Hallo,
ich habe schon viele Beiträge gelesen komme aber nicht weiter!
Mein Problem:
Ich möchte den Timer1 eines ATmega8 im CTC Mode laufen lassen. Tut er
aber nicht trotzt des Studiums der Beiträge und Datenblatt.
Im Datenblatt steht, das WGM13:0 4 sein muß, bzw. 0100. OCR1A habe ich
bei einem Prescaler von 256 auf 0C34 gesetzt. Das entspricht dann bei
einer Grundfrequenz von 31,25kHz einen Timer1 Overflow von 10Hz,
vorrausgesetzt er fängt immer wieder bei 0 an zu zählen. Tut er aber
nicht. Ich muß immer noch den Wert FFFF-0C34 in das TCNT1 Register
schreiben, so dass der Timer das macht was ich möchte.
Laut Datenblatt sollte er doch TCNT1 selbstständig auf 0 setzen und bis
OCR1A zählen. Jetzt zählt er ja die Differenz von F3CB bis FFFF? Was
mache ich falsch?
Schon mal Danke im Vorraus....
Der Code:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | volatile uint8_t Interruptflag;
|
5 |
|
6 | int main() {
|
7 |
|
8 | DDRD = 0x00; //PortD als Ausgang definiert
|
9 |
|
10 | TCCR1A &= ~(1<<WGM10);
|
11 | TCCR1A &= ~(1<<WGM11);
|
12 | TCCR1B |= (1<<WGM12);
|
13 | TCCR1B &= ~(1<<WGM13); //CTC-Mode TOP OCR1A
|
14 | TCCR1B |= 4; //Prescaler 256
|
15 | TIMSK |= (1<<TOIE1); //Timer Overflow Interrupt freischalten
|
16 | OCR1A = 0x0C34; //Top Wert gesetzt
|
17 | TCNT1 = 0xF3CB;
|
18 |
|
19 | sei(); // Interrupts aktivieren
|
20 |
|
21 | while(1) {
|
22 |
|
23 |
|
24 | if (Interruptflag == 1) { // Neuer Timerzyklus ?
|
25 | Interruptflag = 0;
|
26 | PORTD ^= (1 << PD7); // LED toggeln
|
27 | }
|
28 |
|
29 | }
|
30 | }
|
31 |
|
32 |
|
33 |
|
34 | // Timer1 overflow Interrupt
|
35 |
|
36 | ISR( TIMER1_OVF_vect ) {
|
37 | TCNT1 = 0xF3CB;
|
38 | Interruptflag = 1;
|
39 |
|
40 | }
|