LusoRobótica - Robótica em Português

Sistemas específicos => PIC => Tópico iniciado por: msaleiro em 06 de Outubro de 2012, 15:03

Título: Dúvida Timers
Enviado por: msaleiro em 06 de Outubro de 2012, 15:03
Boas! Estou aqui com uma dúvida nos timers que me anda a fazer a cabeça em água :P

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 :\

Código: [Seleccione]
/* ----------------------------------------------------------------------- */
/* 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;
}

}

}
Título: Re: Dúvida Timers
Enviado por: Dave em 06 de Outubro de 2012, 18:39

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).


Antes de continuar, acho que devemos olhar primeiro para os servos.
Que servos são? São de boa qualidade? Qual é o fabricante?

Eu já tive alguns problemas com servos parecidos a este, mas a conclusão a que cheguei é que por muito certinho que fosse tudo feito, o resultado do movimento dos servos era diferente.

A própria electrónica de alguns servos não é a melhor (para ser mais barato) e por isso não consegues ter 2 servos exactamente iguais.

Se os servos forem de muito boa qualidade, como um futaba ou melhor ainda o problema já é diferente...


Cumps ;)

Título: Re: Dúvida Timers
Enviado por: senso em 06 de Outubro de 2012, 18:41
As variaveis countDelay deviam ser declaradas volatile porque estás a aceder ás mesmas numa interrupção e noutra função, pode causar problemas.