Forum: Mikrocontroller und Digitale Elektronik Probleme serielle Datenübertragung


von Manuel (Gast)


Lesenswert?

Hi.
Ich hab ein Messsystem aufgebaut, dass seine Messdaten per serieller 
Schnittstelle an einen PC senden soll. Der verwendete µC ist der 
PIC18F14K50 und an Software benutze ich den C18 Compiler und die 
Microchip IDE. Mein Problem ist, dass ich auf der PC Seite nicht alle 
Daten empfange, sondern nur ein Teil davon. Ich vermute den Fehler bei 
der Seriellen Kommunikation, da der Sensor soweit funktioniert (mit Oszi 
verifiziert). Am PC kommen nur alle 102 Messwerte an. Der Sendeteil des 
Programms sieht wie folgt aus:
...
char Buffer;
char result;

OpenUSART(  USART_TX_INT_OFF  &
    USART_RX_INT_OFF  &
    USART_ASYNCH_MODE  &
    USART_EIGHT_BIT  &
    USART_CONT_RX  &
    USART_BRGH_HIGH,77  )

while(!DataRdyUSART());  //Warten bis Daten empfangen
result = ReadUSART();

for (i = 0; i<102;i++)
{
  Buffer = ReceiveValue();  //8- Bit Messwert empfangen
  while(!TXSTAbits.TRMT);  //warten bis bereit zum Senden
  TXREG = Buffer;    // Senden
}
...
ReceiveValue liefert ein Byte (char) zurück.

Zur Kontrolle habe ich in dem Buffer einen festen Wert zugewiesen:
  Buffer = 'X';
PC seitig sehe ich im Terminalprogramm und auch in Matlab, den Wert 0x53 
also 'S'. Habt ihr ne Idee, was ich verbockt habe? Mir fällt langsam 
nichts mehr ein, woher der Fehler kommt.

Vielen Dank schon mal

von Karl H. (kbuchegg)


Lesenswert?

Manuel schrieb:

> Zur Kontrolle habe ich in dem Buffer einen festen Wert zugewiesen:
>   Buffer = 'X';
> PC seitig sehe ich im Terminalprogramm und auch in Matlab, den Wert 0x53
> also 'S'.

Versteh ich das richtig, dass dein PIC jetzt prinzipiell einfach nur 
Zeichen zurückschicken soll, die er empfangen hat. Nur das du das so 
umgeändert hast, dass immer ein 'X' zurück geschickt wird.

> Habt ihr ne Idee, was ich verbockt habe?

Wenn der Empfänger etwas anderes erkennt, als der Sender weggeschickt 
hat, dann ist das ein deutlicher Hinweis darauf, dass die Baudrate nicht 
exakt stimmt.

von Juergen R. (stumpjumper)


Lesenswert?

Ich möchte mich da anschliessen, Du solltest mal prüfen ob auf beiden 
Seiten die gleiche Baudrate eingestellt ist. Dabei auch unbedingt die 
Anzahl der Stopbits und der Parität prüfen

von Juergen R. (stumpjumper)


Lesenswert?

Nachtrag zu meiner vorherigen Antwort:
Ich kenne den PIC nicht, gehe ich richtig in der Annahme daß mit diesem
Teil der Interrupt abgeschaltet wird

>  USART_RX_INT_OFF  & <

Ich würde hier Interrupts zulassen und eine kleine Serviceroutine dazu 
machen.

Ausserdem zum testen noch die Anregung das mal mit Hilfe einer LinuxCD 
z.B. Knoppix zu testen (falls Du Dich damit anfreunden kannst).

Von der CD booten und in einer Console den Befehl
"cat /dev/ttySx" eingeben. Das x muß durch 0 für COM1 bzw. 1 für COM2 
ersetzt werden.

Du solltest am Bildschirm die gesendeten Zeichen sehen, Baudrate etc. 
siehe vorige Antwort.

von Manuel (Gast)


Lesenswert?

Hi Danke für die Antworten.
Wie ihr vermutet habt lag es an der Baudrate.
Ich hab das Programmgerippe, das ich benutzt hab nicht genau 
durchgesehen. Auf jeden Fall war noch die PLL aktiv, d.h. die Baudrate 
vom µC war ein ganz andere. Dann hat es natürlich in Matlab auch nicht 
richtig funktioniert.
Nun hab ich die PLL deaktiviert und nun funktionuerts wunderbar.

Vielen Dank

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.