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:
Thanks for any help, the learning curve seems steep at times.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






Bookmarks