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:
Sorry, hab den delay() Code vergessen:
124:lcd.c **** delay (uint16_t us)
125:lcd.c **** {
111 .LM1:
112 /* prologue: frame size=0 */
113 /* prologue end (size=0) */
126:lcd.c **** while (us)
115 .LM2:
116 0000 0097 sbiw r24,0
117 0002 11F0 breq .L7
118 .L5:
127:lcd.c **** us--;
120 .LM3:
121 0004 0197 sbiw r24,1
122 0006 F1F7 brne .L5
123 .L7:
128:lcd.c **** }
125 .LM4:
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.