Boas! Estou aqui com uma dúvida nos timers que me anda a fazer a cabeça em água
PIC: 16F88
Clock: 8 MHz interno
Compilador: SDCC
IDE: Piklab em Ubuntu
O problema é o seguinte: estou a tentar ligar 2 servos ao PIC, o que já consegui e não foi difícil. O problema é que preciso de ter uma maior resolução nos pulsos enviados aos servos para conseguir metê-los mais ou menos com a mesma velocidade e para isso preciso de conseguir configurar o(s) timer(s).
Por exemplo com o Timer0 associei o prescaler ao WDT de modo a que fique com o prescaler 1:1, o que depois de algumas contas me diz que com cerca de 7812 overflows do timer0 tenho uma frequência de 1Hz. Contudo, se colocasse o valor 128 no registo TMR0 seria de esperar que a frequência duplicasse, uma vez que cada overflow só levaria metade do tempo. O problema é que ao colocar esse valor no TMR0, nada muda :\
Já tentei também configurar o timer2 para fazer o mesmo. Consegui facilmente metê-lo a piscar um LED com uma frequência de 1Hz mas, mais uma vez, se meter o valor 128 no PR2, que também deveria duplicar a frequência, nada muda.
Penso que estou a fazer as coisas da maneira correcta.. alguém tem alguma ideia do que possa ser? Será algum bug do SDCC?
Segue abaixo o código que estou a usar para testar. O countDelay é usado para o timer0 que neste momento não estou a usar. O countDelay é usado para o Timer2. Mudando o valor de PR2 do timer 2 não me provoca nenhuma diferença no piscar do LED e continuo sempre com uma frequência de 1Hz :\
/* ----------------------------------------------------------------------- */
/* Template source file generated by piklab */
#include <pic16f88.h>
#include <stdio.h>
int countDelay = 0;
int countDelay2 = 0;
void isr() interrupt 0 { /* interrupt service routine */
if(TMR0IF == 1){
TMR0IF = 0;
countDelay++;
}
if(TMR2IF == 1){
TMR2IF = 0;
countDelay2++;
}
/* << insert interrupt code >> */
}
void main()
{
//*****************************************CONFIG TIMER 0****************************************
T0CS = 0;
T0SE = 0;
PSA = 1;
PS0 = 0;
PS1 = 0;
PS2 = 0;
TMR0 = 0x80;
//*****************************************CONFIG TIMER 2****************************************
PR2 = 250;
T2CON = 0b00000100;
TMR2IE = 1;
//*****************************************CONFIGURAÇÃO DAS INTERRUPÇÕES*************************
TMR0IF = 0;
INTCON = 0;
GIE = 1; //Global interrupt enable
TMR0IE = 1; //Timer 0 overflow interrupt enable
//*****************************************CONFIGURAÇÃO DOS PORTOS DE IO*************************
TRISB = 0b00000000;
ANSEL = 0x00;
TRISA = 0b00000000;
while(1){
if(countDelay == 7812){ //7812 for 1s, TMR0 = 0;
//countDelay = 0;
//RA1 = RA1^1;
}
if(countDelay2 == 7843){ //7843 for 1s, PR2=255;
countDelay2 = 0;
RA1 = RA1^1;
}
}
}