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.
Tags:
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
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por