Página 1 de 2
Conceitos Timer0 e set_timer0(x)/pic16F819

Enviado:
31 Jul 2008 10:44
por alex1000
senhores, minhas duvidas devem ser ridiculas para voces mas tenho que apresenta-las assim mesmo
Timer0 -
1) pelo que eu já li o timer0 inicializa emm 255 decrementa até 0 gera uma interrupção e volta de novo de 255 até 0, correto?
2)Para calcular o tempo de 255 a 0 (resolução ) seria esta formula?
resolução= (1/clock interno)*256*preescaleescolhido
3) Lógico que mesmo com o preescale escolhido não consigo o tempo exato desejado, como eu faria isso ?
4) seria esta a função do set_timer0?
neste pic como seria possivel gerar um timer para 1s e 10s?
Obrigado
Ps. consultei o Programando o Pic em liguagem C do Renato Silva mas não me ajudou....

Enviado:
31 Jul 2008 12:01
por fabim

Enviado:
03 Ago 2008 00:27
por alex1000
fabim, vou fazer testes, mas voce apresentou muito bem sua lógica.

Enviado:
03 Ago 2008 09:31
por Pask
Vou tentar ajudar.
O timer0 é um timer de 8 bits do PIC que conta de 0 a 255 incrementado pelo clock do próprio PIC ou por um clock externo aplicado num determinado pino. O timer 0, na verdade, inicia a sua contagem em 0 e conta até um máximo de 255, voltando a zero e repetindo tudo outra vez. Eu sou contra decorar fórmulas. Vamos tentar entender:
Se o seu PIC estiver trabalhando com um clock de 4MHz, o seu período será 4x10^6 / 4 = 1MHz = 1/1x10^6 = 1us (período real de trabalho do clock de máquina). Isto acontece porque, internamente, o período do clock é dividido por 4.
Este valor de 1us significa que a cada 1 micro segundo o timer 0 vai incrementar em uma unidade, ou seja, a cada 1 micro segundo a contagem do timer 0 vai crescer (0,1,2,3....255, 0, 1...). Então, já sabemos que o timer0 vai demorar 255 us para atingir o seu valor máximo e estourar voltando a zero! Porém, este tempo de 255us é muito pequeno e nós podemos aumentá-lo como desejarmos. Então, existe o prescale do timer0 que pode multiplicar esse valor por várias constantes até um máximo de 255. Se o prescaler estiver configurado para 1:255, por exemplo, o tempo total do timer0 vai ser 255us x 255 = 65.025 us ou 65,025 ms! Viu? Agora o tempo já aumentou para 65 milissegundos!
E se eu quiser um tempo maior, como 1 segundo?
Para chegar a temporizar até um 1 segundo, podemos fazer a seguinte conta: 1s / 0,065025s = 15,319. Então, devemos multiplicar esse tempo de 65ms por um fator arredondado de 15. Isto vai dar um tempo de 0,975 segundos! Podemos multiplicar por 16 e teremos 1,040 segundos (mais próximo)!
Mas, como fazer essa multiplicação? Podemos utilizar a interrupção do timer0, pois a cada 65,025 ms ela acontecerá e cada vez que ela ocorrer, incrementamos uma variável inteira de 8 bits em 1 unidade até o máximo de 16, mais ou menos assim:
static int x;
#interrupt_timer0
set_timer0(0);
while (x <= 16) {
x++;
}
Com isto, assim que a variável x atingir o valor 16, terá passado exatamente 1,04 segundos!
Espero ter ajudado.

Enviado:
06 Ago 2008 16:46
por alex1000
senhores, testando meu programa do timer tive um erro no compilador CCS:
OSCCON identificador não definido.
Alguem saberia qual é este problema?
outra coisa o programa usa use delay(clock=4000000) e OSCCON= 0x60,
seria necessário os dois parametros?
Os dois não setam o clock em 4Mhz?

Enviado:
06 Ago 2008 18:13
por Pask
Com qual PIC você está trabalhando? Se for o PIC16F628, ele não possui o registrador especial OSCCON. Se for ele, configure assim:
#use delay(clock=4000000)
#include <regs_16f62x.h> / / você precisa ter essa biblioteca
cmcon=7; / / desabilita os comparadores internos
Se você não tiver a biblioteca acima, faça assim:
setup_ccp1(ccp_off); / / para todos os PIC's com módulo interno capture, compare, pwm.

Enviado:
06 Ago 2008 19:35
por alex1000
Estou usando o PIC16f819.
Não entendo o uso destas duas instruções em um mesmo programa. Afinal as duas não especificam o ocilador interno? Para o clock de 4MHz teriamos 1MHz interno.(sem preescaler). Qual o sentido disto?

Enviado:
06 Ago 2008 20:52
por Pask
#use delay(clock=4000000) / / oscilador trabalhando em 4MHz
Você configurou acima um clock de 4MHz e está correto. Porém, internamente, o PIC divide tal freqüência por 4 e conta 1MHz. Em função desta freq. é que o período é gerado para os timers internos.
Se você tivesse feito:
#use delay(clock=1000000) / / oscilador trabalhando em 1MHz
O PIC também dividiria por 4 e a freq. de trabalho real seria 250 kHz.
O prescaler não tem nada a ver com este clock de máquina. Ele é aplicado somente aos timers ou ao watchdog timer.
Se não era exatamente isto que você queria saber, favor explicar melhor qual a sua dúvida.

Enviado:
06 Ago 2008 21:10
por alex1000
bem, pelo visto tenho um erro de interpretação qanto ao OSCCON
para que serve a OSCCON neste programa.
Temos o use delay e OSCCON , os dois comandos setam 4MHz?
#include<16F819.h>
#device adc=10
#use delay(clock=4000000)
#fuses XT,NOMCLR,NOWDT,PUT,NOPROTECT,BROWNOUT,NOLVP,WRT,INTRC_IO
int saida;
long valor;
void init_pic (void){
OSCCON = 0x60;
}
void converte (void){
if (valor<400) saida = 0x01;
if (valor>399 && valor<800) saida = 0x02;
if (valor>799 &&valor<1024) saida = 0x04;
}
#int_timer0 // tratamento da interrupção do timer 0
void trata_t0(){
static int counter;
set_timer0(252);
counter ++;
if (counter>10){
valor = read_adc();
set_timer0(252);
counter=0;
}
}
#int_timer1 // tratamento da interrupção do timer 1
void trata_t1(){
static boolean led;
static int counter1;
set_timer1(3036);
counter1 ++;
if (counter1>1){
led=!led;
output_bit(pin_a1,led);
counter1=0;
}
}
void main (void){
output_b(0);
init_pic();
setup_ADC_ports(RA0_analog);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256);
set_timer0(252);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
set_timer1(3036);
enable_interrupts(global);
enable_interrupts(int_timer0);
enable_interrupts(int_timer1);
for(;;){
converte();
output_b(saida);
}
}

Enviado:
06 Ago 2008 21:13
por alex1000
ops,saiu smile em lugar errado, o correto é for(;;)

Enviado:
06 Ago 2008 21:14
por alex1000
for(;;)

Enviado:
06 Ago 2008 21:16
por alex1000
desisto, só sai smile, o comando é for(pontoe virgula,pontoevirgula)

Enviado:
06 Ago 2008 21:25
por Maurício
Aperta o botãozinho CODE quando vc for postar, ehehehehhe
[]'s

Enviado:
07 Ago 2008 02:39
por Renie
Desculpe-me Alex,
Eu não uso C, e também não tenho muito domínio sobre o mesmo!
Mas, acho que está fazendo xit, nas 1as linhas você indica ao compilador
como tratar o código e tempos, e depois você força o oscilador, se seu
parâmetro estiver errado, o mais provavel é xit mesmo!!!!
OSCCON = 0x60;

Enviado:
07 Ago 2008 08:12
por alex1000
este programa é da revistta sabereletronica, e estou testando-o com o pic !6f819.
Meu conhecimento de C e microcontroladores é pequeno.
Estou contestando a lógica : se use delay fixa o clock interno e OSCCON faz
a mesma coisa, por que usar os dois?