TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: melectro en 06 de Julio de 2006, 14:18:37
-
Hola a todos , tengo el siguiente problema , tengo que poder mostrar en un LCD cuatro digitos de 0000 a 9999 , que son mili segundos , y para ello hice un programa en PBP que seleccione las unidades dec cent etc con un boton de un puerto y con otro boton lo desplazo de 0 a 9 pero me suma un digito al ultimo valor donde habia quedado ej si termino en 0030 y cambio a las centenas me queda 0040 ,alguien e puede ayudar por favor.
Mis conocimientos de programa son muy elementales y recien estoy aprendiendo , pido disculpas si es muy tonto el caso pero el que no sabe es como el que no ve....
aqui el codigo.
define LCD_BITS 4
define LCD_LINES 2
U VAR BYTE ;unidad
D VAR BYTE ;decena
C VAR BYTE ;centena
UM VAR BYTE ; uniidad de mil 9999 ms.total 10.000 ms = 10 seg.
co VAR BYTE ; variable selecciona numero , unid dec cent um .
cur VAR BYTE 'VARIABLE SELECCIONA MODO.
U = 0 : D = 0 : c = 0 : UM = 0
co = 0 : cur = 0
PAUSE 500
lcdout $fe,1,"Melectro" , $fe,$c0 ," 2006 "
PAUSE 1500
Lcdout $fe, 1 , "Seleccio", $fe,$c0 ,"ne Modo"
pause 1000
curs:
cur = cur + 1
if cur > 4 then cur = 1
lcdout $fe,1,"cur = ",#cur
pause 500
if cur = 1 then call inicio_u
if cur = 2 then call inicio_d
if cur = 3 then call inicio_c
if cur = 4 then call inicio_um
goto curs
return
INICIO_U: IF PORTB.5 = 0 AND cur = 1 THEN
Lcdout $fe,1,"Mod 1",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
Pause 500
U = U + 1
IF U > 9 THEN U = 0
endif
if portb.6 = 0 then call curs
GOTO INICIO_U
RETURN
INICIO_D: IF PORTB.5 = 0 AND cur = 2 THEN
Lcdout $fe, 1 , "Mod 2", $fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
Pause 500
D = D + 1
IF D > 9 THEN D = 0
endif
if portb.6 = 0 then call curs
GOTO INICIO_D
return
INICIO_C: IF PORTB.5 = 0 AND cur = 3 THEN
Lcdout $fe, 1 , "Mod 3", $fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
Pause 500
C = C + 1
IF C > 9 THEN C = 0
endif
if portb.6 = 0 then call curs
GOTO INICIO_C
return
INICIO_UM: IF PORTB.5 = 0 AND cur = 4 THEN
Lcdout $fe, 1 , "Mod 4", $fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
Pause 500
UM = UM + 1
IF UM > 9 THEN UM = 0
endif
if portb.6 = 0 then call curs
GOTO INICIO_UM
return
end
Gracias por cualquier ayuda.
-
Hola:
Lo que no nos dices es que problema tienes.
-
este es el problema"de 0 a 9 pero me suma un digito al ultimo valor donde habia quedado ej si termino en 0030 y cambio a las centenas me queda 0040 ,alguien e puede ayudar por favor.
-
No estoy muy seguro de haber comprendido tu problema, pero podría deberse a lo siguiente: fíjate en que primero haces el LCDOUT, luego esperas 500 ms y por último incrementas el valor de la variable en una unidad. Consecuentemente, el valor que estás viendo en el LCD es una unidad menos del verdadero valor almacenado en la variable, que es el que aparece cuando saltas a configurar el siguiente dígito, y por eso se te parece que se imcrementa en una unidad.
En resumen, en lugar de:
Lcdout $fe,1,"Mod 1",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
Pause 500
U = U + 1
Prueba con:
U = U + 1
Pause 500
Lcdout $fe,1,"Mod 1",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
Saludos
-
Hola ifmateos2 ,gracias por tu respuesta; si es correcto tu cambio pero no me aparecen en 0 el comienzo del display ya que tuve que presionar la tecla y el contador avanzo 1 unidad por lo demas si no me suma mas un digito.
INICIO_U: IF PORTB.5 = 0 AND cur = 1 THEN
U = U + 1
Pause 500
Lcdout $fe,1,"Mod 1",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
en este caso siempre el valor de u va a ser distinto de cero en el arranque porque ya sumo 1.
Saludos
-
OK.
Prueba con esto:
INICIO_U:
Lcdout $fe,1,"Mod 1",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
if portb.6 = 0 then call curs
IF PORTB.5 = 0 AND cur = 1 THEN
Pause 500
U = U + 1
IF U > 9 THEN U = 0
endif
GOTO INICIO_U
RETURN
-
Gracias ifmateos2 por tu ayuda , ahora funciona bien.
PD perdon por la demora en responderte .
Saludos.
:-/
-
Hola a todos.Finalmente logre que funcione bien , pero la idea es optimizar el programa ya que en cierta forma tendria que repetir el mismo procedimiento tres veces mas.
Lo estipulado seria.
Modo 1 decrementar 9999 Ms.
Modo 2 decrementar 999.9 Ms.
Modo 3 decrementar 99.99 Seg.
el programa queda asi:
'MODO 1 EN mS 9999
'MODO 2 EN mS 999.9
'MODO 3 EN SEG 9999
'MODO 4 REPETICION DE N VECES POR XXXX mS.
' 60.000 mS = 1 MINUTO
' 1.000 uS = 1 SEG.
'10.000 SEG =
'DEFINICION DE PINES
'PORTB.4 = SALIDA . MAS SALIDA SONORA BEEP
'PORTB.5 = DIGITO
'PORTB.6 = POSICION U, D , C ,UM. MODO MODO1 , ... MODO4.
'PORTB.7 = START
'PORTB.2 = ENTRADA
'PORTA.0-4 = LCD
'PORTB.3 = LCD
'PORTB.4 = SALIDA
'PORTB.1 = VER DISPARO LED
define LCD_BITS 4
define LCD_LINES 2
U VAR BYTE ;unidad modo 1
U2 VAR BYTE ;unidad modo 2
U3 VAR BYTE ;unidad modo 3
U4 VAR BYTE ;unidad modo 4
D VAR BYTE ;decena 1
D2 VAR BYTE ;decena 2
D3 VAR BYTE ;decena 3
D4 VAR BYTE ;decena 4
C VAR BYTE ;centena 1
C2 VAR BYTE ;centena 2
C3 VAR BYTE ;centena 3
C4 VAR BYTE ;centena 4
UM VAR BYTE ; unidad de mil 1 9999 ms.total 10.000 ms = 10 seg.
UM2 VAR BYTE ; unidad de mil 2 9999 ms.total 10.000 ms = 10 seg.
UM3 VAR BYTE ; unidad de mil 3 9999 ms.total 10.000 ms = 10 seg.
UM4 VAR BYTE ; unidad de mil 4 9999 ms.total 10.000 ms = 10 seg.
co VAR BYTE ; variable selecciona numero , unid dec cent um .
cur VAR BYTE 'VARIABLE SELECCIONA MODO1.
cur2 VAR BYTE 'VARIABLE SELECCIONA MODO2.
cur3 VAR BYTE 'VARIABLE SELECCIONA MODO3.
cur4 VAR BYTE 'VARIABLE SELECCIONA MODO4.
ST var byte
mode var byte
mode2 var byte
mode3 var byte
mode4 var byte
t1 var word
t2 var byte
t3 var byte
t4 var byte
W0 var word
U = 0 : D = 0 : c = 0 : UM = 0
co = 0 : cur = 0 :cur2 = 0:cur3 = 0 : cur4 = 0
PAUSE 500
lcdout $fe,1,"Melectro" , $fe,$c0 ,"Photo 06"
PAUSE 1500
Lcdout $fe, 1 , " Modo 1 "
; ****************** MODO 1 ***************************
curs: cur = cur + 1
if cur > 4 then cur = 1
'lcdout $fe,1,"cur = ",#cur
;pause 500
if cur = 1 then call inicio_u
if cur = 2 then call inicio_d
if cur = 3 then call inicio_c
if cur = 4 then call inicio_um
goto curs
return
INICIO_U:
Lcdout $fe,1," Unid",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
pause 250
if portb.7 = 0 then call start
if portb.6 = 0 then call curs
IF PORTB.5 = 0 AND cur = 1 THEN
U = U + 1
IF U > 9 THEN U = 0
endif
GOTO INICIO_U
RETURN
INICIO_D:
Lcdout $fe,1," Dec",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
pause 250
if portb.7 = 0 then call start
if portb.6 = 0 then call curs
IF PORTB.5 = 0 AND cur = 2 THEN
D = D + 1
IF D > 9 THEN D = 0
endif
GOTO INICIO_D
RETURN
INICIO_C:
Lcdout $fe,1," cen",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
pause 250
if portb.7 = 0 then call start
if portb.6 = 0 then call curs
IF PORTB.5 = 0 AND cur = 3 THEN
C = C + 1
IF C > 9 THEN C = 0
endif
GOTO INICIO_C
RETURN
INICIO_UM:
Lcdout $fe,1,"Umil",$fe,$c0,#uM,$fe,$c1,#C,$fe,$c2,#D,$fe,$c3,#U," MS"
pause 250
if portb.7 = 0 then call start
if portb.6 = 0 then call curs
IF PORTB.5 = 0 AND cur = 4 THEN
Um = Um + 1
IF Um > 9 THEN Um = 0
endif
GOTO INICIO_Um
RETURN
start:
lcdout $fe,1," ",#UM,#C,#D,#U ," MS"
pause 100
Pulsin portb.2,0,W0
If W0 <> 0 Then disparo
goto start
disparo: low portb.4 :lcdout $fe,1," ",#UM,#C,#D,#U ," MS" ,$fe,$C0," INICIO"
T1 = (UM*1000+c*100+d*10+u)
pause T1
high portb.4
pause 100
low portb.4 :low portb.1
return
Es decir esta parte es solo para el modo 1 , y tendria que optimizarla para que ocupe menos espacio en el pic.
Agradeceria tambien si a alguien se le ocurre otra manera de implementar el programa me diera una idea para poder hacerlo ya que este es mi tercer programa en PBP.
Muchas gracias.
Saludos.
Jorge