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:
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9,RESTART_WDT,DISABLE_INTS)
Für den Empfang:
#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.
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 ...
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:
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:
#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 ..