Forum: Mikrocontroller und Digitale Elektronik Attiny3217: Interrupt fuer UART-RX wird nicht ausgeloest.


von Marc P. (marc_p649)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich versuche gerade meine Uart-Schnittstelle auf einem ATtiny3217 zu 
programmieren. Leider gelingt es mir nicht, dass der zugehoerige 
Interrupt ausgeloest wird. Wenn ich die Daten polle, sehe ich, dass der 
ATtiny das bzw. die Byte(s) empfaengt.

Um zu ueberpruefen, ob mein Programm etwas an den Einstellungen 
vermurxt, habe ich ein neues Projekt (ueber Atmel Start) erstellt, das 
nur aus einer UART-Schnittstelle und einer Status-LED besteht, die bei 
Ausloesen des Interrupts toggeln soll. Wenn ich mit dem Debugger auf dem 
uc bin, dann wird der Breakpoint im Interrupt nicht erreicht.

Den Quellcode sowie das Projekt findet ihr im Anhang.

Meine bisherigen Schritte:
- Globale Interrupts sowohl ueber das Projekt als auch ueber sei() 
aktiviert
- Globale Interrupts vor der Aufrufen von driver_init() deaktiviert (im 
Datenblatt auf Seite 315 wird empfohlen, dass die Interrupts bei der 
Initialisierung deaktiviert sein sollen) und nach der Initilisierung 
aktiviert.
- Attiny gewechselt (also von der Zielplatine zum Evalboard)
- Definitionen von ISR-Routinen in unterschiedliche Dateien geschrieben

Die .map-Datei schaut aus als ob die ISR-Funktionen nicht vergessen 
wurden.
Dennoch wirkt es fuer mich, als waere an der Konfiguration von den 
Interrupts irgend etwas nicht richtig.

Im Datenblatt steht auch noch, dass vor dem UART CPUINT und SREG 
eingestellt werden muessen. Letzteres passiert, wenn ich mich nicht 
taeusche, ueber sei() und cli(), ersteres wirkt fuer mich, als ob ich 
nicht wirklich etwas einstellen muesste.

Aktuell benutze ich das Attiny3217Xplainedpro board. Die 
Uart-Nachrichten sende ich ueber einen TTL-Adapter ueber USB von meinem 
Laptop aus. Am Oszi schauen die Signale gut aus (und werden wie vorhin 
auch beschrieben richtig empfangen).

Hat jemand einen Tipp, wie ich weiter vorgehen kann?

Vielen Dank im Voraus.

Link zum Datenblatt:
https://ww1.microchip.com/downloads/aemDocuments/documents/MCU08/ProductDocuments/DataSheets/ATtiny3216-17-DataSheet-DS40002205A.pdf

von Ingo L. (corrtexx)


Lesenswert?

Pack doch den Code bitte nicht als Zip in den Anhang, sonder als c-file

von Wilhelm M. (wimalopaan)


Lesenswert?

Und am besten ein MCVE in einer Datei. Und: oft wird durch die Reduktion 
darauf schon der Fehler sichtbar und es erübrigt sich das nachfragen ;-)

von Marc P. (marc_p649)


Angehängte Dateien:

Lesenswert?

Ingo L. schrieb:
> Pack doch den Code bitte nicht als Zip in den Anhang, sonder als c-file

Sorry, nicht mitgedacht. Wollte alles zugaenglich machen.

Habe die c-Dateien angehaengt.

Das MCVE reiche ich morgen frueh nach. Hab das Evalboard nicht bei mir 
und will euch jetzt nicht irgend einen falsch zusammenkopierten Code 
posten.

: Bearbeitet durch User
Beitrag #7437445 wurde vom Autor gelöscht.
Beitrag #7437452 wurde vom Autor gelöscht.
von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

»So viel Geschrei und wenig Wolle!«, sagte die Hexe.

Vielleicht möchten Sie sich an einem Einfachst-zu-Fuß-Programm (eines
Assemblerprogrammierers) orientieren (läuft auf dem ähnlichen
ATmega4809) - wenn nicht, einfach ignorieren.

von Dieter R. (drei)


Lesenswert?

Du musst dich schon entscheiden, was du willst.

Aus USART0_RXDATAL wird in main und in der ISR gelesen. Beides zusammen 
geht nicht.

Richtig wäre es, einen Ringpuffer anzulegen, der in der ISR befüllt wird 
und aus dem in main gelesen wird. Vermutlich gibt es dazu auch ein 
START-Codebeispiel, und vermutlich ist dieses unnötig kompliziert. 
Praktische Übung wäre dann, es zu vereinfachen.

von Ingo L. (corrtexx)


Lesenswert?

Trotzdem sollte er ja schneller im Interrupt sein als aus der delay(20), 
daher wundert es mich, dass die ISR nicht geht

von Marc P. (marc_p649)


Lesenswert?

Dieter R. schrieb:
> Du musst dich schon entscheiden, was du willst.
>
> Aus USART0_RXDATAL wird in main und in der ISR gelesen. Beides zusammen
> geht nicht.

USART0_RXDATAL hab ich nur fuer Testzwecke in der while-Schleife. Ich 
habe es auch ohne abholen der Daten getestet. Dann togglt die LED halt 
im circa 20-ms-Takt. Ich sende die Nachrichten im Sekundentakt. Mit dem 
Abholen der Daten kann ich die Interrupt-Flag loeschen.

Wenn ich die if-Bedingung in der while-Schleife komplett loesche oder 
auskommentiere, dann blinkt die LED gar nicht. :(

von Marc P. (marc_p649)


Lesenswert?

> Vielleicht möchten Sie sich an einem Einfachst-zu-Fuß-Programm (eines
> Assemblerprogrammierers) orientieren (läuft auf dem ähnlichen
> ATmega4809) - wenn nicht, einfach ignorieren.

Ich probier morgen auch nochmal aus wirklich nur die aller noetigsten 
UART-Register zu setzen. Danke fuer den Vorschlag.

von Dieter R. (drei)


Lesenswert?

Marc P. schrieb:

> USART0_RXDATAL hab ich nur fuer Testzwecke in der while-Schleife.

Aus einem grundsätzlich falschen Testprogramm irgendetwas schließen zu 
wollen, ist ziemlich müßig.

Wie wäre es, wenn du erst einmal eines der sicherlich vorhandenen 
Codebeispiele von Microchip für das Evaluation Board zum Laufen bringst 
(mit Ringbuffer) und dann weitersiehst?

von Marc P. (marc_p649)


Lesenswert?

Dieter R. schrieb:
> Wie wäre es, wenn du erst einmal eines der sicherlich vorhandenen
> Codebeispiele von Microchip für das Evaluation Board zum Laufen bringst
> (mit Ringbuffer) und dann weitersiehst?

Auch das werde ich probieren. Danke fuer den Tipp :)

von Marc P. (marc_p649)


Lesenswert?

Hallo,

noch ein Nachtrag zur Loesung meines Problems.

Habe gestern morgen ein komplett neues Projekt aufgesetzt, beim dem beim 
Evalboard die Interrupts wieder nicht ausgeloest wurden. Habe das 
Programm dann auch meine Platine gespielt und da wurden auf einmal die 
Interrupts ausgeloest. Danach habe ich mein urspruengliches 
Programm/Projekt drauf gespielt und die Interrupts haben wieder nicht 
funktioniert.

Dann habe ich mein urspruengliches Projekt schrittweise komplett neu 
aufgesetzt um zu schauen ob irgendetwas in der Konfiguration 
durcheinander gewuerfelt wird. Das war aber nicht der Fall. Also 
funktioniert jetzt alles.

Deshalb vermute ich, dass in meinem urspruenglichen Projekt irgendetwas 
verwuerfelt wurde (warum auch immer) und das Evalboard defekt ist und 
der eine Fehler den ich vermutet habe somit zwei unabhaengige Fehler 
sind.

Danke fuer eure Hilfe :)

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.