Nabend,
meine Absicht ist es ein PWM-Signal mit dem Timer 1 zu erzeugen.
Zur Überprüfung habe ich ein Voltmeter an PB5, sowie GND angeschlossen.
Zu sehen ist ein Abfall der Spannung auf 0V und dann wieder ein Anstieg
auf ca. 5V, danach bleibt der Pegel aber bei 5V und geht nicht, wie
erwartet, auf 0V.
Meine Vermutung ist, dass die ISR einmal ausgeführt wird und das wars
bzw. der Timer nach dem Interrupt nicht mehr hochzählt.
Hier mein Quellcode, vielleicht findet ihr ja meinen Fehler:
ISR:
1 | ISR(TIMER1_COMPA_vect)
|
2 | {
|
3 | //Startwert neusetzen
|
4 | TCNT1 |= 0xBDC;
|
5 | }
|
Timer_io_Init :
1 | //Fast-PWM-Mode mit OCR1A TOP (Nr. 15 in Tabelle), sowie Clear on Match - Set on BOTTOM
|
2 | TCCR1A |= (1<<WGM11) | (1<<WGM10) | (1<<COM1A1) | (0<<COM1A0);
|
3 | TCCR1B |= (1<<WGM13) | (1<<WGM12);
|
4 |
|
5 | //CMP Interrupt Enable, (Overflow Interrupt Enable)
|
6 | TIMSK |= (1<<TOIE1) | (1<<OCIE1A) | (1<<OCIE1B);
|
7 |
|
8 | //Prescaler auf 256, Startwert: 3036 --> Takt: 16MHz --> Overflow jede Sekunde
|
9 | TCCR1B |= (1<<CS12) | (0<<CS11) | (0<<CS10);
|
10 | TCNT1 |= 0xBDC;
|
11 |
|
12 | //Vergleichsregister auf 0xFFFF (65535)
|
13 | OCR1A |= 0xFFFF;
|
Main:
1 | //PortB auf Ausgang und Pins mit High-Pegel (zur besseren Visualisierung auf Voltmeter)
|
2 | DDRB |= 0xFF;
|
3 | PORTB |= 0xFF;
|
4 |
|
5 | //Timer initialisieren
|
6 | Timer_io_Init();
|
7 |
|
8 | //Interrupts Global enablen
|
9 | sei();
|
10 |
|
11 | while(1);
|