collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[27 de Março de 2024, 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Dúvida Timers  (Lida 2633 vezes)

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

Offline msaleiro

  • Mini Robot
  • *
  • Mensagens: 691
    • Blog
Dúvida Timers
« 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;
}

}

}
« Última modificação: 06 de Outubro de 2012, 15:11 por msaleiro »
msaleiro - Mário Saleiro
UAlg FCT-DEI / VisLab - Instituto de Sistemas e Robótica / eLab Hackerspace
http://thebitbangtheory.com

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: Dúvida Timers
« Responder #1 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 ;)

David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Dúvida Timers
« Responder #2 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.
Avr fanboy