Sie sind auf Seite 1von 5

Centro de Tecnologia Microgenios - Todos os direitos reservados

Clique aqui para Imprimir o doc umento

As Interrupções do PIC18Fxx2

 1.0 Interrupção TIMER1

Interrupção TIMER1:

Os registradores de interrupção do TIMER1 são:

T1CON : registrador de configuração do TIMER1


INTCON.TMR1IF: bit sinalizador de estouro do TIMER1
INTCON.TMR1IE: bit que habilita ou desabilita a interrupção do TIMER1
INTCON3.INT1IP: bit de seleção de prioridade de interrupção do TIMER1
TMR1L: registrador de contagem do byte LSB do TIMER1
TMR1H: registrador de contagem do byte MSB do TIMER1

***************** registradores de configuração geral das interrupções (válido para


todas as interrupções do PIC) *************************

INTCON.GIEH: habilita a chave geral das interrupções e habilita as interrupções de


alta prioridade
INTCON.GIEL: habilita as interrupções de baixa prioridade
RCON.IPEN: herança da família PIC18F ou PIC16F (dois níveis de prioridade de
interrupção ou somente um nível)

Para aprendermos a programar a interrupção do TIMER1, vamos desenvolver passo a


passo um programa:
Nosso programa terá a função de ler o canal analógico AN0 (trimpot R2 conectado ao
pino RA0) e mostrar seu valor no LCD, e a cada 2 segundos o estado do relé Q2 deverá
ser alterado (ligado e desligado). Para realizarmos a temporização de 2 segundos
utilizaremos o TIMER1 e sua interrupção. A cada interrupção será incrementada uma
variável, e seu valor poderá ser visualizado no LCD.

Esquema elétrico:

Hardware:
Cristal: 8Mhz
Microcontrolador: PIC18F452

Cálculo da temporização do TIMER1:

Cálculo do tempo de estouro e interrupção do TIMER0 do programa abaixo:

Tempo de estouro do TIMER0 = ciclo de máquina * prescaler * (Modo 16 bits -


valor do registrador TMR0L e TMR0H)
200.000 us = 0,5 * 8 * (65536 - x ) logo
x = 15536

convertendo o valor 15536 para hexadecimal teremos: 0x3CB0

agora basta alocar nos registradores de contagem do TIMER0:


Programando a interrupção do TIMER1:

Primeiro devemos configurar o modo de operação do TIMER1. Para exemplificarmos,


vamos configurar o TIMER1 em 16 bits com prescaler 1:8, clock interno e timer1
ligado.

T1CON = 0b10110001;

Segundo: devemos carregar os registradores de contagem do TIMER1: (vamos supor


que desejamos carregar o valor 0 nesses registradores)

TMR1L = 0xB0;
TMR1H = 0x3C;

terceiro: devemos apagar o bit sinalizador de estouro do TIMER1

PIR1.TMR1IF = 0; //bit sinalizador de estouro do TIMER1

Quarta: devemos habilitar a chave geral das interrupções

INTCON.GIEH = 1;

Quinto: devemos habilitar a interrupção do TIMER1:

PIE1.TMR1IE = 1; //bit que habilita ou desabilita a interrupção do TIMER1

Sexto: devemos definir a prioridade de interrupção

IPR1.TMR1IP = 1; //define TIMER1 como alta prioridade de interrupção

sétimo: configurar o registrador RCON.IPEN

RCON.IPEN = 1; //define dois níveis de prioridade de interrupção presente na


família PIC18F
Pronto agora é só criarmos nosso programa:

/*********************************************************************
*****
centro de tecnologia microgenios
kit picgenios pic18f

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

char contador = 0;

void interrupt(){ //rotina de interrupção de alta prioridade


contador++; //incrementa variável contador
if (contador > 10){
portb.f0 = ~portb.f0;
contador = 0;
}
tmr1l = 0xb0; //carrega valor de contagem baixa do timer1
tmr1h = 0x3c; //carrega valor de contagem alta do timer1
pir1.tmr1if = 0; //apaga flag de interrupção timer1
}

void main() {

char texto[10];
int leitura_ad0 = 0;

adcon1 = 0b00001110; // programa pinos de ra0 como a/d e os demais


como i/o de uso geral
trise = 0; // programa porte como saida
trisd = 0; // programa portd como saida
trisb.f0 = 0; //define pino como saida
trisa.f0 = 1; //pino como entrada (ad)

lcd_custom_config(&portd,7,6,5,4,&porte,2,4,1); //configura e
inicializa lcd no modo 4 bits
lcd_custom_cmd(lcd_clear); // apaga display
lcd_custom_cmd(lcd_cursor_off); // desliga cursor
lcd_custom_out(1, 1, "inter. timer1"); // escreve texto "programa
lcd" na primeira linha, quarta coluna do lcd
lcd_custom_out(2, 1, "numeros ="); // escreve texto "programa lcd"
na primeira linha, quarta coluna do lcd

t1con = 0b10110001; //liga timer1, prescaler 1:8, modo 8bits,


temporizador
tmr1l = 0xb0; //carrega valor de contagem baixa do timer1
tmr1h = 0x3c; //carrega valor de contagem alta do timer1

intcon.gieh = 1; //habilita chave geral das interrupções


rcon.ipen = 1; //define niveis de prioridade de interrupção -
pic18f
pie1.tmr1ie = 1; //habilita interrupção do timer1
pir1.tmr1if = 0; //apaga flag de interrupção timer1
ipr1.tmr1ip = 1; //define como alta prioridade timer1

while(1){

bytetostr(contador, texto); //converte valor da variável contador


no lcd
lcd_custom_out(2, 10,texto); // escreve variável texto na 2º
linha, 10º coluna do lcd
lcd_custom_out_cp("qt"); //escreve a string "qt" na corrente
posição do cursor

leitura_ad0 = adc_read(0);
wordtostr(leitura_ad0, texto); //converte valor da variável
contador no lcd
lcd_custom_out(1, 10,texto); // escreve variável texto na 2º
linha, 10º coluna do lcd
lcd_custom_chr_cp('%'); //escreve a string "qt" na corrente
posição do cursor

}
}

clique aqui para baixar o programa acima:

voltar para o topo da pagina

Centro de Tecnologia Microgenios - Curso de Microcontroladores PIC - Programação


em C
Microgenios © 1998 - 2008. Todos os direitos reservados. É proibido cópia parcial ou
integral desse material sem prévio aviso. Maiores informações:
suporte@microgenios.com.br

Das könnte Ihnen auch gefallen