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
Dir hat doch schon be AVRfreaks jemand geschrieben, daß Deine vermeintliche Endlosschleife keine ist...
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
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
Trotzdem fehlt doch (der Vollständigkeit halber ;)) noch ein ; bei deiner Endlosschleife in dem Code weiter oben, oder? Also for(;;) ;
für sauberen code schon, so wie es jetzt dasteht wäre es wohl äquivalent zu for(;;){ return 0; } ? Sebastian
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.