Forum: Compiler & IDEs AVR ISR Probleme


von Gerhard G. (gergap)


Angehängte Dateien:

Lesenswert?

Hallo

ich bin gerade am verzweifeln. Seit zwei Tagen versuche ich AVR 
Toolchain Problem zu lösen (oder meine eigenen, bin nicht sicher).
Google, Forenbeiträge lesen, Datenblätter wälzen, verschiedene Toolchain 
Versionen, hat alles nix gebracht. Ich hoffe es liegt einfach an meinen 
Code...

Problem 1) _delay_ms() geht nur mit konstanten die zur compilezeit fest 
stehen. Soweit habe ich das schon kapiert.
Also habe ich eine Wrapper Funktion gemacht

void my_delay_ms(uint16_t count) {
  while(count--) {
    _delay_ms(1);
  }
}

Funktioniert mit konstanten und mit lokalen variablen. Sobald ich aber 
eine globale variable nehme oder eine lokale static definiere gehts 
nicht mehr.
Ich toggle ein Pin mit my_delay_ms(100) und es geht wir erwartet.
Mit einer globale variable und dem sebeln Wert toggelt der Pin im µs 
Bereich, als hätte der Code keine Funktion mehr.

Problem 2) Habe schließlich aufgegeben und wollte das über einen 
Timer-Interrupt steuern. Schon stieß ich auf das nächste Problem. Sobald 
ich sei() Aufrufe scheint nichts mehr zu gehen.

Problem 3) Damit ich besser sehe was passiert (habe keinen 
jtag-debugger) implementiere ich UART Kommunikation. Das geht auch ohne 
Interrupts.
Ich teste hier also auch noch mal ob ich das mit interrupts hinbekomme 
und wieder geht nichts.

Anbei ist ein einfaches auf das Minimum reduzierte UART-Beispiel mit ISR 
für den Empfang.
1.) Es gibt Hello aus ohne ISR (geht)
2.) Schickt 3 empfangene Zeichen als Echo zurück ohne ISR (geht)
3.) Danach aktiviere ich die interrupts mit sei() -> reset gibt wieder 
hello aus.

Eine ISR für USART_RX_vect ist natürlich vorhanden, wird aber 
anscheinend nie betreten. (habe ich mit dem oszi und einem IO getestet)
Eine ISR für BADISR_vect um eventuelle vergessen Interrupts abzufangen 
hat auch nix geholfen.

Ich hoffe mir kann da jemand helfen.

Ach ja, hier noch meine aktuelle Toolchain, falls es da dran liegen 
soll:
binutils 2.21
gcc 4.3.4
avr-libc 1.7.1
HW läuft mit 8MHz Quarz (habe ich an PB0 mit entsprechendem FUSE bit und 
Oszi überprüft)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Deinen LDFLAGS fehlt die -mmcu=-Einstellung.

von Gerhard G. (gergap)


Lesenswert?

Du bist der Held des Tages. Das wars.

Da hätte ich noch ewig gesucht. Danke. Danke. Danke.

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.