RoboterCC - Robotic Code Compiler
Forum Robot Kits NIBO 2 NIBO 2 Projekte Menu mit 4 Tasten

Welcome

Nachrichten

Sie sind nicht eingeloggt.

Werbung

Letzte Themen

  • Keine Beiträge vorhanden

Site-Statistic

  • 7430 private projects
  • 378 public projects
  • 16177837 lines compiled
  • 58186 builds
NIBO @ facebook YouTube Twitter
Willkommen, Gast
Benutzername: Passwort: Angemeldet bleiben:

THEMA: Menu mit 4 Tasten

Aw: Menu mit 4 Tasten 11 Jahre 10 Monate her #1186

  • Egon
  • Egons Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 316
Hallo achim S.

In dem link steht's doch genau drin:
Volatile Variablen

Variablen, auf die sowohl innerhalb wie auch außerhalb einer Interruptserviceroutine zugegriffen wird (schreibend oder lesend), müssen (ähnlich wie Hardwareregister) mit dem Schlüsselwort volatile (flüchtig) versehen werden, damit der C-Compiler berücksichtigen kann, dass diese Variablen jederzeit (durch das Auftreten des Interrupts) gelesen oder geschrieben werden können. Ansonsten würde der C-Compiler das regelmäßige Abfragen oder Beschreiben dieser Variablen ggf. wegoptimieren, da er nicht damit rechnet, dass auf die Variable auch "ohne sein Zutun" zugegriffen wird.

Eine ausführlichere Erklärung zu "volatile" ist hier zu finden: FAQ: Was hat es mit volatile auf sich


Ganz wichtig ist auch bei dem Artikel über die Interrupts der Punkt
Interruptfeste Programmierung

Die Antwort auf Deine Frage -
- Du mußt also wait10 als "volatile" deklarieren
- in der main bei der Verarbeitung von wait10 die Interrupts sichern, sperren und wieder freigeben...


Egon
lokalisieren, eliminieren, Vollzug melden
Letzte Änderung: 11 Jahre 10 Monate her von Egon.
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Aw: Menu mit 4 Tasten 11 Jahre 10 Monate her #1187

  • BirgerT
  • BirgerTs Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 325
Hallo Ihr beiden,
das wird wohl der längste Thread hier im Forum..

Also zum volatile:
Selbst in den Bibliotheken fehlt das volatile an den Stellen, wo es hingehört.
Siehe auch den Thread "NIBO 2 Lib 2.11 Update".
Die uint16_t pwm_timer_ms ist eine 16-Bitvariable die in einer ISR verändert wird.
Bei einem kurzen Programm wird die Variable einmal aus dem Spicher in ein Register geladen, und wenn man dann in einer Schleife daruf wartet, dass sich diese ändert, dann wartet man ewig, weil sich zwar die variable im Speicher ändert, aber nicht der Registerinhalt.
Mit volatile wird der Compiler angewiesen, die variable bei Verwendung immer aus dem Speicher neu einzulesen.
Dann das mit den 16Bit Variablen auf dem 8Bit Professor - der muss bei 16bit Rechenoperationen zwei 8Bit Operationen (Highbyte und Lowbyte) ausführen. Wenn jetzt zwischen der ersten und der zweiten 8bit Operation eine Interrupt auftritt und in der ISR die 16 Bit verändert werden, hat die zweite 8bit Operation einen falschen Wert - das kann fatal sein, wenn aus dem LowByte anstelle 0x00 in der ISR 0xFF wird und das HighByte von 0x03 nach 0x02 ändert. Aus einem 16Bit Dekrement -1 in der ISR wird dann in der Mainloop ein Inkrement von +255.
Um so etwas zu vermeiden, wird die Verwendung von Atomic Block empfohlen:
uint8_t savesreg = sreg; // Interruptregister retten
cli(); // Interrupts sperren
16Bit Operation mit ISR Variable; // mit der 16 Bit Variable arbeiten
sreg = savesreg; // Interruptregister wieder herstellen

Aber lieber Achim, warum so komplizierte Tastenverarbeitung mit dem NIBO2?
Ich persönlich brauche so etwas nicht, aber Deine Vorarbeit mit dem Timer2, also wie der für eine ms-ISR parametriert werden muss, hat mir in meinem Projekt geholfen.

Ich für meinen Teil, werde mich hier auf Roboter.cc auf Programme unter Verwendung der NiboLib beschränken, deren Verwendung ist eine Herausforderung..
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Aw: Menu mit 4 Tasten 11 Jahre 10 Monate her #1188

  • Egon
  • Egons Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 316
Hallo BirgerT

Die NibiLib ist ja "open source" => Du kannst also jederzeit das fehlende volatile mit "reinklimpern" und die Lib neu builden oder die geänderte pwm.c inlc *.h mit in Deinem Programm includen.

Soweit ich sehe, hat achimS. auch nur die NiboLib und keine andere verwendet

Egon

Aber Du hast recht, dieser thread ist wirklich (zu) lange und jetzt wird's doch langsam off topic
lokalisieren, eliminieren, Vollzug melden
Der Administrator hat öffentliche Schreibrechte deaktiviert.
Ladezeit der Seite: 0.045 Sekunden

Werbung