Sei sulla pagina 1di 2

1 /*******************************************************************************

2 Nome do arquivo: main_34-4_md.c


3 Data: 27 abril de 2018
4 Versao: 1.4
5 MPLAB IDE: MPLAB-X v.4.15
6 Autor: Wagner Zanco
7 Modificado por: Carlúcio Silva
8 Descrição: Configuração do TIMER0 para operar como temporizador no modo 16 bits,
9 com interrupção com a codificação desenvolvida dentro de configTMR0() com passagem
10 de parâmetro e com a inicialização do TIMER desmembrada da configuração. Com
11 uma função para tratar a interrupção em separado.
12 *******************************************************************************/
13 #include <p18f4550.h> //diretiva de compilação
14 #include "MCC18_18F4550.h" //diretiva de compilação
15
16 //******************************************************************************
17 //Protótipos de funções
18 void configSFR( void );
19 void configTMR0 ( unsigned char ); //configura o TIMER0 - modo 8 bits
20 void initTMR0_08BIT ( unsigned char ); //inicializa o contador de 8 bits do TIMER0
21 void initTMR0_16BIT ( unsigned int ); //inicializa o contador de 16 bits do TIMER0
22 void configInterruptTMR0 ( unsigned char ); //inicializa ineterrupção
23 void high_isr ( void ); //trata a interrupção
24
25
26 //******************************************************************************
27 // Declaração de variáveis globais
28 unsigned char flagPORTD = 0;
29
30 //******************************************************************************
31 /* Vetor de interrupção de alta prioridade.
32 * Toda vez que ocorre uma interrupção o fluxo do program é desviado para a
33 * região de memória definida por essa instrução, mais especificamente, para o
34 * endereço 0x08 da Memória de Programa. */
35 #pragma code high_vector=0x08
36 void interrupt_at_high_vector ( void )
37 {
38 /*Desvia programa para rotina de tratamento da interrupção*/
39 _asm GOTO high_isr _endasm
40 }
41 #pragma code
42
43 //******************************************************************************
44 void main( void ){
45 configSFR();
46 // Configuração do TIMER0
47 configTMR0 ( 0b10000111); //Passo 1
48 initTMR0_16BIT ( 65450); //Passo 2
49 configInterruptTMR0 ( 1); //Passo 3
50
51 while( 1);
52 }
53
54 /*******************************************************************************
55 Esta função inicializa os registradores SFRs.*/
56 void configSFR( void )
57 {
58 TRISA = 0x00; //PORTA saída
59 TRISB = 0x00; //PORTB saída
60 TRISC = 0xFF; //PORTC entrada
61 TRISD = 0x00; //PORTD saída
62 TRISE = 0x00; //PORTE saída
63 ADCON1 = 0x0F; //configura pinos dos PORTA e PORTE como digitais
64 PORTA = 0 ; //limpa PORTA
65 PORTB = 0 ; //limpa PORTB
66 PORTC = 0 ; //limpa PORTC
67 PORTD = 0 ; //limpa PORTC
68 PORTE = 0 ; //limpa PORTE
69 }
70
71 /******************************************************************************
72 * Rotina de tratamento de interrupção (ISR)
73 * Depois que ocorre a interrupção, o vetor de interrupção direciona o fluxo do
74 * programa para a localização da Memória de Programa onde encontra-se essa
75 * instrução, "high_isr".*/
76 #pragma interrupt high_isr
77 void high_isr ( void )
78 {
79 if(INTCONbits.TMR0IF){
80 if(flagPORTD){
81 PORTD = 0xFF;
82 flagPORTD = 0x00;
83 }
84 else{
85 PORTD = 0x00;
86 flagPORTD = 0xFF;
87 }
88 INTCONbits.TMR0IF = 0; //limpa a flag de estouro
89 initTMR0_16BIT(65450);
90 }
91 }
92
93 /******************************************************************************
94 Esta funcao inicializa os registradores SFRs do TIMER 0*/
95 void configTMR0(unsigned char configTMR0)
96 {
97 //******************************************************************************
98 /* Passo 1: Configurar o TMR0 para operar como temporizador e estourar a cada 1s
99 * T0CON<7> (TMR0ON = 1): Liga o TIMER 0
100 * T0CON<6> (T08BIT = 0): Operar no modo 8 bits
101 * T0CON<5> (T0CS = 0) : Operar com o clock do Fosc/4
102 * T0CON<4> (T0SE = 0) : Operar na borda de subida **
103 * T0CON<3> (PSA = 0) : Operar a partir do prescaler
104 * T0CON<2:0> (T0PS2 = 1; T0PS1 = 1; T0PS0 = 1): Configura o prescaler para 1:256,
105 * com essa configuração o prescaler proporciona um atrso de 128us. */
106 T0CON = configTMR0; //0b10000111
107 }
108
109 /******************************************************************************
110 Esta funcao habilita/desabilita a interrupção por estouro do TIMER0*/
111 void configInterruptTMR0(unsigned char interruptTMR0){
112 if(interruptTMR0){
113 INTCONbits.TMR0IE = 1; //liga chave individual de interrupção do TIMER 0
114 INTCONbits.GIE = 1; //liga chave geral de interrupção
115 }
116 else{
117 INTCONbits.TMR0IE = 0; //desliga chave individual de interrupção do TIMER 0
118 INTCONbits.GIE = 0; //desliga chave geral de interrupção
119 }
120 }
121
122 /******************************************************************************
123 Esta funcao inicializa o registrador TIMER0 para o modo 8 bits*/
124 void initTMR0_08BIT(unsigned char initTMR0){
125 TMR0L = initTMR0;
126 }
127
128 /******************************************************************************
129 Esta funcao inicializa o registrador TIMER0 para o modo 16 bits*/
130 void initTMR0_16BIT(unsigned int initTMR0){
131 TMR0H = initTMR0 >> 8;
132 TMR0L = initTMR0;
133 }

Potrebbero piacerti anche