Boris.
Dein Problem ist ein ganz anderes.
Wenn Du die Bedingung ins Hauptprogramm schreibst,
dann musst Du schon darauf warten, dass x irgendwann den
Wert 50 erreicht.
> SIGNAL (SIG_TIMER0_OVF) /*Dieser Interrupt löst beim Überlauf des
> Timers0 aus*/
> {
> x++; //erhöht die Variable um eins
> }
> int main (void) //HAUPTPROGRAMM
> {
> init(); //INIT
> sei(); //INTERRUPTS aktiv
> if (x==50)
> {
> PORTB|=(1<<PB7)
> }
> }
Sie mal:
Nach dem sei bginnt der Timer zu tickern. Sagen wir mal
er wird das erste mal aufgerufen: x wird um 1 erhoeht und
hat jetzt den Wert 1.
Super, Aber gleich nachdem der Timerinterrupt durchgelaufen ist,
wird auch im Hauptprogram wieder weitergemacht:
if( x == 50 )
x hat aber nicht den Wert 50. x ist erst bei 1. Und daher wird
der if Teil nicht gemacht. Und weiter gehts im Hauptprogram.
Nur da ist nichts mehr (was macht ein AVR eigentlich in so einem
Fall). Waehrenddessen kommt der naechste Timer Interrupt.
x kriegt den Wert 2. Super. Nur ist da im Hauptprogram nichts
mehr was sich dafuer interessieren wuerde. Dein main() ist
ja schon lange beendet. Naechster Timer Interrupt. x kriegt
den Wert 3, usw. Irgendwann hat x dan den Wert 50 erreicht.
Auch gut. Nur im Hauptprogramm interessiert das keine Sau mehr,
der Code der x ueberprueft ist schon lange durch und da er nicht
wiederholt wird, ....
Du musst die Abfrage in eine Schleife packen, die immer und
immer wieder durchlaufen wird.
while( 1 ) {
if( x == 50 ) {
/* mach was */
}
}
-----
> So und folgendes Programm funktioniert
> volatile uint8_t x;
>
> SIGNAL (SIG_TIMER0_OVF) /*Dieser Interrupt löst beim Überlauf des
Timers0 aus*/
> {
> x++;
> if (x==10) //erhöht die Variable um eins
> {PORTB|=(1<<PB7)}
> }
Ist ja auch klar. Hier wird ja jedesmal, wenn x erhoeht wird,
auch gleichzeitig die Abfrage gemacht, ob der Wert 10 erreicht
ist. Ist ja beides in der Interrupt Funktion. Da die Abfrage
aber immer gleichzeitig mit der Erhoehung gemacht wird, kann
der Wert von 10 auch nicht uebersehen werden.
Das hast Du aber nicht im ersten Fall. Da ist: Die Erhoehung
fundet in der Interrupt Funktion statt und die Abfrage in main().
Nur weiss der Teil in main() ja nicht wann die Erhoehung stattfindet
daher muss er drauf warten.
Wenn Du Dir mit Deinem Kumpel ausmachst, dass er Dir irgendwann
im Laufe des Nachmittags ein Buch auf dem Tisch liegen laesst,
dann wirst Du auch ein paarmal nachsehen muessen, ob er schon
da war. Wenn Du bereits um 13 Uhr nachsiehst, das Buch nicht
vorfindest und daraus den Schluss ziehst, dass man sich auf
Deinen Kumpel nicht verlassen kann, dann war das wohl etwas
voreilig. Die siehst vielleicht um 13:30 nochmal nach, dann um 14:00.
Sagen wir mal Dein Kumpel kommt um 14:10. Wenn Du dann um 14:30
wieder nachsiehst findest Du letztendlich das Buch.