mikrocontroller.net

Forum: Compiler & IDEs Fehler vom Compiler?


Autor: Steven () (ovular) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aus
  delay_time_10ms = 100;    // simple delay
  while (delay_time_10ms != 0);
wird
>62:         delay_time_10ms = 100;    // simple delay
>>+0000002D:   E684        LDI       R24,0x64       Load immediate
>>+0000002E:   93800067    STS       0x0067,R24     Store direct to data space
>63:         while (delay_time_10ms != 0);
>>+00000030:   91800067    LDS       R24,0x0067     Load direct from data space
>>+00000032:   2388        TST       R24            Test for Zero or Minus
>>+00000033:   F7E1        BRNE      PC-0x03        Branch if not equal

R24 wird immer wieder mit 100d geladen!
Was kann ich da machen?

O2, tny26

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meinste?

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

Bewertung
0 lesenswert
nicht lesenswert
Steven W. schrieb:

> R24 wird immer wieder mit 100d geladen!

100d wären aber hex 64 :-)

Aber abgesehen davon, könntest du ja mal in der Schleife auch 
delay_time_10ms tatsächlich verändern :-)

Autor: Steven () (ovular) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Seid ihr Müde???
Trinkt mal n Kaffee, das hilft.

Und schonmal was von Interrupts gehört?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versteh das Problem nicht, der Assembler Code macht doch exakt das, 
was im C Code steht.

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

Bewertung
0 lesenswert
nicht lesenswert
Steven W. schrieb:
> Seid ihr Müde???
> Trinkt mal n Kaffee, das hilft.
>
> Und schonmal was von Interrupts gehört?

Schon mal was davon gehört, dass man bei einer Frage alle relevanten 
Informationen angeben sollte? Wenn eine Variable durch einen Interrupt 
verändert wird, nenne ich das relevant!
Und diese Interruptabhängigkeit solltest du vielleicht nicht nur uns 
sagen, sondern auch dem Compiler. Stichwort - volatile

Und wenn es das auch nicht ist, könnten dann euer Hochwohlgeboren 
eventuell, nur wenn es nicht zuviele Umstände macht, ein klein wenig 
mehr Code herzeigen. An ein in sich geschlossenes, vollständiges 
Beispiel wage ich dabei noch nicht einmal im Traum zu denken.

Untertänigst

Autor: Juergen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile?

Autor: Steven () (ovular) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich weiß nich, normalerweise wärs ja auch das erste, was man sagen 
würde: Zu wenig Information.

Aber aus dem Listing-Schnippel geht eigentlich alles hervor, was zur 
Beantwortung der Fragestellung nötig ist:

Aus
  delay_time_10ms = 100;    // simple delay
  while (delay_time_10ms != 0);

wird
>62:         delay_time_10ms = 100;    // simple delay
+0000002D:   E684        LDI       R24,0x64       Load immediate
+0000002E:   93800067    STS       0x0067,R24     Store direct to data space
>63:         while (delay_time_10ms != 0);
+00000030:   91800067    LDS       R24,0x0067     Load direct from data space
+00000032:   2388        TST       R24            Test for Zero or Minus
+00000033:   F7E1        BRNE      PC-0x03        Branch if not equal

Und das ist vollkommen korrekt.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wär's mit einem Disassembler, der relative Sprünge auch absolut
anzeigt? avr-objdump ist bspw. so einer.

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

Bewertung
0 lesenswert
nicht lesenswert
ISR(TIMER0_OVF0_vect)

wird die überhaupt aufgerufen?

(Und lass das verdammte SREG Register in Ruhe! Darum kümmert sich der 
Compiler)

Autor: Steven () (ovular) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso!!!
Jetzt hab ich gemerkt, dass die Adresse0x0067 der Var: delay_time_10ms 
entspricht.

Ich hab den Fehler übrigens gefunden, ich hab das OCalibrationByte nicht 
geschrieben...

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

Bewertung
0 lesenswert
nicht lesenswert
TIMSK = 2;

Ist das korrekt für den Overflow-Interrupt?
void Timer_Init()
{
  

  TCCR0 = 2;
  TCNT0 = 155;
  TIMSK = 2;
  
}


Bitte, bitte, bitte.
Tu dir selbst und uns einen Gefallen und schreibe das in der üblichen 
Bitsetz-Notation
void Timer_Init()
{
 TCCR0 = ( 1 << CS01 );   // Vorteiler: 
 TCNT0 = 155;
 TIMSK = ( 1 << TOIE0 );
}

dann musst du dir auch nicht merken, an welcher Position welches Bits 
steht und wir müssen auch nicht nachsehen ob du dich dabei vielleicht 
verzählt hast.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auch diese Sache

 ISR(TIMER0_OVF0_vect)
    ...
    Timer_Init();
    ...


kommt mir ein wenig unschön vor, du willst bestimmt ereichen das du 
immer nach 0.1ms aufgerufen wist. Wenn es nicht sehr genau sein muss 
kann man es so machen, wenn es genau sein muss geht das nicht. Weil du 
nicht weisst wieviel Takte vergangen sind bis die ISR aufgerufen wurde. 
(es gibt befehle die dauert etwas länger und andere ISR werden erst 
komplett abgearbeitet)

Autor: Steven () (ovular) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry das Programm hab nicht ich geschrieben.

Hat sich aber erledigt, es funktioniert...

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.