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 4000000


unsigned 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 CONFIG
    GPIO   = 0;
    TRISIO = 0b000011;                                    //entradas do comparador

    //TIMER0 CONFIG
    OPTION_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 CONFIG
    CMCONbits.CINV = 1;
    CMCONbits.CM   = 0b010;
               
    //INTCON CONFIG
    INTCONbits.GIE    = 1;
    INTCONbits.T0IE   = 1;                               //habilita interrupção
    INTCONbits.T0IF   = 0;                                //interrupt timer0 - off (flag)
    INTCONbits.PEIE   = 1;                              //int comparador
               
    PIR1bits.CMIF     = 0;                                  //limpa flag
    PIE1bits.CMIE     = 1;                                  //Enables the comparator interrupt
   
    botao = 0;
    conta = 0;
   
    while(!botao);
   
    GP4=1;                                                            //acciona o botão
    __delay_ms(500);
    GP4=0;
   
   
    //SLEEP mode
    STATUSbits.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.


0 Responses so far.

Enviar um comentário