P I C   -   A P P U N T I    D I    U T I L I Z Z O

(avvertenze)

[Indice principale]


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