TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Helena en 22 de Abril de 2006, 19:11:07
-
Hola chicos,
Primero quiero decirles que soy nueva en esto de los pics pero tengo un gran entusiasmo por aprender pues considero que este tipo de tecnología es bastante interesante.
Quiero pedirles un gran favor y es el siguiente, tengo en mente hacer un temporizador que funcione asi:
tengo 3 leds ubicados en RB0,RB1.RB2 y un pulsador ubicado en RB3 quiero que cada vez que lo oprima aumente en 5 minutos, es decir si lo oprimo 1 vez temporiza 5 min, 2 veces 10 min y 3 veces 15 minutos, y una vez finalizado el tiempo escogido me encienda un led en RB7.
Quiero utilizar un pic16f628 o alguno similar, lo cierto es que no he podido iniciar el código y tampoco se por donde comenzar pues mi bloc de notas ya se esta acabando de tanto borrarlo.
Si alguno de ustedes puede ayudarme sería fantástico, por cierto no he visto en el foro a otra mujer chicos.
Muchas gracias
Helena
-
Hola Helena, felicidades por haberte registrado en el foro, si miras bien en la lista de usuarios podrás ver que hay varias mujeres, entre ellas esta elena2000 y paola09, que son las que más participan, espero que tu también participes con cierta constancia.
Antes de poderte darte una mano necesitaríamos saber que lenguaje de programación usaras (asembler, basic o C), y viendo las especificaciones que nos as dado no nos comentas que método usaras para que el PIC sepa cuando empezar la temporización, ya que solo tenemos 1 pulsador y este lo usas para programar el tiempo a temporizar.
Bueno, nuevamente felicidades, un saludo.
Atte. CARLOS.
-
Que tal Helena... un gusto..
Pues bien primero decir en que lenguaje vas a trabajar, como veo que posteaste en PBP y Proton, supongo que en uno de los dos... pues bien aca te envio un codigo sencillo para hacer lo que tu quieres...
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2006 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 22/04/2006 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
led1 var portb.0
led2 var portb.1
led3 var portb.2
led4 var portb.7
boton var portb.3
x var word ' variable de control del timer
i var word
x = 3000
main:
if boton=0 then goto inicio 'al pulsar el boton se iniciara
'el temporizador por default 5 min
goto main
inicio:
if boton=0 then inicio 'al pulsar el boton se iniciara
if x=3000 then high led1
if x=6000 then high led2
if x=9000 then high led3
for i=0 to x 'aca va a encerarse en el ciclo hasta
if boton =0 then gosub tiempo
pause 100 'que termine el tiempo que necesites
next
goto fin
goto inicio
fin:
low led1:low led2:low led3 'apaga los leds
high led4 'enciende el led de fin durante 5 segundos
pause 5000
low led4
goto main
tiempo:
if boton =0 then goto tiempo 'no hace nada hasta q se suelta el boton
x=x+3000
if x>9000 then x=3000
if x=3000 then
high led1:low led2:low led3:
endif
if x=6000 then
high led2:low led1:low led3
endif
if x=9000 then
high led3:low led1:low led2
endif
return
Aca te dejo el circuito simulado en proteus.. y los archivos de PBP y el hex
-
Hola Chicos Carlos y olotill,
Que pronta respuesta!... pues yo tengo el PBP se ma olvido decirles y gracias por su oportuna ayuda, lo que dices Carlos es cierto pensaba utilizar un solo pulsador para definir el tiempo 5, 10 o 15 minutos creo que puedo colocar un retardo entre cada tiempo escogido, por ejemplo al pulsar una vez configuro los 5 minutos y espero 1 segundo para que arranque la temporización.
Olotill, el código puede configurar los tres tiempos?... me puedes explicar un poquito como funciona?.
Bueno voy a estudiar el código y hacer el montaje en el board y les cuento luego.
Un gran beso
Helena :g)
-
Hola Olotill,
Descargue tu código pero cuando trato de abrirlo con el proteus me da un error, me dice que la version en la que hiciste el diagrama no es compatible con la mía, yo tengo el PROTEUS PROFESIONAL que puedo hacer?.
Saludos
Helena
-
Hola a todos,
Les explico mejor lo que quiero, al encender el circuito todos los leds RB0,RB1,RB2 y RB7
estan off, al oprimir el pulsador 1 vez configuro 5 minutos y el led en RB0 se enciende
indicando que lo configure para 5 min y que ha comenzado la temporización, si oprimo 2 veces
el pulsador configuro para 10 minutos y el led en RB1 se enciende pero el led en RB0 tambien
permanece encendido indicando que se ha sumado otros 5 minutos, al oprimir el pulsador 3
veces he configurado para lo 15 minutos y lo 3 leds permanecen encendidos.
Sería muy bueno que los leds se apagaran asi:
Cuando comienza el conteo en 15 minutos y terminan los primeros 5 minutos se apague el
led en RB2, cuando terminen los 10 minutos se apague el led en RB1 y cuando termine el
conteo total se apague el led en RB0 y es entonces cuando se enciende el led en RB7.
No fui muy clara pero esto es lo que quiero hacer, si es posible hacerlo?.
Muchas gracias de nuevo
Helena :g)
-
Que tal Helena..
Pues bien yo tengo el proteus profesional 6.7 sp3... tal vez tu tengas una version inferior ahi esta el problema... ahora que has explicado un poquito mejor lo que quieres hacer pues habra que modificar un poquito el codigo agregando unas lineas mas...
Pero bueno te comento que hace el programa, asi puedes seguir programando y pues subes el codigo que vayas obteniendo hasta que logres la meta :-/ :-/ :-/
Por ahora el programa que te puse lo que hace es esto... Al inciar todos los leds estan apagados, si pulsas el boton se prende el led de 5 min, y empieza el conteo.... este conteo es simplemente un lazo for de va desde 0 a 300000 ms, que serian 5 min (300000 ms=300 s=5min), ahora ves que existe un pause de 100 ms dentro del for pues es el que se encarga de detectar si pulsas otra vez el boton que al hacerlo pues el contador subira a 10min ... y se encendera el led de 10 min pero se apagaran los otros (esto es sencillo de modificar).... y asi con los 15 min...
Bueno espero te haya quedado un poco claro y que sigas probando hasta obtener resultados... tengo una pequeña duda respecto al tamaño de la variable i de tipo word, creo que tengo que revisar cual es el limite al que puede llegar aunque si ves en el codigo veras que va de 3000, 6000 o 9000 que esta dentro del rango de WORD...
Bueno un abrazo y espero que todo salga bien :mrgreen:
-
Buenos días Olotill,
Pues respecto del proteus tengo la version 6.3 SP1 por eso no lo puedo abrir tu me puedes decir donde encuentro la version que tu tienes (por un privado), ya entendi lo que hace tu codigo voy a poner mi cabezita atrabajar hoy para ver que puedo lograr y luego te cuento me voy a esforzar al máximo.
Muchas gracias de nuevo por tu ayuda.
Besos :g)
Helena
-
Que tal Helena...
Puedes bajar una version demo de la misma pagina de labcenter...... Ahora para tutoriales y mucho mas date una vuelta por la pagina de Yoel...
http://proyectosfie.tk
No olvides agradecerle a el todo su esfuerzo :-/
Un abrazo
-
hola:
bueno amiga aki te dejo un ej. que hice para ver si tesirve de algo, la cual espero que tesirva...
'****************************************************************
'* Name : TEMPORIZADOR.bas *
'* Author : BLACKPIC *
'* Notice : Copyright (c) 2006 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 23/04/2006 *
'* Version : 1.0 *
'* Notes : ESTE EJ. ES PARA LA AMIGA HELENA *
'* : ESPERO QUE TE AYUDE *
'****************************************************************
led0 var portb.3 'led de B3 para el conteo
led1 var portb.4 ' led que indica que el conteo fue de 0 a 5
led2 var portb.5 'led que indica que el conteo fue de 0 a 9
boton var portb.0 ' pin de entrade
i var byte ' i variable para el conteo
TRISB=%10000111
inicio:
if boton=0 then
for i=0 to 4 'el led de B3 contara 5 veces y una ves terminado prende B4.
led0=1
pause 250
led0=0
pause 250
high led1
if boton=0 then gosub conteo ' cuando presiones 2 veces seguigo va a la etiqueta conteo
pause 1
next i
endif
goto inicio
end
conteo:
for i=0 to 9 'el led de B3 contara 10 veces y una ves terminado prende B5.
led0=1
pause 250
led0=0
pause 250
high led2
next i
return
como principiante que soy espero verte ayudado en algo y otro cosa cuando le des el segundo pulso (oprimas 2 veces botn), haslo seguidamente y veras como te funciona amiga..
bye... :-/ :-/
-
Hola chicos,
Primero que todo quiero agraceder a todos pues me han ayudado enormemente, hoy estuve tratando de hacer lo que expuse en mi último post pero nada de nada :x :x :x se que debo esforzarme más para lograr lo que quiero, el código de olotill :mrgreen: es muy bueno.
Termino el día con los pics debajo de mi almohada ji ji ji ... se que solo me falta un pasito para lograr lo que quiero basada en el código de olotill.
Besos a todos :g) :g) :g)
-
Hola:
Veamos, Helena, que es lo que te hace falta a parte del codigo que ya te puso Fabian? Ahora entre semana estoy mas constante por aqui y te puedo hechar un cable... :mrgreen:
-
Hola Lord,
El còdigo que posteo olotill trabaja bien pero quiero adicionarle lo que expuse en mi ùltimo post y es:
_____________________________________________________________________________________
Hola a todos,
Les explico mejor lo que quiero, al encender el circuito todos los leds RB0,RB1,RB2 y RB7
estan off, al oprimir el pulsador 1 vez configuro 5 minutos y el led en RB0 se enciende
indicando que lo configure para 5 min y que ha comenzado la temporización, si oprimo 2 veces
el pulsador configuro para 10 minutos y el led en RB1 se enciende pero el led en RB0 tambien
permanece encendido indicando que se ha sumado otros 5 minutos, al oprimir el pulsador 3
veces he configurado para lo 15 minutos y lo 3 leds permanecen encendidos.
Sería muy bueno que los leds se apagaran asi:
Cuando comienza el conteo en 15 minutos y terminan los primeros 5 minutos se apague el
led en RB2, cuando terminen los 10 minutos se apague el led en RB1 y cuando termine el
conteo total se apague el led en RB0 y es entonces cuando se enciende el led en RB7.
No fui muy clara pero esto es lo que quiero hacer, si es posible hacerlo?.
_____________________________________________________________________________
Pues como ves esto es lo que quiero, de antemano gracias por la ayuda que puedas brindarme.
Helena :g) :g)
Hola:
Veamos, Helena, que es lo que te hace falta a parte del codigo que ya te puso Fabian? Ahora entre semana estoy mas constante por aqui y te puedo hechar un cable... :mrgreen:
-
Hola:
Veamos si es esto lo que necesitas:
led1 var portb.0
led2 var portb.1
led3 var portb.2
boton var portb.3
led4 var portb.7
aviso var porta.0
cont var byte
x var word
i var word
cont=0
i=0
loop:
if boton=0 then
cont = cont+1
select case cont
case 1
high led1
x=3000
case 2
high led2
x=6000
case 3
high led3
x=9000
end select
pause 200 'antirebote
if cont>3 then
cont=1
x=3000
high led1:low led2: low led3
endif
endif
pause 10
if cont<>0 then
i=i+1
if i>100 then
high aviso
goto inicio
endif
endif
goto loop
inicio:
for i=x to 0 step -1
pause 100
select case i
case 6000
low led3
case 3000
low led2
case 0
low led1:high led4
end select
next i
end
para que no te demores los 15 min en probarlo, quitale un "0" a todos los valores 3000, 6000 y 9000, sino te cansaras de hacer la prueba ja ja :mrgreen:
-
Hola:
Se me olvido algo, puse un led mas en A0 para ver cuando entra al bucle de retardo, ese codigo te puede servir y si necesitas algo mas me dices y te ayudo a hacerlo, pero solo indicaciones... ahora te toca postear codigo a ti :D
Suerte...!!! :mrgreen:
-
Hola Lord,
Muchas gracias por tu ayuda voy a hacer las pruebas y subo el còdigo que tenga que adicionar.
Gracias a todos!
Helena :g) :D
Hola:
Se me olvido algo, puse un led mas en A0 para ver cuando entra al bucle de retardo, ese codigo te puede servir y si necesitas algo mas me dices y te ayudo a hacerlo, pero solo indicaciones... ahora te toca postear codigo a ti :D
Suerte...!!! :mrgreen:
-
Hola:
para eso estamos... :mrgreen:, espero te sirva
-
Hola chicos,
Anoche estuve estudiando muy bien los còdigos expuestos comienzo entonces con la preguntadera:
led1 var portb.0
led2 var portb.1
led3 var portb.2
boton var portb.3
led4 var portb.7
aviso var porta.0
cont var byte
x var word
i var word
cont=0
i=0
loop:
if boton=0 then
cont = cont+1 SUMO 1 UNIDAD AL CONTADOR CADA VEZ QUE SEA INVOCADO
select case cont ESTE SI NO LO CONOZCO
case 1
high led1
x=3000
case 2
high led2 ESTOS CASE 1,2,3 ME IMAGINO QUE SON LOS RELACIONADOS A INICIO
x=6000
case 3
high led3
x=9000
end select
pause 200 'antirebote
if cont>3 then SI CONT ES MAYOR A 3 PULSOS LLEGA A 3000
cont=1
x=3000
high led1:low led2: low led3
endif
endif
pause 10
if cont<>0 then ESTE NO LO TENGO MUY CLARO
i=i+1 VAMOS SUMANDO 1 A LA VARIABLE i
if i>100 then ME EXPLICAN MAYOR 100 A QUE?
high aviso
goto inicio
endif
endif
goto loop
inicio:
for i=x to 0 step -1 ACA RESTAMOS CADA VEZ QUE SE CUMPLEN 5,10 O 15 MINUTOS
pause 100
select case i
case 6000
low led3
case 3000 ACA VOLVEMOS CON LOS CASE PERO NO ENTIENDO PARA QUE SON
low led2
case 0
low led1:high led4
end select
next i
end
Como ven es poco lo que he logrado entender el programa pero si tengo muchas ganas de comprenderlo "todo" saben una cosa me gusta mucho esto!.
Besos
Helena :g) :D
-
Hola:
Aqui te comento lo que hace el codigo:
led1 var portb.0
led2 var portb.1
led3 var portb.2
boton var portb.3
led4 var portb.7
aviso var porta.0
cont var byte
x var word
i var word
cont=0
i=0
loop:
if boton=0 then 'si el boton es presionado
cont = cont+1 'incrementamos a un contadot para saber el tiempo de espera
select case cont 'este de aqui suprime a los IF pregunta por el estado de cont
case 1 'si es uno se enciende el led 1 y esperará 5 min
high led1
x=3000
case 2 'si es dos se enciende el led 1 y esperará 10 min
high led2
x=6000
case 3 'si es tres se enciende el led 1 y esperará 15 min
high led3
x=9000
end select 'fin del select
pause 200 'antirebote
if cont>3 then 'si el contador es mayor que tres apagamos los leds
cont=1 'y volvemos a asignar 5 min, para que no se exceda en el
x=3000 'los valores que se quieren
high led1:low led2: low led3
endif
endif
pause 10
if cont<>0 then 'este if de aqui es para que si se presionó
i=i+1 'el boton espere un segundo y salte a la
if i>100 then 'subrrutina de temporizacion, si no se preciona el
high aviso 'boton se queda en el bucle loop.
goto inicio
endif
endif
goto loop
inicio:
for i=x to 0 step -1 'este es el bucle de retardo, el numero de iteraciones
pause 100 'multiplicado por la pausa de 100 ms, te da el tiempo
select case i 'total que esperara. EJ x=3000
case 6000 '3000*100=300000milisegundos. 300000/1000 = 300 seg
low led3 '300/60 = 5min
case 3000 'El bucle no se incrementa sino se decrementa en -1
low led2 'y preguntamos el valor de i para ir indicando el tiempo
case 0 'restante apagando los leds.
low led1:high led4
end select
next i
end
El case es para evitar tener que utilizar multiples IF cuando te refieras a la misma variable, esto es lo que dice la ayuda con respecto al CASE, pero aun no me dices si el codigo te sirvio... :mrgreen:
SELECT...CASE PRO STD
SELECT CASE var
CASE expr1 {, expr...}
statements
CASE expr2 {, expr...}
statements
{CASE ELSE statements}
END SELECT
CASE statements, in some cases, are easier to use than multiple IF.. THENs. These statements are used to compare a variable with different values or ranges of values, and take action based on the value.
The variable used in all of the comparisons is specified in the SELECT CASE statement. Each CASE is followed by the statements to be executed if the CASE is true. IS may be used to specify a comparison other than equal to. If none of the CASEs are true, the statements under the optional CASE ELSE statement are executed. An END SELECT closes the SELECT CASE.
Example
SELECT CASE x
CASE 1
y = 10
CASE 2, 3
y = 20
CASE IS > 5
y = 100
CASE ELSE
y = 0
END SELECT
-
Hola Lord,
Upsss, se me habia olvidado decirte que el código es muy bueno y esa era la idea que tenia en mente. Me ha quedado claro la explicacion del codigo pues tenia mis dudillas.
Lo del CASE no lo etendia muy bien pero es una muy buena alternativa para no llenar el codigo de tantos IF.
Bueno, voy a ver que le adiciono y lo comparto para que veas como avanzo... te parece?.
Muchaaaaas gracias a todos!
Helena :g)
-
Hola chicos,
Una preguntita, en la variable x donde se almacena temporalmente el tiempo a fijar cuanto sería el tiempo máximo que podria asignar se que tiene un límite pero no se cual es.
Helena :g)
-
Hola:
esa es una variable de tipo WORD, soporta hasta 65535.
-
Hola Lord,
Gracias por tu ayuda, seguire haciendo algunas preguntillas.
Helena :g)
Hola:
esa es una variable de tipo WORD, soporta hasta 65535.
-
Que tal Helena...
Aun pofundizando un poquito mas en la explicacion de mi compadre Giovanni... vamos a hacer algunos calculos del tiempo maximo que podrias sensar, primero variando el valor de la variable x y luego el valor del delay dentro del lazo for hasta un maximo de 250 ms (que equivaldria a pulsar lentamente el pulsador)..
Si mantienes en el lazo for un delay de 100ms( valor recomendado para detectar la pulsacion del boton)... entonces lo maximo que podria valer x es 65535, lo que al ser multiplicado por los 100 ms de espera de cada iteracion del for nos da 6553500 ms = 6553.5 s = 109,225 min = 1,82h...
Del mismo modo veremos q si varias el pause dentro del for a unos 250 ms como maximo (no recomendado para sensar pulsacion del boton) y con el maximo valor de x, obtendrias... 273 min = 4,55 h...
Pero la verdad esta manera de controlar tiempos no es tan correcta, ni practica tampoco, esta bien para aprender y para talvez como tu haces unos 15 min, pero para otras aplicaciones que neceseciten mayor control de tiempo te recomendaria que uses un RTC (real time clock) o el Timer del micro, o en su defecto algun algoritmo que te contabilize segundos, minutos, horas, etc...
Bueno espero haber ayudado un poco, aunque veo que tu problema esta resuelto.... a proponer otro :-/
-
Hola olotill,
Respecto de la presicion lo que tu dices no es lo más indicado pero como quiero ir un paso mas adelante ya estoy haciendo el codigo para utilizar segundos, minutos y horas precisamente anoche estuve hasta tarde realizándolo pero como no tengo mucha practica me demoraré un poquito.
Cualquier duda los molesto... ji ji ji :-/
Besos
Helena :g)
-
Hola:
Helena, solo te pido un pequeño favor, como notaras, he venido editando algunos de tus post... porque se hace un poco incomodo ver nuevamente algo que ya se expuso, me refiero a las citas... por favor hazlo solo cuando quieras citar algo específico... gracias por tu comprension... :mrgreen:
-
Upps!
Perdon no lo habia tenido en cuenta.
Helena :shock:
-
hola vi ese codigo que pusiste lord, aver si me puedes explicar un poco el codigo pero lo que no entiendo muy bien esla parte de inicio osea los retardos,osea que presiono una ves y el valor que toma s es de 3000 no,y el case 6000 ,3000 como es eso
por fa responder si no es mucha molestia
-
Hola:
Lo que hago es utilizar un contador que se incremente cada ves que se presiona el boton, y luego dependiendo del valor del contador, se le da una pausa determinada, por ejemplo si precionas una ves el boton el contador se incrementara en uno, y luego hay una parte que pregunta cuanto es el valor del contador, dependiendo de ese valor entra en un condicional y hace la accion determinada.
-
me quedo claro gracias por responder ,lord
aver si me das una manita con dos temas que metienen cabezon uno es conlas memorias eeprom y el otro con pwm
-
Hola:
Pues postea tus problemas, y no necesariamente te respondere yo, hay muchos amigos que pueden hacerlo :mrgreen: :mrgreen: