Forum: Mikrocontroller und Digitale Elektronik PIC RS232 Interrupt C18


von Peter H. (ixixix)


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

von Zwirbeljupp (Gast)


Lesenswert?

code???

von Peter H. (ixixix)


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
1
#pragma interruptlow YourLowPriorityISRCode
2
  void YourLowPriorityISRCode()
3
  {
4
        
5
        // PIC hardware USART Rx interrupt?
6
    if (PIR1bits.RCIF)
7
    {
8
      PIE1bits.RCIE = 0;// DISABLE INTERUPPT
9
      
10
      buffer_rx = RCREG;
11
      
12
      if (RCSTAbits.FERR)
13
      {
14
        
15
      }
16
      else if (RCSTAbits.OERR)
17
      {
18
        
19
          RCSTAbits.CREN = 0;  
20
          RCSTAbits.CREN = 1;  
21
      }
22
        else // valid byte 
23
        {
24
        write_ringbuffer(buffer_rx);
25
      }
26
      PIE1bits.RCIE = 1;//ENABLE INTERUPPT
27
    }

hier meine USER INIT
1
void UserInit(void)
2
{
3
4
  
5
  PIE1bits.RCIE = 1;    
6
  IPR1bits.RCIP = 0;
7
  INTCON = 0b11000000;
8
  RCONbits.IPEN = 0;
9
}

Und hier meine USART init.
1
void InitializeUSART(void)
2
{
3
  TRISCbits.TRISC7  =  1;    // RX
4
  TRISCbits.TRISC6  =  0;    // TX
5
  SPBRG             = 0xe2;
6
  SPBRGH             = 0x04;  // 2400 Baud.      0x1386 =2400; 0x04e2 = 9600
7
  TXSTA             = 0x24;  // TX enable BRGH=1
8
  RCSTA              = 0x90;  // continuous RX
9
  BAUDCON            = 0x08;  // BRG16 = 1
10
11
12
13
  //***  PERIPHERAL INTERRUPT PRIORITY REGISTER 1 ***
14
  //  RCIP: EUSART Receive Interrupt Priority bit
15
  //  1 = High priority
16
  //  0 = Low priority
17
  IPR1bits.RCIP = 0; 
18
  //  TXIP: EUSART Transmit
19
  //  1 = High priority
20
  //  0 = Low priority
21
22
}//end InitializeUSART

von Severino R. (severino)


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.

von Zwirbeljupp (Gast)


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.

von Peter H. (ixixix)


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....

von Severino R. (severino)


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?

von Severino R. (severino)


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?

von Zwirbeljupp (Gast)


Lesenswert?

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

von Peter H. (ixixix)


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.

von Peter H. (ixixix)


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.

von Peter H. (ixixix)


Angehängte Dateien:

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!):
>
>
1
> RCIE = 1;   // USART Rx-Interrupt enable bit
2
> RCIP = 0;   // USART Rx-Int. auf low priority konfigurieren
3
> IPEN = 1;   // Die Interrupt-Priority-Levels must Du schon aktivieren,
4
> wenn Du sie auch benutzen willst
5
> RCIF = 0;   // RX-Interrupt-Flag erstmal löschen
6
> 
7
> GIEH = 0;   // high-prio ints hast Du nicht, also abschalten
8
> GIEL = 1;   // low-prio ints aktivieren
9
>
>

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

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.