Timer 0 - PIC16f506

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Timer 0 - PIC16f506

Mensagempor elton de souza » 04 Nov 2008 09:52

Olá a todos,

Seguinte, estou tentando utilizar o timer 0 no PIC 16f506 (que não possui interrupçaõ!). Minha intenção é que ele fique contando enquanto rodo o loop do meu porgrama, que tb fica verificando o registrador para analisar se a contagem chegou ao seu final (estouro).

No datasheet do PIC existe duas maneiras para setar a contagem, a primeira utiliza o TOCKI pin para incrementar o timer0 (o que não me interessa porque tenho que usar este pino como uma IO). Já a segunda maneira utiliza a saida do comparador para incrementar o timer 0.

Nesta segunda maneira, alguns registradores precisam ser alterados (ver pg.39 do datasheet). Com isso, segue o código:
Código: Selecionar todos
   #asm
   MOVLW 11100111
   OPTION                     //carrega W no reg. OPTION
   BCF 0x08,6              //altera o reg.CM1CON0.C1OUTEN
   BCF 0x08,4              //altera o reg.CM1CON0.C1TOSC
   #endasm

E abaixo segue o meu código que analisa (no loop do meu programa) o estouro da contagem do timer 0:
Código: Selecionar todos
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); //Clock 4MHz interno
set_timer0(238);
...
while(true){
...
verificaEstouroTimer0();
...
}
...
verificaEstouroTimer0(){
if(get_timer0()>=238){ //Verifica se estorou a contagem do timer0(4ms)
isT4ms = true;
ccontTDadoBarramento ++;
if(ccontTDadoBarramento==18){//Conta um periodo de aprox.:64.512ms
isT65ms = true;
ccontTDadoBarramento = 0;
}
set_timer0(238);
}
}

Feita as configurações acima, ao inves de contar 65.5ms, ele esta contando aproximadamente 1ms...

Minhas dúvidas:

- A configuraçaõ feita por mim está correta?
- Poderei utilizar o pino do comparador como um IO?
- Existe uma maneira mais facil e funcional de realizar a contagem por timer0 utilizando este PIC?

Desde já agradeço a todos!!!
elton de souza
Nibble
 
Mensagens: 58
Registrado em: 16 Out 2006 08:48
Localização: Florianópolis - SC

Mensagempor elton de souza » 05 Nov 2008 14:47

Pessoal,

Para não ter influencia nos IO do PIC, pode-se deixar o bit T0SC (OPTION<5>) em "0". Com isso, o timer 0 irá incrementar a cada periodo de instrução de máquina do processador; a negativa fica por conta de não se poder utilizar o prescaler na configuração do timer...

Feita a configuração do bit T0SC, testei o meu programa a fim de analisar se o timer programado estava correto, mas para minha surpresa ele simplesmente não funciona!

Segue o código para analise dos colegas:
Código: Selecionar todos
void vsetFuses(void){
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   set_timer0(230);                                             setup_comparator(NC_NC_NC_NC);
   #asm
   MOVLW 11000111
   OPTION                                                   ; Limpa T0SC bit(OPTION<5>) para timer0 incrementar a cada ciclo de
   BSF 0x08,4                                                 ; bit C1T0SC\ (CM1CON0<4>)
   #endasm
//   *OSCCAL = 0x80;
}

void main(){
   delay_ms(500);
   vsetFuses();
        while(true){
vestouroTimer0();                                       
        }
}

void vestouroTimer0(void){
   if(get_timer0() >= 230){                                    //Verifica se estorou a contagem do timer0
if(isV == false){
   output_high(PIN_C2);
   isV = true;
}
else if(isV == true){
   output_low(PIN_C2);
   isV = false;
}      
set_timer0(230);
}                        


Alguém tem alguma ideia, ou sabe de algum outro register que precise configurar para que o timer faça corretamente a contagem?

Obrigado!!!
elton de souza
Nibble
 
Mensagens: 58
Registrado em: 16 Out 2006 08:48
Localização: Florianópolis - SC


Voltar para PIC

Quem está online

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

x