Hey all, another newbie question.
I'm trying to run a servo (later to be expanded to 2 servos) with timer1 interrupts. The program compiles nicely, but never gets to the interrupt routine. I've never used interrupts or the timer before, but I've read all that I can, and just can't figure it out.
I'm running on the 16F690
Here's my code:
Code:
define OSC 4
ON INTERRUPT GOTO INTCODE
DEFINE HSER_TXSTA 20h 'SET THE TRANSMIT REGISTER TO TRANSMITTER ENABLED
DEFINE HSER_BAUD 2400 'SET BAUD RATE
'DEFINE ADCIN PARAMETERS
Define ADC_BITS 10 'SET NUMBER OF BITS IN RESULT
Define ADC_CLOCK 3 'SET CLOCK SOURCE (3=RC)
Define ADC_SAMPLEUS 50 'SET SAMPLEING TIME IN uS
define LOADER_USED 1
SELECTOR VAR BYTE 'SELECTS PROGRAM TYPE
TEMP VAR WORD 'TEMPORY VARIABLE FOR ANY USE
POSITION VAR WORD 'POSITION OF SERVO1 1250 - 2500
OFFWIDTH VAR WORD 'HOW LONG THE PULSE NEEDS TO BE OFF FOR
FREQ VAR WORD 'FREQUENCY TO RUN THE SERVOS AT
PICOSC VAR BYTE BANK0 'TO STORE OSCILLATOR FREQUENCY IN
PERIOD VAR WORD 'TEMPORY VARIABLE TO DISPLAY THE PERIOD OF PULSE
PRESCALER VAR WORD 'STORES THE TIMER1 PRESCALER VALUE
TMROFF VAR WORD 'STORES THE TIME THAT THE SERVO1 PULSE WILL BE LOW
RUN VAR BIT 'IS THE PROGRAM RUNNING
SERVO1 var PORTA.0 'OUTPUT PIN FOR SERVO1
STARTSTOP VAR PORTB.6 'INPUT PIN FOR PUSHBUTTON
TRISB.4 = 1 'INPUT FOR SELECTOR SWITCH PIN 13
TRISA.0 = 0 'MAKES PIN 19 AN OUTPUT FOR SERVO1
TRISB.6 = 1 'MAKES PIN 11 AN INPUT FOR PUSHBUTTON
PRESCALER = 8 'DEFINES THE TIMER1 PRESCALER AS 18
FREQ = 50 'CONSTANT FREQUENCY FOR THE SERVOS
RUN = 0 'TEMPORARY VARIABLE FOR SERVO RUNNING
T1CON = %00110000 'SETS THE TIMER1 VALUES - PRESCALER = 8
GIE var INTCON.7
PEIE var INTCON.6
TMR1IE var PIE1.0
TMR1ON var T1CON.0
ADCON1 = %10000010 'SET PORTA ANALOGUE AND RIGHT JUSTIFY THE RESULT
GOSUB GETOSC
MAINLOOP
GOSUB FINDPROGRAM
GOSUB STARTPULSE
'GOSUB STOPPULSE
GOTO MAINLOOP
FINDPROGRAM 'SELECTS BETWEEN SEVERAL TYPES OF MOTION
ADCIN 10, TEMP 'READ CHANNEL 10 TO TEMP
IF TEMP = 15000 THEN POSITION = 125 'USES VOLTAGE DIVIDER TO
IF TEMP 15000 AND TEMP = 22000 THEN POSITION = 150 'VARY THE VOLTAGE ON CH10.
IF TEMP 22000 AND TEMP = 35000 THEN POSITION = 175 'THIS CONVERTS AND STORES
IF TEMP 35000 AND TEMP = 47000 THEN POSITION = 200 'TO 'TEMP'.
IF TEMP 47000 AND TEMP = 60000 THEN POSITION = 225
IF TEMP 60000 THEN POSITION = 250
GOSUB SETPULSE
RETURN
DISABLE INTERRUPT
INTCODE
IF SERVO1 = 0 THEN
TMR1H = ((65535 - POSITION)256) 'EXTRACT HIGH BYTE INTO TIMER1
TMR1L = ((65535 - POSITION)-(TMR1H256)) 'EXTRACT LOW BYTE
HSEROUT [HIGH , DEC TMR1H, LOW , DEC TMR1L,10,10,13]
HIGH SERVO1
ENDIF
IF SERVO1 = 1 THEN
TMR1H = ((65535 - TMROFF)256) 'EXTRACT HIGH BYTE INTO TIMER1
TMR1L = ((65535 - TMROFF)-(TMR1H256)) 'EXTRACT LOW BYTE
HSEROUT [HIGH , DEC TMR1H, LOW , DEC TMR1L,10,10,13]
LOW SERVO1
ENDIF
RESUME
ENABLE INTERRUPT
SETPULSE
POSITION = POSITION MIN 250 'MIN POSITION LIMITED TO 0 DEGREES
POSITION = POSITION MAX 125 'MAX POSITION LIMITED TO 180 DEGREES
HSEROUT [POSITION = ,DEC POSITION,10,13]
TMROFF = (((((10000 FREQ) 10) PRESCALER)10) - POSITION)
'HSEROUT [TMROFF = ,DEC TMROFF,10,10]
'PERIOD = TMROFF + POSITION
'HSEROUT [PERIOD = ,DEC PERIOD,10,10]
RETURN
STARTPULSE
HSEROUT [PULSE STARTED,10,10]
LOW SERVO1
GIE = 1 'GLOBAL INTERRUPT ENABLE
PEIE = 1 'PERIPHRIAL INTERRUPT ENABLE
TMR1H = 255 'SETS TIMER1 TO 65535
TMR1L = 255 'NEXT TICK WILL INTERRUPT
TMR1ON = 1
RETURN
STOPPULSE
HSEROUT [PULSE STOPPED,10,10]
LOW SERVO1
PEIE =0
RETURN
GETOSC
asm
ifdef OSC
MOVECB OSC, _PICOSC
else
MOVECB 4, _PICOSC
endif
endasm
RETURN
END
Thanks for any help, the learning curve seems steep at times.
Bookmarks