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

    Please post the code you're working with, and I'll have a look
    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

    Thank you for your patience..

    Code:
    INCLUDE "MODEDEFS.BAS"
    
    
    
    TRISA=%11110000
    TRISB=%00000010
    
    cmcon=7  ' predispone la portaA come I/O digitali
    
    
    '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=0	'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=0	'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
    
    
    'azzera tutti i flag di interrupt
    PIR1.7=0
    PIR1.6=0
    PIR1.5=0		'azzera l'RCIF
    PIR1.4=0
    PIR1.3=0
    PIR1.2=0
    PIR1.1=0
    PIR1.0=0
    
    
    
    'DEFINE HSER_BAUD 38400	' Set baud rate
    'DEFINE HSER_SPBRG 15	' Set SPBRG directly (normally set by HSER_BAUD)
    
    'set the speet to 38800 baud (with a 10Mhz osc)
    SPBRG.7=0
    SPBRG.6=0
    SPBRG.5=0
    SPBRG.4=0
    SPBRG.3=1
    SPBRG.2=1
    SPBRG.1=1
    SPBRG.0=1
    
    
    
    DEFINE OSC 10
    
    
    OERR VAR RCSTA.1    ' Alias USART over-run bit
    CREN VAR RCSTA.4    ' Alias USART continuous receive enable bit
    RCIF VAR PIR1.5	    ' Alias USART received character interrupt flag bit
    ADEN VAR RCSTA.3
    
    
    
    Enable interrupt
    
    
    i VAR WORD
    led VAR BIT
    led2 VAR BIT
    ric VAR BYTE
    ric2 VAR BYTE
    X VAR BYTE
    X=0
    
    
    on interrupt GoTo indirizzo
    
    GoTo ricevi
    
    
     Disable
    indirizzo:
    
        ric = RCREG            'store the byte contained on RCREG in "ric" and clear RCREG
    
        
        While RCIF               'to be sure that the register'll be empty the next time I'll read it
           	ric2=RCREG
        Wend
        
    '    ADEN=0
    '    RCIF=0   
        
    IF OERR = 1 Then   ' If over-run, then clear it
            CREN = 0   ' Disable receive
            CREN = 1   ' Re-enable & clear over-run condition
    EndIF
         
         'print the 3 lsb of ric into 3 external leds
         PORTA.0=ric.2
         PORTB.7=ric.1
         PORTB.6=ric.0   
         
                 'every time that the pic is interrupted, store the received byte in a location into the eeprom
    	Write 0+X,ric
    	X=X+1          'next time will write the next location
    
      Resume
     Enable
    
    
    ricevi:
    
    	For i=1 to 65000
    	Next	
    
    		IF led=1 Then 
    			PORTA.1=0:led=0
    		Else
    			PORTA.1=1:led=1
    		EndIF
    GoTo ricevi

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

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