Hallo, ich betreibe einen ATMega8 mit einem 3,6468 MHz Quarz. Einen Timer teile ich durch 256 vor. Mit passenem Reloadwert kommt dann ein Überlauf, passend für eine Stoppuhr, von 0,01sec raus. Parallel zu dieser laufenden "Stoppuhr" möchte ich ein immer konstantes PWM-Signal ausgeben. Die Routinen dür das PWM-Signal dürfen natürlich den Timer für die Stoppuhr nicht beeinflussen. Auf was muss ich achten ?? Können sich die Interrupts in die Quere kommen ?? Lieben Dank an euch !! HPK
Also falls der PWM-Timer Interrupt-Code benötigt "können" sie sich schon in die Quere kommen, aber bei drei Komma irgendwas Megaherz hast du ca. 1 Million Befehle pro Sekunde, wenn die Codes in den Interrupts entsprechend schlank sind --> kein Problem!
Der Mega8 hat doch 3 Timer, da kannst Du ruhig den T1 für die PWMs reservieren. Und mit T0 oder T2 machst Du dann Deine Stopuhr. Genau genommen hat man sogar 5 Timer, wenn man die UART und den ADC nicht braucht (Baudrategenerator, ADC-Prescaler). Peter
> Genau genommen hat man sogar 5 Timer, wenn man die UART und den ADC > nicht braucht (Baudrategenerator, ADC-Prescaler). Danke, wieder was gelernt... ;-) ...
Vielen Dank Peter, wie ist das denn, wenn Timer0 zeitgleich mit Timer1 seinen Interrupt auslöst? Kann das passieren ?? HPK
> wie ist das denn, wenn Timer0 zeitgleich mit Timer1 seinen Interrupt > auslöst? Kann das passieren ?? Ja, das kann passieren. Man kann die Fehler aber kompensieren. In der Timer0-ISR kann man den Reload auf den aktuellen Timerstand addieren, dann ist es kein Problem, wenn die ISR etwas verzögert aufgerufen wird. Den Timer1 lässt man möglichst frei durchlaufen, dann kann man beide Compare-Interrupts und den ICP-Interrupt nutzen. In den Compare-ISRs liest man das Compare-Register (nicht den Timer selbst!) ein, addiert das Intervall dazu und schreibt es zurück. Dann entsteht kein Fehler, wenn die ISR etwas verspätet aufgerufen wird. Die ISRs sind dabei möglichst kurz zu halten, aber das ist ja sowiso eine Selbstverständlichkeit. ...
Der Interrupt wird in bestimmten I/O-Registern zwischengespeichert und wenn dein Interrupt fertig behandelt ist, wird der nächste ausgeführt. Entweder du konfigurierst einen Timer gleich als PWM, oder du aktivierst die Interrupts in der Interruptbehandlungsroutine - dann kann dein Timer-Interrupt von einem zweiten Interrupt unterbrochen werden. Das ist nicht ganz gefährlich, wenn die Interrupts sehr lange dauern - dann kann sich ein Timer immer wieder selbst unterbrechen. Wenn man sich aber daran hält, dass man in die Interruptroutinen eh fast nichts steht, gibts auch keine Probleme.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.