Archiv verlassen und diese Seite im Standarddesign anzeigen : Variablen mit Bascom speichern
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, 20: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
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
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.
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
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
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.
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.
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
Leone, Bronson, Fonda und Cardinale standen mir zur Seite...
Eigentlich schade, das dir niemand hier im Forum helfen konnte :(
Und hat INCR was gebracht?
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.