quarta-feira, 17 de agosto de 2016

Exemplo com Timer0


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();
    }
}


  




   

3 comentários:

  1. Pode me explicar como foi feito este cálculo?


    // 83,333 ns x 256 x 46875 = 1s

    ResponderExcluir
    Respostas
    1. Este comentário foi removido pelo autor.

      Excluir
    2. Cristal 48MHz = 48 / 4 = 12Mhz
      1 / 12.000.000 = 8,333333333333333e-8
      256 provavelmente prescaler.
      46875 provavelmente inicialização dos TMR0H = B7 e TMR0L = 1B

      Excluir