Hallo,
mein Ziel ist es timer0 für 20ms(3,6864MHz Quarz) laufen zu lassen, und
in der ISR zu deaktivieren.
Die LED ist laut Oszi immer an. Wieso?
Ich bin für alle Hinweise und Erklärungen dankbar.
Das ist der Code:
Oliver S. schrieb:> Wenn du den Timer in deiner Hauptschleife immer wieder> einschaltest, was> meinst du, wie lange der nach einem Interrupt aus bleibt?>> Oliver
1
#define TIMER0_LAEUFT !(TIFR & (1<<TOV0))
2
3
while(TIMER0_LAEUFT)
Diese while Schleife sollte er doch erst nach der ISR verlassen oder
nicht?
Clemens B. schrieb:> Diese while Schleife sollte er doch erst nach der ISR verlassen oder> nicht?
Diese while-Schleife wird niemals verlassen. Die ISR funkt zwar
dazwischen, aber danach geht's munter im while-Kreis weiter.
Oliver
Oliver S. schrieb:> Clemens B. schrieb:>> Diese while Schleife sollte er doch erst nach der ISR verlassen oder>> nicht?>> Diese while-Schleife wird niemals verlassen. Die ISR funkt zwar> dazwischen, aber danach geht's munter im while-Kreis weiter.>> Oliver
Ach verdammt stimmt, da ist der Denkfehler. Danke!
Clemens B. schrieb:> es läuft wie erwartet:> #define TIMER0_LAEUFT TCCR0 && 0x05
Tatsächlich mit dem logischen &&?
Dann wäre es das selbe wie
#define TIMER0_LAEUFT TCCR0
(denn 0x05 ist immer "true" und kann für ein logisches Und ignoriert
werden)
Und damit muss nur irgendein Bit im TCCR0 gesetzt sein, dass auch
TIMER0_LAEUFT "true" ist...
Lothar M. schrieb:> Clemens B. schrieb:>> es läuft wie erwartet:>> #define TIMER0_LAEUFT TCCR0 && 0x05> Tatsächlich mit dem logischen &&?> Dann wäre es das selbe wie> #define TIMER0_LAEUFT TCCR0> (denn 0x05 ist immer "true")> Und damit muss nur irgendein Bit im TCCR0 gesetzt sein, dass auch> TIMER0_LAEUFT "true" ist...
Natürlich das bitweise UND. Vorm posten prüfe ich nächstes Mal..
@Clemens B. (Gast)
>Natürlich das bitweise UND. Vorm posten prüfe ich nächstes Mal..
Eine gute Idee. Außerdem sollte man derartige Makros IMMER mit einer
Klammer versehen, damit es nicht zu komischen Nebeneffekten kommt, wenn
das Makro in einem komplexeren Ausdruck eingesetzt wird und dort
höherpriorisierte Operatoren angewendet werden. Aber deine Makro ist
immer noch nicht wasserdicht. Warum prüfst du nicht einfach alle drei
CSx Bits? Und wenn man es ordentlich und direkt verständlich schreiben
will, nimmt man die Bitnamen und keine magic numbers.
Siehe Bitmanipulation und
Strukturierte Programmierung auf Mikrocontrollern.
Also eher so.
Clemens B. schrieb:> Ps. Für den Fall, dass es irgendwann mal jemanden hilft. Ich hab es> jetzt so gelöst und es läuft wie erwartet:> #define TIMER0_LAEUFT TCCR0 && 0x05>> Kann geschlossen werden.> Danke nochmal.
Was läuft wie erwartet ?
PORTB &= ~(1<<PB2);
Diesen Befehl kannst du ruhig weglassen, absolut nutzlos.
Somit ist deine LED praktisch immer an (oder aus) - je nachdem wie
du das angeschlossen hast - wozu das Ganze ?
Marc V. schrieb:> Was läuft wie erwartet ?>> PORTB &= ~(1<<PB2);>> Diesen Befehl kannst du ruhig weglassen, absolut nutzlos.
Wieso? Der löscht doch zuverlässig das PB2 Bit. Und mit 'nem guten Oszi
hätte man das sogar gesehen...
Hi
Nebenfrage:
Clemens B. schrieb:> #define TIMER0_LAEUFT !(TIFR & (1<<TOV0))
Dieses Define wird bei jedem Aufruf im Programm erneut hergeleitet?
Hätte jetzt erwartet, daß der Wert Rechts beim Compilieren berechnet
wird und danach Timer0_Laeuft eine Konstante ist - hätte nebenbei auch
erklärt, warum nicht aus dem While raus gegangen wird.
Vll. sollte ich doch Mal in C rein schnuppern :/
MfG
@ Patrick J. (ho-bit-hun-ter)
>> #define TIMER0_LAEUFT !(TIFR & (1<<TOV0))>Dieses Define wird bei jedem Aufruf im Programm erneut hergeleitet?
Ja logisch! Es ist eine Bitmanipulation eines Steuerregisters.
>Vll. sollte ich doch Mal in C rein schnuppern :/
Tu das.
@Falk
Da hast du vollkommen recht, die Leerzeichen zwischen den äußersten
Klammern hatte ich vorher nie gemacht, ansonsten mache ich das identisch
;) schöner Tipp zur besseren Lesbarkeit.
So habe ich mein define aktuell, das CS01 Bit wird bei mir nie gesetzt.
@Marc
So wie Jim schon erkannt hat. Es ist ein reiner Funktionstest. Und bei
meinem Oszi geht's bis 2ns runter, mehr als ausreichend und den Puls zu
sehen der entsteht..
@Patrick
#define ist eine sogenannte Präprozessor Direktive:
https://de.wikibooks.org/wiki/C-Programmierung:_Präprozessor
Erhöht halt die Lesbarkeit im Code(richtig angewandt). Dazu kommt das
was Falk geschrieben hat.
@Falk
Da hast du vollkommen recht, die Leerzeichen zwischen den äußersten
Klammern hatte ich vorher nie gemacht, ansonsten mache ich das identisch
;) schöner Tipp zur besseren Lesbarkeit.
So habe ich mein define aktuell, das CS01 Bit wird bei mir ja nie
gesetzt.
@Marc
So wie Jim schon erkannt hat. Es ist ein reiner Funktionstest. Und bei
meinem Oszi geht's bis 2ns runter, mehr als ausreichend und den Puls zu
sehen der entsteht..
@Patrick
#define ist eine sogenannte Präprozessor Direktive:
https://de.wikibooks.org/wiki/C-Programmierung:_Präprozessor
Erhöht halt die Lesbarkeit im Code(richtig angewandt). Dazu kommt das
was Falk geschrieben hat.
Eine eigene Frage?
Dieser Thread ist über 9 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.