TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: melectro en 26 de Junio de 2008, 13:17:48
-
Hola A todos , estoy tratando de hacer un contador ascendente-descendente (similares a los usados en estacion que controlan la temperatura ) que al mantenes presionado el pulsador sube de a diez unidades Ej. 1-2-3-pulsado 4-10-20-30-etc.y lo mismo bajan.
Si halguien tiene algun ejemplo .
Tengo una lijera idea de como podria ser pero no se como implementarla
Seria algo asi:
inicio
Boton subir en 1
s=s+1
si boton = 1
pause 20
si boton = 1 salta a s=+10
salta a inicio :-/
.
.
.
.
.
si boton bajar en 1
s=s-1
.
.
.
.
salta inicio :-/
Saludos.
Jorge
-
En que lenguaje de programacion estas trabajando?
-
Hola , gracias por responder ,estoy trabajando con PBP 2.46.
Saludos.
PD el ejemplo es a modo de idea de codigo no es el programa en si.
-
Me imagino que es Basic, verdad?, no he programado mucho en basic pero las ideas para programar algo pueden aplicarse en cualquier lenguaje, estuve revisando tu idea y parece estar bien , solo que debes ajustar los tiempos para que se logre ver como va cambiado el display unos 200 ms entre digitos es suficiente, como piensas visualizar la informacion, usando displays de 7 segmentos o un LCD , esto porque tienes que considerar el tema de refresco.
Saludos
-
Aqui copio el programa tal cual pero NO funciona.No logro que salte de 10 en 10 y tampoco de 100 en 100.
Funciona si saco las lineas que uso para pasar de a 10 y 100.Es decir si suma 1 anda bien.
Otro problema es que en la linea PAUSE T1 si da 1000 (1000 MS = 1 segundo ) es un tiempo mayor a casi el doble o mas.....
Agradeceria alguna ayuda .
define LCD_BITS 4
define LCD_LINES 2
digit var word
M VAR BYTE ' Used to count and specify the case
W0 var byte
M1 var word
T3 var byte
T var word
B1 var byte
T1 var word
P var word
;portb.6 = modo y sube.
;portb.5 = baja.
;portb.7 = enter.
;portb.2 =
PAUSE 50
lcdout $fe,1,"Melectro" , $fe,$c0 ," 08"
PAUSE 1500
M1 = 0
modo1: lcdout $fe,1,"Modo1 ",#M1," MS"
PAUSE 150
pause 50
if portb.5 = 0 then call sube
t = t+1
if portb.5 = 0 and T>10 then call suberap
if portb.5 = 0 and T>100 then call suberap2
if portb.6 = 0 then call baja
if portb.6 = 0 and T>10 then call bajarap
if portb.6 = 0 and T>100 then call bajarap2
if portb.7 = 0 then call start
goto modo1
return
sube: M1 = M1 + 1
pause 50
if M1 > 9999 then M1 = 0
return
baja: M1 = M1 - 1
pause 100
if M1 > 9999 then M1 = 0
return
suberap: M1 = M1 + 10
pause 100
return
suberap2: M1 = M1 + 100
pause 100
return
bajarap: M1 = M1 - 10
pause 100
return
bajarap2: M1 = M1 - 100
pause 100
return
start:
lcdout $fe,1,"Tiempo = ",#M1," MS "
pause 100
Pulsin portb.2,0,B1
If B1 <> 0 Then disparo1
goto start
disparo1: low portb.4
lcdout $fe,1,#M1," MS"," INICIADOS"
T1 = (M1)*1000
pause T1
call dispa
dispa:
high portb.4:high portb.1 ;salida a led y a beeper
pause 1000
low portb.4 :low portb.1
goto modo1
end
-
Como te mencioe anteriormente no soy un experto en Basic, pero veo que no declaras la variable T que utilizas en tu comparacion antes de ir a la subrutina suberap, capaz y ahi esta tu error ya que lo que la variable que vas incrementando es t, otra cosa en que estas probando tu programa en algun simulador o ya armaste el circuito.
Saludos
-
Hoal , si esta declarada com t = word.
Lo simulo en Proteus .
Saludos.
PD.Tal vez tenga que moverlo al subforo de picbasic no??
-
Si , veo que la declaras ,pero en el programa que posteaste la declaras con mayuscula y al momento de incrementarla usas una t minuscula
T var word
t = t+1
Acaso en basic no importa como definiste la variable? la verdad no lo se , y si el foro de basic posiblemente consigas mas ayuda.
Saludos
-
para nada sander, BASIC es bastante poco exigente con esas cosas. Si la implementación es según el estándar, no tienes que declarar las variables ni su tipo, haces algo así y no pasa ni hostia:
T=10
C=Hola
B=T+C
y en principio el compilador no debe ni chistar, claro que te saldrán gerigonzas, aunque hay implementaciones que te dan warnings y cosas por el estilo. Por eso me gusta el C y el PASCAL, con lo regado que soy sy me dejan hacer esas cosas ni DIOS entendría mis programas.
melectro, has declarado a T y la usas, pero en ninguna parte veo que la inicializas, prueba a inicializarla a ver que pasa.
Saludos
Reinier
-
Aqui copio el programa tal cual pero NO funciona.No logro que salte de 10 en 10 y tampoco de 100 en 100.
Funciona si saco las lineas que uso para pasar de a 10 y 100.Es decir si suma 1 anda bien.
Otro problema es que en la linea PAUSE T1 si da 1000 (1000 MS = 1 segundo ) es un tiempo mayor a casi el doble o mas.....
Agradeceria alguna ayuda .
define LCD_BITS 4
define LCD_LINES 2
digit var word
M VAR BYTE ' Used to count and specify the case
W0 var byte
M1 var word
T3 var byte
T var word
B1 var byte
T1 var word
P var word
;portb.6 = modo y sube.
;portb.5 = baja.
;portb.7 = enter.
;portb.2 =
PAUSE 50
lcdout $fe,1,"Melectro" , $fe,$c0 ," 08"
PAUSE 1500
M1 = 0
modo1: lcdout $fe,1,"Modo1 ",#M1," MS"
PAUSE 150
pause 50
if portb.5 = 0 then call sube
t = t+1
if portb.5 = 0 and T>10 then call suberap
if portb.5 = 0 and T>100 then call suberap2
if portb.6 = 0 then call baja
if portb.6 = 0 and T>10 then call bajarap
if portb.6 = 0 and T>100 then call bajarap2
if portb.7 = 0 then call start
goto modo1
return
sube: M1 = M1 + 1
pause 50
if M1 > 9999 then M1 = 0
return
baja: M1 = M1 - 1
pause 100
if M1 > 9999 then M1 = 0
return
suberap: M1 = M1 + 10
pause 100
return
suberap2: M1 = M1 + 100
pause 100
return
bajarap: M1 = M1 - 10
pause 100
return
bajarap2: M1 = M1 - 100
pause 100
return
start:
lcdout $fe,1,"Tiempo = ",#M1," MS "
pause 100
Pulsin portb.2,0,B1
If B1 <> 0 Then disparo1
goto start
disparo1: low portb.4
lcdout $fe,1,#M1," MS"," INICIADOS"
T1 = (M1)*1000
pause T1
call dispa
dispa:
high portb.4:high portb.1 ;salida a led y a beeper
pause 1000
low portb.4 :low portb.1
goto modo1
end
Dando una vista rápida, no veo que hayas configurado como entrada los pines RB6, RB7, etc.