Probleme mit RS232 - Daten senden
Dienstag, 22. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  CCS Compiler  |  Schnittstellen (CCS)  |  Probleme mit RS232 - Daten senden « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Probleme mit RS232 - Daten senden  (Gelesen 1835 mal)
 
finki1979
Gast
« am: November 04, 2008, 10:59:33 »

Hallo,

Ich habe ein Problem mit meiner RS232 Schnittstelle.
Hab schon ne Menge Beiträge hier gelesen aber leider nix passendes gefunden.

Ich benutze einen PIC18F6527, der läuft mit 40MHz.
Ich möchte dem PIC einige Befehle senden. Um zu sehen ob er alles verstanden und umgesetzt hat soll er auf die Befehle antworten.
Auf dem PC nutz ich das Programm Com-Terminal (senden/empfangen) und zur Kontrolle den Free Serial Port Monitor.

So nun zum Problem,
Empfangen (vom PC) kann ich problemlos bis 115200 baut.
Senden (vom PIC) kann ich leider nur Datenmüll.

Einstellung RS232:
Code:
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9,RESTART_WDT,DISABLE_INTS)

Für den Empfang:
Code:
#int_RDA
Daten_RS232_isr()
{
   while ((received_data[bit] != 33)||(bit > 14)){
      bit++;
      received_data[bytes] = getc();
   }
   RS232_new_data = True;
}

Die Eingangsdaten werden dann in einer Switch Case Anweisung ausgewertet.
Code:
void RS_232_Auswertung()
{
   if (received_byte[1] == ZN_START)                                            // Prüfe ob Befehl ein ? enthält
   {
      input_Adress = ((received_byte[2]-48)*10) + (received_byte[3]-48);        // berechne Adresse
      If (input_Adress == Pump_Adress)                                          // Prüfe ob Adresse stimmt
      {
         Parameter = 0;
         switch (received_byte[4])                                              // Wähle Befehl aus
         {
            case CALL_D:                                                        // Befehl Betriebsart 1
               Befehl =  received_byte[4];                                      // empfangener Befehl
               Parameter = 0;                                                   // kein Parameter benötigt
               break;
            case CALL_R:                                                        // Befehl Parameter R
               Befehl =  received_byte[4];                                      // empfangener Befehl
               Teiler = 100000;                                                 // Berechne 6 stelligen Parameter
               for (i=5;i<=10;i++){
                  Parameter = Parameter + (((int32)received_byte[i]-48)*Teiler);
                  Teiler = Teiler / 10;
               }        
               break;

           ... noch einige Cases ... insgesamt 14 ...

         }
      }
   }
   for (bytes = 0; bytes < 15; bytes++){received_byte[bytes]=0;}                // Empfangsspeicher leeren
   bytes = 0;
   RS232_new_data = FALSE;
}

Bis hierher geht alles wunderbar ...

So nun soll der PIC eigentlich antworten ...
Zitat
printf("?00%2u%1u%6lu!",Pump_Adress,Befehl,Parameter);

Dachte mit der Funktion sollte es schon gehen.
Aber am Rechner kommt nur Müll an. Allerdings kein zufälliger sondern immer das gleiche.
Das erste Zeichen ("?") stimmt noch danach irgendwelche Zeichen.
Ist auch unabhängig von der Übertragungsgeschwindigkeit. Bis 57600 wird immer das gleiche gesendet.

Nun hab ich mir die Sendedaten mal in ein Array gepackt und in einer Schleife gesendet:
Code:
       
for (bytes = 0; bytes < 11; bytes ++){
   putc(transmit_byte[bytes]);
   delay_ms(10);
}
Jetzt werden meine Daten zwar richtig übertragen ( Wenn delay mindestens 10ms) ich bekomme jedoch immer ein "0xFF" zwischen den Zeichen mitgesendet. Wenn ich die Delay Zeit auf 1ms setze kommt wieder nur Datenmüll an.

Habs nun auch noch mit dem Interrupt probiert:
Code:
#int_TBE
Data_send_isr()
{
   if (bytes<11){
       putc(transmit_byte[bytes]);
       bytes++;
   }
}
Hm nun wird gehts gar nimmer, bei Geschwindigkeiten kleiner 14400 werden nur Teile des Arrays übertragen, je kleiner die Baut rate desto weniger Zeichen (9600 => 3 Zeichen), (14400 => 4 Zeichen), ab 19200 stürzt der Prozessor ab.
Also gehts so wohl auch nicht.

Hat mir jemand eine Idee was ich falsch mache oder wo das Problem liegt?
Vielen Dank schonmal ..
Gespeichert
finki1979
Gast
« Antworten #1 am: November 04, 2008, 13:02:32 »

So hab nun nochmal ein wengle was ausprobiert.
Der letzte Versuch konnte denke ich so net gehen.
Habs nun mal so probiert ...
Code:
#int_TBE
Data_send_isr()
{
   TX_Ready=TRUE;
   disable_interrupts(INT_TBE);
}
void main ()
{
....
while (bytes<13){
   count++;
   LCD_command(set_line4);
   printf(lcd_putc," count    %3u ",count);
   if (TX_Ready){
      putc(transmit_byte[bytes]);
      bytes++;
      TX_Ready = FALSE;
      enable_interrupts(INT_TBE);
   }
}
...
}
jetzt sendet er das erste Zeichen und danach gleich noch ein FF.
Entweder hab ich da jetzt noch nen Denkfehler drin oder der Ausgangspuffer wird nicht geleert.
Der Prozessor hängt nun nämlich in der While Schleife fest. Und setzt das TX Ready Flag nicht mehr.
Der Interrupt wird also nicht mehr ausgelöst.

Kann es also sein das ich auch bei den vorherigen Varianten mit printf net Puffer nicht leer bekommen hab und immer nur die neuen Zeichen "aufaddiert" habe?

Aber wieso wird der Puffer nicht gelöscht?
Gespeichert
Coltfisch
Sr. Member
****
Offline Offline

Beiträge: 496



Profil anzeigen WWW
« Antworten #2 am: November 04, 2008, 13:16:31 »

Empfangen (vom PC) kann ich problemlos bis 115200 baut.
Woher weißt Du das, wenn der PIC kein Echo senden kann?

Einstellung RS232:
Code:
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9,RESTART_WDT,DISABLE_INTS)
Sehr ungewöhnlich. Warum verwendest Du 9 Datenbits? Die von Dir beschriebenen Symptome könnten sehr gut dadurch entstehen, dass die RS232 im PIC auf 9 Datenbits eingestellt ist, der PC aber 8 Datenbits sendet und empfängt.

gruß
daniel
Gespeichert
finki1979
Gast
« Antworten #3 am: November 04, 2008, 13:32:33 »

Hi Daniel,

Wow das war jetzt mal ein Goldrichtiger Tip ...

Tja warum hab ich da 9 Bits .. ehrlich gesagt keine Ahnung .. hab den Wizard vom CSS genommen und der hats mir so eingestellt.
Am COM Terminal auf dem PC hab ich 8 Datenbits ...

Naja nun habs ich geändert und es funktioniert.

Besten Dank ...

Ah und wie ich gesehen hab das der empfang klappt.
Hab den sende String am Display ausgegeben. Da war er noch so wie erwartet ...

Da ich keine echten Debugging Möglichkeiten habe ist das Display noch ne recht gute Möglichkeit sich den einen oder anderen Wert anzeigen zu lassen ... hät ich oben vielleicht noch schreiben können.

Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.038 Sekunden mit 18 Zugriffen.
 
Top! Top!