Newsgroup: it.hobby.elettronica.digitale
Titolo: pilotare un servo via PIC

Ciao gente!!!
...sto cercando di pilotare un servo di quelli da radiocomandi x modellismo
(marca HITEC) utilizzando un pic...
Tutto quello che so è che per muoversi il servo ha bisogno di un treno di
impulsi positivi a circa 20ms l'uno dall'altro della durata compresa tra 1ms
e 2ms per impulso positivo; la durata dell'impulso determina il denso di
rotazione...
Il problema è che ho scritto il codice per il mio 16F84 ma non si muove un
bel niente...
allego qui di seguito il listato del codice così che chi ne sa qualcosa + di
me possa vedere cosa ho combinato.
Grazie e CIAO
Ulisse
;**************************************************************************
 PROCESSOR 16F84
 RADIX DEC
 INCLUDE "P16F84.INC"
 ;Setup of PIC configuration flags
 ;XT oscillator
 ;Disable watch dog timer
 ;Enable power up timer
 ;Disable code protect
 __CONFIG 3FF1H
;_________________________________________________________________
START EQU     156 ;preload per TMR0 in modo da ottenere un divisore 200
 ORG 0CH
DELAY RES 1 ;x contare il tempo tra gli impulsi
LIMP RES 1 ;x contare la lunghezza dell'impulso
 ORG 00H
 BSF STATUS,RP0
 movlw   00000000B
        movwf   TRISA & 7FH
        movlw   00001111B
        movwf   TRISB & 7FH
 movlw 00000000B ;Assegna il PRESCALER a TMR0 e lo configura a 1:2 (500.000
Hz)
 movwf OPTION_REG & 0x7F
 bcf STATUS,RP0  ;Commuta sul primo banco dei registri
;_________________________________________________________________
;******** inizia il programma
MAIN
 movlw START  ;inizializza il conteggio x 100
 movwf TMR0
 movlw 100  ;inizializza il delay di 20ms
 movwf DELAY
 goto PRG
;******** gestisce la temporizzazione
PRG
 movf TMR0,W
        btfss STATUS,Z ;if TMR0=0 then salta
 goto PRG  ;else ripeti
 movlw START  ;inizializza il conteggio x 100
 movwf TMR0
 decfsz DELAY
 goto PRG
 bsf PORTA,0
 btfsc PORTB,0  ;controlla RB0 da cui impongo il senso di rotazione
 goto AVANTI
 goto INDIETRO
;********
AVANTI
 movlw 6
 movwf LIMP  ;LIMP --> 1,2ms
 goto MUOVI
;********
INDIETRO
 movlw 8  ;LIMP --> 1,6ms
 movwf LIMP
 goto MUOVI
;********
MUOVI
 movf TMR0,W
        btfss STATUS,Z ;if TMR0=0 then salta
 goto MUOVI  ;else ripeti
 movlw START  ;inizializza il conteggio x 100
 movwf TMR0
 decfsz LIMP
 goto MUOVI
 bcf PORTA,0
 movlw 100  ;inizializza il delay di 20ms
 movwf DELAY
 goto PRG
 END

> la durata dell'impulso determina il senso di rotazione...
La durata dell'impulso determina la posizione non il senso di rotazione,
sempre che non abbia mal interpretato la tua affermazione.
Quindi 1ms servo tutto da una parte, 2ms servo dall'altra, 1,5ms
servo al centro.
Non conosco i pic quindi non so dire cose fai nel listato.
Spero comunque di esserti stato d'aiuto.
Ciao
   Giancarlo

 (marca HITEC) utilizzando un pic...
sono riuscito a farlo partire ma non so proprio per quale assurdo motivo
adesso funziona... per caso ho messo il PRESCALER a 4 anziché a 2 ma adesso
tutte le temporizzazioni dovrebbero essere raddoppiate!!!
QUALCUNO MI AIUTIIIIIIII !!!!!!!!!!
Bye, Ulisse
;**************************************************************************
 PROCESSOR 16F84
 RADIX DEC
 INCLUDE "P16F84.INC"
 ;Setup of PIC configuration flags
 ;XT oscillator
 ;Disable watch dog timer
 ;Enable power up timer
 ;Disable code protect
 __CONFIG 3FF1H
;_________________________________________________________________
START EQU     156 ;preload per TMR0 in modo da ottenere un divisore
PRESCALER*100
DEL EQU     100 ;DELAY in Hz-->1MHz/(PRESCALER*100)/DEL -->ms=1/Hz
 ORG 0CH
DELAY RES 1 ;x contare il tempo tra gli impulsi
LIMP RES 1 ;x contare la larghezza dell'impulso
 ORG 00H
 BSF STATUS,RP0
 movlw   00011000B ;[0 output] [1 input]
        movwf   TRISA & 7FH
        movlw   11111111B
        movwf   TRISB & 7FH
;casualmete ho variato il prescaler e tutto si č messo a funzionare?????
;non dovrebbe: TMR0 passa per 0 ogni 0,4ms
;cosě come č impostato DEL ho un tempo tra i due impulsi di 40ms!!!
;inoltre la larghezza dell'impulso č di 2ms in un caso e di 3,8ms
nell'altro?!?!?!
 movlw 00000001B ;Assegna il PRESCALER a TMR0 e lo configura a 1:4 (250.000
Hz)
 movwf OPTION_REG & 0x7F
 bcf STATUS,RP0
;_________________________________________________________________
;******** inizia il programma
MAIN
 movlw 00000000B
 movwf PORTA
 movlw 00000000B
 movwf PORTB
 movlw START  ;inizializza il conteggio x 100
 movwf TMR0
 movlw DEL  ;inizializza il delay
 movwf DELAY
 goto PRG
;******** gestisce la temporizzazione
PRG
 movf TMR0,W
        btfss STATUS,Z ;if TMR0=0 then salta
 goto PRG  ;else ripeti
 movlw START  ;inizializza il conteggio x 100
 movwf TMR0
 decfsz DELAY,1
 goto PRG
 bsf PORTA,0  ;inizia l'impulso positivo
 bsf PORTA,1
 goto AVANTI
;********
AVANTI
 movlw 5 ;gira un poco in un senso
 ;movlw 9 va a fine corsa nell'altro senso
 movwf LIMP
 goto MUOVI
;********
MUOVI
 movf TMR0,W
        btfss STATUS,Z ;if TMR0=0 then salta
 goto MUOVI  ;else ripeti
 movlw START  ;inizializza il conteggio x 100
 movwf TMR0
 decfsz LIMP,1
 goto MUOVI  ;ripete il conteggio finché LIMP<>0
 bcf PORTA,0  ;termina l'impulso positivo
 bcf PORTA,1
 movlw DEL  ;inizializza il delay


 servo al centro.
siamo daccordo :-)
Ciao
Ulisse