-
Thread
gemessene Frequenz mit UART verschicken
UpadateUart Job Flag gemacht hast einfach nochmal: In der ISR wird eine globale Variable (das Jobflag) auf 1 gesetzt. in der main() wird neben all den anderen Dingen auch dieses Jobflag noch überprüft und wenn es 1 ist, dann wird über die UART verschickt. int main(void) { ... for
-
Thread
Polling oder Interrupt?
vereinbarte End-eines-Befehls Zeichen (dafür würde ich Return benutzen), dann setzt die ISR ein Jobflag, dass eine Zeile komplett empfangen wurde. Das Polling geschieht in der üblichen main-Schleife. Diese pollt unter anderem das Eine-Zeile-empfangen Job Flag und wenn dieses signalisiert, dass
-
Thread
Problem bei Drehgeber auswertung
zum Zuge kommen, ehe der ;Controller am Ende der Mainloop in den Sleep fällt. Das zugehörige ;Jobflag (Synchronisation mittels Timer) wird in der Routine 'lcd_update' ;gelöscht. rcall lcd_update ;ein Zeichen aus Bildscirmspeicher an LCD ausgeben in wl,dgp ;Drehgeber
-
Thread
Interrupt Funktionsaufruf
Funktionsaufrufe diesen Umfangs legt man eigentlich immer ins Hauptprogramm. Setze in der ISR ein Jobflag und bearbeite den Rest im Hauptprogramm.
-
Thread
Am Input Capture Pin (ICP) Frequenz messen
Berechnung löschen. Ansonsten schließe ich mich Karl Heinz an: Warte zwei Flanken ab, setze ein Jobflag in der Capture-ISR und werte dieses Flag im Hauptprogramm aus. BTW: SIGNAL ist veraltet. Installiere Dir bei Gelegenheit mal eine aktuelle WINAVR-Version bzw. wenn Du das schon getan haben solltest
-
Thread
Drehimpulsgeber von Pollin
vorgesehen. [pre] drehgeber: ;Drehgeber-Entprellung und -Abfrage cbr flags,1<<neu_ms ;Jobflag löschen in wl,dgp ;Drehgeber einlesen andi wl,dgmsk ;nur Drehgeber-Bits (Bit 3:2) swap wl ;nach oben (Bit 7:6) or drg,wl ;neuen Zustand uebernehmen
-
Thread
messen einer Periodendauer
Hauptprogramm ab. Die Berechnung des Ergebnisses in Deinem Beispiel ist eigentlich auch ein Fall für ein Jobflag und eine Bearbeitung im HP, aber da sie in diesem Fall noch überschaubar ist, kann man die auch in der ISR lassen. Mit Deiner Methode machst Du im Prinzip alles falsch, was man falsch machen kann
-
Thread
Kann man über USART Werte vom EEProm auslesen und schreiben
empfangenen Bytes auswerten kann. Hat man im Puffer eine gültige Kommando-Sequenz, so kann man ein Jobflag setzen, worauf die Mainloop den Job erledigt (Byte in EEP schreiben, oder Byte aus EEP holen und an UART übergeben). Da das EEP beim Schreiben nicht unendlich schnell ist, solltest du schon am PC
-
Thread
Atmega128 Prioritaeten
mir meist ein Register mit Boolschen Variablen (Flags) ein, setze in der ISR das entsprechende "Jobflag" und frage in der Mainloop die Jobflags der Reihe nach ab. Ist eins gesetzt, wird die entsprechende Routine ausgeführt und das Jobflag gelöscht. Die Timer-ISR mit der schnellsten Aufrufzeit kann
mir meist ein Register mit Boolschen Variablen (Flags) > ein,setze in der ISR das entsprechende "Jobflag" und frage in der > Mainloop die Jobflags der Reihe nach ab. Ist eins gesetzt, wird die > entsprechende Routine ausgeführt und das Jobflag gelöscht. > Die Timer-ISR mit der schnellsten Aufrufzeit
-
Thread
Digitaler Datenbus + Ein & Ausgänge + Timer
züglich zur Mainloop zurück gesprungen und ein anderer Job erledigt. - In der Mainloop werden die Jobflags geprüft und ggf zum erforder- lichen Unterprogramm verzweigt. Kann dieses den Job erledigen, dann löscht es das Jobflag und tut seine Arbeit. Sind alle Jobs abgear- beitet, dann wird in
-
Thread
ATmega8 und Sleep
die Mainloop so gestaltet, dass sie nach jedem Interrupt solange durchlaufen wird, bis alle (per Jobflags verwalteten) Jobs und noch anstehenden (bereits entprellten) Tastendrücke abgearbeitet wurden. Danach geht die Mainloop in den Sleep-Zustand, aus dem ein Interrupt (meist der Timer) den AVR wieder
-
Thread
ICP Atmega 8
Aufgaben. Irgendein Programmteil (meist ein Interrupt) vergibt einen Auftrag, indem das zugehörige Jobflag gesetzt wird. In der Mainloop werden dann alle Jobflags der Reihe nach abgefragt und wenn eines gesetzt ist, wird die zugehörige Rüutine aufgerufen. Diese Routine löscht dann das Jobflag und erledigt
springt danach über den nach sleep stehenden Befehl "rjmp mainloop" die Hauptschleife aus, bis alle Jobflags gelöscht sind, dann wird wieder geschlafen, bis der nächste Interrupt "klingelt". ...
-
Thread
Interrupts vs. Endlosschleife
- Weitere Timer-Interrupts (OC, ICP, OVF...) diverse zeitabhängige Jobs durch setzen der Jobflags "anmelden" (erledigt Mainloop) (wird von Timern ausgelöst) - ADC-Interrupt: Messwerte einlesen und sichern, nächste Messquelle einschalten, evtl. Jobflag setzen (wird vom ADC ausgelöst
das LCD ausgeben - eine Berechnung ausführen - ... (wird von Mainloop aufgerufen, falls Jobflag gesetzt war, löscht Jobflag und erledigt Job) Man richtet sich ein (oder mehrere) Register ein, in denen jedes Bit für einen Job steht (Jobflags). Erkennt irgendein Programmteil (meist ein
-
Thread
effiziente programmstruktur
Komponenten initialisiert, auch die entsprechenden Interrupts. Dann kommt meist die Mainloop, in der Jobflags (auch Tastenflags der entprellten Tasten) überprüft werden und darauf reagiert wird (in Routine verzweigen, die das Jobflag löscht und den Job ausführt). Sind alle Jobs erledigt, dann wird gepennt
und die entsprechenden ISRs aufrufen. Hier kommt es auf die Situation an, ob in der ISR nur ein Jobflag für die Mainloop gesetzt wird oder ob der Job gleich in der ISR erledigt wird. Auch die Frage der Redundanz kann von Fall zu Fall unterschiedlich ausfallen. Manchmal ist es eben schneller, einen
-
Thread
Tippblinker im fürs Auto...
man ja das Blinken per Blinkschalter nicht vom eigenen Nachblinken unterscheiden. Du nutzt das "Jobflag" Zustandcheck. Sinn eines Jobflags ist es, das der "Auftraggeber" (die ISR) dem "Auftragnehmer" (Mainloop) mitteilt, dass ein neuer Auftrag vorliegt. In der ISR wird das Flag also nur gesetzt, keinesfalls
-
Thread
Probleme mit UART Mega8
LCD-Ausgaben über Ringbuffer laufen lasse und die Zeichenausgabe vom Ringbuffer zum LCD über Timer (und Jobflag) synchronisiere. Somit wird das nächste Zeichen immer erst ausgegeben, wenn der nächste "Termin" ran ist. Dazwischen wird nicht gewartet, sondern die Mainloop durchlaufen und "geschaut, was es sonst noch so zu tun gibt", also alle Jobflags und ggf. Tastenflags der Entprellung abgefragt. ...
-
Thread
Schieberegistersachen
Controller Zeit dazu findet, bis der Lesepointer den Schreibpointer erreicht hat. Dann wird ein "Jobflag" gelöscht, welches in der LCD_DATA-Routine gesetzt wurde, worauf die Zeichenausgabe eingestellt wird. Auch die Cursor-Positionierung erfolgt über den Ringbuffer. Dazu wurden Steuerzeichen im unteren
-
Thread
Led Cluster ansteuern
aufgerufen (dauert viel zu lange, ISRs müssen extrem kurz bleiben), sondern nur das zugehörige "Jobflag" gesetzt. In der Mainloop werden dann nacheinander alle Jobflags geprüft und bei gesetztem Flag wird das zugehörige Unterprogramm aufgerufen, was den Job erledigt und das Jobflag wieder löscht. Sind
-
Thread
Propeller Clock
cbr flags,1<<irgendwas ;Flag zurücksetzen, da Job erledigt ist rjmp mainloop ;weitere Jobflags prüfen... Auf diese Art wird die Mainloop solange durchlaufen, bis alle anstehenden Jobs abgearbeitet sind. Dabei haben die oben stehenden Jobs höhere Priorität. Etwas komplexere Jobroutinen können
-
Thread
Sleepmodus? Mit "SBI MCUSR,SE" oder mit "SLEEP?
neuimp") enden mit "rjmp mainloop", damit vor dem Schlafen erst alle Jobs abgearbeitet werden. Die Jobflags werden natürlich von der Jobroutine gelöscht. ...
-
Thread
Schleife mit interrupt beenden.
sondern in der Timeout Zeit andere Aufgaben ausführen. Und dann wären wir wieder in der Nähe der Jobflags. Aber als Idee auf jeden Fall anerkennenswert. mfg
-
Thread
Tasten entprellen - Bulletproof
vorliegenden Fall läuft die Routine auch nicht im Interrupt, sondern als Job der Mainloop, durch Timer und Jobflag synchronisiert. [pre] Tastenabfrage: ;Entprell-Algorithmus geklaut bei Peter Dannegger... ;die Tasten liegen auf den untern 4 Bits cbr flags,1<<upsync;Jobflag löschen (Routine läuft als Mainloop-Job
] Tastenabfrage: ;Entprell-Algorithmus geklaut bei Peter Dannegger... cbr flags,1<<entprell ;Jobflag löschen in tmp,tap ;Tastenport einlesen (gedrückt=L) com tmp ;invertieren (gedrückt=H) andi tmp,alltast ;ungenutzte Bits ausblenden eor tmp,tas ;nur Änderungen