Interrupção no ATmega8

Software e Hardware para ATMEL

Moderadores: 51, guest2003, brasilma

Interrupção no ATmega8

Mensagempor starker » 09 Fev 2009 08:37

Bom dia, pessoal....

Alguém poderia me explicar como fazer o cálculo da interrupção???

É que eu fiz sem cálculo, incrementar uma unidade de segundo a cada contagem de uma variável chamada tempo.

estou usando o atmega8 com o bascom

fazendo testes, cheguei ao valor de 4208 agora....

o que me deixa encucado é o seguinte:

se eu programo para incrementar a variável segundo toda vez que a variável tempo chegar a 4208, o relógio atrasa alguns minutos por hora, se eu colocar 4207, o relógio adianta alguns minutos por hora....

não entendi porque tanta diferença nessa mínima diferença de incremento...

o que se deve levar em conta na hora da programação???

me disseram que não se pode usar o wait, mas não estou usando esse comando...

o cristal é interno (o projeto está pronto e não foi feito para usar cristal externo), mas a precisão é tão ruim assim???

Não preciso que o relógio seja preciso, mas essa variação que está tendo é demais...

Obrigado desde já !!

Edson
starker
Bit
 
Mensagens: 40
Registrado em: 02 Dez 2006 12:14

Mensagempor msamsoniuk » 09 Fev 2009 12:37

por pior que esteja, sempre eh questao de ajuste! :)

por exemplo, eu tenho um mcu que possui um modulo simples referencia de tempo que soh trabalha com clocks multiplos de 2^n, porem eu tenho um clock de 10MHz como referencia! o ultimo divisor inteiro de 10MHz por 2^n seria com n=7, o que resultaria em 10MHz/128 e portanto 78125 interrupcoes por segundo, mas eh demais. eu simplesmente assumo o caso com menor numero de interrupcoes, que eh n=15, de modo que 10MHz/32768 eh 305.176. assim minha interrupcao conta ateh 305 e marca um segundo. obviamente aquela fracao 0.176 causa um lento desvio e precisa compensar isso!

como 305 eh menor que 305.176, o relogio deve atrasar! a cada hora, esses 0.176 que eu nao considero acumulam 633 interrupcoes nao computadas, o que significa um atraso de 2 segundos! uma solucao seria simplesmente somar 2 segundos a cada hora, mas nao eh uma solucao muito legal... melhor eh espalhar esse incremento no decorrer do tempo!

no caso, o inverso de 0.176 eh 5.6. portanto a cada 6 segundos eu posso somar 1 interrupcao, de modo que computo 1831 interrupcoes a cada 6 segundos, quando o correto seria 1831.056. esses 0.056 a cada 6 segundos acumulados por uma hora seriam um atraso de apenas 67.2 interrupcoes por hora, ou seja um atraso de 1 segundo a cada 4 horas.

eu poderia usar um raciocinio similar e calcular um novo ponto de compensacao, melhorando mais ainda a precisao. no seu caso eu diria entao para deixar o relogio atrasar, calcular exatamente o atraso e tentar calcular pontos de compensacao para seu contador de tempo ir se aproximando do que vc quer... como no seu caso vc nao tem as frequencias exatas, vai depender de muitos testes empiricos e ajustes! :)
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor starker » 09 Fev 2009 13:17

Obrigado Marcelo pela resposta...

eu estou usando cristal de 1Mhz interno e prescaler = 8

o que pelos cálculos que me foram passados fiz assim:

cristal = 1000000
prescaler = 8
pre-counter = 6

então resultou em 500 interrupções por segundo = 2ms

if tempo = 500 then
incr segundos
tempo = 0
end if


mas o relógio atrasa e muito... no primeiro minuto quase não se nota, mas vc espera uns 5 minutos e ele já está bem atrasado...

não deveria ter diferença, não é mesmo??? Já que o número é aredondado!!


Edson
starker
Bit
 
Mensagens: 40
Registrado em: 02 Dez 2006 12:14

Mensagempor enigmabox » 09 Fev 2009 14:22

Se não me engano a freq. interna pode ser ajustada. Na interface do meu gravador AVRDragon, tem uma tela para ajuste do clk interno.
Já tive problemas com o oscilador interno em varios MCUs, por ex. tenho duas placas de MSP430F149, em que ambas usava o clk interno para interface serial. Em cada modulo eu tinha que ajustar um prescaler para a geração do baudrate, senão não comunicava com o PC.
Dá uma olhada no seu software do gravador do AVR.
enigmabox
 

Mensagempor msamsoniuk » 09 Fev 2009 14:34

pois eh, com essa configuracao deveria dar numeros exatos! soh uma coisa: durante a interrupcao vc reconfigura novamente o pre-counter neh ? nos exemplos de avr sempre vejo isso. bom, uma coisa q vc poderia fazer eh simplesmente repassar a saida do timer para um pino de saida, com uma configuracao fixa e sem interrupcao, para medir em um osciloscopio digital com persistencia infinita ativada.

se vc notar que com o passar do tempo o sinal comeca a deslizar muito em relacao ao sinal inicial, eh pq seu oscilador interno esta muito instavel. note q tem uma diferenca: se ele atrasar a mesma coisa todo minuto, eh pq ele eh estavel e esta apenas com o clock maior ou menor do que deveria e eh possivel compensar facilmente. se ele atrasar valores diferentes a cada minuto, eh pq ele esta instavel, daih nao tem como prever e nao dah para compensar...
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor starker » 09 Fev 2009 15:09

ok....

valeu pelas respostas.... :)

vou fazer mais uns testes aqui e amanhã posto o resultado

Edson
starker
Bit
 
Mensagens: 40
Registrado em: 02 Dez 2006 12:14

Mensagempor starker » 10 Fev 2009 18:32

É... com o cristal interno não está dando certo....

vou conectar um cristal externo e voltar aos testes

lí no datasheet que essa variação pode ser de 3% (precisão do circuito RC interno), mas ajustável até 1%...

acho muito e me parece que ele está instável...

não tenho osciloscópio digital, mas no analógico pude ver que ele está variando....


vou pegar outro atmega8 e testar

Edson
starker
Bit
 
Mensagens: 40
Registrado em: 02 Dez 2006 12:14


Voltar para AVR

Quem está online

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

x