Discussione: dove sbaglio?
Visualizza messaggio singolo
Vecchio 08 marzo 12, 10:50   #1 (permalink)  Top
faustog_2
User
 
L'avatar di faustog_2
 
Data registr.: 19-07-2008
Residenza: catania
Messaggi: 978
dove sbaglio?

salve a tutti,

volevo realizzare un sontrollo servo oscillante con una velocità maggiore, la realizzazione è piuttosto semplice, c'è pure esplicitamente suggerita negli appunti del tanzilli:

PIC appunti di utilizzo

... solo che piuttosto che incrementare di un unità alla volta volevo muovermi a passi di 10 sia in senso crescente che decrescente:

in sostanza le istruzioni di INCF e DECF le ho sostituite con...

MOVF AL,W
ADDLW 10

e

MOVLW 10
SUBLW AL

Il problema è che il servo fa un avanti e un indietro e poi si blocca, come se la seconda GOTO MAINLOOP non venisse mai eseguita.

;-----------------------------------------------------
; SERVO.ASM - Dimostrativo pilotaggio servocomando
;-----------------------------------------------------
PROCESSOR 16F84A
RADIX DEC
INCLUDE "P16F84A.INC"
__CONFIG 11110100010001B


AL EQU 32 ;angolo
DL EQU 33 ;direzione
CL EQU 34 ;contatore ritardo

ORG 0
BSF STATUS,RP0 ;Attiva banco 1
CLRF TRISA ;Rende PORTA un'uscita
CLRF TRISB ;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,5mS
MOVWF AL
CLRF DL

MAINLOOP
BTFSS INTCON,T0IF
GOTO $-1 ;attende overflow timer
CALL SERVO ;emette singolo impulso


BTFSC DL,0 ;controlla se direz=0
GOTO MAIN2

MOVF AL,W
ADDLW 10

MOVWF AL
XORLW 220 ;controlla se =220
BTFSC STATUS,Z
BSF DL,0 ;se si cambia direzione

MOVLW 0
movwf TMR0
BCF INTCON,T0IF ;resetta bit overflow

GOTO MAINLOOP ;e torna a mainloop
MAIN2
MOVLW 10
SUBLW AL

MOVWF AL
XORLW 20 ;controlla se =20
BTFSC STATUS,Z
BCF DL,0 ;se si cambia direzione

MOVLW 0
movwf TMR0

BCF INTCON,T0IF ;resetta bit overflow

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 PORTB,1
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 PORTB,1
RETURN

END
faustog_2 non è collegato   Rispondi citando