Autor Tema: contador con decremento  (Leído 4902 veces)

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

Desconectado mibspy

  • PIC10
  • *
  • Mensajes: 3
contador con decremento
« en: 11 de Noviembre de 2004, 13:54:00 »
hola, ¿¿como estan???

tengo un problema con un proyecto.

se trata de un contador con tres o cuatro digitos(representados por display), al presionar un pulsador(boton) debe aumentar y al presionar otro pulsador debe disminuir.

ya tengo realizado el montaje y el programa para 4 display(el montaje y el programa los obtuve de la siguiente direccion:  http://www.pablin.com.ar/electron/circuito/mc/contador/index.htm ), pero para realizar el cambio de agregar el pulsador de la resta (con el respectivo cambio en el codigo) hay que remover uno de los display (el que me indica los 1000) y remover el transistor que le lleva corriente al display, esto con el motivo de liberar uno de los pines del puerto A del pic 16f84.

mi dilema está en no saber como cambio el programa y estoy muy enredado con los ciclos de decremento (no tengo practica en esto ya que apenas estoy comenzando a estudiar la programación de pics)

muchas gracias por su atención y suerte

Desconectado JacoPastorius2004

  • PIC10
  • *
  • Mensajes: 42
RE: contador con decremento
« Respuesta #1 en: 11 de Noviembre de 2004, 15:55:00 »
Hola!

Como dicen por aca: "Si no pegas el codigo para verlo, es dificil poder ayudar"


Desconectado mibspy

  • PIC10
  • *
  • Mensajes: 3
RE: contador con decremento
« Respuesta #2 en: 12 de Noviembre de 2004, 08:42:00 »
este es el programa que me solicitaste, muchas gracias por lo que puedan hacer

;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

como lo dije en el anterior mensaje el montaje esta en la pagina http://www.pablin.com.ar/electron/circuito/mc/contador/index.htm
y la dificultad que tengo es agregarle un pulsor al montaje que me produzca los decrementos, y no se como hacer el codigo correspondiente para este decremento.

muchas gracias por su atencion
SUERTE!!!

Desconectado JacoPastorius2004

  • PIC10
  • *
  • Mensajes: 42
RE: contador con decremento
« Respuesta #3 en: 12 de Noviembre de 2004, 10:18:00 »
Hola!

No te hace falta quitarle un 7 segmentos, podes usar los 4, ya que te queda el pin13 del PIC libre para que lo uses como entrada, con el pulsador que va a decrementar. Conectado tal cual esta el pulsador que incremeta "I" con una R a VCC.
Lo demas dejalo como esta.
Espera que analizo el codigo, despues te digo.


Desconectado mibspy

  • PIC10
  • *
  • Mensajes: 3
RE: contador con decremento
« Respuesta #4 en: 19 de Noviembre de 2004, 15:29:00 »
que pena la demora en responder, gracias pos tu paciencia y espero que me puedas ayudar.

mibspy
Suerte!!!

Desconectado JacoPastorius2004

  • PIC10
  • *
  • Mensajes: 42
RE: contador con decremento
« Respuesta #5 en: 19 de Noviembre de 2004, 15:55:00 »
Hola!

Master, mira por ahora no pude crear alguna rutina que haga lo que queres, ya que he estado corto de tiempo.
He analizado el codigo y lo que necesitas no es muy dificil, fijate bien como funcionan las lineas que incrementan los distintos digitos (unidades, decenas, centenas, u. de mil).
El decremento seria algo parecido, usa la instruccion inverza al incremento.
Tambien tenes que tener en cuenta que cuando decrementas las unidades (cuando llega a cero) le pide o decrementa en uno a las decenas y asi sucesivamente, volviendo las unidades a 9.
Debes preguntar si lo que vas a decrementar llego a cero, para "pedir" un uno al digito superior, se entiende?
Sino practica los casos con papel y lapiz, como seria el algoritmo, con diagramas de flujo, y una vez que lo tengas claro mandate con el codigo.

Proba este algoritmo con los ejemplos numericos de abajo (o con el que se te ocurra a vos), creo que anda:
Ahora trata de convertirlo en codigo assembler

unidades igual a cero?
no: entonces decremento unidades
si: entonces decenas igual a cero?

no: entonces decremento decena y hago unidades igual a "9"
si: entonces centenas igual a cero?

no: entonces decremento centenas y hago decenas y unidades iguales a "9"
si: entonces u. de mil igual a cero?

no: entonces decremento u. de mil y hago centenas, decenas  y unidades iguales a "9"
si: no puedo seguir decrementando, llegue a "0000"


4890  
4889

5000
4999

0001
0000


 

anything