Você está na página 1de 3

#include <16F877A.

h> #use delay(clock=4000000) #use rs232(baud=9600, xmit=PIN_c6,rcv=Pin_c7) #fuses XT,NOWDT,PUT

/* Exemplo de utilizao do timer0 como temporizador.

-> O timer0 possui um registrador TMR0 que conta de 0 at 255. Quando esse registrador chega em 255 e incrementa mais uma unidade, a interrupo do timer0 ativada. -> O prescaler determina quantas bordas vo incrementar o registrador TMR0 em 1 unidade -> Quando se escolhe a frequncia do oscilador de clock do microcontrolador como a frequncia de operao do timer0, importante ressaltar que o timer0 divide essa frequncia por 4. Ex.: se a frequncia do clock do microcontrolador de 4MHz e se escolhe a frequncia do timer0 como sendo essa, ele divide essa frequncia por 4, que resulta em 1MHz, e utiliza esse 1MHz de frequncia como frequncia de operao. -> Assim, o tempo necessrio para que a interrupo seja chamada : T = (4*prescaler*(256-TMR0))/frequencia_microcontrolador

*/

int conta = 0; int estado = 1; //varivel que vai me indicar se o

//led est aceso ou apagado

#int_TIMER0 // Tratamento de interrupo void trata_timer0(void){

// reinicia o timer0 em 0 set_timer0(0); conta++; printf("\n\r Interrupo # %d", conta); if (conta == 61) // se j ocorreram 61 interrupes { conta = 0; //reseta a varivel contadora

printf("\n\r Contou 4 segundos!"); if(estado==1){ output_low(pin_d7); estado=0; }else if(estado==0){ output_high(pin_d7); estado=1; }

/* finterna=fexterna/4 T=1/f Prescaler = a cada valor de prescaler de pulsos de clock incrementa 1 na varivel at 256 quando chama a interrupo 256*prescaler*T=tempo para interrupo */

void main(){

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); // configura o prescaler do timer 0 em 256

enable_interrupts(INT_TIMER0); // Habilita interrupcao do timer 0 enable_interrupts(INT_RTCC); enable_interrupts(GLOBAL); // Possibilita todas interrupcoes

set_timer0(0); // inicia o timer0 em 0

output_high(pin_d7);

while(true); }

Você também pode gostar