Hallo zusammen! Ich habe einen PIC18F252 der mit 20MHz über einen MAX232 auf der RX-Leitung (Pin 3 des SUB-D) hängt. Dieser belauscht die ganze Zeit die Serielle Kommunkation zwischen 2 Geräten. Sollte ein bestimmter String kommen wird RB0 für ~1min ausgeschaltet. An RB0 hängt ein Optokoppler der die Spannungsversorgung von einem der Geräte trennt. Das muss deswegen sein, denn das Gerät 1 überprüft beim Hoch-Booten ob etwas an der RS232 dransteckt. Sollte etwas vorhanden sein bleibt die Konsole stehen und bootet nicht mehr weiter. Bevor das passiert kommen 4-5 Zeilen Text über die RS232 mit 9600bps: Beispiel: debug: asldlasd debug: asdasdadadad debug: aadadadadadadasdadsasd Nun habe ich den Code des PIC soweit zusammen, aber es scheint nicht schnell genug zu sein. er schaltet zwar ab aber zu langsam oder zu spät. Im aktuellen Code wird nach dem String "debug:" gesucht. Habe es auch mit einzelnen Zeichen getestet. Auch nicht schnell genug. Bei 9600bps sollte ca. 0,8ms für ein Zeichen benötigt werden, oder? Ich rechne mal, dass es ~100 Zeichen sind bevor das Gerät hängen bleibt -> ~80ms. Schaft das der PIC? Die Schematic kann ich leider im Moment nur als Metafile anhängen, da der PDF-Printer nicht funktioniert. Hier der Code: /** I N C L U D E S **********************************************************/ #include <p18cxxx.h> #include "delays.h" // für die Warteschleife #include "usart.h" // für die RS232 Schnittstelle #include "string.h" // für Text Vergleich /** Configuration ********************************************************/ #pragma config OSC = HS //CPU=20 MHz #pragma config PWRT = ON #pragma config BOR = OFF #pragma config WDT = OFF //Watchdog Timer #pragma config LVP = OFF //Low Voltage ICSP /** D E C L A R A T I O N S **************************************************/ int chR; char buffer[10]; int nChar = 0; int OUT; char Searchfor[] = "debug:"; int Times; void main(void) { OpenUSART( USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_HIGH & USART_CONT_RX, 129 ); LATB = 0x00; //PortB als Output TRISB = 0x00; LATB = 0x09; //LED + Optokoppler einschalten = Power ON while(1) { chR = 0x00; //while (!DataRdyUSART()); chR = getcUSART(); //aktuellen CR von RS232 lesen if(chR == 0x0013 || chR == 0x0010) //Zeilenumbruch? nChar = 0; else if(nChar < 6 && chR >= ' ' && chR < 0x7F) //Ist CR ein Buchstabe? buffer[nChar++] = chR; //CR zum String hinzufügen else { buffer[nChar] = 0; //String NULL-Terminieren if (strcmp(buffer, Searchfor) == 0 ) //SearchString = Buffer? { Times = 0; LATB = 0x00; //Alles ausschalten do { LATB = 0x08; //LED Blinken Delay10KTCYx(150); //LED Blinken LATB = 0x00; //LED Blinken Delay10KTCYx(150); Times++; }while( Times <= 20 ); LATB = 0x09; } nChar = 0; } } }
Wieso machst du das ganze nicht mit einem Interrupt? getc-Funktionen sind normalerweise relativ langsam. Ich würde das ganze in einem Interrupt machen... so ungefähr vergleichsstring[7]={"d","e","b","u","g",":"} recieve_isr() { empfangstring[i]=RCREG; i++ if(i=6) { i=0; //Hier nun jeden buchstaben einzeln überprüfen. while(vergleichsstring[i]=empfangstring[i]) { i++; if (i=6) LATB=0; } } } so irgendwie würde ich es mal probieren... dürfte wahrscheinlich schnell sein als die Stringcompare funktion.(Den code habe ich nicht übeprüft.. soll eher ein anreiz sein) mfg Schoasch
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.