TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: BLACKPIC en 22 de Abril de 2006, 09:10:27
-
Hola amigo me encuentro desarrollando este ej. La cual no me funciona como yo quiero..
Bueno quiero que cuando le mande un pulso por el pin de portb.6 me presente el mensaje primero durante un tiempo x, y que si durante ese tiempo x, no se presiona otro pulso vuelva al mensaje principal..
Eh conseguido hacer que cuando le doy el pulso por portb.6 me presente el mensaje y cuando le mando el otro pulso me presente el otro mensaje..
Esto me funciona pero cuando le pongo el tiempo que yo quiero que me de para presionar y darle el otro pulso, el espera que termine para poder presentar el otro mensaje..
'------Comando del lcd-----
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 4
DEFINE LCD_LINES 4
'------Oscilador----
define OSC 4
'---------------
inicio:
lcdout $FE,1," PRINCIPAL "
pause 100
pulso:
if PORTB.6=0 then
lcdout $FE,1," PRIMERO "
pause 1000
endif
if PORTB.7=0 then
lcdout $FE,1," SEGUNDO "
pause 1000
endif
goto pulso
end
-
Hola:
Veamos si te entendi, o mas bien voy a comentar tu codigo, el mensaje "PRINCIPAL" solo sera mostrado una ves, mientras no cambie de estado B6 o B7, luego no mostrará ese mensaje en ninguna condicion del programa.
El tiempo X que mensionas tampoco seria recomendable ponerlo directamente lo que quieres esperar con PAUSE X, ya que ese hara la pausa de X milisegundos y durante ese tiempo no sabras si se presiono o no B6 o B7.
Puedes hacer un bucle con un pause de menos tiempo y haces las iteraciones necesarias para lograr el tiempo requerido...
pulso:
if PORTB.6=0 then
for i=0 to 999
lcdout $FE,1," PRIMERO "
if PORTB.6=0 then goto inicio
pause 1
next i
endif
goto pulso
Algo como ese codigo por ejemplo, una ves que se preciono B6, hara ese bucle 1000 iteraciones, con una pausa de 1ms, y dentro de ese bucle pregunta nuevamente el estado de B6 para ver si fue presionado, si es asi salta a la etiqueta inicio que hara que muestre el mensaje "PRIMERO" prueba algo como eso y me comentas como te fue. :mrgreen:
-
amigo lordlafebre te comento que el mensaje "PRINCIPAL" este se mostrara al inicio de este, si cambio el estado de B6 o B7, me motrara el mensaje que estos pin contengan.
pero con respecto al tiempo de Pause de los mensaje me refiero que si una ves presionado B6 me muestra un mensaje, dan dome un tiempo para hacer otra cosa x "ej. mostras otro mensaje con B7" y si este no se cumple vuelve al mensaje "PRINCIPAL"...
y con respecto al ej que me pusiste este solo me muestra el mensaje PRINCIPAL y cuando le doy a B6 no hace nada...
bye... :-/ :-/
-
Hola:
Blackpic, esa es la idea del ejemplo, ese codigo lo puse como guia, si compilas solo ese pedazo no hara nada, tienes que agregarlo a tu codigo original.
-
amigo lordlafebre mira este ej el que puse primero
inicio:
lcdout $FE,1," PRINCIPAL "
pause 100
pulso:
if PORTB.6=0 then
lcdout $FE,1," PRIMERO " ' cuando oprimo B6 me muestra el mensaje y dura
pause 1000 ' un seg ante de mostrar el mensaje PRINCIPAL
endif '*** pero lo que yo quiero es que antes de que muestre el mensaje
if PORTB.7=0 then '*** PRINCIPAL hacer una interuccion para mostras el mensaje SEGUNDO
lcdout $FE,1," SEGUNDO "
pause 1000
endif
gosub inicio
goto pulso
end
-
Hola:
Veamos, a me imagino a lo que te refieres con interrupcion es que quieres que muestre el Mensaje SEGUNDO si se preciono B7 antes de que termine el tiempo de B6, si es asi, prueba con esto:
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 4
DEFINE LCD_LINES 4
'------Oscilador----
define OSC 4
'---------------
i var word
inicio:
lcdout $FE,1," PRINCIPAL "
pause 100
pulso:
if PORTB.6=0 then
lcdout $FE,1," PRIMERO "
for i=0 to 999
if PORTB.7=0 then
goto segundo
endif
pause 1
next i
endif
segundo:
if PORTB.7=0 then
lcdout $FE,1," SEGUNDO "
pause 1000
endif
gosub inicio
goto pulso
end
Si no es eso algo como lo que necesitas, pues aclarame mejor que es lo que necesitas.
-
bueno amigo lordlafebre muchas gracias por todo, esto es lo mas o menos queria hacer.
le ise unos areglo y me funciono como lo quiero
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 4
DEFINE LCD_LINES 4
'------Oscilador----
define OSC 4
'---------------
i var word
inicio:
lcdout $FE,1," PRINCIPAL "
pause 100
pulso:
if PORTB.6=0 then
lcdout $FE,1," PRIMERO "
for i=0 to 999
if PORTB.7=0 then
goto segundo
endif
pause 1
next i
endif
segundo:
if PORTB.7=0 then
lcdout $FE,1," SEGUNDO "
for i=0 to 999
if PORTB.6=0 then
goto pulso
endif
pause 1
next i
endif
gosub inicio
goto pulso
end
bueno amigo solo una cosa veo que aveces el mensaje PRINCIPAL me palpadea y quiero que se quede fijo que le agoo.
bye... :-/ :-/
-
Hola:
Blackpic, dos cosas, la primera, el parpadeo se da cuando los pulsantres no son presionados, eso pasa porque el mensaje lo muestra muy rapido, ponle una pequeña pausa para que no parpadee, lo segundo es que si te fijas el codigo que puse primero, es el que te decia que lo pongas en tu programa... luego lo que hice fue ponerlo tal como te habia mencionado...
en fin... que bien que ya te marcho.. :mrgreen:
-
hola:
bueno a hora estoy dando lata con este proyecto que estoy intentando hacer...
quiero que con un pus-boton que este en cualquier pin como entrada me muestre los pulso que le doy en nomeros en una LCD..
lo que quiero hacer es, si presiono una ves en pus-boton me muestre el nomero UNO, y que despues de un tiempo me muestre el mensaje que tiene por ej. ( presiono el pus-boton me muestre el 1, despues este me muestra el mensaje UNO)...
mas tarde tratare de poner mi ej. que estoy desarrollando....
bye... :-/ :-/
-
aki pongo el ej que puede hacer:
'-----Comando del LCD---
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 4
DEFINE LCD_LINES 4
'------Oscilador----
define OSC 4
'---------------
i var byte
cont var byte
cont1 var byte
trisb=%11000000
portb=0
lcdout $FE,$C0,dec cont
if cont >= 1 then primero
if cont1 >= 2 then segundo
loop:
if PORTb.6=0 then
cont=cont+1
if cont>= 1 then primero
pause 100
endif
if PORTb.6=0 then
cont=cont+1
if cont >= 2 then Segundo
pause 100
endif
goto loop
end
Primero:
if portb.7=0 then
lcdout $fe,1,"primero"
return
endif
Segundo:
if portb.7=0 then
lcdout $fe,1,"segundo"
return
endif
cuando presiono el pus-boton que esta en B6 me presente el "1" y cuando presiono B7 muestra "primero"
esto esta bien...
pero cuando por ej presiono el pus-boton dos veces para que muestre el "2" no lo hace, quiero que lo haga.. para que cuando le de a B7 me presente "segunndo"..
bye... :-/ :-/
-
Hola:
bueno, mientras estaba haciendo el codigo, has posteado, en fin, te pongo el ejemplo que hice a ver si te sirve, sino me avisas, o puedes tomar una idea desde alli para adaptarle a tus necesidades:
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 4
DEFINE LCD_LINES 4
cont var byte
TRISA.0=1
cont=0
LCDOUT $FE, 1, #cont
inicio:
if PORTA.0=0 then
cont=cont+1
if cont>10 then cont=0
LCDOUT $FE, 1, #cont
pause 100
endif
select case cont
case 0
LCDOUT $FE, $c0, "cero"
case 1
LCDOUT $FE, $c0, "uno"
case 2
LCDOUT $FE, $c0, "dos"
case 3
LCDOUT $FE, $c0, "tres"
case 4
LCDOUT $FE, $c0, "cuatro"
case 5
LCDOUT $FE, $c0, "cinco"
case 6
LCDOUT $FE, $c0, "seis"
case 7
LCDOUT $FE, $c0, "siete"
case 8
LCDOUT $FE, $c0, "ocho"
case 9
LCDOUT $FE, $c0, "nueve"
case 10
LCDOUT $FE, $c0, "diez"
end select
goto inicio
end
Ese ejemplo fue antes de que pongas tu codigo y fue lo que te entendi, es un contador 0-10, muestra el numero y el valor en letras:
ejemplo
6
Seis.
Suerte...!!! :-/
-
amigo lordlafebre lo que quiero hacer es lo siguiente..
con B6 como estrada este solo me muestrara los numeros del 1 al 10 cuando presione,
y con B7 este lo quiero para poner el mensaje..
por ej si presiono B6 dos vesces tengo el nomero "2" en la lcd y cuando le doy a B7 este muestra el mensaje "dos"
y me de saparece el numero "2" quedandoce en la lcd en "dos"..
bye... :-/ :-/
-
Hola:
BLACKPIC, si revisas el codigo que te puse, notaras que tienes todo lo que necesitas y solo tienes que hacer unos pequeños cambios, de hecho agregar unas dos lineas, por favor revisa un poco mas los codigos :?, mira, esto debe ser lo que necesitas:
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 4
DEFINE LCD_LINES 4
cont var byte
TRISB.6=1
TRISB.7=1
cont=0
LCDOUT $FE, 1, #cont
inicio:
if PORTB.6=0 then
cont=cont+1
if cont>10 then cont=0
LCDOUT $FE, 1, #cont
pause 100
endif
if PORTB.7=0 then
select case cont
case 0
LCDOUT $FE, 1, "cero"
case 1
LCDOUT $FE, 1, "uno"
case 2
LCDOUT $FE, 1, "dos"
case 3
LCDOUT $FE, 1, "tres"
case 4
LCDOUT $FE, 1, "cuatro"
case 5
LCDOUT $FE, 1, "cinco"
case 6
LCDOUT $FE, 1, "seis"
case 7
LCDOUT $FE, 1, "siete"
case 8
LCDOUT $FE, 1, "ocho"
case 9
LCDOUT $FE, 1, "nueve"
case 10
LCDOUT $FE, 1, "diez"
end select
endif
goto inicio
end
como veras lo unico que aumento es un IF.
Suerte...!!!
-
gracias amigo por todo pero es que estube de masiado ocupado y casi no tuve tiempo de ponerme hacer los arreglo.
pero a hora siguire adelante com mi proyecto y por lo que veo qe pronto lo subire al foro..
tambien te pido otro favor que libro me recomiendas para compralo ya que veo que en tus ej siempre usas sintaxi que no hay en el manual que esta en la pag de todopic...
ya vi que en este usaste case, #cont y select
lo del cont lo tengo claro pero el # no...
bye... :-/ :-/
-
Hola:
como cont es una variable que cambiara de valor cuando presiones los botones y necesitas visualizar ese valor, para eso te sirve el "#" que seguido del nombre de la variable lo que hace es mostrar el valor de la misma.
Ejemplo:
si cont le sume algunas veces y esta almacenando el valor de 10
LCDOUT $FE,1,#cont ---> esto lo que hace es mostrar en el LCD el valor de cont, osea el 10. El "#" no solo sirve para la funcion LCDOUT, sino para cualquier otra en donde quieras enviar una variable, tambien la puedes utilizar con SSEROUT por ejemplo.
Con respecto a la sintaxis, no es nada que me este inventando yo, todos los comandos instrucciones y demas, lo puedes ver en la ayuda del MICROCODESTUDIO, incluso te viene con ejemplos de como utilizar cada funcion.
Lo del SELECT CASE es para reemplazar a multiples IF cuando preguntas el estado de una misma variable, literalmente seria: Seleccione el caso de cont, y luego en el caso que sea 1 haga tal accion, y asi para todos los valores que quieras, y lo cierras con END SELECT.
-
hola:
bueno que alguien me explique o me dice sobre este ej. este lo copie de aki mismo y lo estoy revisando para verificar
las fusiones que usaron y para poder hacer el mio... aprender...
DEFINE LCD_DREG PORTB' " Setea el puertos de datos del LCD por el puerto B
DEFINE LCD_DBIT 0 '" Setea el bit de comienzo de datos (0 o 4) si el bus es de 4-bit
DEFINE LCD_RSREG PORTA' " Setea el port LCD Register Select
DEFINE LCD_RSBIT 1' " Setea el bit LCD Register Select
DEFINE LCD_EREG PORTA '" Setea el port LCD Enable
DEFINE LCD_EBIT 0 '" Setea el bit LCD Enable
DEFINE LCD_BITS 4' " Setea el tamaño del bus LCD (4 o 8 bits)
DEFINE LCD_LINES 2 '" Setea el numero de lineas en el LCD
a var word '" definicion de variables
tecla var word
n1 var byte
n2 var byte
n3 var byte
n4 var byte
n5 var byte
eprom1 var byte
i var byte
R VAR BYTE
n var byte
j var byte
M var byte
FILA_0 VAR BYTE
FILA_1 VAR BYTE
FILA_2 VAR BYTE
FILA_3 VAR BYTE
n1 = "5" '" asigno valor a las variables
n2 = "5" '" el valor es equivalente en asccII
n3 = "5"
n4 = "5"
n5 = "5"
eprom1 = "0"
pause 100 '" inicio el programa
read 0, eprom1
'If eprom1 = 255 Then gravar_clave
'GoTo publicidad
gravar_clave:
WRITe 0, n1
WRITe 1, n2
WRITe 2, n3
WRITe 3, n4
write 4, n5
LCDOUT $FE,1," CLAVE GRAVADA "
GoSub tiempo_05
GoSub tiempo_05
GoSub tiempo_05
GOTO publicidad
publicidad: '" CICLO INICAL DEL LCD MUESTRA
GoSub tiempo_05 '" MENSAJE DE BIENVENIDA
LCDOUT $FE,1," ACCESO à NANDO"
GoSub tiempo_06 '" aqui hay que poner una rutina
OPTION_REG = 0
TRISB = %11111110 '"Activamos Pull-up
IF portb= $7e then goto clave
LCDOUT $FE,$C0," Electronica "
GoSub tiempo_06 '" LEE EL TECLADO A VER SI ES "*"
'" SI NO ES CONTINUA MOSTRANDO MENSAJE
OPTION_REG = 0
TRISB = %11111110 '"Activamos Pull-up
if portb=$7e then goto clave
LCDOUT $FE,1," "
GoTo publicidad
teclado:
COLUMNA_0:
R = 0
TRISB = %11111110
portb.0= 0
GoTo PREGUNTA
COLUMNA_1:
R = R + 1
TRISB = %11111101
portb.1 = 0
GoTo PREGUNTA
COLUMNA_2:
R = R + 1
TRISB = %11111011
portb.2 = 0
GoTo PREGUNTA
COLUMNA_3:
R = R + 1
TRISB = %11110111
portb.3 = 0
GoTo PREGUNTA
GoTo teclado
suelta:
if (portb&%11110000)=$f0 then visualiza
GoTo suelta
visualiza:
lookup j, ["741C8520963=/*-+"], tecla
Return
clave:
LCDOUT $FE,1," Digite su Clave"
GoSub tiempo_05
GoSub tiempo_05
GoSub teclado
SWAP tecla, n1
i = 0
GoSub lcd_sal
GoSub tiempo_05
GoSub teclado
SWAP tecla, n2
GoSub lcd_sal
GoSub tiempo_05
GoSub teclado
SWAP tecla, n3
GoSub lcd_sal
GoSub tiempo_05
GoSub teclado
SWAP tecla, n4
GoSub lcd_sal
GoSub tiempo_05
GoSub teclado
SWAP tecla, n5
GoSub lcd_sal
GoSub tiempo_05
read 0, eprom1
If eprom1 = n1 Then miro_dos
incorrecto:
LCDOUT $FE,1,"Clave Incorrecta"
GoSub tiempo_05
GoTo publicidad
miro_dos:
read 1, eprom1
If eprom1 = n2 Then miro_tres
GoTo incorrecto
miro_tres:
read 2, eprom1
If eprom1 = n3 Then miro_cuatro
GoTo incorrecto
miro_cuatro:
read 3, eprom1
If eprom1 = n4 Then miro_cinco
GoTo incorrecto
miro_cinco:
read 4, eprom1
If eprom1 = n5 Then menu
menu:
LCDOUT $FE,1," Selecione "
GoSub tiempo_05
GoSub tiempo_05
LCDOUT $FE,1,"1_Abrir Puerta"
GoSub tiempo_05
LCDOUT $FE,$C0,"2_Cambiar Clave"
GoSub teclado
If tecla = "1" Then GoTo abrir
If tecla = "2" Then GoTo nueva_clave
'"if tecla != "1" and tecla!= "2" then LCDOUT $FE,1,"TECLA INCORRECTA "
LCDOUT $FE,1,"TECLA INCORRECTA "
GoSub tiempo_05
GoSub tiempo_05
GoTo menu
abrir:
high porta.3
LCDOUT $FE,1," Bienvenido "
GoSub tiempo_05
GoSub tiempo_05
GoSub tiempo_05
GoSub tiempo_05
GoSub tiempo_05
GoSub tiempo_05
low porta.3
GoTo publicidad
nueva_clave
LCDOUT $FE,1," Digite su Nueva"
LCDOUT $FE,$C0,"Clave:"
GoSub tiempo_06
i = 2
GoSub teclado
SWAP tecla, n1
GoSub lcd_sal
GoSub tiempo_05
GoSub teclado
SWAP tecla, n2
GoSub lcd_sal
GoSub tiempo_05
GoSub teclado
SWAP tecla, n3
GoSub lcd_sal
GoSub tiempo_05
GoSub teclado
SWAP tecla, n4
GoSub lcd_sal
GoSub tiempo_05
GoSub teclado
SWAP tecla, n5
GoSub lcd_sal
GoSub tiempo_05
GoTo gravar_clave
tiempo_05:
pause 100
Return
tiempo_06:
pause 500
return
lcd_sal:
LCDOUT $FE,$C5+i,"X"
i = i + 1
Return
PREGUNTA:
M = 4 * R
FILA_0=($E0 +(portb&%00001111))
FILA_1=($D0 +(portb&%00001111))
FILA_2=($B0 +(portb&%00001111))
FILA_3=($70 +(portb&%00001111))
If portb = FILA_0 Then j = M
M = M + 1
If portb = FILA_1 Then j = M
M = M + 1
If portb = FILA_2 Then j = M
M = M + 1
If portb = FILA_3 Then j = M
if (portb&%11110000)<>$f0 then suelta
If R = 0 Then COLUMNA_1
If R = 1 Then COLUMNA_2
If R = 2 Then COLUMNA_3
GoTo teclado
el ej funciona bien pero lo que quiero saber como ago para que cuando le quite la alimentacion la clave que cambien atrabes del teclado no se pierda, para que cuando le conecte la alimentacion otrabes trabajar con la ultima clave que guarde...
agradeceria la ayuda ya que estoy desarrollando un proyecto y esta es la etapa final que son las claves de acceso..
bye... :-/ :-/
-
Hola:
BLACKPIC, mira esto:
WRITe 0, n1
WRITe 1, n2
WRITe 2, n3
WRITe 3, n4
write 4, n5
ese codigo almacena la clave en la eeprom del microcontrolador, por lo que el programa una ves que se haya quitado la alimentacion y luego la reconectes si estara con la clave anterior.
-
si amgio pero como veras al principio tiene estas sintaxis pero no me funciona como quiero
cuando le denonecto la alimentacion y despues cuando buelbo y la conecto siempre tengo que marcar la clave inicial que es "55555"
bye... :-/ :-/
-
Hola:
BLACKPIC, estas probando el codigo en un circuito armado o en proteus?
-
hola:
en un circuito armado en un board
bye... :-/ :-/
-
Hola:
Pues el codigo parece bueno, pero con todo prueba a quitar los comentarios de estas dos lineas:
'If eprom1 = 255 Then gravar_clave
'GoTo publicidad
-
hola:
amigo lordlafebre ya esta todo resuelto a hora seguire trabajando en lo mio..
bye... :-/ :-/
-
Hola:
Como lo resolviste?
Acaso lo hiciste quitando los comentarios de las líneas que te dije?
-
HOLA:
lo resorvi de esta manera
If eprom1 = 255 Then gravar_clave
GoTo publicidad
solo fue quitarle los comentario de las 2 lineas que me dijiste y resuerto.
bye... :-/ :-/