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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.