PIC18F252 & Serielle Auswertung

Gast #394645
Lesenswert?

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;
     }
  }
}
Angehängte Dateien:
Gast #394646
Lesenswert?

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

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