- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Variablen mit Bascom speichern

  1. #1
    Murus
    Gast

    Variablen mit Bascom speichern

    Anzeige

    Praxistest und DIY Projekte
    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... ) 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

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    zu 1.: Dim <name> As <type>
    zu 2.:
    Du kannst sowohl Sprungmarken als auch Methoden nutzen. Methoden heißen in Bascom Subs:

    Code:
    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

  3. #3
    Murus
    Gast
    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

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    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.

  5. #5
    Murus
    Gast
    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

  6. #6
    Murus
    Gast
    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

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Was heisst beim Type Long?
    Was heisst Print?
    Zitat Zitat von Marco78 hat weiter oben
    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.

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    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

    Code:
    Dim B As Byte              ' Variable B definieren 
    B = 0                           ' Variable B=0
    So wäre es richtig.

  9. #9
    Murus
    Gast
    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

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Leone, Bronson, Fonda und Cardinale standen mir zur Seite...
    Eigentlich schade, das dir niemand hier im Forum helfen konnte

    Und hat INCR was gebracht?

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad