Hallo,
ich möchte gerne an einem ATMEGA8 einen Timer (Timer1, 16 Bit) im CTC
Modus verwenden. Leider habe ich bei meinem Code das Problem, dass die
ISR immer nur einmal aufgerufen wird. Ich finde leider den Fehler nicht.
IDE ist Atmel Studio 7 mit gcc Toolchain.
Sieht hier jemand den Fehler? Ich bin wahrscheinlich schon
betriebsblind. :)
1
#define F_CPU 8000000
2
3
#include<avr/io.h>
4
#include<avr/interrupt.h>
5
#include<util/delay.h>
6
#include"lcd-routines.h"
7
#include"lcd-routines.c"
8
9
staticintISRs=0;// Zählvariable
10
11
12
voidtimer_init(void)
13
{
14
TCCR1B=(1<<WGM12)|(1<<CS11)|(1<<CS10);// CTC und Prescaler 64
15
OCR1B=125;// 8.000.000 / 64 / 1000 für 1ms
16
TIMSK=1<<OCIE1B;// Timerinterrupts aktivieren
17
}
18
19
20
ISR(TIMER1_COMPB_vect)
21
{
22
ISRs++;// Zählvariable hochzählen
23
PORTC|=(1<<PORTC0);// LED einschalten (Zeigt, dass die ISR einmal abgearbeitet wird)
24
TIFR|=(1<<OCF1B);// Muss ich hier OCF1B manuell zurücksetzen? Eigentlich nicht, oder?
Die ISR wird eventuell schon öfter gerufen, aber woran soll main() das
erkennen? An der Variable die es selbst gerade auf 0 gesetzt hat und die
nicht als "jederzeit veränderlich markiert" ist?
@Sebastian (Gast)
>Ich habe alle vorgeschlagenen Änderungen eingepflegt, jetzt wird die ISR>garnicht mehr ausgeführt.
Ein BISSCHEN Mitdenken wäre vorteilhaft!
Eher so. RTFM!
1
TCCR1B=(1<<WGM12)|(1<<CS11)|(1<<CS10);// CTC und Prescaler 64
Okay, danke, es funktioniert nun. Aber ich verstehe nicht so ganz warum
ich TCCR1B statt TCCR1A konfigurieren muss. Im Datenblatt finde ich dazu
auch keinen Hinweis.
Und das mit den Interrupts, wenn ich für diese Zeit keine Interrupts
haben möchte, kann ich das doch so machen, oder gibt es, technisch
gesehen, etwas was dagegen spricht?
LG und danke für die Hilfe,
Sebastian
PS: Ich fand den Ton hier auch schonmal freundlicher, auch wenn man vllt
"blöde" Fragen stellt.
@Sebastian (Gast)
>Okay, danke, es funktioniert nun. Aber ich verstehe nicht so ganz warum>ich TCCR1B statt TCCR1A konfigurieren muss. Im Datenblatt finde ich dazu>auch keinen Hinweis.
Brille putzen!
TCCR1A ist NICHT direkt mit OCR1A verbunden und
TCCR1B ist NICHT direkt mit OCR1B verbunden!
TCCR1A und TCCR1B konfigurieren ZUSAMMEN Timer1!
>Und das mit den Interrupts, wenn ich für diese Zeit keine Interrupts>haben möchte, kann ich das doch so machen, oder gibt es, technisch>gesehen, etwas was dagegen spricht?
Ja, siehe Interrupt, gibt es leider noch nicht als Hörbuch ;-)
>PS: Ich fand den Ton hier auch schonmal freundlicher, auch wenn man vllt>"blöde" Fragen stellt.https://de.wikipedia.org/wiki/Ironie
Hab dich nicht so mädchenhaft.
Sebastian schrieb:> Okay, danke, es funktioniert nun. Aber ich verstehe nicht so ganz> warum> ich TCCR1B statt TCCR1A konfigurieren muss. Im Datenblatt finde ich dazu> auch keinen Hinweis.>> Und das mit den Interrupts, wenn ich für diese Zeit keine Interrupts> haben möchte, kann ich das doch so machen, oder gibt es, technisch> gesehen, etwas was dagegen spricht?>> LG und danke für die Hilfe,> Sebastian>> PS: Ich fand den Ton hier auch schonmal freundlicher, auch wenn man vllt> "blöde" Fragen stellt.
Als Tipp, der nett gemeint ist, findest Du das Datenblatt und alle seine
Register und Text unter:
http://www.atmel.com/images/atmel-2486-8-bit-avr-microcontroller-atmega8_l_datasheet.pdf
Der Timer1 Register sind ab S.96ff beschrieben.
Zu der Interrupt-Sperre, wäre es für uns sicherlich interessant das
Warum zu erfahren.
Wir sehen die Dinge aus langjähriger Erfahrung evtl. anders und können
Dir einen Ratschlag geben.