Ich bezweifle, daß die zweite Variante immer funktioniert. Vielleicht wesentlich öfter als die Erste, aber nicht immer, denn es ist nicht-atomarer Code.
Klingelt's?
Hallo,
Es handelt sich um Atmega8L und GCC compiler.
Timer1 generiert jeden 10ms ein overflow interrupt.
- volatile unsigned int Count;
SIGNAL (SIG_OVERFLOW1){
Count+=10;
}
WaitFunction(unsigned int Compare){
Count=0;
while(Count < Compare); //instabiel
while(Count != Compare);//immer stabiel
}
Kann mir Jemanden erklaher warum die function WaitFunction(500) mit 'while(Count < Compare)' meistens 500ms wartet aber ab und zu viel kurzer (so etwas wie 200ms) wartet und dagegen '(Count != Compare)' immer stabiel ist????
Gruss
Henk
Ich bezweifle, daß die zweite Variante immer funktioniert. Vielleicht wesentlich öfter als die Erste, aber nicht immer, denn es ist nicht-atomarer Code.
Klingelt's?
Disclaimer: none. Sue me.
@SprinterSB
BIM BAMM!!!!Klingelt's?
Hatte nach 4 Stunden prugeln die Ursache gefunden.
Habe gerade deine Link 'nicht atomare' besucht.
Und wass sehe ich dort, da steht genau dass Gleiche!
Ich wirds niemals mehr vergessen...
meine Losung:
Lauft wie ein Kuckuck.Code:nicht: while(Count < Compare); sondern: timer1_interrupt_ON; while(1){ timer1_interrupt_OFF; if(!(Count < Compare)){ //if count is okay break; } timer1_interrupt_ON; }
Auf jeden fall, Dank fur die Link.
Gruss
Henk
Nach dem break bleibt der Timer1-IRQ deaktiviert (bevor du ein neues Thema dazu aufmachst *fg*)
Disclaimer: none. Sue me.
Haha,
die code ist Teil der Wartefunktion, wenn die Wartefunktion angerufen wird wird die Interrupt eingeschaltet dafur ist die erste 'timer1_interrupt_ON;'
und dafur sollte noch stehen 'Count=0;'
Lesezeichen