serielle Datenübertragung - Problem !

Gast #28544
Lesenswert?

ich arbeitet mit einem PIC 16F877 und nutze den Usart im Asynchronen 
Modus zum Übertragen von Daten vom PIC auf den PC und umgekehrt !

jetzt komme ich zum Problem ! Daten übertragen vom PIC auf den PC kann 
ich ohne Proleme, allerdings in der andere richtung (vom PC auf den PIC) 
geht nicht !

eigentlich muss ja der PIC richtig konfiguriert sein da er ja senden 
kann !


hatte irgendwer von euch ein schon ähnliches Problem ?
Gast #28546
Lesenswert?

also jetzt habe ich folgendes problem:

wenn ich den µP neu starte (spannung abdrehen) dann funktioniert es 
kurz, nach einer weile funktioniert die datenübertrgung allerdings nicht 
mehr !

irgendwie stehe ich jetzt völlig an !
Gast #28550
Lesenswert?

jetzt ist mir gerade etwas sehr eigenartiges aufgefallen !

kurze vorgeschichte: ich schicke immer einen wert vom pc an den pic und 
der pic schickt als antwort einen andere zahl an den pc !
vom pc schicke ich ein paar verschiedene zahlen weg und der pic 
antwortet je nach zahl mit einer anderen zahl !

in meinem jetztigen schicke ich den pic die zahlen 75; 77 und 77.
wenn ich die zahl 75 schicke bekomme ich ne antwort vom pic, wenn ich 
sie mehrmals schicke bekomme ich auch immer wieder die antwort.
bei der zahl 77 bekomme ich allerdings nur 1x ne antwort( auch wenn ich 
sie öfter schicke).

wenn ich die zahl 79 schicke bekomme ich ne antwort vom pic, wenn ich 
sie mehrmals schicke bekomme ich auch immer wieder die antwort.


ich kann die beiden zahlen 75 und 79 uach mehrmals gemischt 
hintereinander schicken und bekomme auch immer die dementsprechende 
antwort, jedoch wenn ich einmal die zahl 75 schicke bekomme ich keine 
antwort mehr !


dazu muss ich sagen das ich die zahl in einem unterprogramm schicke und 
ihm nur die zu schickende zahl übergebe, d.h. es läuft immer das selbe 
unterprogramm !
Gast #28551
Lesenswert?

na, ist doch klar, der hat ne Allergie gegen die 77.
mfg
Frank

PS: Versuch mal 127 (kein Witz), das dürfte auch nicht klappen, denn da 
sind hinten auch nur Einsen (wie bei 77) im Binärcode. Dann stimmt Deine 
Baudrate nicht exakt, ist nur ne Idee.
Gast #28552
Lesenswert?

also, ich ahb jetzt ne testreihe gemacht !

ich schreib jetzt + für "funktioniert" und - für "funktioniert nicht "


67 +

69 -
70 +
71 +
72 -
73 -
74 +
75 +
76 -
77 -
78 +
79 +

81 -








127 +




warum funktionieren nur manche zahlen ?
Gast #28553
Lesenswert?

als einzige gemeinsamkeit die die zahlen haben die nicht funktionieren 
ist mir aufgefallen das sie an ster stelle vom bit 1 ( 2. von rechts) 
einen nuller haben ! die die funktionieren haben einen 1er !

aber warum ist das so ?

und was kann ich dagegen tun ?
Gast #28556
Lesenswert?

Also bei 4MHz Taktfrequenz sollte das so eigentlich OK sein.
Stimmen die Datenübertragungsparameter beim PC? Vor allem 1xStart und 1x 
Stopbit, NoParity und 8 Datenbit? Wenn die Parameter OK sind, dann liegt 
es wohl doch am Programm im PIC.
MfG
Gast #28558
Lesenswert?

Check mal ob evtl. ein Framing-Error beim PIC auftritt. Die Testreihe 
sieht verdammt danach aus, als ob Bit 6 schon als Stoppbit gewertet 
wird. Kommen die Werte vom PC auch mit 100%-iger Sicherheit richtig beim 
PIC an?
Ansonsten kann ich dir ohne deinen Quellcode auch nicht mehr 
weiterhelfen.
MfG
Gast #28559
Lesenswert?

das FERR Bit wird nicht gesetzt !


hier ist mein quellcode:

void RS232_INI()
{
 TXSTA = 0b00100100;
 RCSTA = 0b10010000;
 SPBRG = 25;  //Baud Rate von 9600 !
 SYNC = 0;
 SPEN = 1;
 TXEN = 1;
 CREN = 1;
}


void RS232S (char x)
{
 while (TXIF == 0);    // PIR1.TXIF
 TXREG = x;
 while (TRMT == 1);
}

void RS232_EMPFANGEN()
{
  zeichen = RCREG;

 if (zeichen == 70)
  {
   RS232S (1);
  }
 if (zeichen == 72)
  {
   RS232S (2);
  }
 if (zeichen == 74)
  {
   RS232S (3);
  }
 if (zeichen == 76)
  {
   RS232S (4);
  }
 if (zeichen == 78)
  {
   RS232S (5);
  }
 if (zeichen == 0)
  {
  }
}
Gast #28560
Lesenswert?

ups, da habe ich noch die interruptroutine vergessen !

bei einem empfängerinterrupt (RCIF) wird das programm RS232_EMPFANGEN() 
aufgerufen !

#pragma origin 4

interrupt int_server()
{
 GIE = 0;
 int_save_registers    //W, STATUS, (and PCLATH)

 if (RCIF == 1)      //RS_232
  {
   RS232_EMPFANGEN();
   RCIF = 0;
  }
 GIE = 1;
}

und in der initialisierung wird RCIE auf 1 gesetzt !
Gast #28561
Lesenswert?

Soweit ich das jetzt beurteilen kann (ich programmiere in Assembler) 
sollte der Code eigentlich OK sein. Die Abfrage
   while (TXIF == 0); // PIR1.TXIF
könnte eigentlich entfallen.

Das ist doch aber nicht der Code, mit dem du die Testreihe durchgeführt 
hasst oder?
Die Routine Antwortet ja nur auf 70,72,74,76 und 78. Oder kommt bei den 
nichtfunktionierenden Werten kein Interupt?
Gast #28562
Lesenswert?

nein, das ist nicht der exakte code !

ich habe bei diesem code ein paar zahlen rausgenommen, damit er kürzer 
wird !

aber eigentlich reicht mir eh wenn die hälfte funktioniert, soviele 
zahlen muss ich eh nicht übertragen !




kennst du dich eigentlich auch mit I2C aus ?
weil da hab ich leider auch ein ziehmlcih großes problem !
Gast #28563
Lesenswert?

Nur wenn, dann sollte schon alles funktionieren. Wie gesagt am Quellcode 
kann ich keinen Fehler feststellen. Gibt es keine Debugmöglichkeit mit 
der man feststellen könnte welcher Wert in RCREG steht?

Mit dem integrierten I²C Modul habe ich bisher auch noch nicht 
gearbeitet.

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