mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Subfunktion falsch uebersetzt?


Autor: Hegy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

aus dem main()-Teil rufe ich eine sleep(uint milisec)-Fkt. auf.
Allerdings tutst diese sleep()-Fkt. nicht. Also habe ich statt des
Aufrufs im main()-Teil die sleep-Funktion da direkt reingebaut und dann
funktioniert das. Warum geht das als Subfunktion nicht? Der Code dazu,
der NICHT funktioniert:
int main(void)
{
  // Initialisierung der Ports..
  sei();

  while(1) // Warteschleifentest, Parameter in ms
  {
    sleep(5);
  }
  return 0;
}

void sleep(unsigned int waittime)
{
  // Timer 0, 8-Bit initialisieren
  w = 256-29;
  TCNT0 = w; // 29 Inkrementierungen bis Interrupt -> 29 x 34.722us =
1.00694 ms
  TCCR0B = (1<<CS02); // Timer 0, Prescaler = 256 f. Wartezeiten von
34.722 us pro TCNT0 Inkermentierung
  //TIFR0 = (1<<TOV0);

  do
  {
    TIMSK0 = (1<<TOIE0); // Timer Overflow Interrupt Enable 0
einschalten
    asm volatile("NOP"); // tu_was_gescheites();
    PORTD = ~PORTD;  // Kontrolle mit Scope
  }while(waittime > 0);
  TIMSK0 = 0;
  PORTB = ~PORTB;  // Kontrolle mit Scope
}

ISR(SIG_OVERFLOW0)
{
  waittime--;
  TCNT0 = w;
}

Funktionieren tut's aber, wenn ich anstatt des sleep(5)-Aufrufs die
komplette sleep-Routine da reinbaue, und vor der do...while Schleife
die Variable waittime auf 5 setzte (waittime = 5;).

Versteh ich nicht, warum das so ist.

Ichb habe mir auch mal das Listing dazu angekukkt (*.lss), darin wird
die do...while Schleife anders uebersetzt, wenn die in einer
Subfunktion aufgerufen wird. Da heisst es naemlich (Zeilen mit >)

---
    PORTD = ~PORTD;
  84:   8b b1           in      r24, 0x0b       ; 11
  86:   80 95           com     r24
  88:   8b b9           out     0x0b, r24       ; 11
    //PORTB = ~waittime;
  }while(waittime > 0);
> 8a:   21 15           cp      r18, r1
> 8c:   31 05           cpc     r19, r1
> 8e:   b9 f7           brne    .-18            ; 0x7e
  TIMSK0 = 0;
  90:   10 92 6e 00     sts     0x006E, r1
---
(funzt nicht!)


Das funzt aber:
---
      PORTD = ~PORTD;
  a2:   8b b1           in      r24, 0x0b       ; 11
  a4:   80 95           com     r24
  a6:   8b b9           out     0x0b, r24       ; 11
      //PORTB = ~waittime;
    }while(waittime > 0);
> a8:   80 91 00 01     lds     r24, 0x0100
> ac:   90 91 01 01     lds     r25, 0x0101
> b0:   89 2b           or      r24, r25
> b2:   a1 f7           brne    .-24            ; 0x9c
    TIMSK0 = 0;
  b4:   10 92 6e 00     sts     0x006E, r1
---

Gibt es dafuer ne Erklaerung? Ist uebrigens mit dem GCC uebersetzt
worden. Ist da evtl. ein Parameter dran Schuld?


Compiling: t.c
avr-gcc -c -mmcu=atmega48 -I. -g -DF_CPU=7372800UL
-DUART_RX_BUFFER_SIZE=128 -DUART_TX_BUFFER_SIZE=128  -Os
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wa,-adhlns=t.lst  -std=gnu99 -MD -MP -MF
.dep/t.o.d t.c -o t.o

Linking: t.elf
avr-gcc -mmcu=atmega48 -I. -g -DF_CPU=7372800UL
-DUART_RX_BUFFER_SIZE=128 -DUART_TX_BUFFER_SIZE=128  -Os
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall
-Wstrict-prototypes -Wa,-adhlns=t.o  -std=gnu99 -MD -MP -MF
.dep/t.elf.d t.o --output t.elf -Wl,-Map=t.map,--cref    -lm

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Gibt es dafuer ne Erklaerung?

waittime ist in der Funktion sleep() eine lokale Variable
und hat nichts mit der gleichnamigen globalen Variablen
waittime zu tun, die in der ISR runtergezaehlt wird.

Du hast ganz einfach 2 Variablen namens waittime.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast da zwei verschiedene "waittime" Variablen. Die eine ist der
Parameter von sleep() und die andere wird im Interrupt benutzt. Wobei
ich nicht erkennen kann, wo letztere definiert ist.

Autor: Hegy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aaaaaaaaaaaaaaaaaaaaaahhhhhhhhhhhhhh, jetzt ja .........

Also, die waittime in der ISR ist eine globale Variable (static
volatile unsigned int waittime;), die in der sleep Function heisst auch
so, ist aber eine total andere......jaja, wenn man nicht richtig
hinkukkt, und schon ueber 3 Tage an sich selber zweifelt..

So, habe mal die waittime in Parameter der sleep()-Fkt. in wait
umbenannt, in sleep() die Zeile "waittime = wait;" reingebaut und
sieh mal einer kukk, es geht!

Danke!
Und jetzt ab inne Heia. Morgen wieder an Schippe 16.

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.