;*** PWM_Servo.asm Firefly DIP switch UDDUDD
;*** uses VR1 to set PWM speed to control a servo
list p=16F88
include <p16F88.inc>
__CONFIG _CONFIG1, 0x377C & _CCP1_RB3 &_WDT_OFF
org 0x000 ; reset vector
movlw b'00000100'
movwf T2CON ;B0 TMR2 on
movlw b'00111100' ;
movwf CCP1CON ;B0 CCP1 PWM mode
movlw b'11001001' ;
movwf ADCON0 ;B0 A/D on VR1
bsf STATUS,RP0 ;B1 change to bank 1
movlw b'00110010'
movwf OSCCON ;B1 500KHz oscillator & INTRC
movlw b'00000010'
movwf ANSEL ;B1 PORTA,1 (VR1) analog input
movlw b'11110111'
movwf TRISB ;B1 RB3 Output (PWM)
movlw b'10011011'
movwf PR2 ;B1 set PWM to 50.34 Hz
main bcf STATUS,RP0 ;B0 change to bank 0
bsf ADCON0,GO ;B0 begin A/D conversion (VR1)
addone btfss ADCON0,GO ;B0 A/D done yet?
goto addone ; loop till A/D done
swapf ADRESH,W ;B0 W = A/D high byte
andlw b'00001111' ; mask off high nibble
movwf CCPR1L ;B0 set duty cycle to A/D result
goto main ; * any A/D result > 250 will = 100% PWM *
end