2012-04-12 18 views
0

Ich habe seit Tagen mit diesem Code gearbeitet und kann nicht herausfinden, warum meine Interrupts nicht ausgelöst werden. Ich weiß, dass Daten erfolgreich durchkommen, weil ich eine Sonde auf einem Logikanalysator verwendet habe, auch meine Baudrate ist korrekt, da ich mit UART erfolgreich übertragen kann.Keine Interrupts werden in UART empfangen empfangen auf PIC18F2680

An diesem Punkt bin ich verloren, ich habe das Datenblatt immer und immer wieder gelesen und kann mein Problem nicht herausfinden. Ich werde versuchen, nur den relativen Code einzubeziehen, aber genug, dass Sie sehen können, wie die Dinge in meinem Projekt funktionieren.

Bitte lassen Sie mich wissen, wenn Sie Probleme mit diesem Code sehen.

Vielen Dank!

-Code-Schnipsel von main.c:

// USART RX interrupt priority 
    IPR1bits.RCIP = 0; 
    IPR1bits.TXIP = 0; 

    // configure the hardware USART device 
    OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & 
     USART_CONT_RX & USART_BRGH_LOW, 14); 

-Code-Schnipsel aus interrupts.c

//---------------------------------------------------------------------------- 
    // Low priority interrupt routine 
    // this parcels out interrupts to individual handlers 
    #pragma code 
    #pragma interruptlow InterruptHandlerLow 

    // This works the same way as the "High" interrupt handler 

    void InterruptHandlerLow() { 

    // check to see if we have an interrupt on USART RX 
    if (PIR1bits.RCIF) { 
     PIR1bits.RCIF = 0; //clear interrupt flag 
     uart_recv_int_handler(); 
    } 
    // check to see if we have an interrupt on USART TX 
    if (PIR1bits.TXIF && PIE1bits.TXIE) { 
     // cannot clear TXIF, this is unique to USART TX 
     // so just call the handler 
     uart_tx_int_handler(); 
    } 
    } 

UART RX-Interrupt-Handler-Schnipsel:

void uart_recv_int_handler() { 
     int msgLen; 

     //if (DataRdyUSART()) { 
     uc_ptr->buffer[uc_ptr->buflen] = RCREG; 
     //uc_ptr->buffer[uc_ptr->buflen] = ReadUSART(); 
      uc_ptr->buflen++; 
     } 
    } 
+1

haben Sie den UART nur 'Polling' versucht? Was passiert, erhalten Zeichen in Ordnung? – gbulmer

+0

Ich habe das noch nicht probiert, ich werde es morgen Nachmittag testen können und euch wissen lassen, wie das ging. – J2N

+1

Sie zeigen die globalen Interrupt-Aktivierungsflags nicht an und erwähnen sie nicht. Abschnitt 9 des Datenblattes gibt an, dass für die Standard-Interrupt-Strategie "INTCON <6>" das 'PEIE'-Bit ist, das/ alle peripheren Interruptquellen deaktiviert.' INTCON <7> ' ist das' GIE'-Bit, das aktiviert/deaktiviert Alle unterbrechen Quellen. " Wenn Sie die Prioritätsstufen für Ihre Interrupts ('IPEN') aktiviert haben, müssen Sie' GIEH' und 'GIEL' einstellen. –

Antwort

2

Haben Sie - Set trisC6/7 richtig? - Wenn Sie ein Teil mit analogen Eingängen an diesen Pins gemultiplext haben, haben Sie sie deaktiviert? - Ist Ihr BRG-Wert für diesen Teil und diese Oszillatoreinstellungen validiert?

Siehe

http://www.piclist.com/techref/microchip/rs232.htm

ich DSPIC migriert auch, aber ich verwendet, um die serielle erhalten unter Verwendung eines Interrupts zu tun. Dies hatte ich in der Unterbrechung (serialin1 eine Potenz von zwei Ringpuffer ist, lastserialin1 den Zeiger hinein und ser1bufinmask ist Größe der Puffer-1)

if (PIR1bits.RCIF == 1) /* check if RC interrupt (receive USART) must be serviced 
{ 
    while (PIR1bits.RCIF == 1) /* flag becomes zero if buffer/fifo is empty */ 
    { 
     lastserialin1=(lastserialin1+1)&ser1bufinmask; 
     serialin1[lastserialin1]=RCREG; 
    } 
} 

an den UART zu initialisieren ich hatte:

// Configure USART 
TXSTA = 0x20; // transmit enable 
RCSTA = 0x90; // spen en cren 
RCONbits.IPEN  = 1; /* Interrupt Priority Enable Bit. Enable priority levels on interrupts */ 

INTCONbits.GIE  = 1; /* Set GIE. Enables all high priority unmasked interrupts */ 
INTCONbits.GIEL = 1; /* Set GIEL. Enables all low priority unmasked interrupts */ 

TRISCbits.TRISC6 = 0; // page 237 
TRISCbits.TRISC7 = 1; // page 237 

Open1USART ( 
       USART_TX_INT_OFF 
       & 
      USART_RX_INT_ON & 
      USART_ASYNCH_MODE & 
      USART_EIGHT_BIT &   // 8-bit transmit/receive 
      USART_CONT_RX &    // Continuous reception 
         //    USART_BRGH_HIGH, 155);  // High baud rate, 155 eq 19k2 
      USART_BRGH_HIGH, brgval);  // High baud rate, 25 eq 115k2 

IPR1bits.RCIP  = 0; 
PIR1bits.RCIF  = 0; 

mit brgval berechnet

 #define GetInstructionClock() (GetSystemClock()/4) 
    #define GetPeripheralClock() GetInstructionClock() 

    // See if we can use the high baud rate setting 
    #if ((GetPeripheralClock()+2*BAUD_RATE)/BAUD_RATE/4 - 1) <= 255 
     #define BRGVAL ((GetPeripheralClock()+2*BAUD_RATE)/BAUD_RATE/4 - 1) 
     #define BRGHVAL (1) 
    #else // Use the low baud rate setting 
     #define BRGVAL ((GetPeripheralClock()+8*BAUD_RATE)/BAUD_RATE/16 - 1) 
     #define BRGHVAL (0) 
    #endif 
+1

Ich glaube, es waren die TrisC6/7-Bits, in denen ich mich befand. Danke! – J2N