tiny26 + interrupts + reset

Gast #40726
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
Gast #40728
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
Gast #40729
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

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