Autor Tema: contador de 0 a 999 asc/des con pic  (Leído 3600 veces)

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

Desconectado dario9669

  • PIC10
  • *
  • Mensajes: 38
contador de 0 a 999 asc/des con pic
« en: 10 de Septiembre de 2013, 21:04:33 »
hola tengo un proyecto de un contador de 0 a 999 con un pic 16f84 tengo toda la sentencia completa el tema es que no tiene un pulsador para descender , mi idea es que ascienda y descienda , aca les dejo la instruccion para ver si me pueden ayudar a modificarla para esa funcion

;Contador de 4 digitos.

indo    equ     00h             ;registro de indireccion
pc      equ     02h             ;contador de programa
status  equ     03h             ;registro de estado
fsr     equ     04h             ;registro de seleccion
ptoa    equ     05h             ;puerto a
ptob    equ     06h             ;puerto b
rota    equ     0fh             ;variable para desplazamiento de display
trisa   equ     85h             ;configuracion puerto a
trisb   equ     86h             ;configuracion puerto b
dig1    equ     10h             ;acumulador miles
dig2    equ     11h             ;acumulador centenas
dig3    equ     12h             ;acumulador decenas
dig4    equ     13h             ;acumulador unidades
loops   equ     1dh             ;variables usadas en retardos
loops2  equ     1eh
z       equ     02h             ;flag de cero
ram     equ     05h             ;bit de seleccion de pagina de memoria
c       equ     00h             ;flag de acarreo
w       equ     00h             ;bit de destino a variable de trabajo

reset   org     00
        goto    inicio
        org     05h

retardo                         ;subrutina de retardo
        movwf   loops           ;la variable de trabajo contiene la cant.
top2    movlw   d'110'          ;de ms a demorar
        movwf   loops2
top     nop
        nop
        nop
        nop
        nop
        nop
        decfsz  loops2          ;controla si termina 1mS
        goto    top
        decfsz  loops           ;controla si termina el retardo completo
        goto    top2
        retlw   0

s1000                           ;rutina de incremento x 1000
        clrf    dig2            ;pone a cero las centenas
        incf    dig1            ;incrementa el contador de miles   
        movf    dig1, w         ;carga en work el conteo de los miles   
        xorlw   0ah             ;si work era 10, entonces quedara en cero
        btfsc   status, z       ;si es cero, el flag z queda alto
        clrf    dig1            ;inicializa los miles   
        return
s100                            ;rutina de incremento x 100
        clrf    dig3            ;pone a cero las decenas
        incf    dig2            ;incrementa el contador de centenas
        movf    dig2, w         ;carga en work el conteo de las centenas
        xorlw   0ah             ;si work era 10, entonces quedara en cero
        btfsc   status, z       ;si es cero, el flag z queda alto
        call    s1000           ;incrementa los miles   
        return

s10                             ;rutina de incremento x 10
        clrf    dig4            ;pone a cero las unidades
        incf    dig3            ;incrementa el contador de decenas
        movf    dig3, w         ;carga en work el conteo de las decenas
        xorlw   0ah             ;si work era 10, entonces quedara en cero
        btfsc   status, z       ;si es cero, el flag z queda alto
        call    s100            ;incrementa las centenas
        return

subir                           ;rutina de incremento
        incf    dig4            ;incrementa el contador de unidades
        movf    dig4, w         ;carga en work el conteo de las unidades
        xorlw   0ah             ;si work era 10, entonces quedara en cero
        btfsc   status, z       ;si es cero, el flag z queda alto
        call    s10             ;incrementa las decenas
        movlw   d'250'          ;retardo de 100ms
        call    retardo
        return

tabla                           ;genera los numeros sobre el display
        addwf   pc              ;agrega al cont. programa el valor de work
        retlw   b'00111111'     ;genera el 0
        retlw   b'00011000'     ;genera el 1
        retlw   b'01110110'     ;genera el 2
        retlw   b'01111100'     ;genera el 3
        retlw   b'01011001'     ;genera el 4
        retlw   b'01101101'     ;genera el 5
        retlw   b'01101111'     ;genera el 6
        retlw   b'00111000'     ;genera el 7
        retlw   b'01111111'     ;genera el 8
        retlw   b'01111101'     ;genera el 9

inicio                          ;programa principal
        bsf     status, ram     ;selecciona el banco de memoria alto
        movlw   b'00010000'     ;configura el puerto a
        movwf   trisa           ;bit 4 entrada, demas bits salidas.
        movlw   00h             ;configura el puerto b
        movwf   trisb           ;como salidas
        bcf     status, ram     ;selecciona el banco de memoria bajo
        clrf    dig1            ;inicializa acumuladores
        clrf    dig2
        clrf    dig3
        clrf    dig4
        movlw   00              ;envia ceros a los transistores para apagar
        movwf   ptoa            ;todos los displays

empe    btfss   ptoa, 4         ;chequea el pulsador
        call    subir           ;llama la rutina de incremento
        movlw   08h             ;iniciar un 1 en el registro de rotacion
        movwf   rota           
        movlw   dig1            ;con el registro selector (fsr) se apunta
        movwf   fsr             ;al primer dato que se va a mostrar
disp    movlw   00h             ;colocar en cero el dato del display
        movwf   ptob            ;para apagarlos
        movf    rota, w         ;pasa rotacion del 1 a la variable work
        movwf   ptoa            ;enciende el transistor (display)
        movf    indo, w         ;lee el dato del registro apuntado por fsr
        call    tabla           ;genera el digito de 7 segmentos
        movwf   ptob            ;envia el digito al puerto b
        movlw   03h             ;retardo de 3ms para visualizacion
        call    retardo
        btfsc   rota, 0         ;controla si terminaron las cuatro rotaciones
        goto    empe            ;si termino, vuelve desde el comienzo
        bcf     status, c       ;carry en cero para no afectar las rotaciones
        rrf     rota            ;desplaza el 1 que enciende los displays
        incf    fsr             ;incrementa el puntero. Apunta el proximo
        goto    disp            ;digito a mostrar

        end

por favor si me pueden ayudar modificando este programa se los agradezco

Desconectado bluesboy

  • PIC12
  • **
  • Mensajes: 89
Re: contador de 0 a 999 asc/des con pic
« Respuesta #1 en: 15 de Septiembre de 2013, 19:55:17 »
Hola, mira, yo tengo a la venta un equipo que tiene esas funciones.
Lo solucione de la siguiente forma, en determinada pata del pic (una entrada) si le pongo un 1, suma, si le pongo un 0 resta.
Muy simple.
Si quieres puedes poner un pulsador y un contador y controlar cuando se pulsa una vez que sume y cuando se pulsa dos veces que reste.
Espero haberte ayudado.
Que andes bien.

Desconectado BBMNet

  • PIC12
  • **
  • Mensajes: 91
Re: contador de 0 a 999 asc/des con pic
« Respuesta #2 en: 17 de Septiembre de 2013, 02:14:34 »
Adjunto un programa para realizar un contador de esas características, de 000 a 999 con protección contra roll-over en caso de tratar de decrementar a menos de cero.

Se le podría añadir otra para el límite superior. Como está, después de 999 regresa a 000.

Perdón por el esquemático a mano. Además no incluye ni el oscilador de reloj ni el reset.

Espero sus comentarios.
« Última modificación: 17 de Septiembre de 2013, 13:30:51 por BBMNet »

Desconectado BBMNet

  • PIC12
  • **
  • Mensajes: 91
Re: contador de 0 a 999 asc/des con pic
« Respuesta #3 en: 18 de Septiembre de 2013, 15:45:57 »
Con respecto al circuito del contador estoy notando que los caps de 0.1uF son vitales ya que sin ellos el circuito se vuelve muy sensible y con tocar cualquiera de las entradas éstas alcanzan a leer el ruido inducido y actúan como válidas.

En breve reportaré más.


 

anything