Gast
#69727
Hallo!
Ich hab ein merkwürdiges Verhalten in einer delay routine, die x
millisekunden warten soll, hier der code:
446:wecker.c ****
447:wecker.c **** void
448:wecker.c **** delayms (uint16_t ms)
449:wecker.c **** {
1427 .LM184:
1428 /* prologue: frame size=0 */
1429 /* prologue end (size=0) */
450:wecker.c **** milliseconds = ms;
1431 .LM185:
1432 06b4 9093 0000 sts (milliseconds)+1,r25
1433 06b8 8093 0000 sts milliseconds,r24
451:wecker.c **** while (milliseconds > 0)
1435 .LM186:
1436 06bc 8091 0000 lds r24,milliseconds
1437 06c0 9091 0000 lds r25,(milliseconds)+1
1438 06c4 892B or r24,r25
1439 06c6 39F0 breq .L99
1440 .L97:
452:wecker.c **** asm volatile (" nop");
1442 .LM187:
1443 /* #APP */
1444 06c8 0000 nop
1445 /* #NOAPP */
1446 06ca 8091 0000 lds r24,milliseconds
1447 06ce 9091 0000 lds r25,(milliseconds)+1
1448 06d2 892B or r24,r25
1449 06d4 C9F7 brne .L97
1450 .L99:
453:wecker.c **** }
Die 16bit Variable milliseconds wird in einer Interruptroutine jede
Millisekunde um eins runtergezählt:
263:wecker.c **** milliseconds--;
604 .LM77:
605 .LBB3:
606 01f0 8091 0000 lds r24,milliseconds
607 01f4 9091 0000 lds r25,(milliseconds)+1
608 01f8 0197 sbiw r24,1
609 01fa 9093 0000 sts (milliseconds)+1,r25
610 01fe 8093 0000 sts milliseconds,r24
Ich bekomme jetzt unregelmässige Zeiten in delayms(), sie sind meist
kürzer als die eingestellte Zeit. Woran kann es liegen?
milliseconds ist definiert als:
static volatile uint16_t milliseconds=0;
Ich hab das gesamte Programm angehängt, falls es hilft.
delay hab ich in lcd.c (nicht angehängt) und sieht so aus: