mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC RS232 Interrupt C18


Autor: Peter Haas (ixixix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ...

ich brauche mal einwenig hilfe mit dem PIC18F4550.

Ich versuche gerade einer Interruptroutine DATEN über die RS232 zu 
lesen.

Ich habe mir einen Ringbuffer aufgebaut, wo ich die Empfangenen Daten 
hineinschreiben kann. Ich brauche hilfe bei der Einstellung der 
Interrupts.

Ich habe nur einmal mit dem Interrupt an Port B gearbeitet. Das auch 
noch mit dem 16F84 unter asm. Vielleicht hat ja jemand ein Laufendes 
Beispeilprojekt für mich unter C18. Ich würde mich um ein Paar helfende 
Worte freuen.

mit freundlichem gruß


peter

Autor: Zwirbeljupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
code???

Autor: Peter Haas (ixixix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
code??? ja hier ...

Der Code ist in den USB Framework eingebettet... Ich kopiere nur die 
Wichtigen stellen rein, sonst wird es unübersichtlich.

HIER der LOW INT CODE

#pragma interruptlow YourLowPriorityISRCode
  void YourLowPriorityISRCode()
  {
        
        // PIC hardware USART Rx interrupt?
    if (PIR1bits.RCIF)
    {
      PIE1bits.RCIE = 0;// DISABLE INTERUPPT
      
      buffer_rx = RCREG;
      
      if (RCSTAbits.FERR)
      {
        
      }
      else if (RCSTAbits.OERR)
      {
        
          RCSTAbits.CREN = 0;  
          RCSTAbits.CREN = 1;  
      }
        else // valid byte 
        {
        write_ringbuffer(buffer_rx);
      }
      PIE1bits.RCIE = 1;//ENABLE INTERUPPT
    }

hier meine USER INIT
void UserInit(void)
{

  
  PIE1bits.RCIE = 1;    
  IPR1bits.RCIP = 0;
  INTCON = 0b11000000;
  RCONbits.IPEN = 0;
}

Und hier meine USART init.
void InitializeUSART(void)
{
  TRISCbits.TRISC7  =  1;    // RX
  TRISCbits.TRISC6  =  0;    // TX
  SPBRG             = 0xe2;
  SPBRGH             = 0x04;  // 2400 Baud.      0x1386 =2400; 0x04e2 = 9600
  TXSTA             = 0x24;  // TX enable BRGH=1
  RCSTA              = 0x90;  // continuous RX
  BAUDCON            = 0x08;  // BRG16 = 1



  //***  PERIPHERAL INTERRUPT PRIORITY REGISTER 1 ***
  //  RCIP: EUSART Receive Interrupt Priority bit
  //  1 = High priority
  //  0 = Low priority
  IPR1bits.RCIP = 0; 
  //  TXIP: EUSART Transmit
  //  1 = High priority
  //  0 = Low priority

}//end InitializeUSART

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Haas wrote:
> Vielleicht hat ja jemand ein Laufendes Beispeilprojekt für mich unter C18.

Im Application Maestro kannst Du ein fertiges Modul (inkl. Ringbuffer) 
konfigurieren und den Sourcecode studieren.

Autor: Zwirbeljupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das sieht doch gar nicht so schlimm aus. Was ist denn jetzt genau das 
Problem? Wird der Interrupt nicht ausgelöst? Wenn ja, woher weißt Du 
das? Ich würde testweise im USART-Interrupt das eingehende Zeichen 
direkt über die serielle Schnittstelle zurückschicken, dann siehst Du 
ja, ob der Interrupt funktioniert oder nicht.

Autor: Peter Haas (ixixix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Severino R.
Danke für den Tipp.

Ich bin gerade dabei das Teil zu Verstehen.
Mein Problem liegt mehr im Handling der Interrupts, was an diesem 
Beispiel sehr gut deutlich wird... Außer des der Interrupt Vektor nur 
für 0x08 da ist. Naja, vielleicht verstehe ich es ja trotzdem ;-).

@  Allgemein: Wiso wird der Maestro nicht mehr weitergepflegt? Ist ein 
schönes Tool.

@Zwirbeljupp: Er wird definitiv nicht ausgelöst. Habe allen Müll beim 
Kopieren rausgeschmissen. Ich Nibble beim empfangen einen Ausgange mit 
LED.
Außerdem hängt dort auch mein Ossi dran. Der Triggert aber ums verrecken 
nicht. Ergo --> kein Interrupt

Irgendetwas habe ich noch nicht beachtet....

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Haas wrote:
> Ausßer des der Interrupt Vektor nur
> für 0x08 da ist. Naja, vielleicht verstehe ich es ja trotzdem.

PIC18 haben nur zwei Interrupt-Vektoren: einen für den High-Priority 
Interrupt und einen für den Low-Priority-Interrupt. Die Prioritäten 
kannst du konfigurieren. Im wesentlichen ist der Unterschied, dass der 
Low-Priority durch den High-Priority Interrupt unterbrochen werden kann 
(umgekehrt nicht).
Was den Interrupt ausgelöst hat, musst Du selber anhand der xxIF-Bits 
herausfinden.

> Wiso wird der Maestro nicht mehr weitergepflegt?

Diese Frage solltest Du an support@microchip.com stellen.

Was gäbe es Deiner Meinung nach zu pflegen?

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Haas wrote:

> Ich Nibble beim empfangen einen Ausgange mit LED.

Du nibbelst einen Ausgang? Wie machst Du denn das? Mag der das 
überhaupt?

Autor: Zwirbeljupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, dann mal Stück für Stück (Achtung, Pseudocode!):
RCIE = 1;   // USART Rx-Interrupt enable bit
RCIP = 0;   // USART Rx-Int. auf low priority konfigurieren
IPEN = 1;   // Die Interrupt-Priority-Levels must Du schon aktivieren, wenn Du sie auch benutzen willst
RCIF = 0;   // RX-Interrupt-Flag erstmal löschen

GIEH = 0;   // high-prio ints hast Du nicht, also abschalten
GIEL = 1;   // low-prio ints aktivieren

So, wenn es damit immer noch nicht funktioniert, dann solltest Du Deine 
Hardware mal überprüfen.
Hast Du denn überhaupt schonmal versucht, das RCIF-bit zu pollen? Das 
Bit wird nämlich auch gesetzt, wenn die Interrupts eigentlich garnicht 
aktiviert sind.
Sollte das Bit auch beim Pollen nicht gesetzt werden, stimmt was mit 
Deiner Hardware nicht.

gruß
zwirbelJ

Autor: Peter Haas (ixixix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Severino R. wrote:
> Peter Haas wrote:


> PIC18 haben nur zwei Interrupt-Vektoren: einen für den High-Priority
> Interrupt und einen für den Low-Priority-Interrupt. Die Prioritäten
> kannst du konfigurieren. Im wesentlichen ist der Unterschied, dass der
> Low-Priority durch den High-Priority Interrupt unterbrochen werden kann
> (umgekehrt nicht).
> Was den Interrupt ausgelöst hat, musst Du selber anhand der xxIF-Bits
> herausfinden.

Ja, ich dachte soweit hätte ich auch verstanden.

>>Peter Haas wrote:

>> Ich Nibble beim empfangen einen Ausgange mit LED.

>Du nibbelst einen Ausgang? Wie machst Du denn das? Mag der das
>überhaupt?

Nein, ich nibble den Ausgang nicht!!! Mein Fehler, ich Toggle ihn und 
das Mag er. Zu debuggen benutzt ich Macros mit verschiedenen bitmustern. 
Mein Tolles Ozzi (http://www.lecroy.de) WAVERUNNER 104 Xi unterstüzt 
Erkennung auf bitmustern, die werden dann schön Bunt angezeigt. 
Teileweise einfacher als mit dem ICD. Zumal wenn man das USB Framework 
nutzt.

Autor: Peter Haas (ixixix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zwirbeljupp wrote:
> Okay, dann mal Stück für Stück (Achtung, Pseudocode!):
>
>
>
> So, wenn es damit immer noch nicht funktioniert, dann solltest Du Deine
> Hardware mal überprüfen.
> Hast Du denn überhaupt schonmal versucht, das RCIF-bit zu pollen? Das
> Bit wird nämlich auch gesetzt, wenn die Interrupts eigentlich garnicht
> aktiviert sind.
> Sollte das Bit auch beim Pollen nicht gesetzt werden, stimmt was mit
> Deiner Hardware nicht.
>
> gruß
> zwirbelJ

Danke, werde gleich mal schauen, ob ich es zum laufen bekomme.

Autor: Peter Haas (ixixix)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Es läuft jetzt... ABER: ich muss zwirbeljupp mal was erklären... ;-)

Zwirbeljupp wrote:
> Okay, dann mal Stück für Stück (Achtung, Pseudocode!):
>
>
> RCIE = 1;   // USART Rx-Interrupt enable bit
> RCIP = 0;   // USART Rx-Int. auf low priority konfigurieren
> IPEN = 1;   // Die Interrupt-Priority-Levels must Du schon aktivieren,
> wenn Du sie auch benutzen willst
> RCIF = 0;   // RX-Interrupt-Flag erstmal löschen
> 
> GIEH = 0;   // high-prio ints hast Du nicht, also abschalten
> GIEL = 1;   // low-prio ints aktivieren
> 
>

Deine Aussage "high-prio ints hast Du nicht" stimmt. Aber "abschalten" 
NEIN.

Es lag nur an diesen einem Verdammten bit. Aus dem Datenblatt-Text ist 
es so nicht sofort ersichtlich aber wenn man sich das Bild anschaut, 
dann ist es eindeutig. Ich habe mal ein Bild mit angehängt.

ALSO GIEH auch =1 ....

CU

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.