print '*' print '*' print '*' print '*' sei Haupt: ;Hauptschleife, Auswertung der Tastenflags ;und Jobflags die in der ISR gesetzt wurden und verändern ;der PWM-Werte der 8 Kanäle. sleep ;Schlafmodus, Wecken erfolgt durch Timer-Int. sbrc flags,aktuLCD ;muss LCD aktualisiert werden? - nein... rcall gibaus
print '*' print '*' print '*' print '*' sei Haupt: ;Hauptschleife, Auswertung der Tastenflags ;und Jobflags die in der ISR gesetzt wurden und verändern ;der PWM-Werte der 8 Kanäle. sleep ;Schlafmodus, Wecken erfolgt durch Timer-Int. sbrc flags,aktuLCD ;muss LCD aktualisiert werden? - nein... rcall gibaus
Timeout fehlt. void __ISR(_RTCC_VECTOR,ipl6) _RTCCInterrupt(void) Die ISR. Die setzt nur ein Jobflag. Alles weitere passiert in einem Eventhandler. Für die Funktion kann ich nicht garantieren, es läuft aber seit >1Jahr in meiner Wetterstation.
M01 ret m3: locate 3,19 printf M02 ret ;Haupt: ;Hauptschleife, Auswertung der Tastenflags ;und Jobflags die in der ISR gesetzt wurden und verändern ;der PWM-Werte der 8 Kanäle. ; sleep ;Schlafmodus, Wecken erfolgt durch Timer-Int. ;sbrc flags,aktuLCD ;muss LCD aktualisiert werden? - nein... ;rcall gibaus
Mainloop-Jobs 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. 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
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) 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 werden
einen Buffer geschrieben, sofern es kein '\n' ist. Erkennt die ISR einen '\n' dann setzt sie ein Jobflag und ein Teilzweig in der Hauptschleife aktiviert sich und sieht sich den Buffer an.
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) 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 werden
Und die Sache mit den Jobflags verstreu sie nicht über das ganze Programm. Lass die Auswertung ruhig in der Hauptschleife [C] void MesseFeuchte(char *str) { static uint16_t i = 0; // // Die Zeitdauer zwischen
ausgehen, dass ein Zeitverbrauch < 1% akzeptabel ist). Ganz im Gegenteil: Das Kochrezept über Jobflags (den um etwas anderes handelt es sich hier konzeptionell nicht), verallgemeinert hervorragend, sodass ein Newbie daraus nur lernen kann, wie er seinen Programmen eine Grundstruktur geben kann, mit
pennen rjmp mainloop ;nochmal... neusekunde: ;UP, eine Sekunde ist vergangen cbr flags,1<<neusek ;Jobflag löschen ;Temperatur ermitteln (Umrechnung in °C mittels Tabelle) out tccr0b,null ;Alarmton erstmal aus clr zh ;Pointer erstmal auf 0 mov zl,adcw ;und ADC-Wert subi zl,100 ;untere 100 Werte sind nicht
pennen rjmp mainloop ;nochmal... neusekunde: ;UP, eine Sekunde ist vergangen cbr flags,1<<neusek ;Jobflag löschen ;Temperatur ermitteln (Umrechnung in °C mittels Tabelle) out tccr0b,null ;Alarmton erstmal aus clr zh ;Pointer erstmal auf 0 mov zl,adcw ;und ADC-Wert subi zl,100 ;untere 100 Werte sind nicht
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
die Merker bei der Ausführung des zugehörigen Jobs. Man kann die Merker in diesem Falle auch als "Jobflag" sehen, also ein Flag (Semaphore, Merker, Bitvariable, Schalter, RS-Flipflop), das anzeigt, das ein bestimmter Job zu erledigen ist (das Gegenstück dazu sind Merker, die einen Status anzeigen, der
/* this is a low priority Task for transfering large amounts of data with a software SPI * if a jobflag is set, the transfer is stalled * therefore, the system is never blocked for longer than it takes to transfer 8 bits (a few µs) * this should be called, if all other jobs has been completed * on completion
Daten abholen ;-------------------------------------------------- sub_fmess: cbr jobs,1<<f_mess ;Jobflag löschen rcall fuellmess ;Abfrage der Messwerte sbr jobs,1<<esp ;Weiter mit Einschalten des ESP ret ; Füllstandsmessung ausführen (durch Einschalten der Spannung) ; Messwerte per RS232 empfangen und