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
Pack doch den Code bitte nicht als Zip in den Anhang, sonder als c-file
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 ;-)
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.
»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.
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.
Trotzdem sollte er ja schneller im Interrupt sein als aus der delay(20), daher wundert es mich, dass die ISR nicht geht
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. :(
> 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.
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?
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 :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.