CONTROLLO SERVOCOMANDO I servocomandi per
modellismo dinamico permettono di realizzare in modo semplice disparate
animazioni meccaniche, come ad esempio piccoli robot. Usando un PIC e'
facile generare gli opportuni impulsi di comando necessari per il loro
movimento. La seguente routine (prevista per funzionare con clock da
4MHz su pic 12F/16F) genera un impulso positivo dal pin RA0 di durata
pari a esattamente 900+5*AL microsecondi. Visto che AL puo' assumere un
qualsiasi valore compreso tra 0 e 255, l'impulso che si puo' ottenere
varia da 900 a 2175 microsecondi a passi di 5uS, questo consente una
precisione di circa 0,6 gradi. Il registro CLha la semplice funzione di
contatore di ritardo. Le istruzioni GOTO $+1 servono per ottenere un
ritardo di 2uS usando una sola istruzione e occupando una sola
locazione della memoria programma.
BSF PORTA,0 ;Inizio impulso su RA0
MOVLW 0xB2
MOVWF CL ;Carica ritardo di base
GOTO $+1
GOTO $+1
DECFSZ CL,F
GOTO $-2 ;Ciclo di ritardo base
NOP
MOVF AL,W
MOVWF CL ;Carica ritardo variabile
BTFSC STATUS,Z
GOTO $+5 ;Se e' 0 salta a fine
GOTO $+1
GOTO $+1
DECFSZ CL,F
GOTO $-2 ;Ciclo ritardo variabile
BCF PORTA,0 ;Fine impulso
Il seguente programma pilota un servocomando generando continuamente un
impulso che varia lentamente da 1 a 2 ms per tornare a 1 ms e cosi' via.
La temporizzazione tra un impulso e l'altro e' affidata al timer 0, che
viene lasciato conteggiare in free running e produce un overflow ogni
16,384 ms. Il bit 0 di DL viene usato come indicatore di direzione,
0=incremento 1=decremento. In rosso e' evidenziata la parte di
inizializzazione dell'hardware e delle variabili di lavoro, in verde le
operazioni di attesa del timer.
;-----------------------------------------------------
; SERVO.ASM - Dimostrativo pilotaggio servocomando
;-----------------------------------------------------
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"
__CONFIG 11111111110001B
AL EQU 12 ;angolo
DL EQU 13 ;direzione
CL EQU 14 ;contatore ritardo
ORG 0
BSF STATUS,RP0 ;Attiva banco 1
CLRF TRISA ;Rende PORTA un'uscita
BCF OPTION_REG,PSA ;prescaler a tmr0
BCF OPTION_REG,T0CS ;clock interno
BCF OPTION_REG,1 ;Prescaler /64
BCF STATUS,RP0 ;Ritorna al banco 0
MOVLW 120 ;angolo iniziale 1,5 ms
MOVWF AL
CLRF DL
MAINLOOP CALL SERVO ;emette singolo impulso
BTFSS INTCON,T0IF
GOTO $-1 ;attende overflow timer
BCF INTCON,T0IF ;resetta bit overflow
BTFSC DL,0 ;controlla se direz=0
GOTO MAIN2
INCF AL,W ;se si incrementa angolo
MOVWF AL
XORLW 220 ;controlla se =220
BTFSC STATUS,Z
BSF DL,0 ;se si cambia direzione
GOTO MAINLOOP ;e torna a mainloop
MAIN2 DECF AL,W ;decrementa angolo
MOVWF AL
XORLW 20 ;controlla se =20
BTFSC STATUS,Z
BCF DL,0 ;se si cambia direzione
GOTO MAINLOOP ;e torna a mainloop
;-----------------------------------------------------
; Genera impulso di comando per un servocomando
; standard (per clock 4MHz e PIC 12F/16F).
; Input: AL da 0 a 255 ( uS = 900 + 5*AL )
; Usa: AL,CL ( AL = (uS-900)/5 )
; Output: pin RA0 (Impulso da 900 a 2175 uS)
;-----------------------------------------------------
SERVO BSF PORTA,0
MOVLW 178
MOVWF CL
GOTO $+1
GOTO $+1
DECFSZ CL,F
GOTO $-2
NOP
MOVF AL,W
MOVWF CL
BTFSC STATUS,Z
GOTO $+5
GOTO $+1
GOTO $+1
DECFSZ CL,F
GOTO $-2
BCF PORTA,0
RETURN
END
By
Claudio Fin - Pagina creata nell'aprile 2004 - Ultimo
aggiornamento 15-4-2004