www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC18F252 & Serielle Auswertung


Autor: Hugo_2 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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;
     }
  }
}

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.