PIC RS232 Interrupt C18

OP #1050770
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
OP #1050792
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
Gast #1051087
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.
OP #1051115
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....
#1051126
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?
Gast #1051180
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
OP #1051197
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.
OP #1051210
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.
OP #1053468
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren