TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: carlos6904817 en 04 de Noviembre de 2004, 07:31:00
-
Quisiera que me ayudaran con un programa para encender leds.
Resulta que quisiera encender a la salida del 16f84 unos 3 leds por medio de 3 botones en la entrada, pero con la caracteristica de que pueda encender con un boton los tres leds a la vez, con el otro dos y con el otro uno por ejemplo.
hice las rutinas pero solo me enciende uno
la idea es que con un boton me encienda al menos dos leds.
le agradeceria que me ayudaran......por supuesto en pic basic pro.
-
Pues como siempre, pon tu codigo y asi podremos intentar ayudarte.
Pero asi a ciegas yo diria que el error esta en el retorno de la cuarta subrutina ![Giño Giño]()
Venga, subelo y ya veras que rapido damos con él.
-
pon tu programa y que pic estas utilizando y sera mas facil para que te ayudemos
-
Hola a todos.
Ya logre mi objetivo de encender los leds como yo queria.
Tambien tenia una inquietud de encenderlos por medio de sw y no de botones, osea que al pasar el sw quedara el led encendido y al desabilitar el sw el led se apaga, lo logre con IF....THEN. me costo un poco pero lo hice.
estoy haciendo estos ejemplos porque quiero implementarselo a una lavadora automatica con reloj mecanico. Ahora estoy trancado con estas rutinas, pongo los pasos para que me ayuden, no he podido poner el programa porque esta en mi casa y se me olvida traerlo al trabajo que es donde me conecto a internet:
1-encender lavadora (boton de encendido)
2-poner a llenar tina (detecta tina vacia y enciende bomba llenado)
3-lavar (detecta tina llena y apaga bomba llenado ,activa solenoide de lavar)
4-vaciar (detiene lavar y activa solenoide de vaciar)
5-exprimir (detiene vaciar y activa solenoide exprimir)
6-parar.
el problema lo tengo en los pasos 2 y 3, acuerdense que estoy empezando con pbp......saludos.
-
Eso se le llama Actualizando Lavadora 2004
, interesante idea esta de convertir una lavadora con reloj mecanico en una lavadora digitalizada!!, solo t falta q nos digas q le pondras selector de temperatura del agua y estara completa!
Bueno, aparte de eso, si puedes hacer q los sensores internos de la lavadora (q detectaban tina llena con el reloj mecanico) sean adaptados a un sistema TTL entonces la tu programa sera mas sencillo algo como esto:
device = 16F84
xtal = 4
symbol onl = 0
symbol full = 1
main:
<tus declaraciones de puerto>
if getbit ptob, onl = 1 then setbit ptob, onw
"Aki suponemos que ONL es el boton de encndido y ONW la entrada general de corriente y de la bomba de llenado
wait_full:
if getbit ptob, full = 1 then
clearbit ptob, onw
else
goto wait_full
end if
delayms 20
"Espera a q se llene la lavadora y apaga la bomba cuando ha detectado el tope (el sensor activa la entrada logica en 1
setbit ptob, wash
"Prende el solenoide de lavar
"Aki pones tu rutina de espera, seria una excelente idea que asignaras a un pin una entrada cuando se abre la tapa de la lavadora para detener el solenoide de lavar y poder sacar o meter ropa o cualkier cosa q se olvide...
bueno ya tienes la idea...
-
Saludos a todos.
Estuve haciendo pruebas con las rutinas que coloco fenix_jn, pero no pude hacerlo arrancar....me daba muchos errores, no se si es por el tipo de programacion.
Aqui les dejo lo poquito que pude hacer para que me ayuden....esto es lo que pude hacer arrancar: las pausas entre cada etiquetas es lo de menos, despues se pueden cambiar.
B0 VAR BYTE
llenado VAR BIT
symbol Button0 = PORTB.5
symbol Button1 = PORTB.6
symbol LED1 = PORTB.0
symbol LED2 = PORTB.1
symbol LED3 = PORTB.2
symbol LED4 = PORTB.3
symbol BeepPort = PORTB.4
symbol BeepTris = TRISB.4
TRISB = $00
PORTB = $00
BeepTris = 0
BeepPort = 0
Main:
Clear
B0 = 0
Button Button0,0,255,0,B0,1,ll
B0 = 0
Button Button1,0,255,0,B0,1,la
GoTo Main
ll: IF PORTB.7=0 Then " creo que en estas rutinas es donde tengo el problema
llenado=1 " con el llenado que enciende el llenado y estando pren-
High PORTB.3 " dido siguen las otras rutinas hasta llegar al final. me
EndIF " gusta la idea de agregarle un sw para detener la
" lavadora, asi como tambien pudiese colocarle un boton
IF PORTA.2=1 Then " de pausa para detener en cierta etapa el programa y
llenado=1 " arrancarlo en el sitio que se detuvo....por el control de
Low PORTB.3 " tempratura por ahora no me preocupa despues podria-
EndIF " mos agregarsela.
la: Sound BeepPort,[105,5,100,5,100,5] "LAVADO
Led1= 1
Led2= 1
Pause 1000
Led1= 0
Led2= 0
Pause 200
va: Sound BeepPort,[110,5,100,5,100,5] "VACIADO
Led1= 1
Pause 500
Led1= 0
Pause 200
ex: Sound BeepPort,[110,5,100,5,100,5] "EXPRIMIDO
Led1= 1
Led3= 1
Pause 500
Led1= 0
Led3= 0
Pause 200
fi: Sound BeepPort,[120,5,120,5,120,5] "FINALIZADO
Pause 300
GoTo Main
End
Por favor si tengo algun error me lo corrigen, estoy haciendolo con pic basic pro
y si tienen otra idea fantastica ....BIENVENIDA SERA.
-
Escrito originalmente por carlos6904817
Saludos a todos.
Estuve haciendo pruebas con las rutinas que coloco fenix_jn, pero no pude hacerlo arrancar....me daba muchos errores, no se si es por el tipo de programacion.
Aqui les dejo lo poquito que pude hacer para que me ayuden....esto es lo que pude hacer arrancar: las pausas entre cada etiquetas es lo de menos, despues se pueden cambiar.
B0 VAR BYTE
llenado VAR BIT
symbol Button0 = PORTB.5
symbol Button1 = PORTB.6
symbol LED1 = PORTB.0
symbol LED2 = PORTB.1
symbol LED3 = PORTB.2
symbol LED4 = PORTB.3
symbol BeepPort = PORTB.4
symbol BeepTris = TRISB.4
TRISB = $00
PORTB = $00
BeepTris = 0
BeepPort = 0
Main:
Clear
B0 = 0
Button Button0,0,255,0,B0,1,ll
B0 = 0
Button Button1,0,255,0,B0,1,la
GoTo Main
ll: IF PORTB.7=0 Then " creo que en estas rutinas es donde tengo el problema
llenado=1 " con el llenado que enciende el llenado y estando pren-
High PORTB.3 " dido siguen las otras rutinas hasta llegar al final. me
EndIF " gusta la idea de agregarle un sw para detener la
" lavadora, asi como tambien pudiese colocarle un boton
IF PORTA.2=1 Then " de pausa para detener en cierta etapa el programa y
llenado=1 " arrancarlo en el sitio que se detuvo....por el control de
Low PORTB.3 " tempratura por ahora no me preocupa despues podria-
EndIF " mos agregarsela.
la: Sound BeepPort,[105,5,100,5,100,5] "LAVADO
Led1= 1
Led2= 1
Pause 1000
Led1= 0
Led2= 0
Pause 200
va: Sound BeepPort,[110,5,100,5,100,5] "VACIADO
Led1= 1
Pause 500
Led1= 0
Pause 200
ex: Sound BeepPort,[110,5,100,5,100,5] "EXPRIMIDO
Led1= 1
Led3= 1
Pause 500
Led1= 0
Led3= 0
Pause 200
fi: Sound BeepPort,[120,5,120,5,120,5] "FINALIZADO
Pause 300
GoTo Main
End
Por favor si tengo algun error me lo corrigen, estoy haciendolo con pic basic pro
y si tienen otra idea fantastica ....BIENVENIDA SERA.
La razon por la que se te va al final es porq no tienes una rutina de retardo o algo q ponga al PIC en espera de otra pulsacion (o de un evento que inicie el siguiente procedimiento). Visual Basic funciona por EVENTOS, los PICs no, ellos son secuenciales, eso implica q si no pones algo q pare la rutina para esperar otro evento ellos seguiran de largo ejecutando todo lo q hay hasta el final, Proton y mikroBASIC emplean el codigo de VB con fines simplificantes (es decir, hacer el codigo mas corto) pero no ejecutan como VB.
Estoy suponiendo que el PIC controla todo incluso el tiempo que permanecen los solenoides encendidos, supongamos que kieres hacer una rutina que haga q la lavada dure 20 mins: (es un ejemplo!!!!)
dim r1 as byte
dim r2 as byte
dim r3 as byte
dim r4 as byte
"Aki va el codigo que detecta el inicio de la lavada e inicia el motor...
"Rutina temporizada
for r1 = 1 to 20 " Minutos
for r2 = 1 to 60 " Segundos
for r3 = 1 to 10 " Decimas de segundo
delayms 100
if getbit ptob, stop = 1 then
llenado = 0 "Detiene la lavada (pausa)
gosub wait_close
end if
next
next
next
goto secado
wait_close: "Espera a q cierres la tapa
if getbit ptob, stop = 1 then goto wait_close
return
secado:
"Rutina de secado...
Porq no usar una interrupcion?? bueno he hecho algunas pruebas, PROTON no atiende la interrupcion dentro de las rutinas de tiempo eso implica q al abrir la lavadora NO NECESARIAMENTE se va a parar sino hasta un tiempo (o en el peor caso hasta llegar a los 20 mins). En todo caso es mejor q pongas un delayms con un valor pequeño y completes los valores con ciclos for..next.
NOTA: Los ejemplos q t di estan basados en PROTON posiblemente estes entrando los datos en otro compilador, otra cosa la rutina for..next no necesariamente consume los 20 mins, esto es porq primero hay q pasar eso a ASM y puede ser q consuma mas por lo q deberas hacer pruebas hasta obtener un tiempo mas o menos aceptable para tu aplicacion.
-
Gracias fenix_jn y a todos por preocuparse por este novato.
con respecto si es que estoy usando otro compilador, SI es el codedesigner, pero al instalar el proton tambien me da errores, creo que no entiendo algunas cosas, por ejemplo:
el programa que puse si lo compila el proton, pero al colocarle el ejemplo que me distes me da errores con el proton, sera que tengo que configurarle los pines ejemp:
device = 16F84
xtal = 4
symbol onl = 0
symbol full = 1
main:
<tus declaraciones de puerto>
if getbit ptob, onl = 1 then setbit ptob, onw
"Aki suponemos que ONL es el boton de encndido y ONW la entrada general de corriente y de la bomba de llenado
wait_full:
if getbit ptob, full = 1 then
clearbit ptob, onw
else
goto wait_full
end if
delayms 20
"Espera a q se llene la lavadora y apaga la bomba cuando ha detectado el tope (el sensor activa la entrada logica en 1
setbit ptob, wash
"Prende el solenoide de lavar
**********************************************
AHORA:
if getbit ptob, onl = 1 then setbit ptob, onw
aqui me da errores en la compilacion:
*** "PTOB" is an unsopported variable type for GETBIT¡ ***
*** "PTOB" is an unsopported variable type for CLEARBIT¡ ***
sera que tengo que configurar los puertos?
tambien me da errores con ELSE:
*** Misplaced r Incorrect "else" .Also check its corresponding IF Command
me gustaria que adaptaran estas lineas al programa que puse o que lo mejoraran o que me dijeran como adaptarlo, porque estuve adaptandolo al proton, cambiando puertos, variables etc y me volvi un 8, mientras seguire estudiando ahora el proton que tambien parece interesante
saludos
-
oops... sorry la declaracion es PORTB no ptob (lo q pasa es q cuando escribo en asm uso ptob), y si, debes declarar las entradas y salidas antes de iniciar el programa eso lo haces usando tris asi:
TRISB = %10101001 "Es un ejemplo, pon tu propio valor de I/O
TRISA = %01011010 "Lo mismo....
-
estuve haciendo las puebas que me distes, pero las tuve que pasarlas a pic basic pro, porque me enrede y estas fueron asi:
B0 VAR BYTE
symbol Button0 = PORTB.5
symbol Button1 = PORTB.6
symbol LED1 = PORTB.0
symbol LED2 = PORTB.1
symbol LED3 = PORTB.2
symbol LED4 = PORTB.3
symbol LED5 = PORTA.0
symbol BeepPort = PORTB.4
symbol BeepTris = TRISB.4
TRISA = $00
PORTA = $00
TRISB = $00
PORTB = $00
BeepTris = 0
BeepPort = 0
Clear
Main:
B0 = 0
Button Button0,0,255,0,B0,1,ll
GoTo Main
ll:
Led5= 0 "si detecta que no hay agua prende la bomba de llenado
IF PORTB.7=0 Then
High PORTB.3
EndIF
ld:
IF PORTB.7=1 Then "al detectar que se ha llenado o que la tina esta llena
Low PORTB.3 "pasa a lavar
Else
GoTo ld
EndIF
Pause 200
la: Sound BeepPort,[105,5,100,5,100,5] "rutina de lavado
Led1= 1
Led2= 1
Pause 1000
Led1= 0
Led2= 0
Pause 200
va: Sound BeepPort,[110,5,100,5,100,5] "rutina de vaciado de la tina
Led1= 1
Pause 500
Led1= 0
Pause 200
ex: Sound BeepPort,[110,5,100,5,100,5] "rutina de exprimido
Led1= 1
Led3= 1
Pause 500
Led1= 0
Led3= 0
Pause 200
fi: Sound BeepPort,[120,5,120,5,120,5] "FINALIZADO
Led5= 1
GoTo Main
End
trabaja bien pero al finalizar y querer empezar de nuevo el ciclo, o sea llenar la tina, comienza desde lavado y no a llenar la tina. para comenzar desde el llenado tengo que llevar a 0 MCLR .....que puede estar pasando ahi.....Tambien hice la prueba con la rutina de parar la lavadora pero no me dio resultado...si podrias agregarselo a este programa te lo agradeceria. O sugerirme como hacerlo.
Saludos.