www.mikrocontroller.net

Forum: Compiler & IDEs tiny26 + interrupts + reset


Autor: Sebastian Kalauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

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

Autor: Sebastian Kalauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian Kalauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph (Gast)
Datum:

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

Also

for(;;)
;

Autor: Sebastian Kalauer (Gast)
Datum:

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

for(;;){
    return 0;
}

?

Sebastian

Autor: Joerg Wunsch (Gast)
Datum:

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

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.