Para demonstrar o funcionamento e uso do módulo timer no PIC18F4550, geramos o exemplo mostrado no diagrama ao lado.
O programa
utiliza o módulo timer 0 para gerar um atraso de 1s para fazer um led piscar em
B0 (tempo on = off = 1s).
Código do programa fonte:
/*
* File: TRM_exemplo.c
* Author: Pilger
*
* Created on 29 de Agosto de 2017, 17:03
*
* Exemplo de uso do Timer 0 como temporizador simples
*/
#define _XTAL_FREQ 48000000
#define led LATBbits.LATB0
#include <xc.h>
#include "C:\h\Config_PIC18F4550.h"
#include "c:\h\biblioteca_lcd_2x162_48M_XC.h"
void timer0_1s() {
// 83,333 ns x 256 x 46875 = 1s
// 65.535 - 46.875 = 18.660 = 0x48E4
// TMR0H = 0x48
// TMR0L = 0xE4
TMR0H = 0x48; // carrega a parte H do start do contador
TMR0L = 0xE4; // carrega a parte L do start do contador e dá início ao contador
while (INTCONbits.TMR0IF==0); // aguarda o estouro do timer 65.535
INTCONbits.TMR0IF=0; // limpa o flag
}
void config_timer0 (void){
// configuração do Timer 0
// T0CONbits.TMR0ON = 1; // Liga o Timer 0
// T0CONbits.T08BIT = 0; // 16 bits
// T0CONbits.T0CS = 0; // contagem por TCI
// T0CONbits.T0SE = 0; // não faz diferença qual valor, pois contagem é por TCI
// T0CONbits.PSA = 0; // ativa Pré-scaler
// T0CONbits.T0PS2 = 1; // 111 - Pré-scaler 1:256
// T0CONbits.T0PS1 = 1;
// T0CONbits.T0PS0 = 1;
T0CON = 0b10000111;
}
void main(void) {
TRISB = 0x00;
TRISD = 0x00;
PORTD = 0;
config_timer0();
lcd_inicia(0x28, 0x0f, 0x06);
lcd_LD_cursor(0);
lcd_posicao(1, 1);
imprime_string_lcd("Timer 0");
lcd_posicao(2, 1);
imprime_string_lcd("Tempo = 1s");
while (1) {
led = 1;
timer0_1s();
led = 0;
timer0_1s();
}
}
* File: TRM_exemplo.c
* Author: Pilger
*
* Created on 29 de Agosto de 2017, 17:03
*
* Exemplo de uso do Timer 0 como temporizador simples
*/
#define _XTAL_FREQ 48000000
#define led LATBbits.LATB0
#include <xc.h>
#include "C:\h\Config_PIC18F4550.h"
#include "c:\h\biblioteca_lcd_2x162_48M_XC.h"
void timer0_1s() {
// 83,333 ns x 256 x 46875 = 1s
// 65.535 - 46.875 = 18.660 = 0x48E4
// TMR0H = 0x48
// TMR0L = 0xE4
TMR0H = 0x48; // carrega a parte H do start do contador
TMR0L = 0xE4; // carrega a parte L do start do contador e dá início ao contador
while (INTCONbits.TMR0IF==0); // aguarda o estouro do timer 65.535
INTCONbits.TMR0IF=0; // limpa o flag
}
void config_timer0 (void){
// configuração do Timer 0
// T0CONbits.TMR0ON = 1; // Liga o Timer 0
// T0CONbits.T08BIT = 0; // 16 bits
// T0CONbits.T0CS = 0; // contagem por TCI
// T0CONbits.T0SE = 0; // não faz diferença qual valor, pois contagem é por TCI
// T0CONbits.PSA = 0; // ativa Pré-scaler
// T0CONbits.T0PS2 = 1; // 111 - Pré-scaler 1:256
// T0CONbits.T0PS1 = 1;
// T0CONbits.T0PS0 = 1;
T0CON = 0b10000111;
}
void main(void) {
TRISB = 0x00;
TRISD = 0x00;
PORTD = 0;
config_timer0();
lcd_inicia(0x28, 0x0f, 0x06);
lcd_LD_cursor(0);
lcd_posicao(1, 1);
imprime_string_lcd("Timer 0");
lcd_posicao(2, 1);
imprime_string_lcd("Tempo = 1s");
while (1) {
led = 1;
timer0_1s();
led = 0;
timer0_1s();
}
}
Pode me explicar como foi feito este cálculo?
ResponderExcluir// 83,333 ns x 256 x 46875 = 1s
Este comentário foi removido pelo autor.
ExcluirCristal 48MHz = 48 / 4 = 12Mhz
Excluir1 / 12.000.000 = 8,333333333333333e-8
256 provavelmente prescaler.
46875 provavelmente inicialização dos TMR0H = B7 e TMR0L = 1B