# Contador de 0 a 99 con PIC



## garzon (Jul 29, 2010)

buenas tardes a todos estoy haciendo un contador con pic  0-99 y quiero saber como le hago para que cuando llegue a 9   que despues me cuente 10 y asi sucesivamente con el 19  y depues me cuente 20 y asi   me gustaria que me explicaran


----------



## pepechip (Jul 29, 2010)

Hola
¿que lenguaje de programacion estas utilizando?


----------



## Meta (Jul 29, 2010)

¿Cuántos pines vas a usar?

Puedes con un PIC16F84A/88 poner dos Display de 7 segmentos en paralelo excepto en ánodo o cátodo común.

Si optas por usar un PIC con más pines puedes usar el 16F886 que lo hace más fácil.


----------



## garzon (Jul 29, 2010)

si hola estoy utilizando el lenguaje asm  estoy usando el pic 16f877a  y el contador lo estoy haciendo por decremento de los contadores internos

y pues estaba pensando  en usar los pines para las unidades y las decenas el puerto b
y para activar el de decenas o unidades el puerto c

si lo puse haci para multiplexarlo   coloque los dos display en paralelo


----------



## Meta (Jul 29, 2010)

¿Puedes poner una imagen del esquema eléctrico?


----------



## garzon (Jul 29, 2010)

ajunto el diagrama en proteus


----------



## Meta (Jul 29, 2010)

Ya vi el tipo de display. Déjate de complicarte la vida. ¿Puedes usar dos display independiente?


----------



## garzon (Jul 29, 2010)

si ok pero como le hago con la programacion no ve que me sigue contando 00-11-22-33-44-55-66-77-88-99-00

y no se k hacer


----------



## Meta (Jul 29, 2010)

No entiendo ese display qu eme pasaste, jamás lo he usado.

Hola:

No tengo tiempo ahora. Leí tus privados continuos. Lo haré mañana y si es que me acuerdo. No tienes ni idea que debo instalar hasta el MPLAB, descargarlo primero, etc, sólo para ayudarte y averiguar por cuenta ajena con ese display que no lo puedo ver. Te aconsejo que uses dos display diferentes a parte. Aún así te miro lo que tienes.

¿Por qué tanta prisas?

Cuanto más desesperado, más quita las ganas.


----------



## garzon (Jul 29, 2010)

hay perdon  pero muchas gracias seguire intentando hasta el amanecer  gracias por responder   pero lo intentare a ver si puedo sacarlo mientras tanto los que tengan alguna idea por favor avisarme


----------



## pepechip (Jul 30, 2010)

hola 
esta programacion es para 4 digitos. http://www.pablin.com.ar/electron/circuito/mc/contador/contador.asm

este es el esquema http://www.pablin.com.ar/electron/circuito/mc/contador/


----------



## garzon (Jul 30, 2010)

muchas gracias  lo estare mirando gracias para poderme basar y despues hacer el mio gracias  seguire intentando si tienen mas ayuda se los agradeceria


----------



## garzon (Ago 2, 2010)

Hola amigos muchas gracia spor su ayuda   ya pude lograr hacer el contador   muchas gracias a ustedes que dedicaron el tiempo muchas gracias de verdad  ahora me voy a ir a quemarlo en el pic  gracias


----------



## garzon (Ago 4, 2010)

muy bueno si lo pude hacer funcionar, y hasta pude lograr hacer uno que cuente hasta 0- 9999 gracias a su ayuda


----------



## noelias (Nov 19, 2010)

pepechip dijo:


> hola
> esta programacion es para 4 digitos. http://www.pablin.com.ar/electron/circuito/mc/contador/contador.asm
> 
> este es el esquema http://www.pablin.com.ar/electron/circuito/mc/contador/



pepe una duddilla estuve viendo el circuito, tengo una duda si las 7 patas de los displays estan conectadas al pic, cual se conecta al transistor,? tiene mas patitas o cuales tomo? y perdon si molesto con la ignorancia


----------



## garzon (Nov 19, 2010)

mira  noelias   es facil   te  voy  a  explicar   antes de ir  a dormir  pero  si no te queda claro pregunta   
los  display     vienen  con 10 patas        y   vienen  asi   a b c d  e f g  y el  punto   y  dos  comunes   asi  que   en el circuito  muestran que   viene   asi  del pin  11 del pic  va  a la  a  del  display   10   b    9 c  8  d  7 e  6 f  12  g      hay estarian  los  7   segmentos    a b c d e f g        haria falta por conectar el punto que no se utiliza  ahora     se conecta  el transistor  al  comun del  display 2 1 18 17       estos  pines  que son del pic          van conectados    al comun del display  en este seria  el de la  mitad  de abajo     si no entendiste  pregunta


----------



## xodin (Nov 20, 2010)

Hola a todos hace unos dias me compre el PIC16F883, mi grabador es te20 el WINPIC lo reconoce pero no puede grabarlo, alguno de ustedes tendra el diagrama de un grabador SERIAL para la serie PIC16F88X de ante mano gracias,


----------



## noelias (Nov 20, 2010)

garzon dijo:


> mira  noelias   es facil   te  voy  a  explicar   antes de ir  a dormir  pero  si no te queda claro pregunta
> los  display     vienen  con 10 patas        y   vienen  asi   a b c d  e f g  y el  punto   y  dos  comunes   asi  que   en el circuito  muestran que   viene   asi  del pin  11 del pic  va  a la  a  del  display   10   b    9 c  8  d  7 e  6 f  12  g      hay estarian  los  7   segmentos    a b c d e f g        haria falta por conectar el punto que no se utiliza  ahora     se conecta  el transistor  al  comun del  display 2 1 18 17       estos  pines  que son del pic          van conectados    al comun del display  en este seria  el de la  mitad  de abajo     si no entendiste  pregunta




me quedo claro a medias, el displays posee 10 pines tanto 5 en la parte inferior y 5 en la parte superior visto la espalda viendo de izquierda a derecha, y loq que entendi, en la parte superior pin 1=a, 2 =b  ,3= comun, 4= c, 5=d
y en la parte inferior  1=e, 2=f, 3=comun, 4=g, 5=punto es asi no??

mi duda es si los dos comunes tienen que estar conectados al transistor, o basta con que uno este conectado.
 y gracias agradesco la pronta respuesta garzon, y gracias y disculpa por las molestias.


----------



## garzon (Nov 20, 2010)

hola de nuevo no no  es  molestia   estamos  aqui para  aprender  y  en esto te puedo enseñar  ahora  te corrijo      como tu dices    viendolo  desde  la espalda    viendolo de izquierda  a derecha  es  asi   
1 b   2  a  3 comun  4  f   5   g     ahora   abajo de izquierda  a derecha 
1 punto   2  c  3  comun  4  d  5  e        solamente  con un comun no importa   si es de  arriba o el  de abajo   si ya has entendido  entonces  te puedo  explicar    que  hay de dos  tipos  de  display  el primero  de catodo comun  o el segundo de anodo  comun   te lo explico ????

xodin  no para  esa serie no no tengo  diagrama


----------



## noelias (Nov 21, 2010)

garzon dijo:


> hola de nuevo no no  es  molestia   estamos  aqui para  aprender  y  en esto te puedo enseñar  ahora  te corrijo      como tu dices    viendolo  desde  la espalda    viendolo de izquierda  a derecha  es  asi
> 1 b   2  a  3 comun  4  f   5   g     ahora   abajo de izquierda  a derecha
> 1 punto   2  c  3  comun  4  d  5  e        solamente  con un comun no importa   si es de  arriba o el  de abajo   si ya has entendido  entonces  te puedo  explicar    que  hay de dos  tipos  de  display  el primero  de catodo comun  o el segundo de anodo  comun   te lo explico ????
> 
> xodin  no para  esa serie no no tengo  diagrama



ahora si, superrr el mio es cato comun, por que eso indica en la pagina a usar,  no creo que en catado comun o en anodo comun varie la poscision de los pines de los displays, y gracias Garzon de verdad que gracias.


----------



## noelias (Nov 22, 2010)

garzon dijo:


> hola de nuevo no no  es  molestia   estamos  aqui para  aprender  y  en esto te puedo enseñar  ahora  te corrijo      como tu dices    viendolo  desde  la espalda    viendolo de izquierda  a derecha  es  asi
> 1 b   2  a  3 comun  4  f   5   g     ahora   abajo de izquierda  a derecha
> 1 punto   2  c  3  comun  4  d  5  e        solamente  con un comun no importa   si es de  arriba o el  de abajo   si ya has entendido  entonces  te puedo  explicar    que  hay de dos  tipos  de  display  el primero  de catodo comun  o el segundo de anodo  comun   te lo explico ????
> 
> xodin  no para  esa serie no no tengo  diagrama


hola Garzonnn me complique la exitencia, el circuito que tu sacaste, yo no lo pude hacer correr, no se que tiene, he verificado el cableado como 15 veces y no se que esta mal, por si acaso no modfiscaste algo como agregar o quitar un componente, o en el sofware, por que no me explico por que no me corre, he quemado el pic todo,   pero hay algo que me hace`desconfiar, en el transistores estoy utilazando el bc548, y no el que esta en el diagrama pero eso no influira por que la misma pagina lo indica como remplazo, o si influe ya no se que hacer jejejej   o a que hora estaras conectado pa que te de cam o fotos de mi circuito, en este foro hay algo parecido ha  un chat para interactuar mas rapido o algo asi, por q de mensaje en mensaje ufff ni pa que imaginarrrrrr...... y graciassssssss


----------



## garzon (Nov 22, 2010)

de cual circuito hablas del  que  publico pepechip??


----------



## noelias (Nov 23, 2010)

hola soy de bolivia  estare conectado exactamente en  13 horas con treinta minutos a partir de que te llegue este mensaje, y si el circuito por el que pregunto es el que publico pepe chip, y tu en alguna parte parece que pudoste hacerlo correr pero vi en otras paginas del foro que muchos no lo sacaron por que tiene errores, y gracias por ayudarme


----------



## garzon (Nov 23, 2010)

hola si     mira  pero  el circuito de el  lo intente  y pues no no sirvio efectivamente   no funciono  asi q    intente  hacerlo  x  mi propia  cuenta   osea un contador 0-9999  y ese fue el que me funciono


----------



## noelias (Nov 24, 2010)

garzon dijo:


> hola si     mira  pero  el circuito de el  lo intente  y pues no no sirvio efectivamente   no funciono  asi q    intente  hacerlo  x  mi propia  cuenta   osea un contador 0-https://www.forosdeelectronica.com/editpost.php?do=editpost&postid=4022679999  y ese fue el que me funciono



y no me lo podes psar por que con el otro circuito ya perdi mucho tiempo, no se si podra, gracias de antemano

no se si abusar de amabilidad. sera que me lo podrias a covertir esto a hex es que no puedo, en caso de que no me puedas pasar tu circuito. Gracias!!!


----------



## garzon (Nov 25, 2010)

hola  hasta  hoy mire  pero   ese      programa  lo abri  y me di cuenta  que     esta  en lenguaje  c   entonces no no te lo puedo convertir    pero   envio  el      circuito  que  yo hice

necesitas  un   circuito   que cuente  de 0-9999  es verdad ? si es asi este  te sirve pero lo hice  con el pic  16f877  adjunto  el circuito y  el    archivo hex  y   si no sirve me avisas

aqui el hex y el circuito

ah y  se  me olvidaba  si lo vas  a presentar  en  forma  real  debes colocarle  el cristal de  4 MHZ   Y CAPACITORES DE 20pf   para que lo necesitas  ?


----------



## noelias (Nov 26, 2010)

garzon dijo:


> hola  hasta  hoy mire  pero   ese      programa  lo abri  y me di cuenta  que     esta  en lenguaje  c   entonces no no te lo puedo convertir    pero   envio  el      circuito  que  yo hice
> 
> necesitas  un   circuito   que cuente  de 0-9999  es verdad ? si es asi este  te sirve pero lo hice  con el pic  16f877  adjunto  el circuito y  el    archivo hex  y   si no sirve me avisas
> 
> ...



hola mil gracias por el interes prestado de verdad que gracias, bueno tu contador esta muy bueno, pero lo llevo aproteus y no corre y si tengo que presentarlo armado, bieno quisera ver la posibilidad si tendras algo armado y que corra, y especificamente no tiene que ser de 4cifras pueden ser con dos pero lo que yo quiero que sea ascendente y descente  aunqye sea solo ascendente pero con pulsadores, y lo sieento por molestarte y estare 8pm hora colombia haber si podes entrar y si no importa pero gracias, ahhhhh y enviame en un privado tu correo porque yo no puedo enviar privados, y menos ponerlos aka gracias


----------



## garzon (Nov 27, 2010)

como asi que lo llevas a proteus  y  no corre  si alli es donde  lo pruebo ahora y si sirve   le cargaste el programa   ?? el hex ???  y si necesitas un contador  ascendente o descende lo necesitas solamente con pic ??     osea  solamente con pulsadores  que     cambie el numero   ???


----------



## noelias (Nov 29, 2010)

garzon dijo:


> como asi que lo llevas a proteus  y  no corre  si alli es donde  lo pruebo ahora y si sirve   le cargaste el programa   ?? el hex ???  y si necesitas un contador  ascendente o descende lo necesitas solamente con pic ??     osea  solamente con pulsadores  que     cambie el numero   ???



bueno si corrrio tu proyecto, y si lo necesito que sea con pic,gracias.


----------



## Lnar92 (Mar 25, 2012)

pepechip dijo:


> hola
> esta programacion es para 4 digitos. http://www.pablin.com.ar/electron/circuito/mc/contador/contador.asm
> 
> este es el esquema http://www.pablin.com.ar/electron/circuito/mc/contador/




yo monte ese pero no me da, cuenta 0000 1111 2222 3333 4444 y asi hasta 9999, yo necesito q cambie 0001 0002 0003 hasta 9999  ayudenme por fis





garzon dijo:


> muy bueno si lo pude hacer funcionar, y hasta pude lograr hacer uno que cuente hasta 0- 9999 gracias a su ayuda



ayudame por fis yo necesito hacer lo mismo


----------



## garzon (Mar 25, 2012)

proba    el que  te puse      ese cuenta  0001 0002 0003 0004   0005  0006  0007  0008  0009  0010 asi hasta  9999


----------



## Meta (Mar 25, 2012)

Buenas:

Te da el valor 1111, 2222, 3333 por que no haz usado técnicas de barrido.






Te pasa estas cosas porque tienes acticado el cátodo común de cada display activado con el transitor 2N3904.

Si quieres que cuente del 0001, 0002, 0003 hast ael 9999. Tienes que hacer esta técnica.

El PIC controla los transistores 2N3904 como muestra arriba. En el PIC16F84A debe haber como mínimo 4 varianles para cada display con sus datos guardados, por ejemplo:

Si queremos que nos muestre este dato en el display, el 3904, las variables deben quedar como indica abajo.

Variable1 = 3
Variable2 = 9
Variable3 = 0
Variable4 = 4

Los pines del PIC para controlar los transistores son.
Pin 2 para controlar el transaistor 2N3904 del primer display de 7 segmento.
Pin 1 para controlar el transaistor 2N3904 del segundo display de 7 segmento.
Pin 18 para controlar el transaistor 2N3904 del tercero display de 7 segmento.
Pin 17 para controlar el transaistor 2N3904 del cuarto display de 7 segmento.

Lo que hace el PIC16F84A es simplemente activar el pin 2, los demás pines apagados y muestra en la variable1 el dato 3 cargado en el primer display. Ahora se apaga el pin 2, sólo se activa el pin 1 que es el segundo display con la variable2 y muestra su contenido que es el 9, así sucesivamente. Así que sóloun display está activado y los demás apagado. Esto ocurre a una velocidad muy alta para que la sesación del ojo humano, crea que los 4 display están encendido cuando en realidad lo que está conmutando a una velocidad pasmosa.

El ejemplo arriba se puede simplificar más o ordenar mejor el código más entendible.
http://www.pablin.com.ar/electron/circuito/mc/contador/contador.asm

¿Se entiende el concepto?

Un saludo.


----------



## garzon (Mar 25, 2012)

yo lo hice como mi ejemplo  y funciono perfecto


----------



## Meta (Mar 25, 2012)

Bien hecho, muchas veces hay que saber el concepto y tener las ideas claras el porqué ocurre las cosas, como los 1111, 2222, 3333.

Simplemente porque esos 4 display están en paralelo y tiene los 4 cátodos activados al mismo tiempo y no es así.

Saludo.


----------



## Lnar92 (Mar 25, 2012)

Este es mi montaje, o sea q monto cada display por separado, aunq bueno lo probe y ps tampoc me dio, lo intentare otra vez


----------



## Meta (Mar 25, 2012)

Ese display que usas en tu esquema es del mismo encapsulado, el de pablín son 4 display independientes y en paralelo.

Parece que el que tienes hace la misma función. Por tu código si no te funciona. Lo analizaremos.

Un saludo.


----------



## garzon (Mar 25, 2012)

proba el mio funciona


----------



## Lnar92 (Mar 25, 2012)

El tuyo lo probe pero ps necesito un pulsador q lo active, no q se active solo



Y SI ENTIENDO EL CONCEPTO, PERO NO, NO ME DA


----------



## D@rkbytes (Mar 25, 2012)

Saludos.
Ese famoso contador de pablin fue uno de los primeros contadores que monte.
Y si funciona contando de 0001 a 9999
Espero que los que lo estan pensando montar, no lo esten haciendo simulandolo como esta el diagrama.
Para simularlo hay que recurrir a un truco de pullups.
Pero así como esta, fisicamente si funciona. Yo lo he armado.
Aqui adjunto el código compilado tal cual esta en la pagina.
Y con su correspondiente simulación en ISIS.

Suerte y hasta luego.





Lnar92 dijo:


> Y SI ENTIENDO EL CONCEPTO, PERO NO, NO ME DA


Recuerda, al de pablin, hay que configurarle los fuses con el programa con el que grabas el PIC.
O con el mismo MPLAB, porque tal cual esta, se compila con osc RC y con el WDT activado.
También puedes colocar estas líneas hasta arriba del programa para hacerlo por software.

    list      p=16F84A
    #include <p16F84A.inc>

    __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


----------



## Meta (Mar 25, 2012)

Se refiere algo así:


```
list      p=16F84A
    #include <p16F84A.inc>
 
    __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;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
```


----------



## Lnar92 (Mar 25, 2012)

meta dijo:


> se refiere algo así:
> 
> 
> ```
> ...



ya lo probe, muchas gracias, ahora solo me falta ponerle q cuente automaticamente


----------



## ivanamado16 (May 18, 2012)

Entonces el de pablito funciona bien y se conecta esactamente como la imagen en amarillo?? asi con sus transistores y todo ?

espero la respuesta, gracias.

(tengo que hacer un contador con pic)


----------



## D@rkbytes (May 18, 2012)

ivanamado16 dijo:


> Entonces el de pablito funciona bien y se conecta esactamente como la imagen en amarillo?? asi con sus transistores y todo ?
> 
> espero la respuesta, gracias.
> 
> (tengo que hacer un contador con pic)


Si funciona.
Montalo así tal cual esta en el esquematico, configurando los fuses como cite anteriormente.

Saludos.


----------



## FJH (Nov 8, 2013)

Hola Comunidad, soy nuevo por aquí y necesito la ayuda de alguien, paso a contarles.
Tengo que hacer un contador usando el pic 16F84A de 4 dígitos que cuente de 0000 a 9999. Uso el MPLAB para compilar y el Proteus para simular, tengo la idea de hacer que comience a contar al darle con un pulsador una señal y luego siga automático, se me había ocurrido hacer unos registros y usar el flag de Z para hacer una resta del decimal 10 y el registro para que Z se levante y asi se le sume 1 al siguiente registro y así seguir hasta 9999 pero no se como hacerlo.. hice un frecuencímetro y de ahí saque la idea pero me trabo y no puedo hacerlo.
Acá lo dejo.

```
LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC   ;PALABRA de configuracion (byte)


CBLOCK    0X0C                         ;creo registros de proposito general. Desde la primera direccion
    UNIDAD                            ;el registro UNIDAD es el que guarde en la primera direccion (0x0C)
    DECENA
    CENTENA
    UDEMIL
    DESBORDES
ENDC

ORG    0                                 ;donde inicia el programa
GOTO    INICIO

ORG    4                                 ;vector de interrupt
GOTO    INTERRUPCION
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INICIO
    BSF        STATUS,RP0                ;ingresa al bco 1
    CLRF     TRISB                    ;pone en cero todo el tris b (portb como salida)
    MOVLW    b\'00011101\'             ;porta como entrada
    MOVWF    TRISA            
    MOVLW    b\'00000101\'                ;configuro registro option para decirle que use un prescaler de 64
    MOVWF    OPTION_REG        
    BCF        STATUS,RP0                ;configuracion de registro intcon se hace en bco 0
    MOVLW    b\'10100000\'                 ;configura el gie y la interrupcion de desbordamiento del timer0
    MOVWF    INTCON            
    CLRF    PORTA                    ;pongo a cero porta y portb para asegurarme de que esten limpios
    CLRF    PORTB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PRINCIPAL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    BTFSS    PORTA,0                    ;pregunta por 1 y por 0 (la señal de entrada comienza "low")
    GOTO    PRINCIPAL                ;detecto el pulso 
PREGUNTA
    BTFSC    PORTA,0        
    GOTO    PREGUNTA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UNIDADES    
    INCF    UNIDAD                    ;una vez detectado el pulso, incremento el registro UNIDAD
    MOVLW    b\'00001010\'                ;cargo el decimal 10 a W
    SUBWF    UNIDAD,W                ;resto W a UNIDAD 
    BTFSS    STATUS,Z                ;compruebo que UNIDAD llego a 10
    GOTO    PRINCIPAL 
    CLRF    UNIDAD

DECENAS
    INCF    DECENA
    MOVLW    b\'00001010\'        
    SUBWF    DECENA,W            
    BTFSS    STATUS,Z        
    GOTO    PRINCIPAL
    CLRF    DECENA

CENTENAS
    INCF    CENTENA        
    MOVLW    b\'00001010\'        
    SUBWF    CENTENA,W            
    BTFSS    STATUS,Z        
    GOTO    PRINCIPAL
    CLRF    CENTENA

UNIDADES_DE_MIL
    INCF    UDEMIL
    
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    GOTO PRINCIPAL


INTERRUPCION
    BSF        PORTA,1
    INCF    DESBORDES    
    MOVLW    b\'00111101\'                    ;debe desbordar 61 veces para que el tiempo sea de 1s
    SUBWF    DESBORDES,W        
    BTFSS    STATUS,Z
    GOTO    SALIR                        ;PARA QUE ENTRE AL MUESTREO TIENE QUE SUMAR HASTA 61, 

MUESTREO
    CLRF    PORTB
    MOVF    UNIDAD,W                    ;hago el latcheo de los 4511
    IORLW    b\'11100000\'
    MOVWF    PORTB            
    MOVF    DECENA,W
    IORLW    b\'11010000\'        
    MOVWF    PORTB            
    MOVF    CENTENA,W
    IORLW    b\'10110000\'        
    MOVWF    PORTB            
    MOVF    UDEMIL,W
    IORLW    b\'01110000\'        
    MOVWF    PORTB    
    CLRF    DESBORDES                    ;limpio los registros para volver a utilizarlos
    CLRF    UNIDAD
    CLRF    DECENA
    CLRF    CENTENA
    CLRF    UDEMIL
SALIR
    MOVLW    b\'10100000\' 
    MOVWF    INTCON    
    CLRF    TMR0    
RETFIE
END
```

Simulación:






en la imagen se ve el pic y 4 4511 que son los que uso para convertir el dato a los displays 7 segmentos. 

Desde ya muchas gracias a quien me pueda ayudar o me de alguna opinión.
Saludos.


----------



## FJH (Nov 11, 2013)

garzon dijo:


> proba    el que  te puse      ese cuenta  0001 0002 0003 0004   0005  0006  0007  0008  0009  0010 asi hasta  9999




Hola garzon estuve mirando esto y la verdad que esta muy bueno, lo probe y funciona tal cual decís. Quisiera saber si podrías ayudarme con algo similar, trabajo en lenguaje assembler, tengo el MPLAB paracompilar y el Proteus para probar y tendria que cambiar algunas cosas de esto que te vo a dejar para que me funcione como tu contador, el tema es que no puedo hacerlo funcionar como contador, he intentado modificarlo pero me cuenta todo desordenado y salteado, te dejo mi circuito y programa original, el que debo modificar.Necesito usar esa misma placa con el pic16F84A, muchas gracias de antemano y espero no molestar, soy nuevo en el foro. nuevamente Gracias



			
				FJH dijo:
			
		

> Hola garzon estuve mirando esto y la verdad que esta muy bueno, lo probe y funciona tal cual decís. Quisiera saber si podrías ayudarme con algo similar, trabajo en lenguaje assembler, tengo el MPLAB paracompilar y el Proteus para probar y tendria que cambiar algunas cosas de esto que te vo a dejar para que me funcione como tu contador, el tema es que no puedo hacerlo funcionar como contador, he intentado modificarlo pero me cuenta todo desordenado y salteado, te dejo mi circuito y programa original, el que debo modificar.Necesito usar esa misma placa con el pic16F84A, muchas gracias de antemano y espero no molestar, soy nuevo en el foro. nuevamente Gracias



Perdón, me olvide de cargar el archivo


----------



## servicom (Ago 20, 2014)

Hola. Tengo un asm bajado de pablin.com.ar de un contador de 4 dígitos.
Funciona muy bien, pero al mantener oprimido el pulsador sigue contando.
Necesito que cuente a cada pulso del pulsador, si se queda pegado el pulsador que mantenga el último número.
¿Alguien me puede dar una mano?
Adjunto asm

```
;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
```


----------



## Miembro eliminado 356005 (Ago 21, 2014)

Justo al final del programa, después de mostrar el número, hay que esperar a que el pulsador se levante.

La línea

```
goto    disp
```
la cambiamos por 

```
espe    btfsc   ptoa, 4     ; si sigue pulsado (0), saltamos una instrucción
        goto    disp        ; si no está pulsado (1), volvemos al bucle principal
        goto    espe        ; esperamos que el botón se levante
```


----------



## locosergio (Abr 17, 2015)

buenas aqui les doy una propuesta para el pcb


----------



## anthonyj (Mar 5, 2020)

hola estoy programando un contador de 00 a 99 en mikrobasic pero no puedo programar que al accionar un swith vaya en forma decendente si me pueden aconsejar que hacer se los agradeceria 
 tengo esto asta el momento
program EXAMEN
 dim suma as byte
 dim DECENAS as byte
 dim UNIDADES as byte
 main:

 trisb=0
 trisd=0
 trisa=1
 portb=0
 portd=0
 suma=0

 while 1=1

 decenas = suma/10
 unidades = suma mod 10
 select case unidades
 case 0
 portd=63
 case 1
 portd=6
 case 2
 portd=91
 case 3
 portd=79
 case 4
 portd=102
 case 5
 portd=109
 case 6
 portd=125
 case 7
 portd=7
 case 8
 portd=127
 case 9
 portd=111
 end select
 select case decenas
 case 0
 portb=63
 case 1
 portb=6
 case 2
 portb=91
 case 3
 portb=79
 case 4
 portb=102
 case 5
 portb=109
 case 6
 portb=125
 case 7
 portb=7
 case 8
 portb=127
 case 9
 portb=111
 end select
 suma = suma + 1
 delay_ms(5)
 if suma =100 then
 suma =0
 end if
    wend

  end.


----------



## Fogonazo (Mar 5, 2020)

¿ Quién escribió el programa ?


----------



## anthonyj (Mar 5, 2020)

Lo hice igual que mi profesor 
esta mal la programación?


----------



## D@rkbytes (Mar 5, 2020)

No está mal, está pésimo ese programa, es lo peor que he visto para hacer un simple contador.
Me parece que tu "profesor" no conoce los arreglos ni los bucles for.


anthonyj dijo:


> no puedo programar que al accionar un swith vaya en forma decendente


En esta parte es donde debes hacer el cambio para que sume o reste.

```
suma = suma + 1
delay_ms(5)
if suma = 100 then suma = 0
```
Si no les enseñó a restar, deberían pedir un cambio de profesor y que en lugar de Basic les enseñe C.


----------



## ricbevi (Mar 5, 2020)

También yo pondría

If suma >= 100 then suma = 0

por que si tienes un "rebote" en el pulsador cuando esta en 99 y debería sumar 1 y legar a 100 y en ves de eso suma 2 o 3, jamás el contador suma se limpiara.


----------



## anthonyj (Mar 5, 2020)

*¿*En serio est*á* mal*?
Sí* socializamos lo de C pero dijo que no conocía muy bien ese programa.
*¿Có*mo debería poner la programación para que reste*?*


----------



## ricbevi (Mar 5, 2020)

Ya te lo dijeron *restando* en vez de sumar.


----------



## D@rkbytes (Mar 5, 2020)

No uso mikroBasic porque nunca me gustó el entorno, pero es muy sencillo.
Por ejemplo:


```
If PORTAbits_RA0 = 1 Then
        suma = suma + 1
        If suma = 100 Then suma = 0
    Else
        suma = suma - 1
        If suma = 0 Then suma = 100
    End If
   
    Delay_MS (500)
```
Si usas el puerto A, recuerda que el PIC16F877A tiene conversor AD y tendrás que usarlo como digital. (Registro ADCON0)
O optar por usar el pin sobrante (RB7) del puerto B, declarar TRISB como 0b10000000 y hasta usar las resistencias pull-up internas. (Registro CMCON)


----------



## DJ T3 (Mar 5, 2020)

```
If PORTAbits_RA0 = 1 Then
        suma = suma + 1
        If suma = 100 Then suma = 0
    Else
        suma = suma - 1
        If suma = 0 Then suma = 99
    End If

    Delay_MS (500)
```

99 Dark, por que es hasta o desde 99.

Por otro lado, me sorprende lo poco que interpretan las cosas, y lo poco que se acuerdan de la primaria.
Sumas, restas, multiplicacion, division, cosas basicas.
A leer e interpretar las cosas por favor.

@anthonyj por favor, usa la etiqueta de codigo la proxima vez.
Lee por aqui [TUTO] ¿Cómo subir archivos? (XenForo)


----------



## Fogonazo (Mar 5, 2020)

Nadie entiende sutilezas en este Foro 
​1) Si el interesado fue quién creó el programa le debería ser muy fácil lograr que el programa decremente la cuenta
2) El programa es horrible


----------



## anthonyj (Mar 5, 2020)

le cambie como me mostraste pero el contador solo se quedo en cero


----------



## D@rkbytes (Mar 5, 2020)

Sube nuevamente el programa con lo que cambiaste.



DJ T3 dijo:


> 99 @Dark, por que es hasta o desde 99.


No, porque de esa forma el contador no llegará a 0, sino que cuando llegue a 1 pasará a 99


----------



## Eduardo (Mar 5, 2020)

Flaco por favor sacá ese SELECT CASE porque da conjuntivitis ver usarlo para eso.

Ahi se usa un array,  como son constantes, lo declarás al principio.

```
dim suma     as byte
dim DECENAS  as byte
dim UNIDADES as byte
const mask7s as byte[10]= (63,6,91,79,102,109,125,7,127,111)
```


Y despues, en lugar de esa chorrera de CASEs

```
UNIDADES = suma/10
        DECENAS = suma mod 10

        portd = mask7s[unidades]
        portb = mask7s[decenas]
```


Por otro lado, otra forma para incrementar/decrementar suma podés usar la función módulo

```
suma = (suma + updn) mod 100
```
Donde updn es una variable que hacés valer 1 cuando quieras que incremente y 255 para que decremente.


----------



## DJ T3 (Mar 5, 2020)

D@rkbytes dijo:


> No, porque de esa forma el contador no llegará a 0, sino que cuando llegue a 1 pasará a 99



Me referia a la resta, pero en la cita que puse no salió lo remarcado.
En la suma está bien, sumas, comprobas si llegaste a 100, si es asi, volves a 0.
En la resta habias puesto que si llegas a 0, entonces colocas a 100 la variable, y en vez de eso, seria poner en 99, y comprobar si llegas a -1, en vez de 0.


----------



## D@rkbytes (Mar 5, 2020)

Es que todo depende de en qué parte se coloque la comparación.
Si es así, se tendrá que contar hasta 100

```
suma = suma - 1
    If suma = 0 Then suma = 100
```

Pero si es así, sí se tendría que contar hasta 99

```
If suma = 0 Then suma = 99
    suma = suma - 1
```



DJ T3 dijo:


> sería poner en 99 y comprobar si llegas a -1 en vez de 0


Eso no puede suceder en una variable sin signo.


----------



## DJ T3 (Mar 6, 2020)

Recuerda que la visualizacion la hace al principio, osea que si hace ésto


D@rkbytes dijo:


> Si es así, se tendrá que contar hasta 100
> 
> ```
> suma = suma - 1
> ...



Al querer visualizar, se va a mostrar "100", en vez de "99", ya que la resta la hace antes de que l variable cambie a "100".

Y si es asi


D@rkbytes dijo:


> Pero si es así, sí se tendría que contar hasta 99
> 
> ```
> If suma = 0 Then suma = 99
> ...



Se visualiza "98", ya que antes de visualizar, se resta 1.



D@rkbytes dijo:


> Eso no puede suceder en una variable sin signo.



Si, no me di cuenta...


----------



## anthonyj (Mar 6, 2020)

gracias por su ayuda voy a seguir sus instrucciones  para que funcione la programación


----------



## anthonyj (Mar 19, 2020)

Hice esa programación y me sali*ó* bien*. G*racias por la ayuda*.
L*o volv*í *a programar para que vaya de dos en dos pero no funciona*,* un contador se queda en cero y el otro si funciona*.
N*o s*é* c*ó*mo programar para que funcionen los 2 y también que al mandar un voltaje de 5*V* cuente n*ú*meros impares*.
¿M*e podrían ayudar o aconsejar qu*é* hacer*, *por favor*?*

```
dim suma     as byte
dim DECENAS  as byte
dim UNIDADES as byte
const mask7s as byte[10]= (63,6,91,79,102,109,125,7,127,111)
```


Y despues, en lugar de esa chorrera de CASEs

```
UNIDADES = suma/10
        DECENAS = suma mod 10

        portd = mask7s[unidades]
        portb = mask7s[decenas]
```


----------



## D@rkbytes (Mar 20, 2020)

¿Qué tiene de complicado que en vez de sumar 1 se sume 2 o 3?


----------

