Conceitos Timer0 e set_timer0(x)/pic16F819

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Conceitos Timer0 e set_timer0(x)/pic16F819

Mensagempor alex1000 » 31 Jul 2008 10:44

senhores, minhas duvidas devem ser ridiculas para voces mas tenho que apresenta-las assim mesmo :oops:
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....
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Mensagempor fabim » 31 Jul 2008 12:01

Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor alex1000 » 03 Ago 2008 00:27

fabim, vou fazer testes, mas voce apresentou muito bem sua lógica.
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Mensagempor Pask » 03 Ago 2008 09:31

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.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor alex1000 » 06 Ago 2008 16:46

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?
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Mensagempor Pask » 06 Ago 2008 18:13

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.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor alex1000 » 06 Ago 2008 19:35

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?
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Mensagempor Pask » 06 Ago 2008 20:52

#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.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor alex1000 » 06 Ago 2008 21:10

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);
}

}
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Mensagempor alex1000 » 06 Ago 2008 21:13

ops,saiu smile em lugar errado, o correto é for(;;)
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Mensagempor alex1000 » 06 Ago 2008 21:14

for(;;)
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Mensagempor alex1000 » 06 Ago 2008 21:16

desisto, só sai smile, o comando é for(pontoe virgula,pontoevirgula)
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Mensagempor Maurício » 06 Ago 2008 21:25

Aperta o botãozinho CODE quando vc for postar, ehehehehhe

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor Renie » 07 Ago 2008 02:39

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;
[]'s
Renie
-------------------------------------------------------------------------------------------------------------
Meu velho site com eletrônica praticamente parado http://www.reniemarquet.com
Nosso Blog http://artemadeiraevida.blogspot.com.br
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor alex1000 » 07 Ago 2008 08:12

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?
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Próximo

Voltar para PIC

Quem está online

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

x