hi hab folgendes problem: atmega 8, programmiersprache c , 14,7456MHz quarz alle 10µsec sollte ein timer 2 compare interrupt ausgelöst werden ich stoppe den timer 2 (sodass kein interrupt mehr ausgelöst werden sollte) jedoch wird beim debuggen mit avr studio 4 alle 10µsec ein timer 2 compare interrupt ausgelöst(obwohl der timer vorher gestoppt wurde) hab ich den timer falsch gestoppt oder weis irgendwer was der fehler sein könnte anbei der source-code danke lg ralph
ralph schrieb:
> hab ich den timer falsch gestoppt
Ja.
1 | TCCR2 &= ~(1<<CS22) | (1<<CS21) | (1<<CS20); |
Da fehlt noch eine Klammer:
1 | TCCR2 &= ~((1<<CS22) | (1<<CS21) | (1<<CS20)); |
Zusatzbemerkungen am Rande: 1)
1 | sreg = SREG; // save global interrupt flag |
2 | cli(); // disable interrupts |
3 | i = TCNT1; // read TCNT1 |
4 | SREG = sreg; // restore global interrupt flag |
5 | sei(); |
Wozu das Hantieren mit dem SREG, wenn dahinter doch ein sei() folgt? Ich würde dir auch empfehlen, die Makros der AVR-Libc dafür zu verwenden: http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html 2) entfernung muss volatile sein.
Das ist obendrein ganz gefährlich... Die Interrupts werden nämlich mit sei innerhalb einer Interrupt-Routine wieder aktiviert. Das kann böse enden... MfG Marius
Ach, dass das im Kontext eines Interrupts läuft, ist mir beim schnellen Überfliegen gar nicht aufgefallen.
danke für die schnellen antworten hab die klammern schon gesetzt funktioniert jetzt
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.