mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupts und 16bit Variablen


Autor: Fritz Ganter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.