//*****************************************************************************
// Arquivo my_ints.c - tratamento das interrupções no PIC by Arne
// Desenvolvido por Eng. Márcio José Soares
//*****************************************************************************

//******************************************************************************
// O Copyright deste programa está reservado para Márcio José Soares e seu
// conteúdo está protegido pela Lei de Direitos Autorais LEI Nº 9.610, de
// 19 de Fevereiro de 1998. É estritamente proibida a reprodução total ou
// parcial dos conteúdos aqui apresentados sem prévia autorização, por escrito,
// do autor.
//******************************************************************************

//******************************************************************************
// Arquivos incluídos no módulo
//******************************************************************************
#include <xc.h>
#include "my_defines.h"

//******************************************************************************
// Definições importantes no módulo
//******************************************************************************
#ifndef byte
#define byte uint8_t
#endif

//*****************************************************************************
// Funções externas do módulo
//*****************************************************************************
//extern void trata_int_comm(void);
//extern void trata_int_ext(void);
extern void trata_int_timer0(void);

//*****************************************************************************
// Funções do módulo
//*****************************************************************************

//*****************************************************************************
// Função para tratar o vetor de interrupções no PIC
//
//  Este é o tratamento de interrupçõe no PIC. Como este microcontrolador possui
//  apenas um único vetor de interrupção (0x0004), toda e qualquer interrupção será
//  tratada aqui. Se uma única interrupção for utilizada, o tratamento pode ser direto,
//  sem a necessidade de se testar qual int ocorreu. Porém se mais de uma estiver
//  em uso, a função deverá testar os flags das ints para saber qual ocorreu, extamente
//  como é feito em assembly.
//  O uso da diretriz "interrupt 0" é importante, pois é assim que o SDCC reconhece que
//  esta função é na verdade um serviço para tratamento das interrupções. Para PICs usar
//  apenas nível 0.
//
// Entradas - nenhuma
// Saídas   - nenhuma
//*****************************************************************************
void __interrupt() pic_isr(void){

    INTCON &= ~0x80;                    // desabilita ints

#ifdef __PIC16F8x__
    //analisa se é int do timer0
    if((TMR0IF == 1) && (TMR0IE == 1)){     // é int do timer1
        trata_int_timer0();             // trata int
        TMR0IF = 0x00;                	// zera  flag 
    }
#else
    //analisa se é int do timer0
    if((T0IF == 1) && (T0IE == 1)){     // é int do timer0
        trata_int_timer0();             // trata int
        T0IF = 0x00;                	// zera  flag 
    }
	
    //analisa se é int externa
    //if((INTF == 1) && (INTE == 1)){       // é int externa
    //	trata_int_ext();                  // trata int
    //    INTF = 0;
    //}

    //analisa se é int da usart
    //if((RCIF == 1) && (RCIE == 1)){     // é int de recepção da USART
    //    trata_int_comm();               // trata int
    //    RCIF = 0;
    //}
#endif
    INTCON |= 0x80;                     // habilita novamente as ints

}
