Ir ao conteúdo
  • Cadastre-se

Timer1 do PIC12F675


CIS

Posts recomendados

Preciso de ajuda com um temporizador. Quero usar o timer1, mas interrupção. O temporizador ficara ligado por 7 dias seguidos, e então devera desligar e só voltar a funcionar quando uma pessoa reativa-lo. Ou seja , ele apenas deve contar o equivalente a 168 horas, e desligar. Programo em C, compilador mikroC e PIC12F675 com saida em GPIO.F0 (pino 7).

Link para o comentário
Compartilhar em outros sites

tenho que usar o oscilador interno, porque o hardware já esta pronto. Acho que da pra fazer uma logica usando algumas variáveis, a questão e configuração do timer1 para não usar interrupção... usando interupção eu consigo, mas ai, ao final da interrupção o programa voltaria, e eu não isso quero, o que quero é que ao final do tempo de 168 horas ele deve desligar, para geral e aguardar um comando de uma pessoa para voltar a funcionar.

Link para o comentário
Compartilhar em outros sites

Com oscilador interno, 4 MHz, habilite o timer1, a interrupção global e de timer1, inicie timer1 com 3036, a cada estouro você soma 3036 ao timer1, isso dará 500ms cada estouro, então a cada 2 estouros você tem 1 segundo.

Crie uma variável 'int32' :eek: que será decrementada em 1 a cada 2 estouros do timer1.

Crie uma rotina que quando for pressionado um botão você liga a saída e carrega a variável 'int32' com o valor em segundos do tempo de 7 dias (168 x 60 x 60 = 604800).

No loop principal você coloca:

if(!variavel){

desliga_saida

}

Att,

Link para o comentário
Compartilhar em outros sites

estou fazendo este codigo, por enquanto so testes no proteus e em protoboard.

Então Fervolt, esta parte da rotina, com a "int32" e o botão eu não entendi muito bem... você consegue me explicar no codigo abaixo:

   // temporizador  com o timer1  e  prescaler 1:8.
// contagem inicial 3036, havera um estouro a cada 0,5 segundos.
// 7200 estouros para cada hora.
/*******************************************************************************
frequencia interna = frequencia osc / 4
ciclo de maquina = 1 / frequencia interna

tempo_de_incremento = ciclo_de_maquina * prescaler * (contagem_modo_8/16_bits - contagem_inicial)

tempo_de_incremento = x
ciclo_de_maquina = 1 microsegundo
prescaler = 1:8
modo = 16bits (65.536)
contagem_inicial = 3.036

x = 0,000001 * 8 * 62500
x = 0,5 segundo

2x = 1 segundo
*******************************************************************************/

#define motor GPIO.f0

void main(){
CMCON = 0x07;
ANSEL = 0x00 ;
TRISIO = 0x00;
GPIO = 0x00;

T1CON.TMR1GE = 0;
T1CON.T1CKPS1 = 1;
T1CON.T1CKPS0 = 1;
T1CON.T1OSCEN = 1;
T1CON.TMR1CS = 0;
T1CON.TMR1ON = 1;
TMR1L = 30;
TMR1H = 36;
PIR1.TMR1IF = 0;


while(1){
unsigned char contador = 0; //de 0 a 65.535 variavel de 2 bytes inteira sem sinal
motor = 0; // motor inicia ligado

if(PIR1.TMR1IF == 1) { // se flag do estouro de timer 1 = 1, passou 0,5 segundo
contador++; // a cada 0,5 contador sera incrementado

if(contador == 2){ // se contador = 2, passou 1 segundo. Executa o codigo abaixo
contador = 0;
motor = 1; // desliga motor
delay_ms(1000); // aguarda 1 segundo
}
TMR1L = 36; // recarrega os registradores do timer 1
TMR1H = 30;
PIR1.TMR1IF = 0; // apaga flag de sinalização do timer 1

}
}
}

Link para o comentário
Compartilhar em outros sites

Fiz no CCS, segue abaixo

Não sei porque, na simulação, o proteus não reconhece a variável de 32 bits então criei de 16 bits e decremento em 1 a cada 10s (20 estouros do tmr1).

Aqui está funcionando no proteus, teste aí.

Se der certo você adapta no seu código.


#include <12F675.h>
#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOCPD //No EE protection
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOMCLR
#FUSES NOPUT //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset

#use delay(clock=4000000)

#define motorOn output_high(PIN_A5);
#define motorOff output_low(PIN_A5);

int igCont;
int16 igTempo;

#int_timer1
void trata_t1(){
//Acerta o valor do registrador do TIMER1
set_timer1(get_timer1() + 3036);

igCont++;

if(igCont >= 20){//conta 10s
igCont = 0;
if(igTempo){
igTempo--;
}
}
}

void main(){

setup_comparator(NC_NC);//Desativa comparador

setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);

enable_interrupts(global);

enable_interrupts(int_timer1);

set_timer1(3036);

igTempo = 0;

for(;{
if(input(PIN_A0)){//botao
delay_ms(50);//debouncing
if(input(PIN_A0)){
motorOn;
igTempo = 60480;
}
}
if(!igTempo){
motorOff;
}
}//Loop
}

Att,

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...