Fehler vom Compiler?

OP Persönliche Seite #1428465
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
#1428483
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
Gast #1428511
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.
#1428536
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.
Gast #1428540
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren