Forum: Compiler & IDEs Fehler vom Compiler?


von Steven (. (ovular) Benutzerseite


Lesenswert?

aus
1
  delay_time_10ms = 100;    // simple delay
2
  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

von Sven P. (Gast)


Lesenswert?

Meinste?

von Karl H. (kbuchegg)


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 :-)

von Steven (. (ovular) Benutzerseite


Lesenswert?

Seid ihr Müde???
Trinkt mal n Kaffee, das hilft.

Und schonmal was von Interrupts gehört?

von Simon K. (simon) Benutzerseite


Lesenswert?

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

von Karl H. (kbuchegg)


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

von Juergen (Gast)


Lesenswert?

volatile?

von Steven (. (ovular) Benutzerseite


Angehängte Dateien:

Lesenswert?

Sorry.

von Sven P. (Gast)


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
1
  delay_time_10ms = 100;    // simple delay
2
  while (delay_time_10ms != 0);

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

Und das ist vollkommen korrekt.

von yalu (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

ISR(TIMER0_OVF0_vect)

wird die überhaupt aufgerufen?

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

von Steven (. (ovular) Benutzerseite


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...

von Karl H. (kbuchegg)


Lesenswert?

TIMSK = 2;

Ist das korrekt für den Overflow-Interrupt?
1
void Timer_Init()
2
{
3
  
4
5
  TCCR0 = 2;
6
  TCNT0 = 155;
7
  TIMSK = 2;
8
  
9
}


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

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.

von Peter (Gast)


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)

von Steven (. (ovular) Benutzerseite


Lesenswert?

Sorry das Programm hab nicht ich geschrieben.

Hat sich aber erledigt, es funktioniert...

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.