USART interrupt not interrupting right


Closed Thread
Results 1 to 13 of 13

Hybrid View

  1. #1
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default

    Try this. It's tested on a 16F627a @4MHz using the MicroCode Studio terminal program.

    I suspect your problem may be due to data-rate errors & trying to write to EEPROM with interrupts enabled. This works perfectly at a data-rate of 19,200 @ 4MHz.

    Use a PC RS232 terminal program that will allow you to send/receive with odd or even parity & view the results on your terminal program. The PIC is setup to send & receive 9-bit.

    This will echo the received address byte back to the PC terminal software using 9-bit send & receive 9-bit with auto address detect. An LED on RB0 will toggle only when in the interrupt service routine.

    Note: If you have your PC terminal software set for EVEN parity, then the program (PIC) will only respond to 1,2,4,7 or 8 because these values will generate a logic 1 as the parity bit which the PIC *must* see in 9-bit mode.

    If you set it for ODD parity, the PIC will only respond to 3,5,6,9 or 0.

    Any value sent to the PIC that does not generate a logic 1 as the 9th parity bit will be ignored, and no interrupt will be generated.

    Code:
    DEFINE OSC 4
    
    OERR    VAR RCSTA.1    ' (Read Only) USART over-run bit
    CREN    VAR RCSTA.4    ' Alias USART continuous receive enable bit
    RCIF    VAR PIR1.5	  ' (Read Only) USART received character interrupt flag bit
    ADEN    VAR RCSTA.3    ' Alias Address enable bit (for 9-bit mode)
    X       VAR BYTE       ' GP
    PORTB.0 = 0            ' Initialize port bit
    TRISB.0 = 0            ' RB0 = LED interrupt indicator
    
    'INTCON ( Interruption Control register ) 
    intcon.7=1 'GIE : Global Interrupt Enable bit
    intcon.6=1 'PEIE : Peripheral Interrupt Enable bit ( This bit should be set when using the CCP interruption so on )
    intcon.5=0 'T0IE : TMR0 Overflow Interrupt Enable bit
    intcon.4=0 'INTE : RB0/INT Interrupt Enable bit
    intcon.3=0 'RBIE : RB Port Change Interrupt Enable bit
    intcon.2=0 'T0IF : TMR0 Overflow Interrupt Flag bit
    intcon.1=0 'INTF : RB0/INT Interrupt Flag bit
    intcon.0=0 'RBIF : RB Port Change Interrupt Flag bit
    
    'definisco il registro di ricezione RCSTA
    rcsta.7=1 'SPEN serial port enable bit
    rcsta.6=1 'RX9 9-bit receive enable bit
    rcsta.5=0 'SREN single receive enable bit
    rcsta.4=1 'CREN continous receive enable bit
    rcsta.3=1 'ADDEN address detect enable bit
    rcsta.2=0 'FERR framing error bit(read only)
    rcsta.1=0 'OERR overrun error bit(read only)
    rcsta.0=0 'RX9D 9th bit of receive data (read only)
    
    'definisco il registro di trasmissione TXSTA
    txsta.7=0 'CSRC : Clock Source Select bit
    txsta.6=1 'TX9 : 9-bit Transmit Enable bit
    txsta.5=1 'TXEN : Transmit Enable bit
    txsta.4=0 'SYNC : USART Mode Select bit 0=asincrono
    txsta.3=0 ' N/A
    txsta.2=1 'BRGH : High Baud Rate Select bit
    txsta.1=0 'TRMT : Transmit Shift Register Status bit ( Read only )
    txsta.0=1 'TX9D : 9th bit of transmit data. Can be parity bit.
    
    'PIE1 ( Peripheral Interrupt Enable register ) 8Ch
    PIE1.7=0 'EEIE : EE Write Complete Interrupt Enable Bit 
    PIE1.6=0 'CMIE : Comparator Interrupt Enable bit 
    PIE1.5=1 'RCIE : USART Receive Interrupt Enable bit 
    PIE1.4=0 'TXIE : USART Transmit Interrupt Enable bit 
    PIE1.3=0 ' N/A
    PIE1.2=0 'CCP1IE : CCP1 Interrupt Enable bit 
    PIE1.1=0 'TMR2IE : TMR2 to PR2 Match Interrupt Enable bit 
    PIE1.0=0 'TMR1IE : TMR1 Overflow Interrupt Enable bit
    
    SPBRG = 12 ' 19,200 bps @ 4MHz 16F627a
    
    ON INTERRUPT GOTO IntHandler
    
    Main:
       FOR X = 0 TO 255    ; Waste some time waiting for characters
        PAUSEUS 10
       NEXT
       GOTO Main
    
        DISABLE
    IntHandler:
        PORTB.0 = PORTB.0^1 ' Indicate that we are in interrupt routine
        IF RCIF THEN        ; Read characters from RCREG only when RCIF is set
          @ movf RCREG, W   ; Load RCREG into W
          @ movwf TXREG     ; Transmit back to PC
        ENDIF
        ' Clear over-runs if present
         IF OERR = 1 Then   ' If over-run, then clear it
            CREN = 0        ' Disable receive
            CREN = 1        ' Re-enable & clear over-run condition
         EndIF
        Resume
        Enable
        END
    Last edited by Bruce; - 4th March 2005 at 05:50.
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  2. #2
    Morpheus's Avatar
    Morpheus Guest


    Did you find this post helpful? Yes | No

    Default

    It's not possible!
    You can't believe where was the problem!
    It was a hardware problem!!:
    I'm using a rs485 net, and there was a short-circuit on the Tx-enable pin of my rs485 converter..
    so the char I was reading was noised by strange trasmissions on the line!!! the char I were sending was right, but the received one was mixed with other stranges things..

    sorry. The program was working right.
    Thank you Bruce for your attention.
    C yA
    Simone.

Similar Threads

  1. Can't ID interrupt source with this IntHandler??
    By jellis00 in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 3rd June 2009, 02:35
  2. Help with Analog Interrupt
    By brid0030 in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 13th February 2008, 18:14
  3. USART interrupt in PIC16F877A
    By amindzo in forum General
    Replies: 7
    Last Post: - 26th August 2006, 18:51
  4. PIC Basic PRO 16F877 USART Interrupt TX
    By BigH in forum Serial
    Replies: 8
    Last Post: - 9th January 2006, 23:26
  5. USART interrupt not interrupting :-(
    By barkerben in forum mel PIC BASIC Pro
    Replies: 1
    Last Post: - 5th January 2005, 13:30

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts