Forum: Mikrocontroller und Digitale Elektronik PIC18 UART Problem


von Martin S. (drunkenmunky)


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?

von Christian K. (Firma: Atelier Klippel) (mamalala)


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

von Martin S. (drunkenmunky)


Lesenswert?

Hab ich schon gemacht. Und auch mit nem Oszi nachgemessen.

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

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Der interne RC ist besser als er immer verschrieen wird.

Nutze evtl. mal 2 Stop-Bits.

Ich nutze immer FTDI-Chips zur Wandlung. Einmal habe ich so einen 
PL-xxxx genutzt, aber der machte mir echte Probleme. Kabel mit FTDI 
angeschlossen und alles war gut.

von Christian K. (Firma: Atelier Klippel) (mamalala)


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

von Stefan R. (stefan_r54)


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.

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.