- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 3 von 3

Thema: Bit-Variablen Atomar?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    05.01.2010
    Beiträge
    35

    Bit-Variablen Atomar?

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Moin,

    Ich nutze gerade den Timer1 per Overflow zum Hochzählen von ein paar Zeitvariablen und den Timer0 per Overflow zum Empfangen von RC5.
    In der Hauptschleife halte ich dann kurz alle Interrupts an, damit die Variablen der ISRs nicht verändert werden, während ich diese auslese und es dann nicht zu Fehlern kommt. Wenn ich an das Ende meiner Hauptschleife ein "Waitms 100" setze, dann klappt auch alles prima, mit "waitms 1" wird aber nur noch sehr vereinzelt etwas empfangen, was wie ich vermute daran liegt, dass der Atmega dann im Verhältnis zu lange die Interrupts deaktiviert hat.

    Das beste was mir da jetzt einfallen würde wäre, dass ich dort nun die Zeit verringere, in der die Interrupts deaktiviert sind. Wenn ich einfach nur eine Bytevariable in eine andere Bytevariable kopiere, dann kann da nichts schief gehen, weil alles in einem Schritt passiert, auch wenn sich die ISR dazwischenschiebt, oder? Bei Wordvariablen muss man da wohl aufpassen.

    Aber wie sieht das in Bascom mit Bitvariablen aus? Kann es da Fehler beim Lesen/Schreiben geben, wenn die ISR genau dann einspringt, wenn die Bitvariable bearbeitet wird?

    Und wie sieht das zeitlich mit "enable Interrupts" und "disable Interrupts" aus? Macht es da Sinn die Interrupts vor und nach jeder Variable zu deaktivieren und aktivieren oder lieber nur einmal am Anfang und Ende?

    Also lieber...
    Code:
    disable interrupts
    wordvariable1 = wordvariable2
    enable interrupts
    If A = B Then
       disable interrupts
       wordvariable3 = wordvariable4
       enable interrupts
    End If
    ...oder doch...
    Code:
    disable interrupts
    wordvariable1 = wordvariable2
    If A = B Then
       wordvariable3 = wordvariable4
    End If
    enable interrupts
    ...?

    MfG

    Dunuin

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Man muss den Interrupt nur dann atomar machen, wenn die Variable in einer ISR auch verändert werden kann.
    Die Befehle "enable Interrupts" und "disable Interrupts" sollten sehr schnell und kurz sein (1-2 Worte und Zyklen) die lassen sich nämlich direkt in ASM Befehle SEI (ggf. noch ein NOP dazu) und CLI übersetzen. Da kann man also ruhig mehrmals kurz die Interrupts sperren.

    Wie lange die Interrupts insgesamt gesperrt sind ist oft nicht so wichtig. Störungen kann es geben wenn Interrupts zu lange in eins unterbrochen sind. Da kann es ggf. sogar sinnvoll sein die Interrupts nur kurz wieder frei zu geben auch wenn der nächste Befehl schon wieder ein "disable Interrupts"ist.

    Das verhalten mit dem Wait 100 ms und Wait 1 ms ist schon verdächtig. Da ist vermutlich ein Fehler drin, der bei der längeren Wartezeit nur seltener auftritt.

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Bascom braucht für BitVarable ein ganze Reihe Instruktionen,
    http://www.rn-wissen.de/index.php/Ba...de#Bitvariable
    d.h. wenn Hauptschleife u. ISR konkurrenzierend damit werken, musst du in der Hauptschleife das ganze mit dis- u. enable einrahmen.

    Bei zu langem "disable interrupts" kann es allerdings passieren, dass ISR-Ereignisse verschluckt werden,
    sprich, die Unterbrechung muss kürzer sein als die zeit zwischen zwei Interrupts, is aber logo.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Ähnliche Themen

  1. String-Variablen mit RP6?
    Von RobotMichi im Forum Robby RP6
    Antworten: 9
    Letzter Beitrag: 14.01.2010, 18:04
  2. Variablen eingeben?
    Von robob im Forum Robby RP6
    Antworten: 24
    Letzter Beitrag: 17.01.2008, 17:55
  3. Variablen Typ ???
    Von Mr-400-Volt im Forum Software, Algorithmen und KI
    Antworten: 10
    Letzter Beitrag: 01.01.2007, 17:36
  4. Attiny12 und Variablen
    Von Furtion im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 19
    Letzter Beitrag: 27.02.2006, 19:36
  5. Variablen
    Von Xeus im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 24.05.2005, 16:50

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad