# Controlar motores por pic 16f84a



## eysaku (Feb 25, 2010)

buenas queria controlar unos motores dc por el pic 16f84a para ver si alguien tendria algo parecido en assembler para programar el pic utilizando un servo de motores l293b


----------



## muessli (Feb 25, 2010)

entonces control de motor dc o de servo? Porque no probas el l298, es muy bueno y facil de usar con pics.
Saludos.


----------



## KanonOfGeminis (Mar 28, 2010)

Si son motores paso a paso, te puede servir este codigo:


```
LIST   P=16F84A
INCLUDE  <P16F84A.inc>
RADIX  HEX
STATUS   EQU 03h ; REGISTRO ESTADO 
PORTA   EQU 05h ; PUERTO A 
PORTB   EQU 06h ; PUERTO B 
OPTION_REG  EQU 81h ; REGISTRO DE INTERRUPCION 
INTCON   EQU 0bh 
TRISA   EQU 85h ; REGISTRO CONFIGURACION PUERTO A 
TRISB   EQU 86h ; REGISTRO CONFIGURACION PUERTO B
CONTA   EQU 0X0D ;Damos el nombre de CONTA a dir. 0Dh(USO GENERAL)
CONTB   EQU 0X0E ;Damos el nombre de CONTB a dir. 0Eh(USO GENERAL)
CONTC   EQU 0X0F ;Damos el nombre de CONTC a dir. 0Fh(USO GENERAL) 
   ORG 00h ; INDICA AL COMPILADOR DONDE COMIENZA EL PROGRAMA 
   GOTO INICIO ; VA A SUBRUTINA INICIO 
   ORG 04h 
INICIO 
   BSF STATUS,5 
   MOVLW B'11111' ; CARGA '11111' EN EL REGISTRO DE TRABAJO 'W' 
   MOVWF TRISA ; CARGA 'W' EN EL PUERTO A 
   MOVLW B'00000000' ; CARGA '00000000' EN EL REGISTRO DE TRABAJO 'W' 
   MOVWF TRISB ; CARGA 'W' EN EL PUERTO B 
   MOVLW B'00000111' ; CARGA '00000111' EN EL REGISTRO DE TRABAJO 'W' 
   MOVWF OPTION_REG ; CONFIGURAMOS TMR0 COMO CONTADOR DESCENDENTE 
   BCF STATUS,5 ; VUELVE A 0 
   CLRF PORTA 
   CLRF PORTB 
GIRO 
   BTFSC PORTA,0 ; EN ESTE PUERTO DA EL GIRO A LA IZQUIERDA 
   GOTO GIRO1 
   GOTO IZQUIERDA 
GIRO1 
   BTFSC PORTA,1 ; EN ESTE PUERTO DA EL GIRO A LA DERECHA 
   GOTO GIRO2 
   GOTO DERECHA 
GIRO2 
   BTFSC PORTA,2 ; EN ESTE PUERTO ABRE 
   GOTO GIRO3 
   GOTO ABRE 
GIRO3 
   BTFSC PORTA,3 ; EN ESTE PUERTO CIERRA 
   GOTO GIRO 
   GOTO CIERRA 
DERECHA 
   MOVLW B'00001100' ; PRIMER PASO. 
   MOVWF PORTB 
   CALL TIEMPO ; TEMPORIZACIÓN ANTES DE PASAR AL SIGIENTE PASO 
   MOVLW B'00000110' ; SEGUNDO PASO 
   MOVWF PORTB 
   CALL TIEMPO 
   MOVLW B'00000011' ; TERCER PASO 
   MOVWF PORTB 
   CALL TIEMPO 
   MOVLW B'00001001' ; CUARTO PASO 
   MOVWF PORTB 
   CALL TIEMPO 
   GOTO GIRO ; SE VUELE A GIRO PARA MIRAR EL ESTADO DEL BIT 
IZQUIERDA 
   MOVLW B'00001001' ; PRIMER PASO 
   MOVWF PORTB 
   CALL TIEMPO ; TEMPORIZACIÓN ANTES DE PASAR AL SIGIENTE PASO 
   MOVLW B'00000011' ; SEGUNDO PASO 
   MOVWF PORTB 
   CALL TIEMPO 
   MOVLW B'00000110' ; TERCER PASO 
   MOVWF PORTB 
   CALL TIEMPO 
   MOVLW B'00001100' ; CUARTO PASO 
   MOVWF PORTB 
   CALL TIEMPO 
   GOTO GIRO ; SE VUELVE A GIRO PARA MIRAR EL ESTADO DEL BIT 
CIERRA 
   MOVLW B'11000000' ; PRIMER PASO. 
   MOVWF PORTB 
   CALL TIEMPO ; TEMPORIZACIÓN ANTES DE PASAR AL SIGIENTE PASO 
   MOVLW B'01100000' ; SEGUNDO PASO 
   MOVWF PORTB 
   CALL TIEMPO 
   MOVLW B'00110000' ; TERCER PASO 
   MOVWF PORTB 
   CALL TIEMPO 
   MOVLW B'10010000' ; CUARTO PASO 
   MOVWF PORTB 
   CALL TIEMPO 
   GOTO GIRO ; SE VUELE A GIRO PARA MIRAR EL ESTADO DEL BIT 
ABRE 
   MOVLW B'10010000' ; PRIMER PASO 
   MOVWF PORTB 
   CALL TIEMPO ; TEMPORIZACIÓN ANTES DE PASAR AL SIGIENTE PASO 
   MOVLW B'00110000' ; SEGUNDO PASO 
   MOVWF PORTB 
   CALL TIEMPO 
   MOVLW B'01100000' ; TERCER PASO 
   MOVWF PORTB 
   CALL TIEMPO 
   MOVLW B'11000000' ; CUARTO PASO 
   MOVWF PORTB 
   CALL TIEMPO 
   GOTO GIRO ; SE VUELVE A GIRO PARA MIRAR EL ESTADO DEL BIT 
TIEMPO
   movwf PORTB    ;sacamos los pasos por el PORTb
   call  Retardo_100ms  ;realizamos el llamado para el retardo
   return      ;retorno de donde fue llamado
Retardo_100ms       ;retardo de 100 milisegundos
   movlw d'1000'    ;OJO d100=100mlsegundos  cambio otros valores como ejemplo d50=50mlsegundos
   goto Retardos_ms
Retardos_ms
   movwf CONTB   
R1ms_BucleExterno
   movlw d'249'   
   movwf CONTA   
R1ms_BucleInterno
   nop    
   decfsz CONTA,F   
   goto R1ms_BucleInterno 
   decfsz CONTB,F   
   goto R1ms_BucleExterno  
   return
   END
```
 
Lo implemente en el control de 2 motores paso a paso para el control de una electrovalvula. Cualquier duda que tengas estare dispuesto a responderte.


----------



## eysaku (Mar 29, 2010)

hola muchas gracias dejame chequearlo para probarlo una preguntica no sabes en el pic 16f877 la instruccion o el registro para decirle al pic que va a trabajar con oscilador externo gracias por tu ayuda


----------



## Jrafmen (May 29, 2011)

Hola creo que ya es muy tarde pero yo hice un programa para mover un motor de cd
con un un 16fxxx y esta simulado en proteus no se si todavia te sriva??
la programacion esta hecha en C


----------



## kurt cobain (Ene 19, 2013)

Jrafmen dijo:


> Hola creo que ya es muy tarde pero yo hice un programa para mover un motor de cd
> con un un 16fxxx y esta simulado en proteus no se si todavia te sriva??
> la programacion esta hecha en C



Podrías adjuntar el archivo para verlo


----------



## Jrafmen (Ene 20, 2013)

Mira este es el control de motor, cambio de giro, automático y manual, también si le pones dedicación esta para ser controlado en una forma remota  todo viene en el .RAR.

Saludos!!!


----------



## kurt cobain (Ene 20, 2013)

Jrafmen dijo:


> Mira este es el control de motor, cambio de giro, automático y manual, también si le pones dedicación esta para ser controlado en una forma remota  todo viene en el .RAR.
> 
> Saludos!!!



Muchas gracias Jrafmen 

Saludos


----------



## Meta (Feb 16, 2014)

Hola:

Quiero controlar un motor DC con el PIC16F84A. El motor dc solo gira un sentido. _(Luego pongo el esquema eléctrico)._ El funcionamiento del circuito es que el motor está apagado. Cuando pulse un botón, se queda el motor encendido durante ese tiempo. Por ejemplo, si pulso el Pulsador 2, el motor se activa y se detiene a los 10 minutos.

Si quiero detener el motor cuando está en marcha, con pulsar el botón Reset es suficiente.

*Pulsador 1 --> 5 minutos. RA4
Pulsador 2 --> 10 minutos. RA3
Pulsador 3 --> 20 minutos. RA2
Reset  --> Para detener los tiempos. Es como si fuera un STOP. En realidad  resetea el PIC y lo pone en modo inicio, esperando que pulses un botón.*
*Motor DC --> RB4.*

Mi idea original es tener un Pulsador 4 del pin RA1 que detenga el tiempo cuando quiera. Como no se me da calcular bien los tiempos con el timer 0. Opté la idea de usar rutinas de tienmpos que se puede generar aquí.

El PIC queda esclavo, aunque puslse otro botón para cambiar el tiempo mientras el motor está encendido, o incluso detener el motor con otro pulsador que no sea Reset, no se puede hacer porque el PIC no ejecutará otra acción hasta que se acabe el tiempo. Es la parte mala.

La forma de pulsar el pulsador es el siguiente. El código INCOMPLETO que está abajo trabaja así:

Si pulas un pulsador, se enciende el motor, si lo vuelves a pulsar, se apaga el motor. Ahora me toca añadir el tiempo de 5, 10 o 20 minutos con las subrutinas que crearé. A lo mejor queda bien si pulso un botón, empieza el tiempo, cuando acabe se detiene el motor.


```
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

    CBLOCK 0x0C
    ENDC

#DEFINE Pulsador_1    PORTA,4        ; Pulsador conectado a RA4.
#DEFINE Pulsador_2  PORTA,3     ; Pulsador conectado a RA3.
#DEFINE Pulsador_3  PORTA,2     ; Pulsador conectado a RA2.
#DEFINE Motor        PORTB,1        ; Línea donde se conecta el diodo Motor.

; ZONA DE CÓDIGOS ********************************************************************

    ORG    0                        ; El programa comienza en la dirección 0.
Inicio
     bsf        STATUS,RP0            ; Acceso al Banco 1.
    bsf        Pulsador_1            ; La línea RA4 se configura como entrada.
    bcf        Motor                ; Se configura como salida.
    bcf        STATUS,RP0            ; Acceso al Banco 0.
    bcf        Motor                ; En principio diodo Motor apagado.
Principal
    btfsc    Pulsador_1            ; ¿Pulsador presionado?, ¿(Pulsador)=0?
    goto    Fin                    ; No. Vuelve a leerlo.
    call    Retardo_20ms        ; Espera que se estabilicen los niveles de tensión.
    btfsc    Pulsador_1            ; Comprueba si es un rebote.
    goto    Fin                    ; Era un rebote y sale fuera.
    btfsc    Motor                ; Testea el último estado del Motor.
     goto    EstabaEncendido
EstabaApagado
    bsf        Motor                ; Estaba apagado y lo enciende.
    goto    EsperaDejePulsar
EstabaEncendido
    bcf        Motor                ; Estaba encendido y lo apaga.
EsperaDejePulsar
    btfss    Pulsador_1            ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
    goto    EsperaDejePulsar    ; No. Espera que deje de pulsar.

; Pulsador 2.
    btfsc    Pulsador_2            ; ¿Pulsador presionado?, ¿(Pulsador)=0?
    goto    Fin                    ; No. Vuelve a leerlo.
    call    Retardo_20ms        ; Espera que se estabilicen los niveles de tensión.
    btfsc    Pulsador_2            ; Comprueba si es un rebote.
    goto    Fin                    ; Era un rebote y sale fuera.
    btfsc    Motor                ; Testea el último estado del Motor.
     goto    EstabaEncendido2
EstabaApagado2
    bsf        Motor                ; Estaba apagado y lo enciende.
    goto    EsperaDejePulsar2
EstabaEncendido2
    bcf        Motor                ; Estaba encendido y lo apaga.
EsperaDejePulsar2
    btfss    Pulsador_2            ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
    goto    EsperaDejePulsar2    ; No. Espera que deje de pulsar.

; Pulsador 3.
    btfsc    Pulsador_3            ; ¿Pulsador presionado?, ¿(Pulsador)=0?
    goto    Fin                    ; No. Vuelve a leerlo.
    call    Retardo_20ms        ; Espera que se estabilicen los niveles de tensión.
    btfsc    Pulsador_3            ; Comprueba si es un rebote.
    goto    Fin                    ; Era un rebote y sale fuera.
    btfsc    Motor                ; Testea el último estado del Motor.
     goto    EstabaEncendido
EstabaApagado3
    bsf        Motor                ; Estaba apagado y lo enciende.
    goto    EsperaDejePulsar3
EstabaEncendido3
    bcf        Motor                ; Estaba encendido y lo apaga.
EsperaDejePulsar3
    btfss    Pulsador_3            ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
    goto    EsperaDejePulsar3    ; No. Espera que deje de pulsar.
Fin
    goto    Principal

; ZONA DE SUBRRUTINAS ****************************************************************
Retardo_20ms
    cblock
    RAM
    RAM_1
    endc

Delay
            ;199993 cycles
    movlw    0x3E
    movwf    RAM
    movlw    0x9D
    movwf    RAM_1
Delay_0
    decfsz    RAM, f
    goto    $+2
    decfsz    RAM_1, f
    goto    Delay_0

            ;3 cycles
    goto    $+1
    nop

            ;4 cycles (including call)
    return


    END
```

¿Alguna sugerencia para mejorarlo?


----------

