TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: carlos6904817 en 04 de Noviembre de 2004, 07:31:00

Título: Ayuda al encender leds
Publicado 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.
Título: RE: Ayuda al encender leds
Publicado por: MarquesSalsero en 04 de Noviembre de 2004, 13:22:00
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

Venga, subelo y ya veras que rapido damos con él.
Título: RE: Ayuda al encender leds
Publicado por: TITAN.ae en 09 de Noviembre de 2004, 09:16:00
pon tu programa y  que pic estas utilizando y sera mas facil para que te ayudemos
Título: RE: Ayuda al encender leds
Publicado por: carlos6904817 en 09 de Noviembre de 2004, 13:57:00
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.

Título: RE: Ayuda al encender leds
Publicado por: fenix_jn en 09 de Noviembre de 2004, 20:09:00
Eso se le llama Actualizando Lavadora 2004Muchas risas, 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...
               
Título: RE: Ayuda al encender leds
Publicado por: carlos6904817 en 10 de Noviembre de 2004, 14:41:00
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.
Título: RE: Ayuda al encender leds
Publicado por: fenix_jn en 10 de Noviembre de 2004, 18:49:00
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.
Título: RE: Ayuda al encender leds
Publicado por: carlos6904817 en 11 de Noviembre de 2004, 13:42:00
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

Título: RE: Ayuda al encender leds
Publicado por: fenix_jn en 11 de Noviembre de 2004, 19:43:00
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....
Título: RE: Ayuda al encender leds
Publicado por: carlos6904817 en 15 de Noviembre de 2004, 11:27:00
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.