mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik serielle Datenübertragung - Problem !


Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RC7 als Eingang definiert, CREN gesetzt ADDEN=0? Dann sollte es gehen.

MfG
Steffen

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: Frank Simon (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe vor längerem ein Projekt gehabt, wo alles drin vorkommt, was Du 
brauchst. Das Senden ist sogar mit einem Fifo realisiert. Vielleicht 
hilft es Dir.
mfg
Frank Simon

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke !

ich werde mal dein programm analysieren !

Autor: Frank Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
noch was, Chris,
was Du schreibst klingt ja erstmal nach watchdog oder stack-Problem.
mfg
Frank

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: Frank Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Poste doch mal deine genaue Konfiguration also Taktfrequenz, TXSTA, 
RCSTA, SPBRG.
MfG

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hier ist meine konfiguration:

void RS232_INI()
{
 TXSTA = 0b00100100;
 RCSTA = 0b10010000;
 SPBRG = 25;  //Baud Rate von 9600

 SYNC = 0;
 SPEN = 1;

 TXEN = 1;
 CREN = 1;
}

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, mein pic ist mit 4MHz getaktet !

de parameter beim pc sind: Baud rate: 9600; Data Bits: 8; Parity: none; 
Stopb Bits: 1; Handshaking: none

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)
  {
  }
}

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.