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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.