TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: 16f en 08 de Mayo de 2008, 22:24:03
-
hola amigos como podriamos llevar esto a proton.
he usado contadores , interrupciones y no le doy
Los relés de alternadores de bomba son relés que reciben señal de un contacto que indica que es necesario bombear agua. El relé cierra un contacto que hace que la bomba Nº 1 actúe. Cuando el contacto exterior al relé abre el contacto del relé también abre. Posteriormente ese contacto exterior vuelve a operar cuando sea necesaria de nuevo la operación de una bomba. En este último caso el relé hace que opere el contacto de la bomba Nº 2. Esto hace posible una operación alternada de las bombas.
sw1 activa , motor1 activa :)
sw1 desactiva, motor1 desactiva :(
sw1 activa , motor2 activa :)
sw1 desactiva , motor2 desactiva :(
se repite la accion
(http://[img])[/img]
-
inicio:
if sw = 1 then
M1 = 1
else
goto inicio
end if
perro:
if sw = 1 then
M1 = 0
else
goto perro
end if
gato:
if sw = 1 then
M2 = 1
else
goto gato
end if
loro:
if sw = 1 then
M2 = 0
else
goto loro
end if
End
SALUDOS desde cd. Juarez
CHihuahua Mexico
-
Que tal 16f,
mmmm, en cuanto a la solucion que te ofrece raul_juarez_chichuahua no seria muy correcta. Porque de esa manera cuando el SW genere un 1 puede entrar a cualquier IF y eso no se desea. La mejor manera es que utilices un contador. No se como este configurado tu lecterua de switch, es decir si estes usando un puul-up o un pull-down. Suponiendo que estas usando un pull-down, tu codigo seria algo asi:
INICIO:
Contador = 0
INI:
If SW = 1 then
IF Contador = 0 then
HIGH MOTOR1 ;Enciende el motor1
Contador = Contador + 1
GOTO INI
Endif
If Contador = 1 then
LOW MOTOR1 ;Apaga el motor1
Contador = Contador + 1
GOTO INI
Endif
If Contador = 2 then
HIGH MOTOR2
Contador = Contador + 1
GOTO INI
Endif
If Contador = 3 then
LOW MOTOR2
GOTO INI
Endif
Endif
Debo hacer la alcaracion que en el codigo no esta considerado los rebotes del switch, por lo que deberas eliminarlos. Saludos y espero que te sirva la solucion.
Elreypic.
-
Saludos! :-)
Bueno no soy tan experimentado como elreypic2.
Pero, en el último if no debería ir un goto inicio en vez de goto ini? Para que el contador sea aclarado y el ciclo pueda volver a repetirse? O sino colocar dentro del último if, después de Low Motor2 un "contador=0"?
Creo que eso falta, si estoy equivocado me dicen...
Ok nos leemos! :mrgreen:
-
Gracias firepic, tienes razon ahi cometi un error. En el ultimo IF el GOTO deberia ir INICIO, es decir sera asi:
INICIO:
Contador = 0
INI:
If SW = 1 then
IF Contador = 0 then
HIGH MOTOR1 ;Enciende el motor1
Contador = Contador + 1
GOTO INI
Endif
If Contador = 1 then
LOW MOTOR1 ;Apaga el motor1
Contador = Contador + 1
GOTO INI
Endif
If Contador = 2 then
HIGH MOTOR2
Contador = Contador + 1
GOTO INI
Endif
If Contador = 3 then
LOW MOTOR2
GOTO INICIO
Endif
Endif
-
Saludos reypic2!
Ah ok, entonces estaba en lo cierto...
Bueno como diría ALF... no hay problema! Cualquiera se equivoquea :D
Nos leemos! :mrgreen:
-
INI:
Pause = 3000 'Hace una pausa de 3 segundos
If SW = 1 then
If Contador = 3 then
LOW MOTOR2
Endif
If Contador = 2 then
HIGH MOTOR2
Endif
If Contador = 1 then
LOW MOTOR1 ;Apaga el motor1
Endif
IF Contador = 0 then
HIGH MOTOR1 ;Enciende el motor1
Endif
contador = contador + 1
if contador > 3 then contador = 0
endif
goto ini
End
Asi quedara un poco mejor y los reles no parecerán una orquesta cada vez que se pulsa la tecla.
PD. No conozco la sintaxis del lenguaje, asi que no compilara el programa... :mrgreen:
-
Uf! Muchísimo mejor! :-/
Tienes razón dogflu, de la forma anterior los contactos de los relés estarían continuamente como bailando samba :D
Ok nos leemos! :mrgreen:
-
DE igual forma funcionaria con un select case :mrgreen:
Saludos
-
Bueno todavía mejor pues, qué decir?
Eso evitaría tener que invertir la cosa y colocar 0,1,2,3 (que se ve más elegante) en lugar de 3,2,1,0...
Entonces, modificando el codigo de dogflu, quedaría así Ralph?:
INI:
Pause = 3000 'Hace una pausa de 3 segundos
If SW = 1 then
Select case Contador
case 0
HIGH MOTOR1 ;Enciende el motor1
case 1
LOW MOTOR1 ;Apaga el motor1
case 2
HIGH MOTOR2
case 3
LOW MOTOR2
End Select
contador = contador + 1
if contador > 3 then contador = 0
Endif
goto ini
Bueno así se ve más dindo dindo :D
Se aceptan más mejoras! :)
Ok nos leemos! :mrgreen:
-
Asi es firepic!
Saludos
-
Si, asi quedo mas elegante... :D
-
hola amigos gracias por los aportes pero es mas menos lo que he hecho. el programa que uds expucieron tiene un problema
que al quedar el sw enganchado recorrera toda secuencia, es efectivo para un pulsador que solo interviene en un segundo.
la idea es que si el sw se activa enviando un 1 el motor 1 se activa, pero si dejo de precionar deja de funcionar el m1
luego tendremos una nueva secuencia con el mismo pulsador pero ahora activando el motor 2
esto se repite
-
INI:
If Contador = 3 then
while sw=1
LOW MOTOR2
gosub wait
wend
contador = 4
Endif
If Contador = 2 then
while sw=1
HIGH MOTOR2
gosub wait
wend
contador = 3
Endif
If Contador = 1 then
while sw=1
LOW MOTOR1 ;Apaga el motor1
gosub wait
wend
contador = 2
Endif
IF Contador = 0 then
while sw=1
HIGH MOTOR1 ;Enciende el motor1
gosub wait
wend
contador = 1
Endif
if contador >= 4 then contador = 0
goto ini
End
wait:
pausa 3000
return
Me parece que esto si que lo hace... :-)
-
Saludos! :-)
Bueno no había visto la respuesta de dogflu, pero por aquí tienes este código... esta vez no utilizo contador, tal vez sea un poco rudimentaria la lógica pero por lo menos el código es más corto.
Lo simulé en proteus y va de lo lindo, allí te dejo el archivo con la simulación y el .bas y .hex para que lo pruebes.
SW var PORTB.0
motor_1 Var PORTB.1
motor_2 Var PORTB.2
loop: if SW==0 then
pause 100
while SW==0
HIGH motor_1
wend
else
goto loop
endif
LOW motor_1
evalua: if SW==0 then
pause 100
while SW==0
HIGH motor_2
wend
else
goto evalua
endif
LOW motor_2
goto loop
END
El switch está simulado por un pulsador NA, conectado de forma tal que al cerrarlo = GND. Lo coloqué así porque es la configuración que más uso, pero si deseas que al presionar sea = 1, entonces simplemente cambia donde dice SW==0 por SW==1...
Los motores están simulados por un par de leds azules.
Por cierto, usé PIC16F84A y frecuencia de trabajo 4MHz solo para probar... como sabrás eso también lo puedes cambiar.
Ok espero te ayude, nos leemos! :mrgreen:
P.D. Como verás, esto lo hice con pic basic... tu pedías proton, pero es que no manejo ese compilador... :D aunque creo que no te costará adaptarlo a proton... :mrgreen:
-
firepic wena wena :-/
muy bien firepic eso es lo que buscaba, agradecimientos a todos los que buscaron solucion , nuestro amigo firepic dio con el clavo.
compilado en proton
DEVICE 16F628A
XTAL 20
TRISB = 0
TRISA = 1
CMCON = 7
CONT VAR BYTE
contador var BYTE
CONTT VAR BYTE
CONTTa VAR BYTE
SYMBOL sw1 = PORTA.0
SYMBOL sw2 = PORTA.1
SYMBOL sw3 = PORTA.2
SYMBOL sw4 = PORTA.3
SYMBOL sw5 = PORTA.4
SYMBOL SW6 = PORTA.7
SYMBOL motor1 = PORTB.0
SYMBOL motor2 = PORTB.1
SYMBOL led3 = PORTB.2
SYMBOL led4 = PORTB.3
SYMBOL led5 = PORTB.4
SYMBOL led6 = PORTB.5
SYMBOL led7 = PORTB.6
SYMBOL led8 = PORTB.7
CONT = 0
CONTAdor = 0
CONTT = 2
contta = 3
PORTB = 0
INI:
loop: IF sw1=0 THEN
DELAYMS 100
WHILE sw1=0
HIGH motor1
WEND
ELSE
GOTO loop
ENDIF
LOW motor1
evalua: IF sw1=0 THEN
DELAYMS 100
WHILE sw1=0
HIGH motor2
WEND
ELSE
GOTO evalua
ENDIF
LOW motor2
GOTO loop
END
-
Me alegra que hayas resuelto tu problemilla 16f! :-/
Nuevamente cito del maestro nocturno: enhorabuena! (es que suena bien la frase eh :D )
Ok nos leemos! :mrgreen: