Olá a todos. Estou desenvolvendo um trabalho e irei utilizar nele um relógio. Tinha finalizado o programa utilizando o Timer_0, porém meu orientador falou para utilizar o oscilador externo para ter mais precisão...

Irei utilizar o modo XT com um cristal de 4MHz (o mesmo que utilizava internamente) junto com 2 capacitores de 15pF (circuito e componentes vi no datasheet do PIC). Minha dúvida é como utilizar isso no programa, quero saber como "chamar" esse comando, acredito que é uma "troca de direção", em vez de ir no timer_0 ir pros OSC1 e 2, mas não sei como fazer isso. Utilizo o PIC C compiler (CCS) e segue ai meu código dessa parte:


//////////////////////////////////////////////////////////////

...
#device ADC = 10

...


#int_timer0

void trata_t0 () {

static int conta;

set_timer0(131 - get_timer0() );
conta++;
   if (conta == 125){      //AQUI É ONDE OCORRE O CONTROLE DE SEGUNDO
   conta = 0;
   segundo++;
   } //fim do if conta == 125
      if (segundo > 59){
      segundo = 0;
      minuto++;
      }
         if (segundo < 0) segundo = 59;
         if (minuto > 59){
         minuto = 0;
         hora++;
         }
            if (minuto < 0) minuto = 59;
            if (hora > 23) hora = 0;
            if (hora < 0) hora = 23;
} // fim do void trata_t0

...

// dentro do main

   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   delay_us(20);


   setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_64);
   set_timer0 (131);
   enable_interrupts (global |int_timer0);

//////////////////////////////////////////////////////////////////////////////

Todo o programa funciona perfeitamente sem erros e bugs.

Exibições: 5867

Respostas a este tópico

Bem Filipe se eu entendi bem o que seu orientador disse basta você configurar os fuses do PIC para que este trabalhe com oscilador externo de 4Mhz.

Fazendo isso você terá uma precisão maior, já que o crital externo terá uma variação de clock bem menor que o oscilador do PIC. Essas variações ocorrem porque o oscilador do PIC perde a precisão quando a tensão de alimentação e temperatura variam (por menor que seja).

 

Não acredito que ele queira que você leia o clock por meio de alguma porta não...

 

Espero te ajudado.

"Bem Filipe se eu entendi bem o que seu orientador disse basta você configurar os fuses do PIC para que este trabalhe com oscilador externo de 4Mhz."

 

Exato, é ai que está minha dúvida, quero saber esses códigos quais são...

Dei uma olhada no datasheet do PIC e no help do CCS, mas não encontrei.

Ou, configurando como XT ele automaticamente utiliza o cristal externo como fonte e joga no timer_0??

Qual o modelo do PIC que você está usando?
16F877A

Filipe,

 

Você não vai precisar MUDAR NADA no teu código ... considerando que já estava funcionando perfeitamente com o Oscilador Interno, só o que você vai fazer é "dizer" para o PIC que ele irá basear o seu clock cycle em um cristal e não no oscilador RC interno .

No CCS basicamente o que você precisa é configurar os FUSE BITS corretamente ... algo do tipo no inicio do seu programa (no arquivo que tem o main() ok?) ...

 

#include <16f877a.h> 
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT 
#use delay(clock=4000000)

 

A clausula XT na diretiva de compilador #fuses, indica que o PIC deve basear seu relógio num Oscilador Externo a cristal.

 

Como referencia, dá olhada no site do RedRaven... tem muita coisa boa por lá... o link é: http://picmania.garcia-cuervo.net/index.php

 

Enjoy!

*-* Thanks, essa era a raiz da mionha dúvida.

 

setup_adc(ADC_CLOCK_INTERNAL);
   delay_us(20);


   setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_64);

 

mesmo configurado para XT posso deixar o cógido assim?

FIlipe,

 

Procurando nos meus alfarrábios, encontrei tal código... que por acaso deve estar também no teu diretório de exemplos do CCSC:

 

/////////////////////////////////////////////////////////////////////////
//// EX_ADMM.C ////
//// ////
//// This program displays the min and max of 30 A/D samples over ////
//// the RS-232 interface. The process is repeated forever. ////
//// ////
//// Configure the CCS prototype card as follows: ////
//// Insert jumpers from: 11 to 17, 12 to 18 and 9 to 16 ////
//// Use the #9 POT to vary the voltage. ////
/////////////////////////////////////////////////////////////////////////
#include<16f877.h>
#fuses HS,NOLVP,NOWDT,PUT
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)

void main() {
int i, value, min, max;

printf("V01Sampling:");

setup_adc_ports( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 1 );

do { //Takes 30 samples from pin A0
min = 255; //and displays the min and max
max = 0; //values for that 100ms period
for(i = 0; i <= 30; ++i) {
delay_ms(100);
value = read_adc();
if(value < min)
min = value;
if(value > max)
max = value;
}
printf("nrMin:%x MAX: %x", min, max);
} while (TRUE);
}

 

 

Veja se lhe serve de parametro ... outra coisa... é o uso da Clausula HS no lugar de XT ...

 

Enjoy!

Filipe ,

 

Usar um cristal de 4MHz é sem duvida melhor que oscilador interno RC do PIC.

Mas é melhor usar um cristal oscilador de 32,768 KHz separado do clock da CPU pois fica Muuuuito mais estavel.

Poe ele para oscilar no Timer1(que tem um oscilador especifico para esta função) e não no timer0

e vc ainda pode deixar a cpu rodando em altas velocidades , tipo 20 a 64 MHz no RC.

Veja no manual da Microchip como fazer isto com o Timer1 :

Timer1 can also be used to provide Real-Time Clock(RTC) functionality to applications with only a minimal addition of external components and code overhead.Timer1 is controlled through the T1CON Controlregister (Register 13-1). It also contains the Timer1Oscillator Enable bit (T1OSCEN). Timer1 can be enabled or disabled by setting or clearing control bit,TMR1ON of the T1CON register.

 

Boa sorte !

Enio

grande enio sempre tem umas artimanhas rsrsrs

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço