Hallo,
ich lerne gerade die Programmierung von Microcontrollern. Bei der
Implementierung eines Sekundenzählers (Timer1) mittels Interrupt stoße
ich auf folgende Problematik:
Der Timer 1 soll einen Interrupt bei einem Buffer-Overflow auslösen. Der
Zähler wird mit Prescaler (1024) und einem Startwert parametriert. Die
Interrupt-Serviceroutine soll den Timer stoppen und die Endlosschleife
beenden.
Hier der Code-Ausschnitt:
1 | #include <avr/io.h>
|
2 | #include <stdio.h>
|
3 | #include <avr/interrupt.h>
|
4 |
|
5 | (...)
|
6 |
|
7 | int wait(int i)
|
8 | {
|
9 |
|
10 | for (int j = 0; j<= i; j++)
|
11 | {
|
12 | TCCR1A=0x00; // Normal port operation
|
13 | TCCR1B |= (1 << CS12) | (0 << CS11) | (1 << CS10);
|
14 | TCNT1=61936; // Startwert des Timers
|
15 | TIMSK|=0x04; // Timer1 Overflow Interrupt = Enable
|
16 |
|
17 |
|
18 | while(sekunde=1)
|
19 | {
|
20 | //warten auf Interrupt
|
21 | }
|
22 | /* Diese Stelle wird nie erreicht!*/
|
23 | sekunde=1;
|
24 | }
|
25 |
|
26 |
|
27 | return(0);
|
28 |
|
29 | }
|
30 |
|
31 | ISR(TIMER1_OVF_vect)
|
32 | {
|
33 | TCCR1B=0x00; //Timer:stop!
|
34 | TIMSK&=~(0x04); //Interrupt löschen
|
35 | sekunde=100;
|
36 |
|
37 | }
|
Problem: Der Interrupt wird ausgelöst, die ISR wird bearbeitet. Nachdem
die ISR abgearbeitet wird, wird a.) die ISR nicht verlassen b.) die
(Endlos-) Schleife nicht beendet.
Da Ich nun schon mehrere Versuche (eine Variante ist oben zu sehen)
unternommen habe, viele Code-Beispiele gesichtet habe, das Manual
gequält habe aber meinen Fehler nicht sehe, bitte ich um Hilfe :-) .
Vielen Dank im Voraus!!!