Forum: Mikrocontroller und Digitale Elektronik Interrupts und 16bit Variablen


von Fritz Ganter (Gast)


Angehängte Dateien:

Lesenswert?

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:

von Fritz Ganter (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.