Ir ao conteúdo
  • Cadastre-se

PIC configuração do timer 1 para evento externo .


Posts recomendados

Boa tarde meus amigos do FORUM !!!!!!!!!!

Estou estudando o PIC da família 18F, mais precisamente o PIC18F45k22, estou elaborando um protejo de um DIMMER, porém a dias estou tropeçando em algum detalhe que não consigo enxergar.

Gostaria de obter ajuda no tocante a orientação dos colegas mais experientes nesse assunto.

Segue os dados do protejo e desde á agradeço a todos.

*****************************************************************************************************************************************************

Estou utilizando o MIKOC Pro For PIC 

Microcontrolado 18f45K22

Oscilador externo de 8MHz 

 

**************************************************************************************************************************************************************************************************** 

#define controle PORTD.RD0

unsigned short tempo_H = 0x00; // variável para o tempo mais significativo do TIMER1
unsigned short tempo_L = 0x00; // variável para o tempo menos significativo do TIMER1

void interrupcao_high() iv 0x0008 ics ICS_AUTO // Rotina especial de interrupção gerado pelo MIKROC

{
 if(INTCON.INT1IF == 1)             // Houve interrupção exertna no pino RC0 ?
   {                        // Houve !
    INTCON.INT1IF= 0x00;      // Limpa a flag de sinalização
    PIR1.TMR1ON = 0x01;     // Liga o TIMER 1
   }
   
 if(PIR1.TMR1IF == 1)       // Houve estouro no ovf ?
   {                        // sim !
    PIR1.TMR1IF = 0;        // Limpa a flag
    TMR1H = tempo_H;        // Carrega o valor de High
    TMR1L = tempo_L;        // Carrega o tempo de Low
    controle = 0x01;           // Aciona controle no pino RD0
    delay_ms(200);          // Um tempinho
    controle = 0x00;           // Desliga o controle
    PIR1.TMR1ON = 0x00;     // Desliga o TIMER 1
   }// fecha int1if
}//fecha interrupção
void main() 
{
  ANSELC = 0;                // Todos os pinos da PORTA C configurdo como digital
  ANSELD = 0;                // Todos os pinos da PORTA D configurdo como digital
  TRISC.RC0 = 0x01;          // Apenas o pino RC0 configurado como entrada, pois parao pulso externo é necessário configurar esse pino
  PORTC.RC0 = 0x01;          // Nem era preciso !
  TRISD = 0;                 // Configurado para todos os pinos da PORTA D como saída
  PORTD = 0;                 // Nem era preciso !
  
  T1CON = 0b00000011;
  // config T1CON:
  /* RD16 = 0 -> leitura e escrita em 8 bits;
  T1RUN = 0 -> Oscilador do TIMER 1 não é sinal de clock;
  T1CKPS1 E T1CKPS0 = 0 -> prescaler 1:1;
  T1OSCEN = 0 -> Oscilador externo desabilitado;
  T1SYNC = 1 -> Sincronismo desligado;
  TMR1CS = 1 -> Incremento pelo sinal externo;
  TMR1ON = 1 -> Habilita o TIMER1.*/
  
  PIR1.TMR1IE = 1;       // Habilita a interrupção do TIMER1
  INTCON.GIEH = 1;       // Habilita interrupções global
  INTCON.PEIE = 1;       // Habilita interrupções por periféricos
  INTCON2.INTEDG1 = 1;   // Habilita borda de subida
  INTCON3.INT1IE = 1;    // Habilta a interrupção externa INT1
  /*inicializa o TIMER1 para contar até 8333 us (16bits - 8333 = 57203d; DF73h)*/
  TMR1H = 0xDF;          // Carrrega o valor com bit mais significativo em HIGH
  TMR1L = 0x73;          // Carrrega o valor com bit menos significativo em LOW
  
  controle = 0x00;       // Controle inicializa em zero
  
  while(1)
  {}                     //implementação futura
}//fecha void

 

A expectativa é gerar um sinal como mostra a figura abaixo

 

osc_controle_ent_sai.jpg.4b05c4c6cb0663ab4b957eb2039e928a.jpg

 

Mas a realidade é que estou gerando apenas o sinal de entrada no PINO RC0 e não está gerando o sinal de saída no PINO RD0, no canal dois do osciloscópio,como mostra a figura abaixo :

 

osc_controle_ent_sai_sem_exito.jpg.0dd1b0ad7534ccc62abc872e3f4053bc.jpg

 

A figura a baixo está o esquema do início do protejo gerado pelo PROTEUS 8 PROFISSINAL :

 

esquema_1.jpg.18e3b02f3a9a1e5f82e580f5f91f8b14.jpg

 

Queiram ignorar o LCD e o BUTTON !

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

O que seu fonte me diz é que um pulso no pino causa um pulso de 200mS em outro e isso não está ocorrendo certo? No seu esquema não está conectado o botão ao pino RC0 do mc e nem seu osc mostra o pulso. Verifique também se o pino está configurado como entrada digital pois há caso em que algum nasce como analógico.

 

Permita-me uma tradicional incorporada da dura realidade daqui de fora 🤪...: o que sempre recomendo pros meus "alunos do mundo real" é que antes de qualquer projeto com mc consulte o item mais importante: o preço bem como o 2º mais: a disponibilidade. Minha (minha) referência é a digikey p.ex. https://www.digikey.com/short/31c2p538

Mas se for pra brincadeiras (sem ofensa), passa tempo, aprendizados e tal ou pra aproveitar alguma peça que você tem a disposição, sem crise 😁

 

Link para o comentário
Compartilhar em outros sites

@.if Boa tarde !

O pino RC0 está recebendo o "sinal " no caso uma frequência de 120Hz, é uma simulação de um pulso quadrado.

O pino RC0 se der uma olhada no algorítmico irá perceber que TRISC.RC0 = 0x01; // Apenas o pino RC0 configurado como entrada, o ANSELC responsável por habilitar os pinos em digitais.

 

Acredito que tem algo que não consegui configurar,mas não estou conseguindo ver o erro !

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Ahhh .. vi agora que o RC0 é o de cima ..achei que era o de baixo... 🥴 mals. De fato este pino tem mais de meia dúzia de funções. Verifique se está como digital I/O. Verifique se não precisa de pullup.

Tente algo como

PORTD.RD1=PORTC.RC0; //pra ver se tá lendo o pino. 

Consulte também o d.s. https://ww1.microchip.com/downloads/en/DeviceDoc/40001412G.pdf pra ver se tem mais registros de controle de interrupção

53 minutos atrás, CLEUBER disse:

algo que não consegui configurar

Depois de resolver, não te esqueças de retornar o resultado/solução, ok? 🙂

Link para o comentário
Compartilhar em outros sites

@.if Obrigado mais uma vez !

Pois é, estou revirando o data dele, configurei como manda o escript. porém nada de sair um sinal no osciloscópio.

Já fiz um teste mandando o pulso externo através de um botão, no modo contador, ele conta os pulsos certinho, mas quando mando o pulso de 5v com frequência de 120 Hrz ele não funciona !

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Como você foi simpático, vejamos algumas análises a+ que fiz no seu fonte...

 

22 horas atrás, CLEUBER disse:
unsigned short tempo_H = 0x00; // variável para o tempo mais significativo do TIMER1
unsigned short tempo_L = 0x00; // variável para o tempo menos significativo do TIMER1

 

22 horas atrás, CLEUBER disse:
TMR1H = tempo_H;        // Carrega o valor de High
    TMR1L = tempo_L;        // Carrega o tempo de Low

você realimenta o timer com valor zero... ou seja fica o tempo máximo da contagem esperando o ovl.

 

22 horas atrás, CLEUBER disse:
TMR1H = 0xDF;          // Carrrega o valor com bit mais significativo em HIGH
  TMR1L = 0x73;          // Carrrega o valor com bit menos significativo em LOW

Já no main você carrega o valor supostamente correto mas ele é feito 1 vez só...

 

Não vi onde está habilitada a interrupt do timer1. Seria em T1CON?

22 horas atrás, CLEUBER disse:
T1CON = 0b00000011;

 

E tem + ... penso que você não precisa de interrupção de timer pra dimerizar. Basta a do 120Hz. A cada pulso você espera 1 tempo antes de disparar o tiristor. Quanto mais espera (aí sim pode usar o timer), menos energia ele transfere.

22 horas atrás, CLEUBER disse:

um protejo de um DIMMER

 

Link para o comentário
Compartilhar em outros sites

@.if Boa discussão referente ao caso, obrigado !

 

A interrupção do TIMER 1 está no registrador INTCON3, o bit INT1IE é responsável pela habilitação de interrupção externa do TMR1 (=1)

O pino é o PORTC.RC0 /  T13CKI  

 

Agora para esse protejo quero poder controlar o tempo de disparo no TRIAC.

Pelo que está no algoritmo, ainda não consigo controlar, pois ainda não foi implementado, mas já era para poder aparecer uma saída no canal dois.  

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
38 minutos atrás, CLEUBER disse:

A interrupção do TIMER 1 está no registrador INTCON3, o bit INT1IE é responsável pela habilitação de interrupção externa do TMR1 (=1)

Olá amigo. Dei uma olhadela na página 111 e não consegui ver rapidão a relação destes bits com o timer1. Agora dá uma olhadela na página 162 onde mostra os bits que devem ser setados pra uma interrupção.

 

44 minutos atrás, CLEUBER disse:

Agora para esse protejo quero poder controlar o tempo de disparo no TRIAC

Entendi. Diga também se você entendeu isso...

1 hora atrás, .if disse:

A cada pulso você espera 1 tempo antes de disparar o tiristor. Quanto mais espera (aí sim pode usar o timer), menos energia ele transfere.

Olha este minimalismo em c que digito online
 

unsigned int tmp,tmp1;

for(;;)
{
if (!RC1) tmp1++; //botões de controle
if (!RC2) tmp1--;
tmp=tmp1;
while(!RC0);//espera pulso
while(tmp--);//espera 1 pouco
RD0=1;RD0=0; //pulso no gate
}

Zero zero interrupt & zero timer. Dá até pra fazer com pic10f2xx... Pode não lhe ser totalmente inútil

 

Link para o comentário
Compartilhar em outros sites

18 minutos atrás, .if disse:

Olá amigo. Dei uma olhadela na página 111 e não consegui ver rapidão a relação destes bits com o timer1. Agora dá uma olhadela na página 162 onde mostra os bits que devem ser setados pra uma interrupção.

Acredito que :

Como tenho um interrupção externa devo habilitar o pino da interrupção externa.

Porém estou habilitando o PINO RC0 para que ocorra a interrupção na borda de subida, então possa ser isso que esteja fazendo errado !

Habilitando os dois passa estar havendo um conflito.

 

21 minutos atrás, .if disse:

Entendi. Diga também se você entendeu isso...

Na verdade não acompanhei seu raciocínio;

 

22 minutos atrás, .if disse:
unsigned int tmp,tmp1;

for(;;)
{
if (!RC1) tmp1++; //botões de controle
if (!RC2) tmp1--;
tmp=tmp1;
while(!RC0);//espera pulso
while(tmp--);//espera 1 pouco
RD0=1;RD0=0; //pulso no gate
}

Claro, tenho um algoritmo parecido com esse, só estou esperando para acertar a saída para controlar o triac e depois vou implementar o algoritmo de controle do ângulo , obrigado por essa dica.

Vou fazendo por aqui e vou atualizando o projeto com você.

25 minutos atrás, .if disse:

Zero zero interrupt & zero timer. Dá até pra fazer com pic10f2xx... Pode não lhe ser totalmente inútil

Na verdade o que estou querendo é assim: 

Temos a nossa senoide vindo da rede elétrica, temos que tratar esse sinal de modo que consiga mandar um sinal a cada passagem por zero para o MC, pois bem, feito isso a cada passagem por zero, o MC entende que existe um interrupção externa, por essa vez acontece a habilitação da ocorrência e aciona o TIMER 1, sendo assim, existe a contagem em 16 bits o qual é dividido em TMR1H e TMR1L, quando isso ocorre ele dispara a saída do MC podendo controlar o ângulo de disparo e com isso consigo regular o quanto de energia quero para acionar o objeto.

Mas essa é a primeira parte do projeto !

Tem muito para rachar a cuca.

Link para o comentário
Compartilhar em outros sites

@CLEUBER ,

 

Em 30/08/2022 às 17:37, CLEUBER disse:

Temos a nossa senoide vindo da rede elétrica, temos que tratar esse sinal de modo que consiga mandar um sinal a cada passagem por zero para o MC, pois bem, feito isso a cada passagem por zero, o MC entende que existe um interrupção externa, por essa vez acontece a habilitação da ocorrência e aciona o TIMER 1, sendo assim, existe a contagem em 16 bits o qual é dividido em TMR1H e TMR1L, quando isso ocorre ele dispara a saída do MC podendo controlar o ângulo de disparo e com isso consigo regular o quanto de energia quero para acionar o objeto.

Mas essa é a primeira parte do projeto !

 

Primeiro, como é o circuito que gera o pulso de passagem por zero ?

Precisa saber se usará subida / descida ou mudança de nível .

Cá entre nós, usar um Timer de 16 bits para controle de disparo de um Triac ???? 

Já pensou no erro de ângulo de disparo que o seu circuito irá causar para gerar  o pulso ?

 

Paulo

 

Link para o comentário
Compartilhar em outros sites

@aphawk Paulo obrigado por contribuir, fico feliz de fazer parte desse universo de pensadores !

 

Então pensei no pulso de entrada no INT0 do PIC quando acusa a interrupção externa ele aciona o TIMER no ovf, quanto a 16 bists, pelo que ando estudando e pesquisando 16 bits pelo fato de haver a divisão do cálculo do tempo de estouro do timer.

Na verdade a rede eléctrica AC aqui no BRASIL é de 60Hrz quando é feita o tratamento do sinal, esse rebate e soma os 60Hrz + 60Hrz totalizando os 120. como isso se acha o período dando início ao cálculo que no final se resulta em 8333 us. 

Então resumindo :

 

16bits = 65563 - 8333 = 57203 em decimal 

                                       DF73 em hexadecimal - com isso a parte HIGH fica DF 

                                                                                                parte  LOW  fica 73 

 

Como estou engatinhando nesse mundo,acredito que seja essa a ideia !

 

Quanto ao circuito de passagem por zero estou usando um 4023 .

 

Paulo agradeço mais uma vez !

 

@vtrx Brother !!!!!!!!!!!!!

 

Gostei demais do exemplo, vou estudar ele e adaptar para o mikroC .

 

Testei no Proteus e as ondas são perfeitas.

 

Muito obrigado por contribuir para meu conhecimento . 

Link para o comentário
Compartilhar em outros sites

@CLEUBER ,

 

Bom, 4023 que eu conheço é uma simples porta Nand de 4 entradas ..... não vejo como usar isto de maneira a ter um preciso detector de passagem por zero... 

 

Existem duas maneiras básicas : um circuito que simplesmente muda de 0 para 1 quando a tensão cruza o zero na subida da senóide e muda de 1 para 0 quando cruza na descida. Neste caso, você tem programar a interrupção por mudança de nível ( change ); e a outra maneira é um circuito mais complexo que gera um pulso a cada transição. Ambos tem prós e contras, e ambos possuem um erro na detecção do instante da passagem por zero.

 

Idealmente usa-se um optoacoplador para fazer essa detecção, o qual acrescenta um delay que pode chegar a 9% do tempo do período da senóide, portanto se você está procurando precisão, tem de considerar esse erro nos cálculos. Pode-se também usar um transformador isolador, e um circuito simples com resistor e zener fornece um erro menor. 

 

Lembre-se que basta apenas uma referência a cada ciclo da senóide.... não precisa saber quando que ela sobe e quando que ela desce, você pode saber apenas umas das situações, e inferir o próximo instante, somando o tempo correspondente a meia senóide !

 

Por estes motivos é que te perguntei qual o circuito que você vai usar, justamente para eu poder calcular o erro que você terá para considerar em seus cálculos...

 

Dá uma lida aqui :

 

https://www.clubedohardware.com.br/forums/topic/1291559-zero-crossing-detector-circuit-detector-por-cruzamento-de-zero-da-corrente/

 

Paulo

 

Link para o comentário
Compartilhar em outros sites

8 horas atrás, CLEUBER disse:

Testei no Proteus e as ondas são perfeitas.

Na época eu utilizei um18F2550 para controlar 8 lâmpadas para acompanharem o ritmo de uma musica com cada lâmpada respondendo a uma frequência da musica.

O circuito funciona perfeito com lâmpadas incandescentes,no caso do exemplo ele controla 2 canais,pena que hoje em dia lâmpadas PAR estão sendo feitas com Leds e não são controláveis deste modo,mesmo assim ainda da para controlar motores etc.

Tenho um vídeo da época que usa os circuitos do exemplo que postei (moc.jpg,zero_cross.jpg),como não tinha dinheiro para desperdiçar,usei duas lâmpadas,uma no primeiro canal e a outro no ultimo.

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!