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?
ADCON1 = %10000010 'SET PORTA ANALOGUE AND RIGHT JUSTIFY THE RESULT
SERVO1 var PORTA.0 'OUTPUT PIN FOR SERVO1
PUSHBUTT VAR PORTA.2 'INPUT PIN FOR PUSHBUTTON
TRISB.4 = 1 'INPUT FOR SELECTOR SWITCH PIN 13
TRISA.0 = 0 'MAKES PIN 19 AN OUTPUT FOR SERVO1
TRISA.2 = 1 'MAKES PIN 17 AN INPUT FOR PUSHBUTTON
PRESCALER = 8 'DEFINES THE TIMER1 PRESCALER AS 1:8
FREQ = 50 'CONSTANT FREQUENCY FOR THE SERVOS
RUN = 0 'TEMPORARY VARIABLE FOR SERVO RUNNING
T1CON = %00110001 'ENABLE X,X,PRESCALER = 8,X,X,X,TMR1ON
INTCON = %11001000 'ENABLE GIE,PEIE,x,x,GPIE,x,x,x
GIE var INTCON.7
PEIE var INTCON.6
TMR1IE var PIE1.0
TMR1ON var T1CON.0
TMR1IE = 1 '
PEIE = 1 'WHO KNOWS
GIE = 1 'WHAT ALL OF
PIR1.0 = 0 'THESE DO, BUT IT
TMR1H = 0 'DIDN'T START
TMR1L = 0 'WITHOUT THEM.
GOSUB GETOSC
MAINLOOP:
IF PUSHBUTT = 1 THEN
HSEROUT ["HIGH.",13,10]
ELSE
HSEROUT ["LOW",13,10]
ENDIF
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
HSEROUT ["FIRST IF - POSITION: ",DEC POSITION,10]
TMR1H = ((65535 - POSITION)/256) 'EXTRACT HIGH BYTE INTO TIMER1
TMR1L = ((65535 - POSITION)-(TMR1H*256)) 'EXTRACT LOW BYTE
HSEROUT ["HIGH: ", DEC TMR1H," LOW: ", DEC TMR1L,10]
SERVO1 = 1
HSEROUT ["SERVO1: ",DEC SERVO1,10,10]
ENDIF
IF SERVO1 = 1 THEN
HSEROUT ["SECOND IF - TMROFF: ",DEC TMROFF,10]
TMR1H = ((65535 - TMROFF)/256) 'EXTRACT HIGH BYTE INTO TIMER1
TMR1L = ((65535 - TMROFF)-(TMR1H*256)) 'EXTRACT LOW BYTE
HSEROUT ["HIGH: ", DEC TMR1H," LOW: ", DEC TMR1L,10,10,13]
SERVO1 = 0
HSEROUT ["SERVO1: ",DEC SERVO1,10,10]
ENDIF
INTCON.0 = 0
PIR1.0 = 0
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
MOVE?CB OSC, _PICOSC
else
MOVE?CB 4, _PICOSC
endif
endasm
RETURN
END
I hope it worked this time, dunno what went wrong the first time.
Bookmarks