control display 7 segmentos con un pulsador

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?
 
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.
 
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.
 
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;
....
...
 
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.
 
Última edición:
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.

Código:
;*******************************************************************************
; 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.
 
Última edición por un moderador:
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
:apreton:
 
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
 
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
 

Adjuntos

  • contadorvelocidades.rar
    27.6 KB · Visitas: 26
Última edición:
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.
 

Adjuntos

  • contadorvelocidades.rar
    14.7 KB · Visitas: 39
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
 
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...
 
Última edición:
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...
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.
 

Adjuntos

  • contadorvelocidades[2].rar
    16.6 KB · Visitas: 44
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.
 
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...
 
Atrás
Arriba