PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variablen mit Bascom speichern



Murus
10.09.2005, 19:36
Guten Abend,

ich erforsche gerade Bascom mit einem ATmega8.

Möchte eine LED immer schneller und schneller blinken lassen.

Ich benutze dafür Timer0 und den internen Oszi. (um den Timer kennenzulernen)

Den Code poste ich, falls Interesse besteht (wohl eher net... =P~ ) dann nachher.

Nur: Wie kann man mit Bascom Variablen abspeichern. (z.B. eine Dezimalzahl unter dem Buchstaben "g" oder so..)

So z.B. :

declare sub Unterprogramm

"speichere": S=0
"speichere": q=78

do
loop
"speichere": s+1=s
If s=q Then
Goto Unterprogramm
Else
Endloop

Sub Unterprogramm
End

Also: zwei Fragen: Wie sieht in Bascom "speichere" aus?
und: Wie sieht der Goto-Befehl aus, der in ein Unterprogramm geht?

Herzliche Grüsse
Mario

jagdfalke
10.09.2005, 19:46
zu 1.: Dim <name> As <type>
zu 2.:
Du kannst sowohl Sprungmarken als auch Methoden nutzen. Methoden heißen in Bascom Subs:



Declare Sub test(var As Byte) //Sub deklarieren

Dim cnt as Long //Variable deklarieren
cnt = 0 //Variable initialisieren

endlosschleife: //Sprungmarke
Call test(cnt)
cnt = cnt + 1
wait 1
Goto endlosschleife //Goto-Befehl, damit es eine Endlosschleife wird

Sub test(var As Byte) //Begin des Subs
print test
End Sub //End des Subs


Sub müssen ganz am Anfang deklariert werden. Dann können sie aufgerufen werden. Das obige Beispiel dürft so das Grundgerüst jeden Programms mit Bascom sein:

Subs deklarieren
Variablen deklarieren
Endloschleife
Subs

Murus
10.09.2005, 19:53
Hmm, Ok. Nur: Was heisst "type"? War cnt frei gewählt?
Kann man mit den Variablen mit If/Then/Endif verfahren?
Also:
If cnt=4 Then
goto Endlosschleife
Endif

Gelten diese Befehle?

Geht das?
Wofür braucht man denn Subs, wen es doch mit den Marken und Goto so einfach geht??

herzliche Grüsse
Mario

Marco78
10.09.2005, 20:13
Type ist Bit, Byte, Word, Single, Integer, Long, String.
Schreibe einfach mal DIM in den Editor von BASCOM und drücke F1. So geht es mit allen Befehlen. Einfach mit dem Cursor aus den Befehl gehen und F1 drücken. Sofort kommt die Hilfe zum Befehl. Das klappt meistens ;) Wenn nicht, dann den gesuchten Befehl in der Hilfe suchen lassen.
Die Hilfe von BASCOM ist meiner Meinung nach recht brauchbar. Mann muss nur das englisch verstehen und sich an den Syntax gewöhnt haben.

Der Type gibt letztendlich an, wie groß der Wert werden kann, den die Variable aufnehmen kann. Bit ist nur 0 oder 1. Byte 0-254, Word 0-1023, String sind Zeichen (Buchstaben, Zahlen, Sonderzeichen). Bei String muss die max. länge angegeben werden.
z.B.: Dim A as String * 10 'damit kann A max. 10 Zeichen aufnehmen.

Dim A As Byte
A = 10
Do
If A = 10 Then Gosub isso
Loop

:isso
Print "A=10"
A = 9
Return

End

In diesem Programm kann nur einmal die Bedinung erfüllt werden, das A 10 ist. Mit Return wird hinter dem Befehl GOSUB zurückgesprungen. Dort kommt ein Loop. Es wird immer die DO-LOOP-Schleife ausgeführt, weil A den Wert 10 nichtmehr annimmt.

Ich finde es zu Anfang leichter sich auf GOTO und GOSUB mit RETURN zu beschränken. Damit kommt man auch immer zum Ziel und kann sein lernen auf anderes konzentrieren.

Murus
10.09.2005, 20:16
Ok, vielen Dank!Was heisst beim Type Long?
Wieso hats vor dem Sub "isso" ein doppelpunkt? der kommt doch nachher, oder nicht?
Was heisst Print?

Herzliche Grüse
Mario

Murus
10.09.2005, 20:33
Also, hab mal probiert: Mit diesem Code wird eine Led etwa alle 3 Sekunden an- und abgeschaltet. (verwende 1Mhz internen Oszi)

Hier ist der Code:

$regfile = "m8def.dat"
$crystal = 1000000

Dim B As Byte ; Variable B definieren
B = 0 ; Variable B=0


On Timer0 Ontimer0
Ddrd.6 = 1
Config Timer0 = Timer , Prescale = 1024
Enable Timer0
Enable Interrupts

Do
If B = 10 Then
Toggle Portd.6
If B = 10 Then
B = 0
Loop

Ontimer0:
B = B + 1

Return

End

Hmm, funktioniert das so?
Kann man die beiden If-Befehle in der Loop-Schlaufe nicht einfacher zusammenfassen? Braucht es ein Endif?
Was ist falsch/krumm?

Herzliche Grüsse
Mario

Marco78
10.09.2005, 20:51
Was heisst beim Type Long?

Was heisst Print?

Einfach mit dem Cursor aus den Befehl gehen und F1 drücken. Sofort kommt die Hilfe zum Befehl.
Nicht das ich nicht helfen will, aber ich denke du selbst willst dabei auch was lernen, oder?

Zum Programm: Ich sitze nicht vorm Mega8 und sehe die LED: Probier es doch aus. Kaputt machen kannst du damit eigentlich nichts.

Aber ich glaube nicht, das du das Programm fehlerfrei compiliert bekommen hast ;)



Do
If B = 10 Then
Toggle Portd.6
If B = 10 Then
B = 0
Loop

Do
if b = 10 then Toggle portd.6
if b = 10 then B = 0
loop

oder einfacher

do
If B = 10 then
toggle portd.6
b=0
end if
loop

Wenn das Programm compiliert ist, achte mal drauf, wie groß es ist. Dann ändere folgendes:
Lösche B = B + 1
und ersetze es durch INCR B
Damit wird B auch immer um 1 erhöht. Ich glaube das verbraucht weniger Code.

Marco78
10.09.2005, 20:56
Dim B As Byte ; Variable B definieren
B = 0 ; Variable B=0

Geht auch nicht. Also hast du das Programm 100%ig noch nicht selbst ausprobiert :P
; leitet einen weiteren Befehl ein.
z.B.: A = A * 10 ; A = A - 3
Die Rechnung A = A * 10 - 3 geht in BASCOM (noch) nicht. mit ; kann man es aber relativ übersichtlich in einer Zeile darstellen.
Kommentare werden mit ' angefangen


Dim B As Byte ' Variable B definieren
B = 0 ' Variable B=0

So wäre es richtig.

Murus
10.09.2005, 21:55
Jawolll!!! Es geht!
Leone, Bronson, Fonda und Cardinale standen mir zur Seite...
Die LED wechselt den Zustand alle 2,6 Sekunden, rein rechnerisch komme ich auf:
1000000/1024/256=3.8 Hertz.
Also jede 3.8teltse Sekunde kommt ein Interrupt. Das noch mit 10 beabsichtigt, macht alle 2.63 Sekunden....
Judihuiii

Marco78
10.09.2005, 22:09
Leone, Bronson, Fonda und Cardinale standen mir zur Seite...

Eigentlich schade, das dir niemand hier im Forum helfen konnte :(

Und hat INCR was gebracht?

Murus
10.09.2005, 23:24
Natürlich habt ihr mir auch geholfen! :)

Ja, hab INCR genommen! Gibts das auch in 10er-Schritten oder so?

So, gute N8
und vielen Dank!

Mario