Calculo Frequencia timer0 não bate

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Calculo Frequencia timer0 não bate

Mensagempor geraldomelo » 01 Set 2008 04:41

Pessoal , deem uma olhada nesse simples programinha :

#include <12F675.h>
#fuses INTRC,NOWDT,NOPROTECT,NOMCLR
#use delay(clock=4000000)
#include <regs_12F6xx.h>
#bit pino0 = gpio.0

#int_timer0
void trata_int()

{ set_timer0(176);
pino0=~pino0; }

void main (void)
{
ansel=0;
trisio=0;
cmcon=7;
gpio=0;
setup_timer_0 (rtcc_internal | rtcc_div_2);
enable_interrupts (global | int_timer0);

while(true);

}

então vamos lá : fosc /4 = 1mhz
.
.
RTCC_DIV_2 = 500Khz
.
.
set_timer(176) ... (256-176)=80 , então 500K/80=6250Hz
.
.
pino0=~pino0; inverte pino ,ai 1 interrupção em 1 e outra em 0 , então fica 6250 hz / 2 , que dá 3125Hz ...

Beleza pessoal , mas quando rodo isso no pic , e meço a frequencia , ela está em 2540Hz ... muito fora .. o oscilador interno esta calibrado .... ai simulo no Proteus , e o resultado eh o mesmo , ~ 2540 Hz ....

agora pergunto , oque esta errado com esses calculos acima ??

abs

Geraldo
geraldomelo
Byte
 
Mensagens: 267
Registrado em: 14 Out 2006 16:53
Localização: Ribeirão preto - SP

Mensagempor geraldomelo » 02 Set 2008 04:27

pessoal , esqueci de mencionar , que para frequencias baixas ,em torno de 100 .. 200 Hz , funciona certinho ...

algum help ai ??

abs

Geraldo
geraldomelo
Byte
 
Mensagens: 267
Registrado em: 14 Out 2006 16:53
Localização: Ribeirão preto - SP

Mensagempor leoabubauru » 02 Set 2008 13:53

olá, geraldo!

dê uma olhada no datasheet do micro na seção 4.4 (PRESCALER). Você não pode setar o valor do registrador do TIMER0, pois ele reseta o Timer (e contará só até 176! 500k/176 = 2840). Setar o timer é possível no TIMER2 para outros PICs, se não estou enganado.

Creio que terá que fazer de outra forma, contando os "Tics" da INT...

Abraço


Laercio
Tento, tento e tento...
Me arrebento!
Também bato!
Ô negocim bunitim essa tal eletrônica de barco!
leoabubauru
Byte
 
Mensagens: 227
Registrado em: 21 Nov 2006 19:08
Localização: São Paulo

Mensagempor Djalma Toledo Rodrigues » 02 Set 2008 14:22

Creio que seja o seguinte:

O uC esta em um Loop while(true);
ao ocorrer a interrupção, ele tem que terminar a instrução atual , então + 1 us

Dentro da interrupção:
{ set_timer0(176);
Em ling. ASM
Movlw 60H (= 176 D) ; + 1 us
Movwf Timer0; +1 us
Sub total ¹ 3 us

pino0=~pino0; }
Em ASM
Diversas alternativas uma delas:
Btfsc f,d ; + 1 us
goto xx ; + 1 us ( é interpretado como NOP se houver salto)
Bsf GPIO,0; + 1 us
goto yy ; +1us
xx:
Bcf GPIO,0 ; (+ 1 us)
yy:

Sub total²: 1 + 1 + 1 = 3 us ou 1 + 1 + (1) = 3 us
Outra forma mais eficiente, mas, é bem provável que o Compilador C não faça:

Movlw B'00000001' ; +1 us
Xorwf GPIO,0 ; +1 us (inverte o bit 0 sem necessidade de testa-lo)

Então Total 3 + 3 = 6 us
mais 6 us por ciclo o que baixaria a freq. de 3 125 Hz para ~3 067 Hz

Como sua medição é 2 540 Hz ou meus cálculos estão errados ou seu compilador é enrolado "pakas" rsrsrsrs

Solução: Some o erro a 176
Editado pela última vez por Djalma Toledo Rodrigues em 02 Set 2008 23:18, em um total de 1 vez.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor geraldomelo » 02 Set 2008 21:24

Então pessoal , realmente eu tbm não estou entendendo ... O meu compilador eh o CCS ...

pessoal , alguém ai tem mais alguma luz , pq aqui acabou ..

abs

Geraldo
geraldomelo
Byte
 
Mensagens: 267
Registrado em: 14 Out 2006 16:53
Localização: Ribeirão preto - SP

Mensagempor Djalma Toledo Rodrigues » 02 Set 2008 23:26

Minha msg acima foi editada a última linha.

Vc entendeu ?
A Liguagem Assembler é a mais eficiente - Gera um código menor e executa em maior velocidade que qualquer outra liguagem compilada.

Aumente o valor de recarga do timer zero ( a freq vai aumentar) de modo a compensar o tempo que o uC adcionou a cada ciclo ao executar as instruções.
Na dificuldade de calcular o novo valor, faça por tentativa. Depois que chegar a freq. certa guarde esse valor de incremento para usar em outras frequências. Como um Off Set
Assim: Valor de recarga do timer0 = valor calculado + OFF SET .
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor geraldomelo » 03 Set 2008 23:27

Eh Djalma , acho que vou seguir suas dicas mesmo , eu já tinha pensado nisso , em ir por tentativas , mas estava insistindo nas formulas ..

abs

Geraldo
geraldomelo
Byte
 
Mensagens: 267
Registrado em: 14 Out 2006 16:53
Localização: Ribeirão preto - SP


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x