A interrupção do laser faz reiniciar o contador.
Antes de fechar o portão, vai aguardar aprox. 5min, se o feixe não for interrompido, ele acciona o botão do comando.
PS: Realço o facto de o programa ser extremamente simples, pois é praticamente tudo feito por hardware...
O código (hi-tech C):
/** File: portao cod.c* Author: David Martins** Created on 14 de Outubro de 2012, 0:46*/// PIC12F675 Configuration Bit Settings#include <htc.h>__CONFIG(FOSC_INTRCIO & WDTE_OFF & PWRTE_ON & MCLRE_OFF & BOREN_OFF & CP_OFF & CPD_OFF);#define _XTAL_FREQ 4000000unsigned char botao;unsigned int conta;void interrupt INT(void){if (CMIE && CMIF) //interrupção do comparador{TMR0 = 0;conta = 0;PIR1bits.CMIF = 0;}if (T0IF && T0IE){conta++;if(conta==4578){botao=1;}INTCONbits.T0IF = 0;}}void main(){//PORT CONFIGGPIO = 0;TRISIO = 0b000011; //entradas do comparador//TIMER0 CONFIGOPTION_REGbits.nGPPU = 1;OPTION_REGbits.INTEDG = 0;OPTION_REGbits.T0CS = 0;OPTION_REGbits.T0SE = 0;OPTION_REGbits.PSA = 0;OPTION_REGbits.PS = 0b111; //prescaller 256//COMPARATOR CONFIGCMCONbits.CINV = 1;CMCONbits.CM = 0b010;//INTCON CONFIGINTCONbits.GIE = 1;INTCONbits.T0IE = 1; //habilita interrupçãoINTCONbits.T0IF = 0; //interrupt timer0 - off (flag)INTCONbits.PEIE = 1; //int comparadorPIR1bits.CMIF = 0; //limpa flagPIE1bits.CMIE = 1; //Enables the comparator interruptbotao = 0;conta = 0;while(!botao);GP4=1; //acciona o botão__delay_ms(500);GP4=0;//SLEEP modeSTATUSbits.nTO = 1;STATUSbits.nPD = 0;}
O circuito:
Vamos lá ver se este fim de semana próximo tenho tempo de fazer a montagem final deste sistema.