PDA

View Full Version : Instant Interrupts - Timer 4 not interupting



timmers
- 18th August 2011, 16:56
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.


'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

Darrel Taylor
- 18th August 2011, 17:44
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.

mister_e
- 18th August 2011, 17:47
Damn MicroChip... Again... Why? Why? Endless story...

timmers
- 18th August 2011, 22:48
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.

gadelhas
- 18th August 2011, 22:59
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.