Forum: Mikrocontroller und Digitale Elektronik UART am 2333 will nicht


von Andreas Reich (Gast)


Lesenswert?

Hallo,

ich habe schon alles probiert, ich kriege den UART am 2333 einfach nicht 
zum Laufen.

Ich habe zum Testen jetzt mal per Transistor eine LED an TXD gehängt und 
den Baudraten-Teiler extrem hoch eingestellt. Eigentlich müsste an der 
LED ein Flackern zu sehen sein, aber nichts passiert.

(Vorher habe ich es natürlich normal getestet, mit normaler Baudrate und 
mit einem Pegelwandler - aber da kam am PC auch nix an.)

Hier ist das Testprogramm:

.include "2333def.inc"
.def temp = r16

ldi temp, low(RAMEND) ;Stackpointer initialisieren
out SPL, temp

sbi UCSRB,TXEN                   ;TX aktivieren

ldi temp,255                         ;Baudrate so gering wie möglich 
setzen
out UBRRH,temp
out UBRR,temp

loop:
ldi temp, 'T'
rcall serout
ldi temp, 'e'
rcall serout
ldi temp, 's'
rcall serout
ldi temp, 't'
rcall serout
ldi temp, '!'
rcall serout
ldi temp, 10
rcall serout
ldi temp, 13
rcall serout
rjmp loop

serout:
  sbis UCSRA,UDRE   ;Warten, bis UDR bereit ist
  rjmp serout
  out UDR, temp
ret

von Günter König (Gast)


Lesenswert?

Hi Andreas,
ich vermute, das der Fehler in der Baudrate Einstellung liegt.
Das richtige verhältniss errechnet sich aus

fbaud = Quarzfreq. /(16*(ubrr+1))

also ist der Wert f. 9600baud

ubrr = quarzfreq. / (9600*16)-1


Lasse mal die 3 Zeilen für das UBRR Register weg und ersetze sie durch

ldi temp,4000000/(9600*16)-1
out ubrr,temp

Wenn du jetzt deinen PC auf 9600Baud, kein Handshake, 8 Datenbits, 1 
Stoppbit, keine parität einstellst dann sollte es gelingen.
Solltest du einen anderen Quarz als 4MHz benutzen, entsprechen die 
Frequenz natürlich einsetzen.

Für die Subroutine "SEROUT" schreibe mal:

serout:
sbis USR,UDRE
rjmp serout
out UDR,temp
ret

Gutes gelingen
Günter

von Andreas Reich (Gast)


Lesenswert?

Hallo Günter,

das mit der Baudrate hatte ich zuerst, für 5 MHz Quarz und 9600 baud ist 
32 rausgekommen. Aber jetzt wollte ich eben erstmal mit einer LED 
testen, ob am TXD-Pin irgendwas rauskommt - dazu habe ich den Teiler so 
hoch wie möglich gesetzt, damit die einzelnen Impulse möglichst langsam 
kommen.

Deine Änderung in serout besteht ja nur in USR statt UCSRA, das USR gibt 
es aber im 2333 gar nicht. Das Register heisst da UCSRA, und das enthält 
laut Datenblatt auch das UDRE-Bit. Also müsste das eigentlich stimmen.

von Günter König (Gast)


Lesenswert?

Ja Andreas,
das mag sein, ich habe es aus meiner Routine für den 8535 entnommen.
Aber ich find das Register ubrrh nicht. Leider habe ich auch kein 
Datenblatt vom 2333 da. Beim 4413 usw. gibt es das wohl nicht.
Was hast du den für einen Transistor genommen?

Gruß,
Günter

von Andreas Reich (Gast)


Lesenswert?

In meinem 2333 ist die Baudrate ein 12-bit-Wert. Die unteren acht Bit 
liegen in UBRR, die oberen vier in UBRRH.

Der Transistor ist ganz normal BC547C, 10k Basiswiderstand. An anderen 
Ports funktioniert das auch wunderbar, nur am TXD kommt nichts raus.

von Uwe (Gast)


Lesenswert?

Hi,

Eigentlich sollte es gehen. Funktioniert PD1 überhaupt als Ausgang?
Normal brauchst du es ja nicht, aber setze doch mal PD1 permanent als 
Ausgang. Solange TXEN=1 sind keine Fehler zu erwarten.

Gruß Uwe

von Andreas Reich (Gast)


Lesenswert?

Hallo Uwe,

da scheint wohl der Fehler zu sein:
Ich habe einfach mal ein Programm geschrieben, das nichts weiter macht, 
als den gesamten Port D als Output konfiguriert und auf HIGH setzt - 
dann überall nachgemessen, und siehe da: Überall hübsch 5V, nur auf PD1 
und PD2 0V!
Bloß warum ?!

von Günter König (Gast)


Lesenswert?

Tag Andreas,
es eigentlich egal wie du den Port D setzt, wenn du den UART aktiverst 
sind PD0 und PD1 als RX und TX geschaltet. Schalte mal deine UART 
Routine ab, nehme den MAX232 weg und du wirst sehen, das PD0 und PD1 
auch als Ausgang laufen.
Ich habe mal wegen dem 2333/4433 geschaut, deine Routine sollte 
eigentlich laufen.

Gruß,
Günter

von Andreas Reich (Gast)


Lesenswert?

Hallo Günter,
das dachte ich zuerst auch - aber der UART ist in dem Testprogramm gar 
nicht aktiviert.
Es setzt NUR Port D als Ausgang und setzt ihn auf HIGH.

Außerdem sind es ja PD1 und PD2, die nicht gehen, nicht PD0 und PD1. 
Womöglich sind die beiden Ausgänge einfach zerschossen?

von Günter König (Gast)


Lesenswert?

Hi Andreas,
wollen ja nicht hoffen, das die Ports komplett zerschossen sind. Lege 
doch mal PD1 und PD2 über 4,7KOhm nach +5V und konfiguriere den 
kompletten Port D nochmal als Ausgang. Dann teste nochmal ob du PD1 und 
2 auf L bzw. auf H setzen kannst.
Wenn das nur mit diesen beiden Ausgängen nicht klappt, dann ist er wohl 
wirklich gehimmelt.

Ich mache hier im Moment auch mit dem UART rum und habe diesbezüglich 
überhaupt keine Probleme (4414).

Gruß,
Günter

von Uwe (Gast)


Lesenswert?

Hi,
also wenn die 4,7K nichts bringen, hau wech dat Ding oder mach was 
anderes damit. Ich hatte jetzt mal nen 1200-erter da wollte int0 auf 
einmal nicht mehr, da muß er eben Weichen auf des Sohnes Eisenbahn 
steuern.

Gruß Uwe

von Andreas Reich (Gast)


Lesenswert?

Das mit den 4,7K-Pullups hat leider auch nicht geklappt. Wenn ich den 
ganzen Port auf Low setze, sind die beiden Pins immer noch High (durch 
die Pullups).
PD1 und PD2 benehmen sich also völlig tristated. Gibt es noch Hoffnung?

von Günter König (Gast)


Lesenswert?

Hi Andreas,
wenn du alles richtig gemacht hast (ddrd auf 1 gesetzt) und so, glaube 
ich das du mal einen anderen 2333 testen solltest. Die Zeit ist wohl 
jetzt reif dafür.

Mein Beileid zum ableben des ehrwürdigen µProz

Günter

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.