[PIC18F458] Serielle Schnittstelle - Einmal klappts, einmal nicht..

Gast #2235030
Lesenswert?
• ▲
▼
Hallo zusammen,

ich habe folgendes Problem: Ich möchte Daten von einem seriellen Bus 
lesen, allerdings springt er nie wieder in den Receive-Interrupt, sobald 
ich das Receive-Register auslese. Lese ich das Receive-Register nicht 
aus sondern setze manuell den Interrupt-Flag zurück (nichts anderes 
macht laut Datenblatt auch der uController!), kriege ich pro empfangenem 
Zeichen eine CAN-Nachricht.

Ich habe versucht den Quelltext auf die folgenden Zeilen zu kürzen:

Geht (Verifizierung über CAN):
1
// RCIF: Receive-Interrupt, RCIE: Reveice-Enable
2
if(PIR1bits.RCIF==1 && PIE1bits.RCIE==1)
3
{
4
PIR1bits.RCIF=0;
5
CANSendMessage(...);
6
}

Geht nicht, er geht nur einmal rein, dann nie wieder:
1
// RCIF: Receive-Interrupt, RCIE: Reveice-Enable
2
if(PIR1bits.RCIF==1 && PIE1bits.RCIE==1)
3
{
4
answer[answer_counter]=RCREG;
5
CANSendMessage(...);
6
}

Ich weiß nicht mehr weiter. Saß da jetzt 6 Stunden dran, verrückt macht 
mich vor allem dass exakt der gleiche Quelltext auf einer anderen 
Platine mit dem logischen gleichen Aufbau und der gleichen Bestückung 
lief.

Das eine empfangene Zeichen beim Auslesen von RCREG ist übrigens 
plausibel, über das Oszi sieht auch alles gut aus, Senden klappt auch 
hervorragend.

Würde mich freuen wenn ihr weiter weißt. :-)

Grüße vom Bodensee,
Daniel
Gast #2236379
Lesenswert?
• ▲
▼
Hi, hatt ähnliche Probleme beim 18F4620. Senden von UART klappte auf 
Anhieb, Empfangen vom PC nur mit Problemen.
Habe dann einen Empfangspuffer une eine Interruptroutine geschrieben. 
Jatzt klappt es prima.


volatile unsigned char PufferP =0;    // UART Puffer Index
volatile unsigned char Puffer[20] =0;  // UART Puffer 20 Bytes

//************ High-priority Interrupt service******************
void interrupt my_isr(void)
{
if((RCIE)&&(RCIF))      // ***** UART receive Code
  {
  Puffer[PufferP]= RCREG;   // Daten lesen und in den Puffer
  if (PufferP < 10) PufferP ++;// Schutz vor Puffer Überlauf, max 10 
Bytes
  RCIF=0;            // clear event flag
  }
}

//*********** Low-priority Interrupt service********************
void low_priority interrupt my_isr_low(void)
{
}

main.....
  if (PufferP !=0)  // irgendwas im UART Puffer ?
    {

//********************Bootloader********************************
    if (Puffer[0]  == 0xc1 )    //  0XC1 Zeichen vom Bootloader ?
       {........
//********************UART Puffer 
löschen****************************************************
    unsigned char i;    // Puffer löschen
    RCIE = 0;         // disable UART receive Interrupt
    for (i=0; i<=10; i++)  Puffer[i] =0;
    PufferP = 0;      // Zeiger wieder auf Anfang
    RCIE = 1;         // enable UART receive Interrupt
    }

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.