# control display 7 segmentos con un pulsador



## chito (Mar 14, 2012)

Hola, me llamo David y este es mi primer post. ( puse otro el el lugar equivocado, pido disculpas).
Estoy empezando a programar pic, y como no... tengo dudas. A ver si me podeis echar una mano.

Quiero que un display de siete segmentos controlado por un 16f84a, valla ascendiendo de cero a cinco, pero solo un numero cada vez actue el pulsador.

Tengo este codigo:

I var Byte
pulsador var byte
aumentar var byte
cero con %11000000
uno con %11111001
dos con %10100100
tres con %10110000
cuatro con %10011001
cinco con %10010010



trisa = %11111 ;configura el puerto a como entradas
trisb = %00000000 ;configura el puerto b como salidas

porta =%00000 ;inicializa el puerto a
portb =%11111111 ;inicializa el puerto b

inicio:
aumentar = I+1
pulsador = porta.0

if pulsador = 1 then I = i + 1 



call digito


goto inicio



digito:

if I = 0 THEN portb = cero
if I = 1 then portb = uno 
if I = 2 then portb = dos
if i = 3 then portb = tres
if i = 4 then portb = cuatro 
if i = 5 then portb = cinco 

return 

End


El caso es que estando asi, cuando pulso, me sube directamente al cinco.
¿Que puede ser?


----------



## manu123 (Mar 14, 2012)

El microprocesador es muy rápido, el tiempo que pulsas el micro ha pasado de 1-2, de 2-3, de 3-4 y de 4-5 Intenta hacerlo con un cambio de estado, es decir, introduce en una memoria temporal el estado del pulsador, si cambia en la siguiente lectura del programa, por ejemplo de 0 (sin pulsar) a 1 (pulsado) el contador aumenta.


----------



## chito (Mar 15, 2012)

Te agradezco la respuesta, pero no acabo de entenderlo.
La parte de la rapidez del micro si, pero no entiendo que quieres decir con lo de crear una variable con el estado del pulsador.


----------



## chito (Mar 16, 2012)

una ayudita, que por mas que le doy vueltas, no soy capaz.


----------



## heli (Mar 16, 2012)

Es un recurso muy común en programación, se hace así:
(pseudocódigo C)
bool EstadoAnterior=0, EstadoActual;

EstcadoActual=LeerPinEntrada();
if (EstdoActual==1 && EstadoAnterior==0) 
{
// Solo entra aquí si se ha actuado el pulsador y antes no estaba pulsado. Para que entre de
// nuevo hay que soltarlo y volverlo a pulsar
}
EstadoAnterior=EstadoActual;
....
...


----------



## D@rkbytes (Mar 16, 2012)

chito dijo:


> una ayudita, que por mas que le doy vueltas, no soy capaz.


Analiza este código que realice hace algún tiempo.
Me parece que te puede servir para que entiendas el concepto.


----------



## tannke (Mar 16, 2012)

Yo también pondría un pequeño retardo para el tema de los rebotes. 
Un saludo


----------



## D@rkbytes (Mar 17, 2012)

Saludos.
Para generar el código de los segmentos del display, realice un proyecto para eso.
Con este programa se pueden corregir los números 6 y 9 del proyecto que subí arriba.
Por si lo requieren, aqui anoto el enlace del proyecto.

*Generador de código para displays de 7 segmentos*


----------



## chito (Mar 17, 2012)

no  puedo ver el codigo del contador , ¿puedes resubirlo?


----------



## D@rkbytes (Mar 17, 2012)

chito dijo:


> no  puedo ver el codigo del contador , ¿puedes resubirlo?


¿No lo puedes ver, o no lo puedes abrir?
¿Que editor de PBP estas usando?
Es el archivo *.pbp
Si te fijas, tiene varias descargas, así que el archivo (comprimido rar) esta bien.
Lo subí así porque contiene la simulación del proyecto.
Y el proyecto también funciona en la realidad.


----------



## chito (Mar 18, 2012)

Ok. Ya lo abri, y me a servido de gran ayuda.
Muchas gracias por todo.
De momento ya lo ley y lo aproveche para mi programa, ahora tengo que hacer que al meterle un 1 por porta.2 muestre una linea nada mas en display. "anulando" todas las demas ordenes.
Voy a ver si lo consigo.
Gracias de nuevo

Ya lo tengo, os muestro el codigo por si veis algun error, pero simulandolo me corre todo bien.


```
;*******************************************************************************
; Titulo: contador velocidades
; Autor: chito
; Compañia: xx
; Fecha: 18/03/2012
; Notas: 
; contador de velocidad engranada para moto
;*******************************************************************************


DEFINE OSC 4


trisa = %11111          ;configura el  puerto a como entradas
trisb = %00000000       ;configura el  puerto b como salidas

porta =%00000           ;inicializa el puerto a
portb =%11111111        ;inicializa el puerto b

;*******************************************************************************
SYMBOL  PBSUBE = PORTA.0
SYMBOL  PBBAJA = PORTA.1
symbol  PUNTOM = porta.2
CUENTA  VAR BYTE

CLEAR               ; Limpiar las variables al iniciar el PIC o Resetear
PORTB = %111111     ; Mostrar el 0 en el Display     


CheckPB:               ; Comprobar que Pushbutton se pulso
               
if PUNTOM=1 then
pause 100
goto RALLA
endif
               
IF PBSUBE=1 THEN
PAUSE   100
GOTO Subir
endif


IF PBBAJA=1 THEN
PAUSE   100
GOTO Bajar
ENDIF




GOTO CheckPB



Subir:              ; Incrementar la variable CUENTA


IF CUENTA>=5 THEN CUENTA=4
CUENTA=CUENTA+1

GOTO Display

Bajar:              ; Decrementar la variable CUENTA
IF CUENTA<=1 THEN CUENTA=2
CUENTA=CUENTA-1
GOTO Display

RALLA:
 
portb=%10111111



goto checkpb

Display:            ; Mostrar la cuenta en el Display
SELECT CASE CUENTA

CASE 1
PORTB = %11111001        ; Digito 1
case 2
PORTB = %0100100    ; Digito 2
CASE 3
PORTB = %0110000    ; Etc.
CASE 4
PORTB = %0011001
CASE 5
PORTB = %0010010

END SELECT

GOTO CheckPB


RETURN
END
```
Este programa esta escrito, para armar un contador de velocidad engranada para una moto.
En el cual el orden de las velocidades es:
1
(punto muerto) una ralla en el display y la señal la saco del sensor de punto muerto de la moto (porta.3)
2
3
4
5
Pero ahora tengo un problema, quiero que si el display esta mostrando la ralla osea portb=%10111111 y pulso en "Subir" deberia saltar a mostrar un dos en el display y de ahy seguir con la cuenta normal.


----------



## D@rkbytes (Mar 18, 2012)

Ok.
Entonces solo coloca esto en el código.

RALLA:
CUENTA=1    ; CUENTA toma el valor 1
portb=%10111111

Así, cuando se presione el botón subir la variable CUENTA estará en 1 y el próximo conteo será 2


----------



## chito (Mar 24, 2012)

Hola de nuevo. Pues cuando tenia echo el codigo lo probe en proteus y anda todo bien, programo el micro y no anda. Lo acabo de probar en pic simulator y tampoco anda. El caso es que en proteus va todo bien, no se que pasa.
A ver si me echais una mano, os pongo el codigo:
*******************************************************************************


DEFINE OSC 4


trisa = %11111          ;configura el  puerto a como entradas
trisb = %00000000       ;configura el  puerto b como salidas

porta =%00000           ;inicializa el puerto a
portb =%10111111        ;inicializa el puerto b

;*******************************************************************************

CUENTA  VAR BYTe       


CheckPB:               ; Comprobar que Pushbutton se pulso

if porta.2=1 then
pause 100
goto RALLA
endif

IF porta.0=1 THEN
PAUSE   100
GOTO Subir
endif


IF porta.1=1 THEN
PAUSE   100
GOTO Bajar
ENDIF

 goto checkpb




Subir:              ; Incrementar la variable CUENTA

IF CUENTA>=5 THEN CUENTA=4
CUENTA=CUENTA+1

GOTO Display




Bajar:              ; Decrementar la variable CUENTA

IF CUENTA<=1 THEN CUENTA=2
CUENTA=CUENTA-1
GOTO Display

RALLA:
cuenta=1 
portb=%10111111



goto checkpb

Display:            ; Mostrar la cuenta en el Display
SELECT CASE CUENTA

CASE 1
PORTB = %11111001        ; Digito 1
case 2
PORTB = %0100100    ; Digito 2
CASE 3
PORTB = %0110000    ; Etc.
CASE 4
PORTB = %0011001
CASE 5
PORTB = %0010010

END SELECT

GOTO CheckPB


RETURN

END


----------



## chito (Mar 24, 2012)

Aqui os pongo los archivos.
Con este codigo lo maximo que hago es encender el led de rb6 por unos segundos al inicializar el micro, despues se apaga y ya no hace nada


----------



## D@rkbytes (Mar 24, 2012)

chito dijo:


> Aqui os pongo los archivos.
> Con este codigo lo maximo que hago es encender el led de rb6 por unos segundos al inicializar el micro, despues se apaga y ya no hace nada


Saludos.
Analiza los cambios que realice a tu código y al diseño.
Posiblemente con esos cambios ya te funcione, de hecho tiene que funcionar.
Los cambios y observaciones los comente en el código.

Suerte y hasta luego.


----------



## peep387 (Mar 24, 2012)

poco a poco se te ve mejorando. el comando selec case es muy practico para ese tipo de comparaciones multiples.
pero los display te aconsejava mterlos en una variable array.

display var byte [19]
display [0]=%11111101  ' 0
display [1]=%01000101  ' 1
display [2]=%01111011  ' 2
display [3]=%01101111  ' 3
display [4]=%11000111  ' 4
display [5]=%10101111  ' 5
display [6]=%10111111  ' 6
display [7]=%01100101  ' 7
display [8]=%11111111  ' 8
display [9]=%11100111  ' 9
display [10]=%00000001 '  blanco
display [11]=%00000011 ' -
display [12]=%10111011 ' E
display [13]=%10011001 ' L
display [14]=%11110101 ' n
display [15]=%10110011 ' F
display [16]=%11100011 ' o
display [17]=%11010111 ' H
display [18]=%11110111 ' A
'
'______5      
'____****    
'_7_*____* 6  
'___*__1_*   
'____****    
'_4_*____* 2  
'___*____*   
'____****    
'______3  

esto seria como configure el ultimo display. los numeros que tiene el dibujo el display de 7 segmentos corresponden a donde los conecte en el puerto B
y bueno el bit correspondiente a b.0 ese lo puedes poner como quieras yo los pongo a uno porque dan el pulso clk a un 4017 (en otro proyecto e ese tipo se lo avia asignado al reset del 4017)   

y nada tansolo te seria despues sacarlo al display.  

portb=display[marcha]

donde marcha seria la variable definida con el numero de uno al 5 y con esto te evitas el selec case.

un saludo


----------



## chito (Mar 24, 2012)

ok, muchas gracias por vuestro tiempo, pero sigo teniendo problemas.
Baje el archivo de Darkbytes, y quite los retardos en el pulsador. Lo conecte de la misma forma forma que estaba en proteus y ahora al conectar el circuito o bien me enciende como si fuera el "PM" ( PORTB = %10111111) o bien me enciende como si tuviera un cinco en el display (PORTB = %10010010), y los pulsadores siguen sin tener ningun tipo de respuesta.
¿deberia de poner algun retardo en el sotfware para los pulsadores?
¿por que unas veces inicia de una manera y otras de otra?
He grabado directamente el .hex y asi actua, lo he modificado quitando los retardos y la linea @define, ya que microbasic no me deja compilar asi. Luego le programo los fuses con pikkit 2 (cofiguration:3FF1) creo que asi esta bien.
Necesito la opinion de los maestros a ver si doy con ello de una vez, que llevo muchas horas ya con esto y solo consigo encer un led.
Que dura es la vida del aprendiz de programador...


----------



## D@rkbytes (Mar 24, 2012)

chito dijo:


> ok, muchas gracias por vuestro tiempo, pero sigo teniendo problemas.
> Baje el archivo de Darkbytes, y quite los retardos en el pulsador. Lo conecte de la misma forma forma que estaba en proteus y ahora al conectar el circuito o bien me enciende como si fuera el "PM" ( PORTB = %10111111) o bien me enciende como si tuviera un cinco en el display (PORTB = %10010010), y los pulsadores siguen sin tener ningun tipo de respuesta.
> ¿deberia de poner algun retardo en el sotfware para los pulsadores?
> ¿por que unas veces inicia de una manera y otras de otra?
> ...


  Ok.
Al parecer el problema que tienes, ya no es precisamente por software, sino por hardware.
Puede ser que tengas ruido en la alimentación, que ingresen más de 5 pulsos, o sean muy rápidos, etc.
Revisa ahora este nuevo código, al cual le añadí antirebote (debounce) por software.
Y otra manera de almacenar el código del número para ser mostrado en el display.

PD. Te recomiendo que realices tus programas de PBP con MicroCode Studio Plus.

Suerte y hasta luego.


----------



## chito (Mar 25, 2012)

Gracias de nuevo. He probado con ese codigo y sigue haciendo lo mismo.
He cambiado la fuente de aimentacion y tampoco a dado resultado. ¿Que puedo hacer ahora?
Ayer lei que poniedo un 7805 convierte la tension de una fuente de 12v a 5, pero fuy a comprarle y el vendedor no me lo quiso vender, dice que no venden componentes sueltos, cuando otras veces sus compañeros si lo han echo, pero ese es otro tema..
Mañana ire a otra tienda a ver si lo consigo y lo pruebo con una buena fuente.


----------



## chito (Mar 27, 2012)

Hola a todos de nuevo, hoy he comprado el 7805 lo conecte, y nada. Sigue igual.
Estoy atascado, ya no se por donde seguir. He cambiado cristales, condensadores, PIC, resistencias, vamos que lo cambie todo y sigue sin responder a los pulsadores.
Se queda el que tiene la salida conctada a RB6 y no responde a los pulsadores.
A ver si alguien me echa una mano que no se por donde seguir.
No se si sera fallo al grabar, He metido los dos .HEX de Darkbytes y lo grabo con pickit2.
Tambien e probado quitar la linea @DEVICE OSC... por que no me deja compilar con esa linea en Micro Code Studio Plus, y configurar los fuses desde pickit, cambiandolos en Configuracion: 3ff1.
No se por donde seguir...


----------



## chito (Mar 31, 2012)

Bueno, pues problema resuelto. No funcionaba porque le estaba poniendo los condensadoores equivocados al cristal.
Debe llevar condensadores no polarizados de 22pf y yo le puse polarizados de 22uf


----------

