Forum: Mikrocontroller und Digitale Elektronik Problem mit EUSART beim PIC18F4520


von Klaus (Gast)


Lesenswert?

Hallo zusammen,

an alle PIC-Profis hier: Ich habe ein Problem mit der EUSART beim 
PIC18F4520. Prinzipiell habe ich die Kommunikation über RS232 mit 
19200bps stabil am laufen, allerdings wird als erstes Zeichen nach einem 
Hardware-Reset immer eine 0 ausgelesen. Der Interrupt zum Empfangen 
kommt ganz normal beim ersten Zeichen, aber dieses Zeichen steht immer 
als 0 im RCREG.
Sobald dieses Zeichen durch ist, funktioniert alles wie erwartet, auch 
nach Kommunikationspausen gibt es keine Probleme, es ist immer nur das 
erste Zeichen nach einem Reset, auch wenn der Reset schon etliche 
Sekunden her war.

Hat einer so ein Problem schonmal gehabt, oder weiß so, was ich falsch 
mache?

Gruß
Klaus

von günny (Gast)


Lesenswert?

Klingt ja fast nach einem Initialisierungsproblem.
Poste doch mal Deinen code, wie Du die Schnittstelle initialisierst!

gruß

von Paul (Gast)


Lesenswert?

Hallo Klaus,

die PIC-EUSARTs weisen so manches merkwürdige Verhalten auf. Je nach 
PIC-Typ und Herstellungsdatum (Jahr und KW steht auf dem Gehäuse unter 
der Typenbezeichnung) gibt es unterschiedliche Verhalten.

Tausche vielleicht mal den Controller gegen einer aus aktueller 
Fertigung. Du kannst ihn als kostenloses Muster direkt über die 
Microchip-Internetseite anfordern.

Vielleicht arbeitet Du auch mit dem REAL ICE mit nicht ganz aktueller 
Firmware und einer älteren MPLAB-Version. Gerade im letzten Update 
wurden in diesem Bereich einige Fehler korrigiert. Alternativ arbeite 
mal mit dem ICD 2.

Ich habe in letzter Zeit einige PICs mit EUSART als serielle 
Schnittstelle programmiert. Zumindest der Datenempfang arbeitete bei mir 
ab dem ersten Byte einwandfrei. Beim Senden sind zwingend die 
Errata-Sheets zu beachten.

Gruß Paul

von Klaus (Gast)


Lesenswert?

TriRS232TX = 1;
  TriRS232RX = 1;
  TXSTA = 0x64;  // EUSART senden konfigurieren
      // asysnchron
      // 9-bit
      // high-speed
  RCSTA = 0xF0;  // EUSART empfangen konfigurieren
      // Empfang aktiv
      // Port aktiv
      // 9-bit
  BAUDCON = 0x0A;  // 16-bit Baud-Rate Generator

  SPBRGH = 1;  // 19200bps
  SPBRG = 3;  // 19200bps, 3


  RCIE=1;    //RX Interrupt enable

so initialisiere ich die EUSART

Ich arbeite mit dem ICD2, und das Problem ist sowohl beim debuggen als 
auch mit fest einprogrammiertem Code vorhanden.

von Paul (Gast)


Lesenswert?

Hallo Klaus,

Deine Initialisierung macht einen guten Eindruck.

Füge doch mal folgende Zeile in ans Ende Deiner Initialisierungssequenz 
ein:

   movf   RCREG,W

Wenn der Fehler dann immer noch auftritt, hängt das Problem vermutlich 
nicht mit dem Reset und der Initialisierung zusammen.

Auch kannst Du ein Oszilloskop an Deine Schnittstelle halten um zu 
sehen, ob vielleicht nicht doch eine Null als erstes Zeichen gesendet 
wird.

Gruß Paul

von Meister E. (edson)


Lesenswert?

Nur mal ne Frage: Wen stört das denn?

Versende Zahlenwerte in ASCII, da ist die Null bei 30h. Meines Wissens 
werden sog. 'Null-Bytes' mit dem Inhalt 00h schlicht ignoriert. Wer das 
bei eigenen Programmen nicht berücksichtigt, fängt sich Fehler ein, das 
ist klar.

Gruss,
Edson

von Klaus (Gast)


Lesenswert?

@Paul, das bringt mir leider auch keinen Vorteil und das erste Zeichen 
ist eigentlich immer eine 0x02, weil ich ein 3964-Protokoll abarbeite. 
Das habe ich auch überprüft.

@Meistee Eder
Störend ist nicht die Null an sich, sondern dass das erste gültige 
Zeichen verschluckt wird.

Ich kann mit dem Phänomen leben, da das Protokoll ja den Fehler 
ausbügelt, aber schön ist das halt nicht.

von Paul (Gast)


Lesenswert?

Hallo Meister Eder,

> Nur mal ne Frage: Wen stört das denn?

Es gibt Protokolle, da sind auch Nullen gültige Daten. Es gibt weitaus 
mehr Arten der Datenübertragung als nur die Übertragung von 
ASCII-Werten.

Und wer sagt Dir, dass der gesuchte Fehler nur in Bezug auf das Senden 
einer Null Probleme bereitet, sonder auch keine andere Auswirkungen hat?

Es macht für eine saubere Programmierung sehr viel Sinn auftretende 
Fehler zu analysieren um nicht irgendwann mit einem weiteren Effekt des 
Fehlers voll gegen die Wand zu laufen. Das unterscheidet übrigens einen 
guten Programmierer von jemanden, der auftretende Fehler nur irgendwie 
zuschmiert. Fehler kommen oft dann zurück, wenn man es absolut nicht 
gebrauchen kann.

Gruß Paul

von Meister E. (edson)


Lesenswert?

>Das unterscheidet übrigens einen guten Programmierer von jemanden, der 
>auftretende Fehler nur irgendwie zuschmiert.

In aller Unbescheidenheit meinst du mit guten Programmierer wohl dich 
selbst, oder? Von zuschmieren kann keine Rede sein, um meine 
Programmierfähigkeiten brauchst du dich auch nicht zu kümmern.

>Es gibt Protokolle, da sind auch Nullen gültige Daten. Es gibt weitaus
>mehr Arten der Datenübertragung als nur die Übertragung von
>ASCII-Werten.

Setzt der TE ein solches Protokoll ein? Was spricht gegen die 
ASCII-codierung, wenn man sichs aussuchen kann?

>Und wer sagt Dir, dass der gesuchte Fehler nur in Bezug auf das Senden
>einer Null Probleme bereitet, sonder auch keine andere Auswirkungen hat?

Stabil laufende Anwendungen, die ausser dem Senden einer unerwünschten 
Null einwandfrei funktionieren. Im übrigen habe ich hier einen 
Sick-Barcodeleser, der ebenfalls gerne Nullen ausspuckt, ohne damit 
einen weiteren Sinn zu verfolgen.

Gruss,
Edson

von NOP (Gast)


Lesenswert?

Ich hatte das gleiche Problem

Das erste Byte war immer 0 die gleich darauffolgenden Bytes waren zwar 
nicht mehr 0 sondern einfach Falsch.

Darauf hin habe ich die Initialisierung so gemacht wie es im Datenblatt 
steht (exakte reienfolge). Danach trat der Fehler nicht mehr auf.

Auszug aus Datenblatt
1
To set up an Asynchronous Transmission:
2
1. Initialize the SPBRGH:SPBRG registers for the
3
appropriate baud rate. Set or clear the BRGH
4
and BRG16 bits, as required, to achieve the
5
desired baud rate.
6
2. Enable the asynchronous serial port by clearing
7
bit, SYNC, and setting bit, SPEN.
8
3. If interrupts are desired, set enable bit, TXIE.
9
4. If 9-bit transmission is desired, set transmit bit,
10
TX9. Can be used as address/data bit.
11
5. Enable the transmission by setting bit, TXEN,
12
which will also set bit, TXIF.
13
6. If 9-bit transmission is selected, the ninth bit
14
should be loaded in bit, TX9D.
15
7. Load data to the TXREG register (starts
16
transmission).
17
8. If using interrupts, ensure that the GIE and PEIE
18
bits in the INTCON register (INTCON<7:6>) are
19
set.

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.