TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: melectro en 30 de Junio de 2008, 14:23:14
-
Hola , en esta oportunidad les comento un inconveniente con el comando PAUSE.en rojo
aqui el programa.
Programado en PBP 2.46
Simulado Proteus 7.2 SP2
Compilado microcode studio 3
Defecto :el retardo no es el que marca el T1 es decir si T1=1200 =1.2 segundos y demora mas de 3 seg. :shock:
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
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 ,"06"
PAUSE 1500
Lcdout $fe, 1 , " Modo 1 "
pause 1000
modo: if portb.6 = 0 then ; SELECCIONA MODO
select case mode
mode = mode + 1
if mode > 3 then mode = 1
case 1: call curs
case 2: call curs2
case 3: call curs3
end select
endif
goto modo
; ****************** MODO 1 ***************************
curs: cur = cur + 1
if cur > 4 then cur = 1
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
alguna idea de porque el delay es diferente????
-
Bueno melectro puede ser 2 cosas una que el proteus no simula a tiempo real. Si te sigue pasando en la realidad quiza tenga que ver con la suma de tu pausa, recuerda que PBP redondea no usa decimales.
-
Si te sigue pasando en la realidad quiza tenga que ver con la suma de tu pausa, recuerda que PBP redondea no usa decimales.
Maestro navaismo, pero en línea sólo hay multiplicaciones, no habría razón para un redondeo.
Me inclinaría más a pensar en que es un error del proteus, pero también me parece difícil de creer pues en lo que he podido ver hasta ahora, cuando yo uso leds para indicar retardos la simulación hace los retardos correctamente, o bastante cerca según lo que se ve "a ojo".
Qué tal si antes del retardo, mandas al lcd el valor de T1? Para saber cuál es el valor después de la operación, si la está haciendo correctamente.
Bueno sólo es una sugerencia, para ir descartando posibles errores.
Ok saludos, nos leemos! :mrgreen:
-
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
hola. si no estoy muy equivocado, justo antes de definir el valor de T1 muestras los valores en juego en el lcd (UM, C, D y U) con lo cual ya conoces el valor que estos tienen y también puedes deducir el valor de T1. yo probaría a convertir en comentario la línea que define el valor de T1 y aplicaría ese valor calculado en pause.. y haber que pasa.
tal como te dice navaismo los tiempos en proteus son lo que son ya que no simula en tiempo real.
y aunque solo sea por claridad, yo lo haría así: T1 = (UM*1000) + (C*100) + (D*10) + U... no sé, hay algo en tu forma de hacerlo que no me encaja pero no sé porque... no termino de verlo
un saludo
-
Gran xocas, es correcto que él está mandando al LCD los valores separados de UM, c d, u... pero yo decía mandar el valor de T1, a ver si se está realizando bien la operación, si T1=1200 o no... es una tontería pero es no más para descartar errores :lol:
Buena la sugerencia de los paréntesis.
Ok saludos, nos leemos! :mrgreen:
-
no veo que haga uso de T1 en ninguna parte, a excepción de la subrutina disparo, y ahí le indica que tome su valor en base a una serie de operaciones. bien, el valor que 'debería' tener T1 lo sabemos porque tenemos los valores de las variables, entonces se puede hacer como tu indicas para que muestre el valor real de T1 en el lcd y salir de dudas pero personalmente creo que se termina antes poniendo ese valor a mano en pause porque el valor -o a mi se me escapa algo- ya lo sabemos.
melectro, porque no subes el archivo de proteus y te lo pruebo en mi pc? es muy probable que sea el el culpable
un saludo
-
Estoy de acuerdo.
Si le coloca el valor a mano como dices ya se sabría si es o no el proteus...
Saludos, nos leemos! :mrgreen:
-
SERIA LO MEJOR QUE EL COLEGA SUBA TODO PARA VER EN QUE SE LE PUEDE AYUDAR.
SALUDOS
-
Que tal amigos!
Melectro prueba este trozo de codigo solo sin el resto del programa:
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
con los supuestos valores que ves en la lcd para UM, C, D y U
a ver si te da el mismo error y asi poder encerrar la falla en este segmento de codigo, que es el que te da problemas :mrgreen:
Para ver sino es un Bug del compilador ya que las variables qie estan a la derecha de la igualdad son byte y la que esta a la izquierda es word :shock:
Saludos
-
el colega ralf2 tiene mucha razon has esa prueba y nos comentas
-
Hola a todos y muchas gracias por sus respuestas y el interes y tiempo empleados en solucionar el tema.
Finalmente y despues de muchas horas de prueba y error este codigo funciona.
.
.
.
...
.
doy valores diferentes a N1 a N4 y funciona.
disparo1: high portb.1 ;salida a led y a beeper
T1= (M1*N1) + (M1*N2) + (M1*N3)+ (M1*N4)
;T1 = (M1)
pause T1
low portb.1
lcdout $fe,1,#M1," MS"," FIN "
PAUSE 500
goto modo1 :-/ :-/ :-/
:mrgreen: :mrgreen: :mrgreen:
Para comprobarlo coloque el contador virtual (Del proteus)en la salida portb.1 y cuenta el valor especificado.
-
Felicidades Melectro, por haber resuelto el problema! :-/
Hombre, que da una satisfacción enorme cuando después de horas de trabajo logras lo deseado! :lol:
Saludos, nos leemos! :mrgreen: