ho dovuto scomodare il registro FSR ... funziona alla grande!
;Questo software riceve dall'applicazione java JRobot sequenze di numeri
; compresi tra 0 e 255. In ordine questi numeri saranno assegnati a ATTESA1,
; ATTESA2, ATTESA3, ATTESA4. Queste tre varibili sono utlizzate in
; BLOCK PULSE, per impartire ad ogni servo la relativa inclinazione.
;
;
fausto.giudice@gmail.com
;-----------------------------------------------------
PROCESSOR 16F628
RADIX DEC
INCLUDE "P16F628.INC"
__CONFIG 11110100010000B
;
; __________________________________________________ _____________________________________
;
ATTESA EQU 32
L_COUNT EQU 33
H_COUNT EQU 34
CL EQU 35
ID_SERVO EQU 36
ATTESA1 EQU 41
ATTESA2 EQU 42
ATTESA3 EQU 43
ATTESA4 EQU 44
;
; __________________________________________________ _____________________________________
;
; START PROGRAM
; ------------------------------------
ORG 0
;
; __________________________________________________ _____________________________________
;
; SET ANALOG/DIGITAL INPUTS PORT A
; ------------------------------------
;
MOVLW 7
MOVWF CMCON ; CMCON=7 set comperators off
;
; __________________________________________________ _____________________________________
;
; INITIALIZE PORTS
; ------------------------------------
;
movlw b'00000000' ; set up portA
movwf PORTA
movlw b'00000100' ; RB2(TX)=1 others are 0
movwf PORTB
bsf STATUS,RP0 ; RAM PAGE 1
movlw b'11110000'
movwf TRISA ; portA all pins input
movlw b'11110010' ; RB7-RB4 and RB1(RX)=input, others output
movwf TRISB
;
; __________________________________________________ _____________________________________
;
; SET UART DEVICE, FOR COMUNICATE SERIAL PORT
; ------------------------------------
;
;
movlw 0x19 ; 0x19 = 9600 bps
movwf SPBRG
movlw b'00100100' ; brgh = high (2)
movwf TXSTA ; enable Async Transmission, set brgh
bcf STATUS,RP0 ; RAM PAGE 0
movlw b'10010000' ; enable Async Reception
movwf RCSTA
;
; __________________________________________________ _____________________________________
;
; INIZIALIZE VARIABLES
; ------------------------------------
;
call message
MOVLW 100
MOVWF ATTESA1
MOVLW 100
MOVWF ATTESA2
MOVLW 100
MOVWF ATTESA3
MOVLW 100
MOVWF ATTESA4
MOVLW 41
MOVWF ID_SERVO ; INIZIALIZE THE ID_SERVO
MOVWF FSR ; THIS IS A POITER AT ARRAY MEMORY OF SERVOS
;
; __________________________________________________ _____________________________________
;
; PULSE BLOCK
; ------------------------------------
;
LOOP CALL DELAY_20
MOVF ATTESA1,W
MOVWF ATTESA
BSF PORTA,0
CALL PULSE
BCF PORTA,0
MOVF ATTESA2,W
MOVWF ATTESA
BSF PORTA,1
CALL PULSE
BCF PORTA,1
MOVF ATTESA3,W
MOVWF ATTESA
BSF PORTA,2
CALL PULSE
BCF PORTA,2
MOVF ATTESA4,W
MOVWF ATTESA
BSF PORTA,3
CALL PULSE
BCF PORTA,3
;
; __________________________________________________ _____________________________________
;
;
; ------------------------------------
;
btfss PIR1,RCIF ; Receive data from Serial Port
GOTO LOOP ;
MOVF RCREG,W ; If true then load W
MOVWF INDF ; load FSR register by INDF
MOVF ID_SERVO,W
SUBLW 44
btfss STATUS,Z
GOTO STEP
MOVLW 41 ; INIZIALIZZA TUTTO DACCAPO
MOVWF ID_SERVO ;
MOVWF FSR ;
GOTO LOOP ; TORNA SUL PULSE BLOCK
STEP INCF FSR
INCF ID_SERVO
GOTO LOOP
;
; __________________________________________________ _____________________________________
;
; SEND CHARACTER IN W VIA RS232 AND WAIT UNTIL FINISHED SENDING
; ------------------------------------
;
send movwf TXREG ; send data in W
TransWt bsf STATUS,RP0 ; RAM PAGE 1
WtHere btfss TXSTA,TRMT ; (1) transmission is complete if hi
goto WtHere
bcf STATUS,RP0 ; RAM PAGE 0
return
;
; __________________________________________________ _____________________________________
;
; MESSAGE
; ------------------------------------
;
message movlw '1'
call send
movlw '6'
call send
movlw 'F'
call send
movlw '6'
call send
movlw '2'
call send
movlw '8'
call send
movlw ' '
call send
movlw 'R'
call send
movlw 'e'
call send
movlw 'a'
call send
movlw 'd'
call send
movlw 'y'
call send
movlw 0x0D ; CR
call send
movlw 0x0A ; LF
call send
return
;
; __________________________________________________ _____________________________________
;
; GENERA UN RITARDO DI 20 mS
; ------------------------------------
;
DELAY_20 movlw 26
movwf H_COUNT
movlw 10
movwf L_COUNT
decfsz L_COUNT,F
goto $-1
decfsz H_COUNT,F
goto $-3
RETURN
;
; __________________________________________________ _____________________________________
;
; GENERA UN RITARDO PROPORZIONALE AL REGISTRO ATTESA
; ------------------------------------
;
; 900 + 5 * ATTESA = da 900uS se ATTESA è = 0 , a max 2000uS se ATTESA = 200
PULSE movlw 178 ; 1uS |
movwf CL ; 1uS | 4uS
goto $+1 ; 2uS |
goto $+1 ; 2uS |
decfsz CL,F ; 1uS | 5uS * (178 - 1) = 885uS
goto $-2 ; 2uS |
nop ; 1uS
movf ATTESA,W ; 1uS
movwf CL ; 1uS
btfsc STATUS,Z ; 1uS nel caso in cui ATTESA = 0 allora salta alla fine
RETURN ; 2uS
goto $+1 ; 2uS
goto $+1 ; 2uS |
decfsz CL,F ; 1uS | 5uS * (ATTESA - 1) =
goto $-2 ; 2uS |
RETURN
END