Forum: Mikrocontroller und Digitale Elektronik UART0 Programmierung M16C/62P


von oliver (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen


Ich möchte Euch um Rat fragen betreffend der Programmierung des UART0
auf meinem Glyn Board EVBM16C/62P
Zum schreiben des Codes verwende ich den Tasking Compiler.

Ich habe an UART0 einen Transponderleser "CONRAD" angeschlossen
Die Daten welche ich empfangen möchte mit 9600 baud sind:
<STX> [Byte1] [Byte2] [Byte3] [Byte4] <EOT>

[Byte1]... usw. sind ASCII codes
STX ist 002
EOT ist 004
******************************­******************************­*******

Nun der Buffer wird gefüllt mit Zeichen, das ist OK.

Das Startbit und das Stoppbit schlagen aber nicht an.
weiss jemand wieso?
ist meine initialisierungsroutine nicht korekt?
Was müsste geändert werden? um obengenannte Daten zu empfangen

Ist U0BRG = 0x67 in der initialisierungsroutine richtig für 9600 baud?
- ich schnalle es noch nicht ganz. wie man das berechnet.
vielleicht kann mir das jemand mal erklären?

Ist die Auswertroutine für die seriellen Daten so in Ordnung?
Das müsste man doch so machen können?

Vielen Dank

Gruss Oliver













Hat jemand ein Lösungsvorschlag für dieses Problem? wie ich auch die
anderen Bytes auswerten kann.
Stimmt die Initialisierung?
Evt. mache ich einen Grundsätzlichen Fehler, welchen ich mir gerne
erklären lasse.


oder Hat jemand eine lauffähige Routine um diese eingehenden Daten aus

4 Bytes abfragen zu können?


Besten Dank jetzt schon


Oli


Antworten

von Uli Strobelt (Gast)


Angehängte Dateien:

Lesenswert?

Hi Oli.

@"Ist U0BRG = 0x67 in der initialisierungsroutine richtig für 9600
baud?"

Ja, wenn Deine System Clock auf 16 MHz steht(clock division factor = 1,
kann man bei mir im Compiler(Tasking EDE) einstellen).
Berechnung:
System Clock durch 16 teilen, dann durch die gewünschte Baudrate und
dann minus 1. Das Ergebnis ist der Wert des BRG.
z.B: ( (16000000 / 16) / 9600 ) - 1 = 103.   (== 0x67)


Mit "Startbit" und "Stopbit" meinst Du sicher "Startbyte" und
"Stopbyte"!?!
Kann nicht sagen, warum's nicht tut, weil man die Initialisierung
im Quelltext nicht sehen kann.

Grundsätzlich (nach kurzem überfliegen) würd ich sagen, dass
man das so machen kann.

Gruß,
uli

P.S: Anbei meine "se_initialize_port()" - Routine.

von Oliver (Gast)


Lesenswert?

Danke Uli für Deine Info bezüglich der Programmierung des UART0
Deine Erklärungen sind gut und auch für mich als "Anfänger" gut
verständlich.
Nun sind mir schon wieder einige Dinge klarer geworden

Ich werde mal wieder weiterprobieren, werde mich dan wieder melden

Nochmals besten Dank

Gruss Oliver

von Andreas (Gast)


Lesenswert?

Hallo

Ich weis, das ist bereits ein ziemlich alter Thread, jedoch habe auch 
gerade ein vergleichbares Problem und bin per Zufall hier gelandet. Im 
Sourcecode von Uli ist mir dabei ein kleiner Fehler aufgefallen:

Er setzt das UiBRG-Register praktisch als erstes bei seiner 
Initialisierung. Laut Datenblatt (für meinen M30626FHPFP) sollte man 
jedoch zuerst das UiC0 Register setzen, bevor man ins UiBRG-Register 
schreibt. (Jedenfalls wenn man an den CLK0 und CLK1 Bits des 
UiC0-Registers etwas ändert)

Damit ist zwar mein Problem noch nicht gelöst, aber ich wollte das nur 
ergänzen, damit möglichst keine Fehler durch solche Vorgaben entstehen.

Gruss,
Andreas

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.