Forum: Mikrocontroller und Digitale Elektronik Wartefunktion funktioniert nicht


von Chris (Gast)


Lesenswert?

Hallo,

ich brauche eine präzise Wartefunkion. Daher habe ich folgendes gemacht:

1
uint8_t t = 0;
2
3
void ton(void)
4
{
5
    TCCR1B = (1<<CS11) | (1<<WGM12);
6
    OCR1A  = 200;
7
8
}
9
10
    
11
ISR (TIMER1_COMPA_vect)
12
{
13
    t++;
14
15
}
16
17
void warte(uint16_t delay)
18
{
19
    ton();
20
    while(t<delay){}
21
    TCCR1B = 0; 
22
    t=0;
23
24
25
}


Warum funktioniert das nicht?
Ich habe mit einem Logicanalyser festellen können, dass der 
Interrupthandler zwar immer wieder aufgerufen wird, und auch t wird 
immer wieder mit 1 addiert, aber das problem ist, dass er die 
whileschleife immer als wahr anssieht, so wie es mir scheint.


Wäre nett wenn jemand mal drübersehen könnte.

Gruß

von Chris (Gast)


Lesenswert?

Ach ja, in der main() steht natürlich dass:
1
TIMSK |= (1<<OCIE1A);
2
sei();

von Stefan P. (form)


Lesenswert?

Die While Schleife ist leer - mach da ein Semikolon rein.
Und in der Main solltest auch eine While(1) schleife oder ähnliches 
machen...

von Stefan E. (sternst)


Lesenswert?

volatile

von Stefan E. (sternst)


Lesenswert?

Stefan P. schrieb:
> Die While Schleife ist leer - mach da ein Semikolon rein.

Es ist völlig korrekt so, wie es jetzt ist.

von Lasse S. (cowz) Benutzerseite


Lesenswert?

1
volatile uint8_t t = 0;

edit: verdammt ist das Forum schnell :)

von Chris (Gast)


Lesenswert?

1
volatile uint8_t t = 0;

Nattüüüüürlich. Danke Jungs:) Sowas kommt vor wenn man schon 10 Stunden 
am Programm sitzt...

von Fabian (Gast)


Lesenswert?

10 Stunden an dem Programm?! ;-)
Außerdem: Sollte t kurz vor der while Schleife auf 0 gesetzt werden?!

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
Noch kein Account? Hier anmelden.