Hallo Leute, ich sitz grad vor einem Problem. Ich hatte eine UART Verbindung erfolgreich eingerichtet, und alles lief in meinem Programm. Jetzt hab ich noch weiter programmiert und komischerweise geht es nicht mehr über den Interrupt. Damit ich Fehlerquellen einschränken kann, hab ich ein neues Programm mit der UART Schnittstelle geschrieben. Und siehe da, hier funktioniert es auch nicht mehr. Es geht übrigens ums senden der Daten über den Interrupt. Wenn ich direkt eine Zeichen schreibe, wird dieses auch auf dem PC dargestellt (Software: mttty). Es hat ja auch schon funktioniert, vielleicht seh ich den Wald vor lauter Bäumen nicht mehr. Hab den Quellcode des Testprogrammes angehangen. Programmieren tue ich über einen JTAGer (JTAG ICE) mit AVR4.19. Compilieren über AVR5. Chip: AT90CAN128 Hoffe jemand sieht den Fehler. Bin ratlos. Kann eine falsche Fuse-Einstellung schuld sein. Ich werd gleich nochmal ein Bild davon machen.
komisch, irgendwie geht es mal und mal auch nicht? Ich steh aufm Schlauch. Ist übrigens das OLIMEX AVR-CAN Evaluations-Board
Hi > while(1) > { > UDR0='B'; //TODO:: Please write your application code Wo ist die Stelle, an der du abfragst, ob UDR0 überhaupt frei ist? MfG Spess
Du meinst diese Zeile? while ( !(UCSR0A & (1<< UDRE0)) ); hab ich jetzt noch davor gesetzt. Aber kommt das gleiche bei rum. Durch das hinzufügen der Zeile, geht es wenigstens immer, das das richte Zeichen 'B' angezeigt wird. Ein Testprogramm von der Homepage (OLIMEX) läuft auch einwandfrei, jedoch werden hier keine Interrupts benutzt. Also muss der Fehler ja dort liegen, aber ich seh einfach nicht wo. Die ISR(....) müsste es wohl sein, aber da steht laut Internet das richtige drin und es lief ja auch schon alles mal.
1 | UCSR0B |= (1<<TXCIE0) ... |
2 | ...
|
3 | ISR(USART0_UDRE_vect) |
Das passt nicht zusammen. Außerdem ist es einigermaßen sinnfrei, sowohl im Interrupt, als auch in einer Endlosschleife in main zu senden.
Ist ja nur nen Test gewesen, ich hab das aus der main schon entfernt, sollte nur verbildlichen, das es dort funktioniert und im ISR nicht. Das muss ich mir eben mal im Datenblatt anschauen. Komisch, dass das alles schon ging. Da hatte ich aber ISR(SIG_UART0_TRANS) benutzt.
Verdammte Axt, hab mal folgendes ergänzt UCSR0B |= (1<<UDRIE0); funktioniert nun. Danke euch für die 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.