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
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
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.
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
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.
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
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 ?!
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
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?
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
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
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?
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