Guia CNC Brasil - Tudo sobre CNC, Router, Laser, Torno e 3D Print
ELETRÔNICA / ELÉTRICA => Eletrônica Básica => Microcontroladores => Tópico iniciado por: Blackmore em 29 de Outubro de 2009, 11:33
-
Pessoal, bom dia.
Tenho a necessidade de usar a interrupção de timer0 do PIC18Fxx2 ( http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en010276 ) e estou apanhando mais que cachorro vagabundo!
Pelo que tenho apurado, o TMR0 dele é configurável para contar em 8 ou 16 bits, já consegui configurar isso, mas o meu problema está agora em conseguir fazer com que esse TMR entre em interrupção a cada 0,25s ou mesmo 0,5s ou ainda 1s ... a forma de calcular a frequência dele é diferente dos pic16 ...
Fqi = (clock/(4*PS)/(256-reload)
onde:
Fqi = frequência de interrupção
clock = valor do cristal utilizado
PS = Prescale
reload = repetições
como não tenho tantos recursos tecnológicos em casa, eu monto o esquema no proteus e meço o período com o osciloscópio virtual dentro do proteus ... mas os valores não batem com o calculado.
-Será que a forma de calcular a frequência de interrupção está certa para este uC?
-Existe algum "macete" para fazer estes cálculos?
-Será que a simulação do proteus não é tão boa assim e eu preciso de uma bacada com instrumentos?
Agradeço aos amigos qualquer ajuda relaciona as questões acima.
-
Amigos, boa tarde.
Um amigo de outro fórum me ajudou na solução da base de tempo, vou postar abaixo o código enviado por ele para que as interrupções ficassem em 1 segundo.
É importante dizer que o oscilador utilizado foi de 20MHz.
unsigned int *tmr0_reg = 0; //cria um ponteiro para T0CON
unsigned int *tmr0_h = 0; //TMR0H
unsigned int *tmr0_l = 0; //TMR0L
// Interrupcao TIMER 0
#int_timer0
void trata_t0()
{
static boolean led;
static int conta;
*tmr0_h = 0x67;
*tmr0_l = 0x68;
led = !led;
output_bit (PIN_A0,led);
}
void main ()
{
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
tmr0_reg = 0x0FD5; //aponta para T0CON
tmr0_h = 0x0FD7; //aponta para TMR0 HIGH
tmr0_l = 0x0FD6; //aponta para TMR0 LOW
*tmr0_reg = 0b10000110;
// timer 0 ligado, configurado como 16bits,
// clock interno, prescale habilitado,
// usando prescale de 128
*tmr0_h = 0x67; //seta valor inicial
*tmr0_l = 0x68; //seta valor inicial
while (true)
{
}
}