Anda di halaman 1dari 6

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* Certifica��o C18 - PIC18F4550 *


* *
* *
* CENTRO DE TREINAMENTO - UNITED DEVICE TECHNOLOGY *
* *
* WWW.UDTEC.COM.BR *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VERS�O : 1.0 *
* DATA : *
* PROGRAMMER : *
* REVISION: *
* PROGRAMMER : *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* DEVELOPMENT BOARD: PIC18F#UDTEC
*
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **
* Descri��o geral *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/** I N C L U D E S **********************************************************/
#include <p18f4550.h> // Necess�rio para que o compilador adicione a biblioteca
// com as defini��es do PIC selecionado no
projeto, neste
// caso, o modelo 18F4550.

#include <delays.h> // Biblioteca C18 com fun��es de rotinas de


atraso(delay)
// por exemplo: Delay10TCYx(xxx);

/** D E F I N E S ************************************************************/
// LED's: saida digital
//atribui��o: 0 = LED desligado
// 1 = LED ligado
#define LED_VERDE PORTBbits.RB7
#define LED_VERMELHO PORTBbits.RB6
#define LED_AMARELO PORTBbits.RB5

// LAMP=1 LIGADA
// LAMP=0 DESLIGADA
#define LAMP PORTCbits.RC2

//Bot�o INT2
//Bot�o=0 n�o pressionado
//Bot�o=1 pressionado
#define INT2 PORTBbits.RB2

// O Bot�o de BOOT tem l�gica invertida


//atribui��o: 0 = botao pressionado
// 1 = botao n�o pressionado
#define BOTAO_BOOT PORTBbits.RB4

// Buzina (buzzer): saida digital


//atribui��o: 0 = buzzer desligado
// 1 = buzzer ligado
#define BUZZER PORTEbits.RE0
/** V A R I A V E I S G L O B A I S ****************************************/

/** P R O T O T I P O S P R I V A D O S ***********************************/
void MCU_Init (void);
void Toca_Buzina(void);

/** P R O T O T I P O S D A S F U N � � E S D E I N T E R R U P � � O*/
void ConfiguraInterrupcao(void);
void Tratamento_High_Interrupt(void);
void Tratamento_Low_Interrupt(void);

/** F U N C O E S ************************************************************/

/******************************************************************************
* Funcao: void main(void)
* Entrada: Nenhuma (void)
* Sa�da: Nenhuma (void)
* Descri��o: Fun��o principal do programa. O termo "main" significa
* principal, e isto � relacionado a esta fun��o pois eh
a
* mesma � a primeira a ser chamada apos o reset da PIC.
* Todas as outras fun��es sao chamadas a partir da
"main".
*****************************************************************************/
void main(void)
{

MCU_Init(); // Configura as portas e perif�ricos do PIC.

//Desliga todos os LED's


LED_VERDE=0;
LED_AMARELO=0;
LED_VERMELHO=0;
LAMP=1;
//Desliga Buzzer
BUZZER=0;

INTCONbits.GIEH=1; // Habilita TODAS as interrup��es


INTCONbits.GIEL=1;
while (1) //la�o infinito que executa o funcionamento do
projeto.
{
// O la�o infinito fica vazio, o programa � controlado pela interrup��o

}//end while

}//end main

/******************************************************************************
* Funcao: void MCU_Init(void)
* Entrada: Nenhuma (void)
* Sa�da: Nenhuma (void)
* Descri��o: MCU_Init � a rotina de configura��o principal do PIC.
* Seu objetivo � configurar as portas de I/O e os
perif�ricos
* do microcontrolador para que os mesmos trabalhem da
maneira
* desejada no projeto.
*
*****************************************************************************/
void MCU_Init(void)
{
// Configura todas as 13 portas anal�gicas ANx (portas do conversor A/D) como pinos
digitais
ADCON1 |= 0x0F; // Todos os pinos como digital
// No PIC18F4550 temos:
// AN0=RA0
// AN1=RA1
// AN2=RA2
// AN3=RA3
// AN4=RA5
// AN5=RE0
// AN6=RE1
// AN7=RE2
// AN8=RB2
// AN9=RB3
// AN10=RB1
// AN11=RB4
// AN12=RB0

// Configura LED's: saida digital


TRISBbits.TRISB7=0; // RB7: saida digital - LED_VERDE
TRISBbits.TRISB6=0; // RB6: saida digital - LED_VERMELHO
TRISBbits.TRISB5=0; // RB5: saida digital - LED_AMARELO

// Configura LAMP sa�da digital


TRISCbits.TRISC2=0;

// Buzzer: saida digital


TRISEbits.TRISE0=0; // RE0: saida digital - BUZZER

// Configura Bot�o: entradas digitais


TRISBbits.TRISB4=1; // RB4: entrada digital - BOTAO_BOOT

// Fun��o que configura as interrup��es do sistema


ConfiguraInterrupcao();

// Configura Bot�o:entrada digital


TRISBbits.TRISB2=1;

}//end ConfiguraSistema

/******************************************************************************
* Funcao: void ConfiguraInterrupcao(void)
* Entrada: Nenhuma (void)
* Sa�da: Nenhuma (void)
* Descri��o: Fun��o que configura as interrup��es utilizadas no projeto
*
*****************************************************************************/
void ConfiguraInterrupcao(void)
{
RCONbits.IPEN=1; // Habilita prioridade de interrup��o

INTCONbits.GIE=0; // Desabilita TODAS as interrup��es

INTCONbits.PEIE=0; // Desabilita interrup��o de perif�ricos

INTCONbits.RBIE=1; // Habilita interrup��o de mudan�a de estado


//nos pinos do PORTB de RB7 a RB4

INTCON2bits.RBPU=1; // Desabilita pull-up dos pinos de RB7 a RB4

INTCON2bits.RBIP=0; // Seleciona BAIXA prioridade para interrup��o


do PORTB

INTCONbits.RBIF=0; // T�tica de boa programa��o, garantir iniciar em zero

INTCON2bits.INTEDG2=0; //Habilita interrup��o por transi��o negativa

INTCON3bits.INT2IE=1; //Habilita interrup��o externa

INTCON3bits.INT2IP=1; // HABILITA INTERRUP��O DE ALTA PRIORIDADE

INTCON3bits.INT2IF=0; // FALA QUE INICIALMENTE N�O EXISTE INTERRUP��O

}// end ConfiguraInterrupcao

/******************************************************************************
* Funcao: void Tratamento_High_Interrupt(void)
* Entrada: Nenhuma (void)
* Sa�da: Nenhuma (void)
* Descri��o: Fun��o de tratamento das interrup��es de ALTA prioridade
* Nessa fun��o deve-se lembrar de fazer a seguinte lista:
* 1- verificar qual foi a causa da interrup��o,
comparando
* os flags de cada tipo de interrup��o.
* 2- tratar a interrup��o selecionada.
* 3- limpar o flag que causou a interrup��o!!!
Importante
* para garantir que n�o ocorrer� uma chamada indesejada ao
sair
* do tratamento da interrup��o.
*
* Ao sair dessa fun��o � usado o retorno do tipo "retfie
fast",
* pois esta fun��o � declarada como ALTA prioridade com a
diretiva
* #pragma interrupt
*
*****************************************************************************/
// ATEN��O NA SINTAXE de declara��o com #pragma interrupt = Alta prioridade
#pragma interrupt Tratamento_High_Interrupt
void Tratamento_High_Interrupt(void)
{
// Verifica se o motivo da chamada da interrup��o foi mudan�a de estado no
PORTB
if(INTCON3bits.INT2IF)
{
Toca_Buzina();
LED_AMARELO = !(LED_AMARELO);
INTCON3bits.INT2IF = 0; //Limpa flag da interrup��o do PORTB
}// end tratamento da interrup��o do PORTB (INTCONbits.RBIF)

}// end Tratamento_High_Interrupt

/******************************************************************************
* Funcao: void Tratamento_High_Interrupt(void)
* Entrada: Nenhuma (void)
* Sa�da: Nenhuma (void)
* Descri��o: Fun��o de tratamento das interrup��es de BAIXA prioridade
* Nessa fun��o deve-se lembrar de fazer a seguinte lista:
* 1- verificar qual foi a causa da interrup��o,
comparando
* os flags de cada tipo de interrup��o.
* 2- tratar a interrup��o selecionada.
* 3- limpar o flag que causou a interrup��o!!!
Importante
* para garantir que n�o ocorrer� uma chamada indesejada ao
sair
* do tratamento da interrup��o.
*
* Ao sair dessa fun��o � usado o retorno do tipo "retfie",
* pois esta fun��o � declarada como BAIXA prioridade com a
diretiva
* #pragma interruptlow
*
*****************************************************************************/
// ATEN��O NA SINTAXE de declara��o com #pragma interruptlow = Baixa prioridade
#pragma interruptlow Tratamento_Low_Interrupt
void Tratamento_Low_Interrupt(void)
{
//Escreva o codigo de tratamento da interrup��o de baixa prioridade aqui
// Verifica se o motivo da chamada da interrup��o foi mudan�a de estado no
PORTB
if(INTCONbits.RBIF)
{
LED_AMARELO=0;
Toca_Buzina();
//LED_AMARELO = !(LED_AMARELO);
INTCONbits.RBIF = 0; //Limpa flag da interrup��o do PORTB
}// end tratamento da interrup��o do PORTB (INTCONbits.RBIF)

}//end Tratamento_Low_Interrupt

/******************************************************************************
* Funcao: void Toca_Buzina(void)
* Entrada: Nenhuma (void)
* Sa�da: Nenhuma (void)
* Descri��o: Aciona o buzzer (RE1) com dois bip's curtos
*
*****************************************************************************/
void Toca_Buzina(void)
{
BUZZER=0; // desliga BUZZER
BUZZER=1; // liga BUZZER
Delay10KTCYx(100); // espera 50ms
BUZZER=0; // desliga BUZZER
Delay10KTCYx(100); // espera 30ms
BUZZER=1; // liga BUZZER
Delay10KTCYx(100); // espera 50ms
BUZZER=0; // desliga BUZZER
}

/** V E C T O R R E M A P P I N G ******************************************/
// Se��o necess�ria para informar ao compilador C18 onde s�o os novos endere�os
//da mem�ria de programa que ele deve alocar as rotinas de tratamento do "reset"
//do microcontrolador e das rotinas de tratamento de interrup��o.
//
//ATEN��O: COPIAR ESTA SE��O DO CODIGO PARA TODO ARQUIVO "main.c" DOS PROJETOS QUE
//UTILIZAM O BOOTLOADER PARA GRAVA��O IN-CIRCUIT.

// prot�tipo usado pelo compilador C18


extern void _startup (void); // See c018i.c in your C18 compiler dir

// Aloca��o da fun��o de tratamento do "reset" da aplica��o principal


// no endere�o 0x800 da mem�ria de programa
#pragma code REMAPPED_RESET_VECTOR = 0x000800
void _reset (void)
{
_asm goto _startup _endasm
}

// Aloca��o da fun��o de tratamento das interrup��es de ALTA prioridade


// no endere�o 0x808 da mem�ria de programa.
//
#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = 0x000808
void _high_ISR (void)
{
_asm goto Tratamento_High_Interrupt _endasm
}

// Aloca��o da fun��o de tratamento das interrup��es de BAIXA prioridade


// no endere�o 0x818 da mem�ria de programa
#pragma code REMAPPED_LOW_INTERRUPT_VECTOR = 0x000818
void _low_ISR (void)
{
_asm goto Tratamento_Low_Interrupt _endasm
}

#pragma code // Diretiva que retorna a aloca��o dos endere�os


// da mem�ria de programa para seus valores padr�o

/** F I M D A S E � � O D E V E C T O R R E M A P P I N G *************/

/** EOF main.c ***************************************************************/

Anda mungkin juga menyukai