Interrupçao usando o timer0 com PIC 12f1822 no CCS

Olá pessoal, se alguém puder me ajudar, preciso desligar um relé depois de 20 minutos usando o TIMER0, com 4,0 ms overflow (uso do TIMER0 EM 32MHz) x 125 daria 500ms em nível alto e 500ms em nível baixo, fiz o código mas não bate com o esperado, pic usado foi 12f1822.

Exibições: 149

Anexos

Responder esta

Respostas a este tópico

Boa tarde,

o Timer0 é um timer de 8 bits.

Com um clock de 32Mhz, voce terá um interrupt de Timer 0 a cada 8 Usegs.  256 * 1/32Mhz

portanto se seu contador vai até 125, voce vai estourar o contador em  1 mseg.  8 u * 125  = 1000 mseg

Esta rotina :

clear_interrupt(INT_TIMER0); 
if(cnt == 125)
{
cnt = 0;
segundo++;

 incrementa o milisegundos  e não segundos.

RV mineirin

Boa noite, obrigado pela ajuda, no teste feito aqui no proteus funcionou incrementando em segundos, o problema é que funcionou sem lógica,

clear_interrupt(INT_TIMER0);    //                

 cnt++;                                                                         

 if(cnt == 83) {      // Com cnt ==83 (+ou- 83)  o resultado depois do while(TRUE) saiu melhor,                                                           

 cnt = 0;               //  Não entendo porque deu esse resultado,  porque cnt==83 resultou em                                        

 segundo++;        // 336ms em nível alto e 336ms em nível baixo e com cnt ==125   resultou                                 

  output_toggle(PIN_A0);  }    // em 510ms  em nível alto e 510ms em nível baixo, resumindo,

                                         //  Resultado depois do while(TRUE) com cnt==83 resultado   +ou- 1 segundo ;   com cnt==125  resultado  +ou-  1,5 segundo. Só lembrando  que estou usando como referencia isso 4,0 ms overflow  que veio quando configurei o CCS C COMPILER.

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128|RTCC_8_bit);         //4,0 ms overflow  (Uso do timer0) EM 32MHz                     

Anexos

Olá.

  Acredito que sejam 32KHz e não 32MHz, afinal é um RTC de pic..

  32000/128/125=2Hz Parece correto..

  

  Mas reveja os cálculos considerando K.

Ref: https://ww1.microchip.com/downloads/en/DeviceDoc/61125F.pdf

isso https://ww1.microchip.com/downloads/en/DeviceDoc/61125F.pdf não seria só para a família pic 32?

Creio que isso seria mais aceito, 32Mhz/4->entra 8MHz no contador prescaler

prescaler/256->31250Hz no contador final TMR0

digamos que eu (eu) queira 250Hz na saída: devo fazer 31250/125=250

Sabendo que ele conta acima e seta o flag na contagem 255...0 devo alimentar o TMR0 com 255-125=130 a cada passagem pela interrupt... Pronto.. agora você tem uma interrupt a cada 1/250seg. Incremente variáveis pra conseguir o tempo que quiser a partir deste. recebi essa ajuda,

mas isso também não deu certo. Como eu disse, na configuração que fiz já recebi 4,0 ms overflow em 32MHz, sobrando só incrementar variáveis pra conseguir o tempo que pretendia, mas não bateu com o esperado, mas valeu pela tentativa. 

Verdade, peguei uma folha de dados errada.

Vide:

http://ww1.microchip.com/downloads/en/devicedoc/40001413e.pdf

"

Flexible Oscillator Structure
• Precision 32 MHz internal Oscillator Block:
- Factory calibrated to ± 1%, typical
- Software selectable frequencies range of 31 kHz to 32 MHz
• 31 kHz Low-Power Internal Oscillator
• Four Crystal modes up to 32 MHz
• Three External Clock modes up to 32 MHz
• 4X Phase Lock Loop (PLL)
• Fail-Safe Clock Monitor:
- Allows for safe shutdown if peripheral clock
stops
• Two-Speed Oscillator Start-up
• Reference Clock module:
- Programmable clock output frequency and
duty-cycle "

Eu não costumo usar PIC, não sei se consigo te ajudar.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço