Forum: Mikrocontroller und Digitale Elektronik UART AT90CAN128 Senden


von Kai K. (kaya)


Angehängte Dateien:

Lesenswert?

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.

von Kai K. (kaya)


Angehängte Dateien:

Lesenswert?

Hier noch die Fuses.

nicht im Bild: brown-out detection disabled

von Kai K. (kaya)


Lesenswert?

komisch, irgendwie geht es mal und mal auch nicht? Ich steh aufm 
Schlauch.

Ist übrigens das OLIMEX AVR-CAN Evaluations-Board

von spess53 (Gast)


Lesenswert?

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

von Kai K. (kaya)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

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.

von Kai K. (kaya)


Lesenswert?

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.

von Kai K. (kaya)


Lesenswert?

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
Noch kein Account? Hier anmelden.