Autor Tema: controlar un servo desde un PIC 16F876  (Leído 2506 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado DraKKaR_

  • PIC10
  • *
  • Mensajes: 1
controlar un servo desde un PIC 16F876
« en: 21 de Febrero de 2004, 13:05:00 »
Hola, soy nuevo en esto de la electronica.
Tengo que controlar un servo desde un PIC 16F876. He probado un montaje y un programa en ASM que habia en una web pero parece no funcionar: cuando lo pruebo, el servo que tendria ke dar una vuelta entera... solo hace un pequeño ademán y se para.

¿Podriais darme alguna referencia o link a alguna página donde se mueste un diagrama de como conectar estod dispositivos y un pequeño programa en ensamblador que controle el servo?

Gracias.


Este es el código que uso pero no funciona:

      LIST   P=PIC16F876


w       EQU     0       ;Destino W
f       EQU     1       ;Destino registro
RA      EQU     05h     ;Puerta A
RB      EQU     06h     ;Puerta B
PORTA   EQU     05h     ;Puerta A
PORTB   EQU     06h     ;Puerta B
TRISA   EQU     5h      ;Registro triestado de Puerta A
TRISB   EQU     6h      ;Registro triestado de Puerta B
STATUS  EQU     03h     ;Registro STATUS
OPCION  EQU     1h      ;Registro OPCION
RBPU    EQU     7h      ;Bit R de polarizaci¢n
RP0     EQU     05h     ;Bit 5 registro STATUS
PDel0   EQU   0Ch
PDel1   EQU   0Dh

;                                    
;************************* Seccion Codigo de RESET **************************
;                                    
                ORG     00h             ;Direccion del Vector de RESET
                GOTO    Inicializa      ;Comienza el programa
                ORG     05h             ;Una posicion detras del Vector Interrupcion
;                                    
;**************************** Seccion Inicializa ****************************
;                                    
                                     
Inicializa        BSF   STATUS,5   ;Seleccion Banco 1
      MOVLW   b"00000000"   ;Carga W
      MOVWF   TRISB      ;Bit0 Puerta B salida
      MOVLW   b"00000001"   ;Carga W
      MOVWF   TRISA      ;Bit0 Puerta A entrada
      BCF   STATUS,5   ;Seleccion Banco 1
      CLRF   RB


LeerEntrada   ;BTFSC   RA,0      ;Comprueba estado interruptor en RA0
      GOTO   Servo_pos_1   ;Si ra0 = 0 salta y pone el servo en pos. 2
;      GOTO   Servo_pos_2   ;Si ra0 = 1 no salta y pone el servo en pos. 1
      GOTO    LeerEntrada   ; Bucle infinito


;************* Pulso de 0,2 ms para poner el servo en 0º ********************

Servo_pos_1   BSF   RB,0      ;Pone a 1 la salida Rb0

;------------------Bucle retardo duracion pulso a 1--------------
PDelay     movlw   .48          ; 1 set number of repetitions
           movwf   PDel0        ; 1 |
PLoop0     clrwdt                 ; 1 clear watchdog
           decfsz  PDel0, 1     ; 1 + (1) is the time over?
           goto    PLoop0       ; 2 no, loop
PDelL1     goto    PDelL2            ; 2 cycles delay
PDelL2     clrwdt                 ; 1 cycle delay
;----------------------------------------------------------------

      BCF   RB,0      ;Pone a 0 la salida Rb0

;-------------Bucle retardo duracion resto onda hasta 20 ms--------------
PDelayR     movlw   .86          ; 1 set number of repetitions (B)
            movwf   PDel0        ; 1 |
PLoop1R     movlw   .45          ; 1 set number of repetitions (A)
            movwf   PDel1        ; 1 |
PLoop2R     clrwdt                ; 1 clear watchdog
PDelL1R     goto    PDelL2R          ; 2 cycles delay
PDelL2R     clrwdt                ; 1 cycle delay
            decfsz  PDel1, 1     ; 1 + (1) is the time over? (A)
            goto    PLoop2R      ; 2 no, loop
            decfsz  PDel0,  1    ; 1 + (1) is the time over? (B)
            goto    PLoop1R      ; 2 no, loop
;----------------------------------------------------------------


             GOTO   LeerEntrada  

;************* Pulso de 2,2 ms para poner el servo en 180º ********************

Servo_pos_2   BSF   RB,0      ;Pone a 1 la salida Rb0

;------------------Bucle retardo duracion pulso a 1--------------
PDelay_2     movlw   .4           ; 1 set number of repetitions (B)
           movwf   PDel0        ; 1 |
PLoop1_2     movlw   .136          ; 1 set number of repetitions (A)
           movwf   PDel1        ; 1 |
PLoop2_2     clrwdt               ; 1 clear watchdog
           decfsz  PDel1, 1     ; 1 + (1) is the time over? (A)
           goto    PLoop2_2       ; 2 no, loop
           decfsz  PDel0,  1    ; 1 + (1) is the time over? (B)
           goto    PLoop1_2       ; 2 no, loop
PDelL1_2     goto    PDelL2_2         ; 2 cycles delay
PDelL2_2     clrwdt                 ; 1 cycle delay
;----------------------------------------------------------------

      BCF   RB,0      ;Pone a 0 la salida Rb0

;-------------Bucle retardo duracion resto onda hasta 20 ms--------------
PDelayS     movlw   .17           ; 1 set number of repetitions (B)
           movwf   PDel0        ; 1 |
PLoop1S     movlw   .205         ; 1 set number of repetitions (A)
           movwf   PDel1        ; 1 |
PLoop2S     clrwdt                 ; 1 clear watchdog
           clrwdt                 ; 1 cycle delay
           decfsz  PDel1, 1     ; 1 + (1) is the time over? (A)
           goto    PLoop2S       ; 2 no, loop
           decfsz  PDel0,  1    ; 1 + (1) is the time over? (B)
           goto    PLoop1S       ; 2 no, loop
PDelL1S     goto    PDelL2S         ; 2 cycles delay
PDelL2S  
           ;return                 ; 2+2 Done   
;----------------------------------------------------------------
           GOTO   LeerEntrada  

 
      END    

Desconectado Harry32

  • PIC10
  • *
  • Mensajes: 39
RE: controlar un servo desde un PIC 16F876
« Respuesta #1 en: 22 de Febrero de 2004, 06:37:00 »
Hola Drakkar_
Solo aclararte unas ideas. Un servo a noser que este modificado no da una vuelta entera, sino que gira mas o menos 180 grados dependiendo de la anchura de pulso recibida por la entrada de señal.
Aunque suele variar de un fabricante a otro el punto central, o sea 90 grados, corresponde a 1,5 ms. de anchura de pulso, 1 ms a 0 grados y 2 ms. a 180 grados. Una cosa mas entre pulso y pulso no debe de pasar mas de 20 ms. de tiempo, sino el servo se relaja y pierde su fuerza.
Espero que esto te sirva de ayuda.
Saludos a todos

Desconectado angelmoi123

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 298
    • Construccion de Maquinas CNC
RE: controlar un servo desde un PIC 16F876
« Respuesta #2 en: 22 de Febrero de 2004, 16:58:00 »
Saludos

Totalmente de acuerdo con Harry.

angelmoi123


 

anything