Forum: Mikrocontroller und Digitale Elektronik PIC18F252 & Serielle Auswertung


von Hugo_2 (Gast)


Angehängte Dateien:

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;
     }
  }
}

von Schoasch (Gast)


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

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
Noch kein Account? Hier anmelden.