Instant Interrupts - Timer 4 not interupting


Closed Thread
Results 1 to 5 of 5
  1. #1
    Join Date
    Apr 2011
    Location
    Kent, UK
    Posts
    52

    Default Instant Interrupts - Timer 4 not interupting

    Darrel may be better placed to answer this one, Having setup interupts for timer 2 and timer 4, programme is not jumping out out to service timer4 interrupt.

    Could you check if it is something I am doing wrong or if its something else.

    Device is 18F46K22

    Cheers,
    Tim.

    Code:
    'PIC 18F46K22
    'PROGRAMME WITH HS OSC
    '                MCLR ENABLED
    '                PLL no multiply
    '                BORV 2.5v
    
    
    'Ver 1
    'First write of code
    
    
    '================================================
    '    Constants and Defines
    '================================================
    DEFINE OSC 20                                    '20 Mhz resonator
    
    
    B9600_H        con 2
    B9600_L        CON 8
    PRELOAD        CON 60542                            'MAKES TIMER 1 TICK AT 1 MSEC PERIODS
    LOOP_TIME    CON 1000                            '1000 Msec TICK
    INT_PERIOD    CON 1                                'PERIOD BETWEEN INTERRUPTS IN MSEC
    
    '================================================
    '    Bit Variables
    '================================================
    RX_FLAG1    VAR BIT
    TX_FLAG1    VAR BIT
    RX_FLAG2    VAR BIT
    TX_FLAG2    VAR BIT
    TICK        VAR BIT
    TEMPA        VAR BIT
    TEMPB        VAR BIT
    DTA1_TOUT_FLAG    VAR BIT
    DTA2_TOUT_FLAG    VAR BIT
    
    '================================================
    '    Byte Variables
    '================================================
    PRELOADH     VAR BYTE                            'HIGH BYTE USED TO RESET TIMER 1
    PRELOADL     VAR BYTE                            'LOW BYTE USED TO RESET TIMER 1
    TX_BYTE        VAR BYTE
    HEAD_NO        VAR BYTE
    HEAD         VAR BYTE                            'Incoming Head address number
    FUNC         VAR BYTE                            'Function to perform
    PAN         VAR BYTE                            'Pan value
    TILT         VAR BYTE                            'Tilt value
    ZOOM         VAR BYTE                            'Zoom value
    FOCUS         VAR BYTE                            'Incoming Focus value
    HEAD_NEW    VAR BYTE
    FUNC_NEW    VAR BYTE
    PAN_NEW        VAR BYTE
    TILT_NEW    VAR BYTE
    ZOOM_NEW    VAR BYTE
    FOCUS_NEW    VAR BYTE
    FUNC_OUT1    VAR BYTE
    FUNC_OUT2    VAR BYTE
    ZOOM_OUT    VAR BYTE
    FOCUS_OUT    VAR BYTE
    ERROR_OUT1    VAR BYTE
    ERROR_OUT2    VAR BYTE
    TXBYTE1        VAR BYTE
    TXBYTE2        VAR BYTE
    VALID        VAR BYTE
    GASH        VAR BYTE
    FUNC_IN        VAR BYTE
    DATR1        VAR BYTE
    DATR2        VAR BYTE
    DATR3        VAR BYTE
    DATR4        VAR BYTE
    DATR5        VAR BYTE
    TEMP1        VAR BYTE
    TEMP2        VAR BYTE
    TEMP3        VAR BYTE
    iTEMP1        VAR BYTE
    iTEMP2        VAR BYTE
    RX1_1 VAR BYTE : RX1_2 VAR BYTE : RX1_3 VAR BYTE : RX1_4 VAR BYTE : RX1_5 VAR BYTE
    RX1_6 VAR BYTE : RX1_7 VAR BYTE : RX1_8 VAR BYTE : RX1_9 VAR BYTE
    RX2_1 VAR BYTE : RX2_2 VAR BYTE : RX2_3 VAR BYTE : RX2_4 VAR BYTE : RX2_5 VAR BYTE
    RX2_6 VAR BYTE : RX2_7 VAR BYTE : RX2_8 VAR BYTE : RX2_9 VAR BYTE
    TX1_1 VAR BYTE : TX1_2 VAR BYTE : TX1_3 VAR BYTE : TX1_4 VAR BYTE : TX1_5 VAR BYTE
    TX1_6 VAR BYTE : TX1_7 VAR BYTE : TX1_8 VAR BYTE : TX1_9 VAR BYTE
    PAN_DEMAND    VAR BYTE
    STEP_FLAG    VAR BYTE
    
    '================================================
    '    Word Variables
    '================================================
    N             VAR WORD        'General variable
    uSEC        VAR WORD
    MSEC        VAR WORD
    TEMP10        VAR WORD
    DTA1_TOUT    VAR WORD
    DTA2_TOUT    VAR WORD
    TILT_DEMAND    VAR WORD
    PAN_OFF_TIME VAR WORD
    P_INTVAL    VAR BYTE
    TIME        VAR WORD
    
    '================================================
    '    Register Variables
    '================================================
    ADFM        VAR ADCON2.7    'right justified number format
    FERR1        VAR RCSTA1.2
    OERR1        VAR RCSTA1.1
    CREN1        VAR RCSTA1.4
    TRMT1        VAR TXSTA1.1
    TX1iF        VAR PIR1.4
    RC1IF        VAR PIR1.5
    FERR2        VAR RCSTA2.2
    OERR2        VAR RCSTA2.1
    CREN2        VAR RCSTA2.4
    TRMT2        VAR TXSTA2.1
    TX2iF        VAR PIR3.4
    RC2IF        VAR PIR3.5
    TMR0IF        VAR INTCON.2
    GIE            VAR INTCON.7
    
    
    '================================================
    '    Port Variables
    '================================================
    '             VAR PORTA.0        'D O not used
    '            VAR PORTA.1        'D O not used
    LDTA_EN        VAR PORTA.2        'D O lens data out EN. High for data out to Lens
    CDTA_EN        VAR PORTA.3        'D O Cable data out EN. High for data out to RS485
    TRIGGER        VAR PORTA.4        'D I Focus hold/trigger active. Low for active
    '            VAR PORTA.5        'D O not used
    '            VAR PORTA.6        'D I used for XTAL
    '            VAR PORTA.7        'D I used for XTAL
    
    '             VAR PORTB.0        'D O not used
    '            VAR PORTB.1        'D O not used
    PAN_SLEEP    VAR PORTB.2        'D O PAN Sleep. High to run
    TILT_SLEEP    VAR PORTB.3        'D O TILT Sleep. High to run
    '            VAR PORTB.4        'D O not used
    '            VAR PORTB.5        'D O not used
    '            VAR PORTB.6        'D O ICSP
    '            VAR PORTB.7        'D O ICSP
    
    PAN_MS2         VAR PORTC.0        'D O PAN MS2
    PAN_EN        VAR PORTC.1        'D O PAN Enable
    PAN_STEP    VAR PORTC.2        'D O PAN Step
    PAN_DIR        VAR PORTC.3        'D O PAN Direction
    TILT_DIR    VAR PORTC.4        'D O TILT Direction
    TILT_MS1    VAR PORTC.5        'D O TILT MS1
    '            VAR PORTC.6        'D I Hardware data out to camera
    '            VAR PORTC.7        'D I Hardware data in from camera
    
    PAN_MS1     VAR PORTD.0        'D O PAN MS1
    TILT_MS2    VAR PORTD.1        'D O TILT MS2
    TILT_EN        VAR PORTD.2        'D O TILT Enable
    TILT_STEP    VAR PORTD.3        'D O TILT Step
    REN            VAR PORTD.4        'D O RS485 Receive EN. Receive active low
    TEN            VAR PORTD.5        'D O RS485 Transmit EN. Transmitter active high
    '            VAR PORTD.6        'D I Hardware data out (RS485/LENS)
    '            VAR PORTD.7        'D I Hardware data in (RS485)
    
    LED2         VAR PORTE.0        'D O LED2
    '            VAR PORTE.1        'D O not used
    '            VAR PORTE.2        'D O not used
    
    '================================================
    INCLUDE "DT_INTS-18.bas"     ; Base Interrupt System
    INCLUDE "ReEnterPBP-18.bas"     ; Include if using PBP interrupts
    ASM
    INT_LIST  macro    ; IntSource,        Label,  Type, ResetFlag?
            INT_Handler    RX1_INT,  _SERIALIN1,   PBP,  no
            INT_Handler    TX1_INT,  _SERIALOUT1,  PBP,  no
            INT_Handler    RX2_INT,  _SERIALIN2,   PBP,  no
            INT_Handler    TX2_INT,  _SERIALOUT2,  PBP,  no
            INT_Handler    TMR1_INT, _COUNTER1,    PBP,  yes
            INT_Handler    TMR2_INT, _COUNTER2,    PBP,  yes
            INT_Handler    TMR4_INT, _COUNTER4,    PBP,  yes
        endm
        INT_CREATE               ; Creates the interrupt processor
    ENDASM
    
    '================================================
    '    Programme Runs From Here
    '================================================
    INIT:        TRISA =%11010000                    'PortA ins & outs
                TRISB =%00000000                    'PortB ins & outs
                TRISC =%11000000                    'PortC ins & outs
                TRISD =%11000000                    'PORTD ins & outs
                TRISE =%00000000                    'PORTE ins & outs
                
                ANSELA =0                            'porta as digital
                ANSELB =0                            'portb as digital
                ANSELC =0                            'portc as digital
                ANSELD =0                            'portd as digital
                ANSELE =0                            'porte as digital
                
                'Setup internal variables
                TICK =0                                'interval flag
                RX_FLAG1 =0                            'packet received flag
                TX_FLAG1 =0
                RX_FLAG2 =0                            'packet received flag
                TX_FLAG2 =0
                uSEC =0                                
                MSEC =0
                DTA1_TOUT =0
                DTA2_TOUT =0
                DTA1_TOUT_FLAG =0
                DTA2_TOUT_FLAG =0
                P_INTVAL =0
                PAN_DEMAND =0
                
                'Setup idle state for ports
                PAN_EN =1                             '1 = DISABLED
                PAN_SLEEP =0
                PAN_MS1 =0                            '00 = FULL STEP
                PAN_MS2 =0                            '00 = FULL STEP
                PAN_STEP =0                            'IDLE
                PAN_DIR =0                            '
                TILT_EN =1                             '1 = DISABLED
                TILT_SLEEP =0
                TILT_MS1 =0                            '00 = FULL STEP
                TILT_MS2 =0                            '00 = FULL STEP
                TILT_STEP =0                        'IDLE
                TILT_DIR =0                            '
                LED2 =0
                REN =0                                'RS485 RECEIVE ENABLE
                TEN =0                                'RS485 TRANSMIT DISABLE
                LDTA_EN =0                            'LENS DATA OUT =OFF
                CDTA_EN =0                            'CABLE DATA OUT =OFF
                
                'Setup serial port
                RCSTA1 = %10010000                    ' Enable serial port & continuous receive
                TXSTA1 = %00100100                    ' Enable transmit, BRGH = 1
                BAUDCON1.3 = 1                         ' Enable 16 bit baudrate generator
                SPBRGH1 = B9600_H
                SPBRG1 =  B9600_L                    
                
                RCSTA2 = %10010000                    ' Enable serial port & continuous receive
                TXSTA2 = %00100100                    ' Enable transmit, BRGH = 1
                BAUDCON2.3 = 1                         ' Enable 16 bit baudrate generator
                SPBRGH2 = B9600_H
                SPBRG2 =  B9600_L                    
                
                'Setup internal timer1
                T1CON =%00000001                    'CONFIGURES TIMER1 TO INT CLOCKING, DIVIDER = 1
                PRELOADH =PRELOAD /$100
                PRELOADL =PRELOAD //$100
                
                'Setup internal timer2
                T2CON =%01111111
                PR2 =255
                
                'Setup internal timer4
                T4CON =%01111111
                PR4 =255
                
                'Switch on interrupts
                @ INT_ENABLE  TMR1_INT        ; enable Timer 1 interrupts
                @ INT_ENABLE  TMR2_INT        ; enable Timer 2 interrupts
                @ INT_ENABLE  TMR4_INT        ; enable Timer 4 interrupts
                @ INT_ENABLE  RX1_INT        ; enable Async RX 1 interrupts
                @ INT_ENABLE  RX2_INT        ; enable Async RX 2 interrupts
                
                'Re-load variables
                VALID =0                            'EEPROM data validity flag
                GOSUB READ_SETTINGS                    'reload from eeprom
                IF VALID <>1 THEN GOSUB RESTORE        'first time load of default values
                
                'Flash LED's
                FOR TEMP3 =1 TO 3
                    LED2 =1
                    PAUSE 200
                    LED2 =0
                    PAUSE 300
                NEXT
                
                PAN_SLEEP =1                        'Wake up stepper driver
                TILT_SLEEP =1                        'wake up stepper driver
                GOTO MAIN
                
    '================================================
    '------ SUBROUTINES -----------------------------
    '================================================
    READ_SETTINGS:    
                READ  0,VALID
                RETURN
    
    '================================================
    RESTORE:    VALID =1
                
    WRITE_SETTINGS:    
                GIE =0
                WRITE  0,VALID
                GIE =1
                RETURN
    
    '================================================
    'INTERRUPT ROUTINES HERE
    '================================================    
    SERIALIN1:    IF FERR1 THEN
                    GASH =RCREG1
                    GOTO INT_END
                ENDIF
                
                RX1_9 =RX1_8                        'H
                RX1_8 =RX1_7                        '*
                RX1_7 =RX1_6                        'FUNC_IN
                RX1_6 =RX1_5                        'DATR1
                RX1_5 =RX1_4                        'DATR2
                RX1_4 =RX1_3                        'DATR3
                RX1_3 =RX1_2                        'DATR4
                RX1_2 =RX1_1                        'DATR5
                RX1_1 =RCREG1                        'ERROR
                
                IF RX1_9 ="H" AND RX1_8 ="*" THEN
                    ITEMP2 =(RX1_7 + RX1_6 + RX1_5 + RX1_4 + RX1_3 + RX1_2) ^$FF
                    IF ITEMP2 = RX1_1 THEN D_OK1
                ENDIF
                GOTO INT_END
                
    D_OK1:        FUNC_IN  =RX1_7
                DATR1  =RX1_6
                DATR2  =RX1_5
                DATR3  =RX1_4
                DATR4  =RX1_3
                DATR5  =RX1_2
                RX_FLAG1 =1
                DTA1_TOUT =400
                RX1_8 =0
                RX1_7 =0
                RX1_6 =0
                RX1_5 =0
                RX1_4 =0
                RX1_3 =0
                RX1_2 =0
                RX1_1 =0
                GOTO INT_END
                
    '================================================
    SERIALIN2:    IF FERR2 THEN
                    GASH =RCREG2
                    GOTO INT_END
                ENDIF
                
                RX2_9 =RX2_8                        'D
                RX2_8 =RX2_7                        '*
                RX2_7 =RX2_6                        'HEAD
                RX2_6 =RX2_5                        'FUNC
                RX2_5 =RX2_4                        'PAN
                RX2_4 =RX2_3                        'TILT
                RX2_3 =RX2_2                        'ZOOM
                RX2_2 =RX2_1                        'FOCUS
                RX2_1 =RCREG2                        'ERROR
                
                IF RX2_9 ="D" AND RX2_8 ="*" THEN
                    ITEMP2 =(RX2_7 + RX2_6 + RX2_5 + RX2_4 + RX2_3 + RX2_2) ^$FF
                    IF ITEMP2 = RX2_1 THEN D_OK2
                ENDIF
                GOTO INT_END
                
    D_OK2:        HEAD_NEW  =RX2_7
                FUNC_NEW  =RX2_6
                PAN_NEW   =RX2_5
                TILT_NEW  =RX2_4
                ZOOM_NEW  =RX2_3
                FOCUS_NEW =RX2_2
                RX_FLAG2 =1
                DTA2_TOUT =400
                RX2_8 =0
                RX2_7 =0
                RX2_6 =0
                RX2_5 =0
                RX2_4 =0
                RX2_3 =0
                RX2_2 =0
                RX2_1 =0
                GOTO INT_END
    
    '================================================
    SERIALOUT1:    LOOKUP2 TXBYTE1,["H", "*", FUNC_OUT1, DATR1, DATR2, DATR3, DATR4, DATR5, ERROR_OUT1],TXREG1
                TXBYTE1 =TXBYTE1 +1
                IF TXBYTE1 >= 9 THEN
                    @ INT_DISABLE  TX1_INT
                ENDIF
                GOTO INT_END
                
    '================================================
    SERIALOUT2:    LOOKUP2 TXBYTE2,["S", FUNC_OUT2, ZOOM_OUT, FOCUS_OUT, ERROR_OUT2],TXREG2
                TXBYTE2 =TXBYTE2 +1
                IF TXBYTE2 >= 5 THEN
                    @ INT_DISABLE  TX2_INT
                ENDIF
                GOTO INT_END
                
    '================================================
    COUNTER1:    TMR1H =PRELOADH                                'PRELOAD ADJUSTS TIMER 1 TO ROLLOVER EVERY (INT_PERIOD)
                TMR1L =PRELOADL
                MSEC =MSEC + INT_PERIOD                        'ROLLING COUNT
                
                IF MSEC //LOOP_TIME =0 THEN TICK =1
                
                IF DTA1_TOUT >0 THEN
                    DTA1_TOUT =DTA1_TOUT -1
                    IF DTA1_TOUT =0 THEN DTA1_TOUT_FLAG =1
                ENDIF
                IF DTA2_TOUT >0 THEN
                    DTA2_TOUT =DTA2_TOUT -1
                    IF DTA2_TOUT =0 THEN DTA2_TOUT_FLAG =1
                ENDIF
                
                GOTO INT_END
    
    '================================================
    COUNTER2:    TOGGLE PAN_STEP                        'advance pan motor one step
                GOTO INT_END
    
    '================================================
    COUNTER4:    TOGGLE TILT_STEP                    'advance tilt motor one step
                GOTO INT_END
    
    '================================================
    INT_END:    @ INT_RETURN
                
    '================================================
    '************************************************
    '================================================
    MAIN:        IF OERR1 THEN                        'RX buffer overflow
                    CREN1 =0
                    CREN1 =1
                ENDIF
                IF OERR2 THEN                        'RX buffer overflow
                    CREN2 =0
                    CREN2 =1
                ENDIF
                IF TICK THEN UPDATE                    'loop time
                IF RX_FLAG1 THEN DATA_IN1            'H* camera packet arrived
                IF RX_FLAG2 THEN DATA_IN2            'D* packet arrived
                IF DTA1_TOUT_FLAG THEN                'no data timeout flag
                    DTA1_TOUT_FLAG =0
                ENDIF
                IF DTA2_TOUT_FLAG THEN                'no data timeout flag
                    DTA2_TOUT_FLAG =0
                    LED2 =0
                    GOTO ALLSTOP
                ENDIF
                GOTO MAIN
                
    '================================================
    'Data incoming for camera data
    DATA_IN1:    RX_FLAG1 =0
                'insert camera routine here
                GOTO MAIN
                
    '================================================
    'Data incoming for PTZF data
    DATA_IN2:    RX_FLAG2 =0
                TOGGLE LED2
                HEAD =HEAD_NEW
                FUNC =FUNC_NEW
                PAN  =PAN_NEW
                TILT =TILT_NEW
                ZOOM =ZOOM_NEW
                FOCUS =FOCUS_NEW
                
                FUNC_OUT2 =FUNC                        'echo Zoom and Focus to lens driver
                ZOOM_OUT =ZOOM
                FOCUS_OUT =FOCUS
                CDTA_EN =0                            'Cable data disabled
                LDTA_EN =1                            'Lens data enabled
                GOSUB PREP_TX2                        'Send it
                
                PAN_DEMAND =PAN -127
                PAN_DIR =PAN_DEMAND.7
                PAN_DEMAND = ABS PAN_DEMAND
                
                TILT_DEMAND =TILT -127
                TILT_DIR =TILT_DEMAND.7
                TILT_DEMAND = ABS TILT_DEMAND
                
                IF PAN_DEMAND < 3 THEN                'add cdeadband
                    PAN_DEMAND =0
                ELSE
                    PAN_DEMAND = PAN_DEMAND - 3        'offset deadband
                ENDIF
                
                IF TILT_DEMAND < 3 THEN                'add deadband
                    TILT_DEMAND =0
                ELSE
                    TILT_DEMAND = TILT_DEMAND - 3    'offset deadband
                ENDIF
                
                IF PAN_DEMAND =0 AND TILT_DEMAND =0 THEN ALLSTOP
                PAN_EN =0                            'motor active
                TILT_EN =0                            'motor active
                PR2 =137 - PAN_DEMAND                'pan speed
                PR4 =137 - TILT_DEMAND                'tilt speed (min 127 + 10)
                
                GOTO MAIN
                
    '================================================
    ALLSTOP:    PAN_EN =1                            'Turn off pan drive
                TILT_EN =1                            'Turn off tilt drive
                PAN_DEMAND =0
                TILT_DEMAND =0
                GOTO MAIN
    
    '================================================
    UPDATE:        TICK =0
                
                GOTO MAIN
                
    '================================================
    PREP_TX1:    ERROR_OUT1 =(FUNC_OUT1 + DATR1 + DATR2 + DATR3 + DATR4 + DATR5) ^ $FF
                TXBYTE1 =0
                @ INT_ENABLE  TX1_INT
                RETURN
                
    '================================================
    PREP_TX2:    ERROR_OUT2 =(FUNC_OUT2 + ZOOM_OUT + FOCUS_OUT) ^ $FF
                TXBYTE2 =0
                @ INT_ENABLE  TX2_INT
                RETURN
                
    '================================================
    
    END

  2. #2
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default Re: Instant Interrupts - Timer 4 not interupting

    Yeah, Microchip moved everything around in the K22's.
    TMR4IF is at PIR5.0
    TMR4IE .. .. PIE5.0
    TMR4IP .. .. IPR5.0


    At this point, the only fix is to copy DT_INTS-18.bas to a new file, say DT_INTS-18K22.bas and edit the corresponding flags.

    Timers 5 and 6 are also in PIR5/PIE5/IPR5.
    CCP3, 4 and 5 are in PIR4/PIE4/IPR4.
    DT

  3. #3
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default Re: Instant Interrupts - Timer 4 not interupting

    Damn MicroChip... Again... Why? Why? Endless story...
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  4. #4
    Join Date
    Apr 2011
    Location
    Kent, UK
    Posts
    52


    Did you find this post helpful? Yes | No

    Default Re: Instant Interrupts - Timer 4 not interupting

    Spot on Darrel, I have edited the file as you suggested. Timer 4 now working.

    Should anyone else wish to use it, then I have attached it.

    Cheers,
    Tim.
    Attached Files Attached Files

  5. #5
    Join Date
    Aug 2008
    Location
    Portugal
    Posts
    240


    Did you find this post helpful? Yes | No

    Default Re: Instant Interrupts - Timer 4 not interupting

    Quote Originally Posted by timmers View Post
    Spot on Darrel, I have edited the file as you suggested. Timer 4 now working.

    Should anyone else wish to use it, then I have attached it.

    Cheers,
    Tim.
    Thank you timmers.
    Thanks and Regards;
    Gadelhas

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