-
Thread
UART-Senden und LED-Blinken gleichzeitig
mehrere Variablen hochgezählt werden. Erreichen diese Variablen bestimmte Werte, dann setzen sei Jobflags, als Zeichen für die Hauptschleife: Jetzt gibt es etwas zu tun. Die Hauptschleife sieht dann so aus [C] ... while( 1 ) { if( needToSampleADC == 1 ) { uart_puti(adc(i));
-
Thread
Hilfe zu Drehencoder-Auswertung nach Wiki
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
-
Thread
Wie viele Cycles darf die Interrupt-Routine haben?
Wenn doch, dann kann man natürlich den kompletten Datums-Teil rausziehen und nur diesen über ein JobFlag in der Hauptschleife anstossen. In 24 Stunden wird der kleine Racker dann ja doch irgendwann Zeit haben, das Datum nachzuziehen.
tatsächlich ein Problem ist, kann man das ganze Datumshochzählen auch in die Hauptschleife (mit Jobflag) auslagern. > Noch ne Frage meinerseits die nicht ganz in diesen Thread passt: > Ich nutze jetzt nen Timer2 als RTC (OVERFLOW_INTERRUPT). Nun möchte ich > mit diesem TIMER auch noch einen Taster
-
Thread
LCD - Ausgabefehler
Lösung für LCD-Befehle, die in der ISR gebraucht werden? Im Grunde ja. Man nennt die Dinger 'Jobflags'. Sie zeigen der Hauptschleife an, dass ein Job zu erledigen ist, bei dir das löschen eines LCD. Aber im Grunde hast du trotzdem immer noch einen falschen Ansatz. Die ISR soll sich nämlich im
verstanden, dass sich die ISR nicht um das LCD kümmern soll. Trotzdem entscheidet die ISR durch diese Jobflags was zu tun ist. In meinem Programm kümmert sie sich um das LCD. Wo ist der falsche Ansatz, wenn meine ISR durch setzen von Variablen dem main mitteilt, dass es im darauffolgenden Durchlauf das LCD
-
Thread
Effizientes Programmieren mit Mikrocontroller
Jobn_Needs_to_be_done = FALSE; } } } [/C] Um einen Job zur Auführung zu bringen, wird sein Jobflag auf TRUE gesetzt. Meistens passiert das in einer Interrupt Routine, die zb von einem Timer angestossen wird. Das muss aber nicht so sein. Im Grunde kann jeder Code so ein Jobflag auf TRUE setzen.
Statemachines hinein und oft hat nman eine Mischung aus beidem: einer Statemachine (Zustandsmaschine) und Jobflags.
-
Thread
Blinkende LEDs als paralleles Programm
Warteschleifen in irgend einer Form benutzt, sondern einen Standard-Aufbau mit Hauptschleife und Jobflags macht. Ereignisse werden in Interrupts verfrachtet und setzen bei Bedarf die Jobflags, so dass die Hauptschleife bei Bedarf die entsprechende (kurze) Aktion durchführt. Vielleicht erst mal mit
-
Thread
UP - DOWN Taster Entprellung mit Timer
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
-
Thread
Multiplexing und Taster Routine
benachrichtigt' die Hauptschleife in main, dass es am Display etwas zu tun gibt. Sowas nennt man Jobflags: Ist das Flag gesetzt, gibt es einen Job abzuarbeiten.
-
Thread
UART - Heizungssteurung
:p ... Nun, muss ich also bei > Tastendruck da raus :) Auch deshalb ist die Lösung mit den Jobflags (zb updateTime) die bessere Lösung. Dann verteilt sich die Logik des Programms nicht über so viele Codestellen, sondern bleibt mehr beisammen und bleibt besser überschaubar. Das Jobflag updateTime
-
Thread
Hilfe zur Tastenentprellung von P.Dannegger
eigenen Variablennamen benutze: [pre] entprellung: ; cbr flags,1<<entprell ;Jobflag löschen Tastenabfrage: ;Entprellroutine (Algorithmus geklaut bei Peter Dannegger...) in temp,tap ;Tastenport einlesen (gedrückt=L) com temp ;invertieren (gedrückt=H) eor temp,tas
-
Thread
LED seltener umschalten
ja auch Zeit. Blöd nur, dass dieser Zeitversatz davon abhängt, wo dir Mainloop genau war, als das Jobflag gesetzt wurde.
der Aufwand nicht höher als der Nutzen ist. Eine LED umschalten dauert ein paar Taktzyklen. Ein Jobflag setzen dauert auch ein paar Taktzyklen. Kommt sich also im Endeffekt mehr oder weniger aufs gleiche raus. Und dann gewinnt die einfachere Lösung.
-
Thread
uart interrupt geziehlt ausschalten
wird. Der UART-Interrupt legt das ankommende Byte in einen Puffer und meldet es per Merker (Jobflag) dem Hauptprogramm. Dieses pollt in der Mainloop die Merker und reagiert darauf. Taster werden zyklisch abgefragt und dabeinebenher Entprellt. Siehe [[Entprellung]]. ...
-
Thread
interrupt ohne rücksprung
dazu lautet: Job-Flags. Ein Interrupt macht so gut wie keine Arbeit selber, sondern er setzt ein Jobflag, welches der Hauptschleife mitteilt, dass es wieder mal Zeit wäre die Signalqualität zu überprüfen. Die Hauptschleife registriert dieses Ansinnen anhand des Jobflags und entscheidet, dass genau das
-
Thread
Programmier Stil für Mikrocontroller
Die zentrale Mainloop hat sich bewährt. In der mainloop werden alle möglichen Aktionen über Jobflags ausgelöst. Wenn ein anderer Codeteil was will, 'startet er den Job' in dem er das zugehörige Jobflag setzt.
-
Thread
Befehlsinterpreter auf MC und diverser anderer Kram
einer globalen String Variablen gesammelt, bis die ISR zb. den Return erkennt. Danach setzt sie ein Jobflag, der aussagt, dass eine komplette Eingabezeile fertig vorliegt und beim nächsten Durchlauf der mainloop wird dieses Jobflag ausgwertet und die Eingabezeile der Verarbeitung zugeführt.
-
Thread
abweichung beim zeitmessungsprogramm
sei gekapselt werden) und die global Variable selbst muss volatile sein. Mit dem Suchbegriff "Jobflag" müsstest du eigentlich hier im Forum fündig werden.
-
Thread
Timer aus den AVR Tutorial
nebenbei, also neben der normalen Aufgabe eines Timers) durch einen Timer-Interrupt (direkt oder über Jobflag) hoch oder runter gezählt werden und beim Erreichen des vorgesehenen Wertes ein Ereignis auslösen. Ein Timer kann oftmals mehrere zyklische Jobs verwalten, indem man im Timer die Aufgaben anhand
-
Thread
Makro überspringen
Menüpunktnummer (als Index) ausgibt. Von da aus geht es dann zur Mainloop, wo nach dem Prüfen aller Jobflags und ggf. Aufrufen von Jobs in den Sleep (Idle) gefallen wird und bis zum nächsten Interrupt (meist Timer) gepennt wird. Dient das Menü hauptsächlich zum Einstellen von Parametern, so lassen sich
-
Thread
LCD + SD-Karte an SPI- Pins ?
Bildschirmspeicher übrig, dann prüfe ich im LCD-Wait (Warten auf ein vom Timer gesetztes Flag) die Jobflags und arbeite darin die Jobs der Mainloop ab. Das ist effizienter als Warteschleifen. ...
-
Thread
Atmega 8 stürzt unregelmäßig ab
zaehler' im ANA_COMP interrupt in die Quere(atomarer Zugriff), oder? Ich würde wie ..HanneS.. Jobflags in den Interruptroutinen setzen und in der Main abarbeiten.
-
Thread
Drehegeber und 8051, ich bekomme es nicht hin!
;Drehgeber-Entprellung und -Abfrage rcall lcd_update ;Zeichen ausgeben u. Jobflag loeschen... in wl,dgp ;Drehgeber einlesen andi wl,dgmsk ;nur Drehgeber-Bits (Bit 3:2) swap wl ;nach oben (Bit 7:6) or drg,wl
-
Thread
Tiny45 PLL und Power Down
beendet, das Programm fällt in die Mainloop, da ist noch nix zu tun, weil noch keine Semaphores (Jobflags) gesetzt wurden und fällt in den Sleep. Nun ist aber Sleep-Mode Idle aktiv, worauf alle Takte außer MCU-Takt aktiv sind und deren Interrupts in der Lage sind, Ereignisse der Peripherie zu
-
Thread
Funktion innerhalb von ISR aufrufen
ausarten. > Oder geht man mit Interrupts etc. anders um? Ja. Eine übliche Vorgehensweise sind Jobflags. In main() gibt es die Hauptendlosschleife. Die überprüft ständig, ob ein Jobflag gesetzt ist und bearbeitet einen Job, wenn dem so ist. Die ISR sichert einfach nur die dazu notwendigen Daten in globalen Variablen und setzt das entsprechende Jobflag. Bsp. Du hast einen ADC im System. Der ADC ist so eingestellt, dass er bei fertigem Wandlerergebnis einen Interrupt auslöst. Das Wandlerergebnis muss jetzt beispielseweise noch umgerechnet werden
-
Thread
Drehimpulsgeber (wiedereinmal.)
Togglebits drehgeber: ;Drehgeber-Entprellung und -Abfrage cbr flags,1<<dgentprell ;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 ;
-
Thread
Tiny26 wacht aus ADC noise reduction nicht mehr auf :-(
der Mainloop ein. Das sichert ab, das alle ISRs ordentlich verlassen wurden und alle Jobs (per Jobflags) erledigt sind. Ich nutze SLEEP im Idle-Mode (meist) bereits für ganz einfache Programme, wenn alle Jobs der Mainloop erledigt sind, schicke ich den AVR schlafen. Der nächste Interrupt weckt ihn dann wieder und vor dem nächsten Interrupt kann sowiso kein neuer Job (über Jobflags) in Auftrag gegeben werden. In Deinem Fall müsste beim Start des ADC der Sleep-Mode von Idle auf ADC-Noise-red. umgeschaltet werden. Laut Datenblatt (Seite 41) sollte der ADC bereits eingeschaltet
-
Thread
MSP430 ADC12 Problem
in einer globalen Variablen bereitgestellt zusätzliche globale Variable auf 1 setzen (das sog. Jobflag) um der ganzen Welt anzuzeigen, dass ein ADC Wert verfügbar ist und etwas damit gemacht werden müsste. Interrupt fertig In der Hauptschleife in main() while( 1 ) { das Jobflag
ist es 1 -> Interrupt sperren Wert von der globalen Variablen wegholen Jobflag wieder auf 0 setzen. Interrupt freigeben Wert formatieren und über UART ausgeben } Auf die Art ist die Interrupt Routine so kurz wie es nur irgendwie geht und lässt noch
-
Thread
TWI: Clock leitung auf low halten
Der "klassische" Ansatz ist ein Jobflag+Puffer: die ISR empfängt ein ganzes Paket und setzt, sobald eins da ist, eine Variable/ein Bit (Flag), die Main loop fragt das Bit regelmäßig ab, und ruft die Funktion auf, wenn das flag gesetzt
-
Thread
Comparator mit Timer/Counter1
Zählerstand im RAM sichern (st/std/sts) - Zählerstand mit Referenz vergleichen (cp, cpc, brne) - Jobflag für erfolgreichen Vergleich setzen (sbr) - Register wiederherstellen (pop) - SREG wiederherstellen (out) - Rücksprung (reti) In der Mainloop kann sich der Controller um andere Dinge kümmern.
-
Thread
Frequenz anders als mit externer Taktquelle regeln?
Spiel kommt, denn dann müssen ISRs möglichst kurz sein. Dann setzt man in der ISR einen Merker (Jobflag, Semaphore, Bitvariable, Boolean...). In der Mainloop fragt man alle Merker ab und verzweigt bei gesetztem Merker zur entsprechenden Routine. Diese löscht den Merker und arbeitet den Job ab, springt
-
Thread
UART + Taschenrechner Teil2
gesetzt, weil 0x15 empfangen wurde, machst Du den Job in der Hauptschleife. Siehe ...HanneS... "Jobflag http://www.mikrocontroller.net/search?query=jobflag&forums%5B%5D=1&forums%5B%5D=9&forums%5B%5D=10&forums%5B%5D=2&forums%5B%5D=4&forums%5B%5D=3&forums%5B%5D=6&forums%5B%5D=17&forums%5B%5D=11&forums
-
Thread
ATtiny13 klein programm
als Endlosschleife organisiert und ruft reiherum alle zu erledigenden Jobs auf (Auswertung der Jobflags und bedingte Sprünge) - Jobs der Mainloop setzen ihr Jobflag zurück und erledigen die entsprechende Arbeit - Interrupt-Service-Routinen werden von Ereignissen (z.B. Timer-Überlauf) ausgelöst und aufgerufen können über eigene Boolsche Variablen (Jobflags, Semaphores) Jobs bei der Mainloop anmelden ...
-
Thread
mehrere Interrupts beim ATMEGA32
Aufgaben zu erledigen, sichert man nur die zeitkritischen (also die flüchtigen) Werte, setzt ein Jobflag für die Mainloop und kehrt zur Tagesordnung zurück. In der Mainloop werden dann die Jobflags geprüft und die zugehörigen Jobs ausgeführt, wobei der Job sein Jobflag wieder löscht. Einen ADC-Complete-Interrupt
zehnte mal die Uhr hochzählen und die Tasten entprellen, wenn erforderlich, dann ein Jobflag für Hundertstelsekunde setzen. Braucht man eine Wartezeit, so nimmt man statt eines Jobflags eine Variable, die in der Mainloop alle Hundertstelsekunde (oder bei Bedarf auch alle Sekunde) heruntergezählt
-
Thread
C 'Zeitsteuerung', µS - 24h. Bitte mal ansehen
kann nach meinem Konzept (extrem kurze ISRs, Synchronisierung der Jobs in der Mainloop mittels Jobflags, Sleep-Mode Idle, wenn alle Jobs der Mainloop fertig sind) eigentlich nicht passieren. Denn der Zeitzählung ist es egal, ob ein Impuls abgesetzt wurde oder nicht. Und da ein Impuls immer kürzer ist
Klingt gut! Klingt nicht nur gut, ist auch gut. Der Überlauf-Int "taktet" die Mainloop über ein Jobflag, der Compare-Int schaltet nur den Impuls aus (egal ob er diesmal an war), den Rest erledigt die Mainloop: - Zeit hochzählen und Schaltuhrfunktion ausüben - Servostrom einschalten, wenn Schaltzeit