Autor Tema: Contar pulsaciones de un botón y parpadear en un LED el numero de pulsos 16F84A.  (Leído 6893 veces)

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

Desconectado Ayreon90

  • PIC10
  • *
  • Mensajes: 5
 :2]Buen día colegas primero que nada agradezco a este foro por toda la gran información que me han brindado, de esta manera recurro a este foro para pedir de la manera mas cordial que me ayudaren a resolver el siguiente problema. Bueno la situación es la siguiente, estoy utilizando el PIC 16F84A con lenguaje Ensamblado (.asm), lo que deseo hacer es el control de un motor a pasos, bueno mi idea es desde el PIC contar los pasos de avance deseados a través de un botón A, y guardar el valor de ese conteo de pulsos en una variable, después al presionar un botón B, por un pin de salida del PIC sacar el numero pulsos contados por el botón A hacia la entrada de reloj de un IC 4017 y su ves esta hacia un puente H para la mover el motor a pasos unipolar, si alguien me pudiera ayudar se lo agradecería demasiado.
 :P :-/ :mrgreen:

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Parece relativamente "simple" o por demas simple

Que tenes realizado ya ? y en que necesitas que te ayudemos. Por que lo que me estas diciendo realmente parece muy simple, 2 BTFSS + CALL para el programa principal, 1 delay para el antirebote, 1 delay para el motor tal ves, tal ves una tabla para el manejo del motor, un DECFSZ  mas nos BSF y BCF para manejar la salida del reloj, fin. Es todo el programa que se me ocurre xD. Los delays hay paginas online que te los hacen. asi que seria hacer lo otro.

EDIT: ASM de PIC va en "Almacen de ASM" pero no te preocupes ya un moderador va a mover el tema alla, no crees otro.

Desconectado Ayreon90

  • PIC10
  • *
  • Mensajes: 5
OK ya vi que lo movieron jeje perfecto no me di cuenta que lo había puesto en la categoría de ATMEL, es que antes de hacer el nuevo tema estaba viendo info sobre ATMEL, bueno pues realmente soy algo nuevo en este tema del (.asm), eh hecho programas basándome en el libro de microcontroladores de Roberto palacios creo que así es como se llama, donde he hecho varios ejercicios pero de momento no entiendo como hacer este que acabo de citar, dado que ocupo el PIC siempre este contando los pulsos que recibe del botón A, y este deje de contar hasta que presione el botón B el cual tomara ese numero de pulsos contados y los convertirá en pulsos que saldrán solo de un solo Pin del PIC hacia la entrada de reloj del 4017.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
La pregunta es:

Es necesario que siga contando o debe omitir completamente los pulsos del boton A mientras esta moviendo el motor ?
Si no es necesario te ahorras de interrupciones, sino vas a tener que configurar las interrupciones y usarlas.

Código: ASM
  1. ORG 0x00
  2.   GOTO CONFIGURACION
  3. ORG 0x04
  4.   GOTO PRINCIPAL
  5.  
  6. CONFIGURACION:
  7.   ;Aca configuras los TRIS,etc etc
  8.  
  9.  
  10. ; Rutina principal leyendo
  11. PRINCIPAL
  12.    BTFSS PORTB,0  ;Supongo entrada de boton A
  13.    CALL  BOTONA
  14.    BTFSS PORTB,1  ;Supongo boton B
  15.    CALL  BOTONB
  16.    GOTO PRINCIPAL
  17.  
  18. BOTONA
  19.     CALL DELAY_BOTON  ; Un pequeño delay de 20ms por ejemplo, asi no usas antirebote
  20.     BTFSS PORTB,0
  21.     RETURN                   ; En caso que no siga estando en 1 en esos 20ms vuelve
  22. L_BTNA
  23.     BTFSC PORTB,0         ; Ahora me aseguro que lo solto, de esa forma cuenta cuando suelto unicamente, si no le pongo la condicion esta el programa puede hacerlo muchas veces
  24.     GOTO L_BTNA
  25.     INCF CONTADOR,F     ; Por fin mi programa del boton, incremento un registro, imagino que no va a superar los 255 pulsos por eso me mantengo en 8 bits
  26.     RETURN
  27.  
  28. BOTONB
  29.     BSF  PORTB,3           ; Reseteamos el 4017
  30.     BCF  PORTB,3    
  31. L_BTNB
  32.     MOVF     CONTADOR,W    ; El MOVF actualiza la bandera Z
  33.     BTFSC    STATUS,Z    ;Me aseguro que no sea 0 o que llego a 0
  34.     RETURN
  35.     DECF  CONTADOR,F    ;Decremento CONTADOR
  36.     ; Seccion manejo de CLK
  37.     BCF PORTB,2             ;Salida de clock
  38.     BSF PORTB,2             ; Flanco ascendente suma
  39.     ; Seccion manejo del motor
  40.     ;Aca el codigo de tu motor
  41.     GOTO L_BTNB
  42.  
  43.  
  44. DELAY_BOTON
  45.     ; Aca el codigo de tu delay

Esto es valido siempre y cuando se cumplan los tiempos, un ejemplo es que el CD4017 a 5V la el minimo del pulso del CLK es de 125ns o 250ns como maximo, Por lo cual si vas a usar el codigo asi como esta como maximo serian 16Mhz en el oscilador del PIC, sino deberias agregar unos NOP y ya con eso cumplirias los requisitos del 4017 o tal ves funcione con 20Mhz al cumplirse el valor normal de 125ns. Luego veras lo del motor.

El codigo es simple, esta comentado y no posee complejidad, observaras que en el programa principal partimos por leer las entradas, si se cumple que alguno esta en 1 entonces ahi recien hacemos algo, agregamos unas protecciones ya que como sabes cada instruccion tarda en ejecutarse  4 / Fosc, si supongo 20Mhz son 200ns , si no agregaramos protecciones sobre preguntar cuando el boton se solto nuestro codigo se ejecutaria muchas veces. El antirebote es por que los switch en fisico apenas los presionas no cierran el circuito perfectametne y se ve un pequeño rebote en la señal, como si se presionara y soltara varias veces, entonces se le agrega el delay.

A partir de ahi hacemos nuestro codigo, boton A, solo incrementa una variable,  te recuerdo nuevamente el maximo de tener un registro de 8 bits es 255, si queres mas debes usar 2 registros.
Boton B, mueve el pin de reloj y hace lo del motor, mientras se ejecuta el boton B, el boton A no va a seguir sumando (por que esta encerrado haciedno lo del boton B ). Observaras tambien que el boton B no le escribi ninguna proteccion de antirebote o para que no se ejecute muchas veces. En realidad lo ultimo si lo hice, al preguntar por Contador si es igual a 0. Si lo es entonces sale. El antirebote no me preocupo por que su codigo dura mucho mas. Y esta ademas lo que dije antes.

En fin, Boton A incrementa el contador y boton B lo vacia
« Última modificación: 13 de Abril de 2015, 04:57:31 por KILLERJC »

Desconectado Ayreon90

  • PIC10
  • *
  • Mensajes: 5
No es necesario que siga contando, debe anular los pulsos del boton A mientras se mueva el motor.

Desconectado Ayreon90

  • PIC10
  • *
  • Mensajes: 5
Disculpa mi amigo, me da verguenza pero complete el codigo con lo que le faltaba y no logro detectar cual es el error que me marca el compilador, disculpa la ignorancia pero aun soy novato en esto del asm.

;======================================

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

    CBLOCK   0x0C
    Contador
   ENDC

    ORG 0x00
    GOTO CONFIGURACION
    ORG 0x04
    GOTO PRINCIPAL

CONFIGURACION
  ;Aca configuras los TRIS,etc etc
bsf   STATUS,RP0              ; Acceso al Banco 1.

   movlw   b'00111000'         ; TMR0 como contador por flanco descendente de
   movwf   OPTION_REG          ; RA4/T0CKI. Prescaler asignado al Watchdog.
   bcf   STATUS,RP0              ; Acceso al Banco 0.


; Rutina principal leyendo
PRINCIPAL
   BTFSS PORTB,0  ;Supongo entrada de boton A
   CALL  BOTONA
   BTFSS PORTB,1  ;Supongo boton B
   CALL  BOTONB
   GOTO PRINCIPAL

BOTONA
    CALL   Retardo_20ms  ; Un pequeño delay de 20ms por ejemplo, asi no usas antirebote
    BTFSS PORTB,0
    RETURN                   ; En caso que no siga estando en 1 en esos 20ms vuelve
L_BTNA
    BTFSC PORTB,0         ; Ahora me aseguro que lo solto, de esa forma cuenta cuando suelto unicamente, si no le pongo la condicion esta el programa puede hacerlo muchas veces
    GOTO L_BTNA
    INCF CONTADOR,F     ; Por fin mi programa del boton, incremento un registro, imagino que no va a superar los 255 pulsos por eso me mantengo en 8 bits
    RETURN

BOTONB
    BSF  PORTB,3           ; Reseteamos el 4017
    BCF  PORTB,3
L_BTNB
    MOVF     CONTADOR,W    ; El MOVF actualiza la bandera Z
    BTFSC    STATUS,Z    ;Me aseguro que no sea 0 o que llego a 0
    RETURN
    DECF  CONTADOR,F    ;Decremento CONTADOR
    ; Seccion manejo de CLK
    BCF PORTB,2             ;Salida de clock
    BSF PORTB,2             ; Flanco ascendente suma
    ; Seccion manejo del motor
    ;Aca el codigo de tu motor
    GOTO L_BTNB

    INCLUDE  <RETARDOS.INC>
    END

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Primero que falta configurar el TRISB asi lo pones como entrada o salidas.

Si pones el error que da el compilador va a ser mucho mas facil saber cual es el problema.
« Última modificación: 13 de Abril de 2015, 05:39:42 por KILLERJC »

Desconectado Ayreon90

  • PIC10
  • *
  • Mensajes: 5
Ok mira este es el error que me arroja es por MPLAB X:



make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'C:/Users/Daniel/Desktop/Escuela/Microcontrladores/Proyectos MPLAB/ptadd.X'
make  -f nbproject/Makefile-default.mk dist/default/production/ptadd.X.production.hex
make[2]: Entering directory 'C:/Users/Daniel/Desktop/Escuela/Microcontrladores/Proyectos MPLAB/ptadd.X'
make[2]: *** [build/default/production/PtAdd.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
"C:\Program Files (x86)\Microchip\MPLABX\mpasmx\mpasmx.exe" -q -p16f84a -l"build/default/production/PtAdd.lst" -e"build/default/production/PtAdd.err" -o"build/default/production/PtAdd.o" "PtAdd.asm"
Warning[203] C:\USERS\DANIEL\DESKTOP\ESCUELA\MICROCONTRLADORES\PROYECTOS MPLAB\PTADD.X\PTADD.ASM 16 : Found opcode in column 1. (bsf)
Message[302] C:\USERS\DANIEL\DESKTOP\ESCUELA\MICROCONTRLADORES\PROYECTOS MPLAB\PTADD.X\PTADD.ASM 19 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Error[113]   C:\USERS\DANIEL\DESKTOP\ESCUELA\MICROCONTRLADORES\PROYECTOS MPLAB\PTADD.X\PTADD.ASM 38 : Symbol not previously defined (CONTADOR)
Error[113]   C:\USERS\DANIEL\DESKTOP\ESCUELA\MICROCONTRLADORES\PROYECTOS MPLAB\PTADD.X\PTADD.ASM 45 : Symbol not previously defined (CONTADOR)
Error[113]   C:\USERS\DANIEL\DESKTOP\ESCUELA\MICROCONTRLADORES\PROYECTOS MPLAB\PTADD.X\PTADD.ASM 48 : Symbol not previously defined (CONTADOR)
nbproject/Makefile-default.mk:95: recipe for target 'build/default/production/PtAdd.o' failed
make[2]: Leaving directory 'C:/Users/Daniel/Desktop/Escuela/Microcontrladores/Proyectos MPLAB/ptadd.X'
nbproject/Makefile-default.mk:78: recipe for target '.build-conf' failed
make[1]: Leaving directory 'C:/Users/Daniel/Desktop/Escuela/Microcontrladores/Proyectos MPLAB/ptadd.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed

BUILD FAILED (exit value 2, total time: 5s)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Warning[203] C:\USERS\DANIEL\DESKTOP\ESCUELA\MICROCONTRLADORES\PROYECTOS MPLAB\PTADD.X\PTADD.ASM 16 : Found opcode in column 1. (bsf)
Message[302] C:\USERS\DANIEL\DESKTOP\ESCUELA\MICROCONTRLADORES\PROYECTOS MPLAB\PTADD.X\PTADD.ASM 19 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Error[113]   C:\USERS\DANIEL\DESKTOP\ESCUELA\MICROCONTRLADORES\PROYECTOS MPLAB\PTADD.X\PTADD.ASM 38 : Symbol not previously defined (CONTADOR)
Error[113]   C:\USERS\DANIEL\DESKTOP\ESCUELA\MICROCONTRLADORES\PROYECTOS MPLAB\PTADD.X\PTADD.ASM 45 : Symbol not previously defined (CONTADOR)
Error[113]   C:\USERS\DANIEL\DESKTOP\ESCUELA\MICROCONTRLADORES\PROYECTOS MPLAB\PTADD.X\PTADD.ASM 48 : Symbol not previously defined (CONTADOR)


Esos son...

En realidad son 3 errores, 1 warning y un mensaje.

1ro - El primer avisa que la instruccion en la linea 16 (bsf   STATUS,RP0) esta en la columna 1, donde estarian las banderas. fijate que todas las demas instrucciones estan separadas. Agrega espacio al frente de la instruccion, un TAB

2do - se refiere a (bcf   STATUS,RP0) Linea 19 puede ser un error del compilador al creer que STATUS se encuentra unicamente en el banco 0.

3ro,4to y 5to -  En las lineas 38,45 y 48 tu problema fue que definiste Contador ( con la C mayuscula nomas ) y en el programa se usa CONTADOR ( todo mayuscula ) entonces te indica que no existe CONTADOR, cambia en el Cblock, Contador por CONTADOR y listo


Ademas como dije faltan configurar los TRISB poniendo el PORTB 0 y 1 como entradas y las demas salidas


 

anything