PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vergleich Fehler?



Arexx-Henk
22.03.2006, 14:22
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

SprinterSB
22.03.2006, 15:47
Ich bezweifle, daß die zweite Variante immer funktioniert. Vielleicht wesentlich öfter als die Erste, aber nicht immer, denn es ist nicht-atomarer Code (https://www.roboternetz.de/wissen/index.php/Fallstricke_bei_der_C-Programmierung#Nicht-atomarer_Code).

Klingelt's?

Arexx-Henk
22.03.2006, 16:10
@SprinterSB



Klingelt's?


BIM BAMM!!!!

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:


nicht:
while(Count < Compare);

sondern:
timer1_interrupt_ON;
while(1){
timer1_interrupt_OFF;
if(!(Count < Compare)){ //if count is okay
break;
}
timer1_interrupt_ON;
}



Lauft wie ein Kuckuck.

Auf jeden fall, Dank fur die Link.

Gruss

Henk

SprinterSB
22.03.2006, 16:16
Nach dem break bleibt der Timer1-IRQ deaktiviert (bevor du ein neues Thema dazu aufmachst *fg*)

Arexx-Henk
22.03.2006, 16:27
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;'

O:)