segunda-feira, 23 de junho de 2008

Utilizando o Timer no R8C/25

Caros,

Antes de iniciar o assunto gostaria de falar um pouco sobre os Timers do R8C/25.
O MCU possui quatro timers distintos.
  • Timer X
  • Timer Y
  • Timer Z
  • Timer C
Os timers X,Y e Z são de 8Bits com um Pre-Scaler de 8Bits e o timer C é de 16 Bits.

Utilizando o IOWizard para configurar um timer, primeiro configuramos o chip e a velocidade do clock do mesmo. Isso é necessário para o IOWizard poder calcular corretamente o valor do Counter e do Pre-Scaler. Na tela do timer.

Nas telas de configuração vemos os Timers RA(TimerX), RB(TimerY), RC(TimerZ) e RD(TimerC).


Vemos as chaves geradas com os valores de 249 para o Pre-Scaler e 79 para o Counter.
Estes valores geram uma interrupção de Timer a cada 1ms. Se contarmos mil destas temos aproximadamente 1 segundo.

Feito isso temos as seguintes configurações:

tck0_tramr=0;tck1_tramr=0;tck2_tramr=0;
//count source:f1(tramr bit 4 to 6)
f1 é o clock sem divisões

trapre=249;
//Timer value for timer mode or half period timing for pulse output mode
trapre é o valor do Pre-Scaler

tra=79;
//Timer value for timer mode or half period timing for pulse output mode
tra é o valor do Counter

tmod0_tramr=0;tmod1_tramr=0;tmod2_tramr=0;
//Timer mode(tramr bit 0-2)
tmod é o registro que seleciona a origem dos pulsos do contador, no caso 0,0,0 é o clock que está sendo utilizado pelo MCU. No caso do Cristal.

traic=0x07;
//Set interrupt piority level 7(traic)
Seleciona o nível de prioridade das interrupções geradas.

O próximo passo é configurar tudo isso dentro de um projeto no HEW.
Após criar um projeto, vamos começar a alterar os arquivos necessários para configurar o timer.

O primeiro arquivo a ser alterado é o hwsetup.c. Vamos declarar a função ConfigureInterrupts() e implementá-la. Também vamos descomentar sua chamada dentro da função HardwareSetup().
Veja:

#include "sfr_r825.h"
#include "rskR8C25def.h"
#include "hwsetup.h"

void ConfigureOperatingFrequency(void);
void EnablePeripheralModules(void);
void ConfigurePortPins(void);
void ConfigureInterrupts(void);

void HardwareSetup(void) {
ConfigureOperatingFrequency();
ConfigurePortPins();
EnablePeripheralModules();
ConfigureInterrupts();
}

...

void ConfigureInterrupts(void) {
// Timer RA Setting (TIMERX)
tck0_tramr=0;tck1_tramr=0;tck2_tramr=0;
trapre=249;
tra=79;
tmod0_tramr=0;tmod1_tramr=0;tmod2_tramr=0;
traic=0x07;
}

Vamos declarar o ponto de entrada para a interrupção em main.h:

void main(void);
#pragma INTERRUPT TimerRAHandler
void TimerRAHandler(void);

E escrevemos a função em main.c:


#include "sfr_r825.h"
#include "lcd.h"
#include "main.h"
#include

int xVal;
unsigned long counter;

void main(void) {
int t;

// Inicializa o LCD
InitialiseDisplay();

// Mostra o Banner da aplicação
DisplayString(LCD_LINE1,"Youlink!");
DisplayString(LCD_LINE2,"LedBlink");

for(t=0; t<10000; t++) asm("NOP");

// Prepara a tela para rodar...
DisplayString(LCD_LINE1,"LedBlink");
DisplayString(LCD_LINE2," ");

pd2=0xF0;
xVal=0b00001000;
counter=0;
// Inicia o timer
tstart_tracr = 1;
while(1) {
asm("NOP");
}
}

void TimerRAHandler(void) {
char cBuffer[10];

// Para o timer
tstart_tracr = 0;

if(counter>249) {
xVal=xVal<<1;
p2=~xVal;
if(xVal==0b10000000) xVal=0b00001000;
counter=0;
sprintf(cBuffer,"Val:%d \0",xVal);
DisplayCharBuffer(LCD_LINE2,cBuffer);
} else {
counter++;
}

// Inicia o timer
tstart_tracr = 1;
}

Antes de entrar no loop do programa é necessário inicar a contagem do timer usando o tstart_tracr.
Quando entramos na interrupção, nós a paramos, processamos e depois reiniciamos a mesma.

Até aí tudo bem, agora vem o grande segredo. Somente faltou declarar na configuração do MCU o ponto de entrada da interrupção na tabela de vetores. Editaremos o arquivo sect30.inc:

Após a linha 659 colocamos:
.glb _TimerRAHandler
e depois no vetor 22 colocamos o link
.lword _TimerRAHandler ; vector 22

Pronto... está configurado o projeto para funcionar com TimerX.

Existem inúmeros modos de configuração para os Timers do R8C/25. Como gerar PWM, Seguidor de pulso, Medidor de Largura de pulso, entre outros.

Para quem quiser puxar o projeto e rodar localmente, segue o link para Download:

http://rapidshare.com/files/124593122/LedBlinkTimer.rar.html

E pra quem quiser acompanhar um vídeo deste programa funcionando... tá aí o link para o YouTube...



Mais uma vez matando a cobra e mostrando o PAU!

Nenhum comentário:

Postar um comentário