-         
+ Antworten
Ergebnis 1 bis 8 von 8

Thema: interrupt und variable inkrementieren

  1. #1

    interrupt und variable inkrementieren

    Hi, hab mal ne kurze frage, hoffentlich gibts auch bald ne kurze antwort

    möchte eine variable bei jedem interrupt aufruf inkrementieren.

    wenn ich aber einfach "a=a+1" in meine inerruptroutine einfüge,
    steht die variable a leider nicht für mein hauptprogramm oder subroutinen zur verfügung oder bleibt konstant.

    wie muss ich a deklarieren, das ich sie global verwenden kann?

    thx im vorraus.

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.835
    Bei C schreibt man "static" dazu, (innerhalb eines Moduls)
    static int a = 0;
    bei Basic irgendwas mit "global", denk' ich, da mußt man aber nachschauen. Type "Help" for help mfg

  3. #3
    Hier mal mein Problem...

    Ich will, das mein Robi 1000 schritte gerade aus macht,
    und dann eine Linksdrehung dazu soll ein rad 45 schritte in ne andere richtung machen. sprich das programm hängt 45 schritte in der if schleife und danach springt es aus der subroutine.
    und dann wieder 1000 geradeaus.
    usw...


    wie zähle ich jetzt 45 interupts??




    Declare Sub Drehen_links()

    $regfile = "m32def.dat"
    $crystal = 16000000

    Dim Z As Integer

    Config Timer1 = Timer
    On Timer1 Timer_irq
    Tccr1b = Tccr1b Or &H05
    Timer1 = 65458

    Z = 0

    Do

    If Z > 1000 Then Call Drehen_links

    Loop

    End


    Timer_irq:

    Toggle ...
    Z = Z + 1

    Return


    Sub Drehen_links()

    ...
    If Z > 45 Then
    Z = 0
    End If
    End Sub

  4. #4
    Moderator Roboter Genie
    Registriert seit
    26.08.2004
    Beiträge
    1.228
    Also ich hab das in Bascom mit ähnlich gemacht (bei Überlauf wird x inkrementiert) und hab die Variable auch nicht großartig anders deklariert!
    Hier mal die Variante die ich verwende:
    Code:
    On Int1 OnInt1         'Bei Interrupt 1 gehe zu OnInt1
    Dim a as byte           'Ganz normal a als Byte deklarieren
    
    Do
    Loop                         'Hauptprogramm
    
    OnInt1                     'Wenn Interrupt 1 ausgelöst wird
               incr a            'a um 1 erhöhen
    Return                     'Zurück zum Hauptprogramm
    
    End
    Ich weiß jetzt nicht ob's bei nem Interrupt anders als bei nem Timer ist, aber bei mir tut's!

    MfG
    Basti

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.835
    Wenn "drehen links" dran ist , hat Z einen Wert von > 1000.
    Wenn dir Funktion dann auf > 45 fragt, wird dich das Gerät nicht lange drehen, fürcht ich. mfg

  6. #6
    muss mir das morgen nochmal ansehen,
    wäre natürlich blöd, wenns so wäre.
    kann sein, das ich auch nen z=0 am anfang der subroutine stehen habe.
    trotzdem noch die allgemeine frage,
    wird die variable z also einfach von der interrup routine an das hauptprogramm übergeben, ohne, das ich sie speziell deklarieren muss?
    oder muss ich sie dafür mit variablenübergabe definieren?

    DECLARE SUB Drehe_links(z as integer)

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.835
    Nö, die Variable ist entweder global für Interrupt, Main und Subroutine oder das Ganze klappt eh nicht.
    Eine (mögliche) Tücke noch: eine Variable, die über 1000 geht, ist offensichtlich länger als ein Byte. Und während du auf Null setzten willst, zählt ja der Timer weiter. Dabei kann es durch gefinkelte Überlappungen zu Datenmüll kommen (kommt auf den Kompiler an) Um sicher zu sein, ein Tip:
    Definiere zusätzlich eine Variable LOCK, normalerweise null.
    Veränderst du im Normalprogramm den Wert von Z, setz' LOCK = 1, ändere Z, dann wieder LOCK = 0.
    In der Interrupt routine zählst du nur dann auf Z, wenn LOCK auf Null steht. Aber nicht darauf warten (--> Katastophe), sondern einfach rücksprung aus Irpt).
    Das ist sicher einer drauf, aber nummero sicher mfg

  8. #8
    Also... funzt jetzt
    zum einen war da noch ein z= 0 am anfang der routine.

    es lag aber daran, das ich mit dieser "if z > 45" konstruktion nicht wirklich viel erreicht habe, höchstens den direkten sprung danach aus der subroutine.
    brauchste ja ne schleife und keine if- abfrage.
    hab das jetzt durch "do loop until z>45" ersetzt... funzt jetzt auch...

    trotzdem danke für die antworten und direkt mal den nächsten thread eröffnen.

+ Antworten

Berechtigungen

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