PIC18 UART Problem

OP #2554561
Lesenswert?

Servus,

verwende ein PIC18F26K22 mit internem Oszillator mit PLL auf 64MHz. Ich 
verwende eine asynchrone serielle Schnittstelle mit 19200 bps. Empfangen 
am PC tue ich mit einem CP2102 und HTerm.

Wenn ich jetzt z.B. alle 10ms folgenden Code aufrufe:
1
TXREG = '1';
2
Nop();
3
while( PIR1bits.TX1IF == 0 ) continue;
4
TXREG = '2';
5
Nop();
6
while( PIR1bits.TX1IF == 0 ) continue;
7
TXREG = '3';
8
Nop();
9
while( PIR1bits.TX1IF == 0 ) continue;

funktioniert alles super. Aber wenn ich nur den Code immer wieder in 
einer Schleife aufrufe, passiert es des öfteren, dass ich im HTerm nur 
Müll empfange, aber manchmal geht's nach dem Connecten auch gut:

312312312312312312312312312312312312312312312312312312312312312312312312 
312
3123123123123123123123123123123123123123123123123123123123<\0>
<\0><\0>???????????????????????????????????????????????????????????????? 
???
???????????????????????????????????????????????????????????????????????? 
???
????????????????
<\0><\0>?231231231231231231231231231231231231231231231231231231231231231 
231
231231231231231231231231231231231231231231231231231231231231231231231231 
231

Baudrate habe ich schon überprüft. Die sollte nicht das Problem sein.
Was meint ihr, woran das liegen könnte?
(Firma: Atelier Klippel) #2554623
Lesenswert?

Spiel mal mit den Divisor-Werten in den Baudraten-Registern. So ein 
interner RC Oszillator ist nicht unbedingt das genaueste, da er stark 
von der Umgebungstemperatur beeinflusst wird.

Kenne das von z.B. dem 18F2620 und internem RC. Wenn ich da den 
errechneten Wert nehme, der Chip dann in der Schaltung ist, habe ich 
auch manchmal Probleme. Setze das SPBRG dort dann um ein bis zwei 
Schritte tiefer oder höher, dann klappt es. Hängt aber auch immer mi 
davon ab wie tolerant die UART auf der Empfängerseite ist.

Grüße,

Chris
(Firma: Atelier Klippel) #2554810
Lesenswert?

Bernd Rüter schrieb:
> Der interne RC ist besser als er immer verschrieen wird.

Schlecht ist er nicht, keine Frage. Benutze die ja selber sehr oft, und 
habe auch mit 115200 Baud kein Problem damit. Es ist und bleibt aber ein 
RC. Da spielt die Temperatur halt eine Rolle, und ab und an kommen halt 
Ausreißer vor wo dir Frequenz dann doch recht daneben liegt, zumindest 
hatte ich das hier schon ein paar mal.

Manche vergessen das halt gerne und verlassen sich dann nur auf die "1% 
tolerance" die im DB stehen.

Grüße,

Chris
#2554814
Lesenswert?

Martin S. schrieb:
> Das komische ist ja, wenn ich die drei Zahlen nur alle 10ms sende,
> funktioniert es IMMER.
>
> Nur warum erschließt sich mir nicht so ganz...

Ist deshalb so, weil sich Sender und Empfänger nicht neu 
synchronisieren, wenn du kontinuierlich sendest(oder erst sehr spät)
wenn du Pausen einbaust, synchronisieren sie sich bei jedem Neustart, 
und 3 Bytes im Takt zu bleiben sollte auch bei groben Taktratenfehlern 
kein Problem sein.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren