//Programa de control de espejos y ventanillas
#include <12C509.h>
#fuses INTRC,NOWDT,NOPROTECT, NOMCLR
#use delay(clock=4000000)
#define GP0 PIN_B0 //Relé sacar espejos
#define GP1 PIN_B1 //Relé meter espejos
#define GP2 PIN_B2 //Pulso cierre
#define GP3 PIN_B3 //Pulso apertura
#define GP4 PIN_B4
#define GP5 PIN_B5
void MirrorIn(void){
output_high(GP1);
delay_ms(4000); //Esperamos 4 seg. a que se metan
output_low(GP1);
}
void MirrorOut(void){
output_high(GP0);
delay_ms(4000); //Esperamos 4 seg. a que salgan
output_low(GP0);
}
main() {
char primer_pulso = 0;
char segundo_pulso = 0;
char contador = 0;
output_low(GP0);
output_low(GP1);
output_low(GP2);
output_low(GP4);
while (TRUE){
contador = 0;
if (input(GP2)){//pulsado cierre
//Detectar si han pulsado dos veces en menos de dos segundos
while (contador<25000){//Calcular el valor para que esté un segundo dando vueltas al While
if (input(GP2)){
segundo_pulso = 1;
}//if input(GP2)
}//fin while
if (segundo_pulso = 1){
MirrorIn();//Metemos los espejos
}//if segundo_pulso
}//if input(GP2)
if (input(GP3)){//pulsado abrrir
//Detectar si han pulsado dos veces en menos de dos segundos
while (contador<25000){//Calcular el valor para que esté un segundo dando vueltas al While
if (input(GP3)){
segundo_pulso = 1;
}//if input(GP3)
} //fin while
if (segundo_pulso = 1){
MirrorOut();//Sacamos los espejos
}//segundo_pulso
}//input(GP3)
}//while TRUE Bulce infinito
}//main
- activamos la interrupción externa para la detección del pulso
- en la función de interrupción externa hacemos lo siguiente:
- ¿es el primer pulso?
SI -> cambiamos un flag y activamos el timer y la interrupción del timer. Contador de desbordamientos=0
NO -> cambiamos un flag y comprobamos el tiempo transcurrido (en el Timer). Si hace menos de dos segundos, plegar espejos.
- en la función de interrupción del timer hacemos lo siguiente:
- ¿hemos llegado a 2 seg? (contador de desbordamientos >= x)
SI -> cambiamos el flag y desactivamos contador de tiempo y timer
NO -> acumulamos contador de desbordamientos
if (input(GP2)&&!input(GP4)){//pulsado cierre
while(input(GP2)){
//esperamos que finalice el pulso
}
//Detectar si han pulsado dos veces en menos de dos segundos
LedStatusOn();//debug ver que sólo está encendido 2 segundos máximo
while (contador<600){//Calcular el valor para que esté 2 segundos dando vueltas al While
if (input(GP2)){
delay_ms(200);
if (input(GP2)){//evitamos falsas entradas.
segundo_pulso = 1;
contador = 601;//forzamos la salida ya han dado segundo pulso
}
}//if input(GP2)
delay_ms(200);
contador ++;
}//fin while
contador = 0;
LedStatusOff();
if (segundo_pulso = 1 && !input(GP4)){
MirrorIn();//Metemos los espejos
segundo_pulso = 0;
}//if segundo_pulso
}//if input(GP2)
while (contador<600){//Calcular el valor para que esté 2 segundos dando vueltas al WhileNo se quedaría dentro del While durante dos segundos? (aprox) esperando el segundo pulso?? Estará dando 600 vueltas al while esperando el segundo pulso... no?
if (input(GP2)){
delay_ms(200);
if (input(GP2)){//evitamos falsas entradas.
segundo_pulso = 1;
contador = 601;//forzamos la salida ya han dado segundo pulso
}
}//if input(GP2)
delay_ms(200);
contador ++;
}//fin while
///Programa de control de espejos y ventanillas
#include <12f509.h>
#fuses INTRC,NOWDT,NOPROTECT, NOMCLR
#use delay(clock=4000000)
#define GP0 PIN_B0 //Relé sacar espejos
#define GP1 PIN_B1 //Relé meter espejos
#define GP2 PIN_B2 //Pulso cierre
#define GP3 PIN_B3 //Pulso apertura
#define GP4 PIN_B4 //12v bajo llave Anulamos todo al tenerlos
#define GP5 PIN_B5 //led esperando segundo pulso DEBUG
char primer_pulso = 0;
char segundo_pulso = 0;
char contador = 0;
void MirrorIn(void){
output_high(GP1);
delay_ms(4000); //Esperamos 4 seg. a que se metan
output_low(GP1);
}
void MirrorOut(void){
output_high(GP0);
delay_ms(4000); //Esperamos 4 seg. a que salgan
output_low(GP0);
}
void LedStatusOn(void){
output_high(GP5);
}
void LedStatusOff(void){
output_high(GP5);
}
main() {
#if defined(__PCB__)
setup_counters (RTCC_INTERNAL,RTCC_DIV_2);
// See .h file for other special
// options for setup_counters
#else
setup_counters (RTCC_INTERNAL,RTCC_DIV_2);
#endif
output_low(GP0);
output_low(GP1);
output_low(GP2); //son input
output_low(GP4); //son input
output_low(GP5);
while (TRUE){
contador = 0;
if (input(GP2)&&!input(GP4)){//Detectamos el primer pulso de cierre, siempre que no tengamos señal en GP4
while(input(GP2)){
//esperamos que finalice el primer pulso ya que como dura unos 500ms si no esperamos al nivel bajo
//el nivel alto pasaría al siguiente IF, interpretandolo como una segunda pulsación
}
LedStatusOn();//debug ver que sólo está encendido 2 segundos máximo
while (contador<600){//Calcular el valor para que esté 2 segundos dando vueltas al While
//Esperando al segundo pulso
if (input(GP2)){//segundo pulso detectado
delay_ms(200);//esperamos 200ms para ver que no ha sido una señal falsa
if (input(GP2)){//Es de verdad un segundo pulso? El pulso dura 500ms
segundo_pulso = 1;
contador = 601;//forzamos la salida ya han dado segundo pulso
}
}//if input(GP2)
delay_ms(200);
contador ++;
}//fin while
contador = 0;
LedStatusOff();
if (segundo_pulso = 1 && !input(GP4)){
MirrorIn();//Metemos los espejos
segundo_pulso = 0;
}//if segundo_pulso
}//if input(GP2)
//Habría que repetir lo mismo para GP3 que sería lo que detecta que se dio a al mando a abrir
}//while TRUE Bulce infinito
}//main