Autor Tópico: PIC18F252 - interrupção de TMR0  (Lida 3062 vezes)

Description:

0 Membros e 1 Visitante estão vendo este tópico.

Offline Blackmore

  • CNCMASTER
  • ******
  • Posts: 1568
  • Sexo: Masculino
  • Profissão: Projetista Mecânico/Automação
PIC18F252 - interrupção de TMR0
« Online: 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.

Offline Blackmore

  • CNCMASTER
  • ******
  • Posts: 1568
  • Sexo: Masculino
  • Profissão: Projetista Mecânico/Automação
Re: PIC18F252 - interrupção de TMR0 (Resolvido)
« Resposta #1 Online: 07 de Novembro de 2009, 12:35 »
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)
   {
   
   }
}

 

/** * */