Forum: Compiler & IDEs tiny26 + interrupts + reset


von Sebastian Kalauer (Gast)


Lesenswert?

Hallo,

ich kämpfe nun schon seit langer Zeit mit dem AVR - bisher meist als
Sieger. Aber der tiny26 zeit merkwürdiges Verhalten im Zusammenhang mit
dem avr-gcc.

Folgendes kurzes Programm:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

/*TIMER0 overflow interrupt*/
SIGNAL(SIG_OVERFLOW0){
    PORTB^=1;   /* toggle PORTB0 */
    TCNT0=0x7f; /* reload counter */
}

int main(){
    char c;
    DDRB=0xff;
    TCNT0=0x7f;      /* load counter */
    TCCR0=1;         /* count with cpu clock */
    sbi(TIMSK,TOIE0);/* enable TIMER0 OVI */
    sei();           /* enable interrupts */
    for(c=0x0f;c!=0;c--)
        PORTB^=2; /* toggle PORTB1 */
    for(;;) /* endless loop */
    return 0;
}

sollte ja kurz nach dem Reset ein wenig auf PORTB1 wackeln und danach
nur noch über den TIMER0-Interrupt PORTB0 toggeln. Leider zeigt die
Realität ein anderes Bild. Nach jedem TIMER-Interupt wird der Code zum
Ändern von PORTB1 durchlaufen - der AVR scheint also irgendwie zum
RESET-Vektor zu gelangen. Warum und Wie?
Ich habe um Fehlerquellen auszuschliessen auch die Optimierung variiert
- ohne Ergebniss. Ohne Angabe von "-O" tut sich auf PORTB1 gar
nichts. Auch scheint es egal zu sein, was ich in TCNT0 nachlade. Wird
der tiny26 nicht voll unterstützt? Was habe ich nicht kappiert?

PS: Ähnliche Symptome habe ich mit dem 2343 erfahren.

Sebastian

von Joerg Wunsch (Gast)


Lesenswert?

Dir hat doch schon be AVRfreaks jemand geschrieben, daß Deine
vermeintliche Endlosschleife keine ist...

von Sebastian Kalauer (Gast)


Lesenswert?

Hallo, es kann nicht daran liegen, das hier die Endlosschleife
wegoptimiert wurde. gcc fügt unter dem Symbol _exit automatisch eine
ein.

Beispiel:

#> avr-objdump -S main.elf|tail
  a2:   d9 f7           brne    .-10            ; 0x9a
    for(;;)    /* endless loop */
    return 0;
}
  a4:   80 e0           ldi     r24, 0x00       ; 0
  a6:   90 e0           ldi     r25, 0x00       ; 0
  a8:   00 c0           rjmp    .+0             ; 0xaa

000000aa <_exit>:
  aa:   ff cf           rjmp    .-2             ; 0xaa
                        ^^^^^^^^^^^
... wie man sieht sollte er nicht "resetten".

Sebastian

von Sebastian Kalauer (Gast)


Lesenswert?

Gestern abend habe ich diese Frage auch in einem anderen Forum gestellt.
Dort ist nun die Lösung aufgetaucht. Ich habe beim Linken der
Objektdateien nicht den Hardwaretyp angegeben - wusste nicht, dass das
dort auch notwendig ist - aber wie soll er sonst wissen wie gross der
Chip ist und so. Ist schon logisch.

Danke für eure Mühe - ich gehe mich erstmal selbstkasteien.

Sebastian

von Christoph (Gast)


Lesenswert?

Trotzdem fehlt doch (der Vollständigkeit halber ;)) noch ein ; bei
deiner Endlosschleife in dem Code weiter oben, oder?

Also

for(;;)
;

von Sebastian Kalauer (Gast)


Lesenswert?

für sauberen code schon, so wie es jetzt dasteht wäre es wohl äquivalent
zu

for(;;){
    return 0;
}

?

Sebastian

von Joerg Wunsch (Gast)


Lesenswert?

Lohnt sich eben nicht, in zwei Forums gleichzeitig zu posten.  Die
Antwort bei AVRfreaks war ja auch von mir... ;-)

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.