Interrupção Externa com Timer0

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Interrupção Externa com Timer0

Mensagempor wBB » 21 Dez 2016 13:15

Olá! Estou utilizando Timer0 e Interrupção Externa com borda de subida (RB0/INT) num PIC16F73, de modo que, se o pino RB0/INT permanecer em nível alto por mais de 1000ms, o pino RA1 tem que ter seu estado invertido por meio de rotina implementada no Timer0, conforme código abaixo. Ou seja, ao manter em nível alto o pino RB0/INT (da interrupção externa) por mais de 1 segundo, a saída RA1 inverte continuamente seu estado até que seja retirado o nível alto de RB0/INT.

PROBLEMA:
Se eu colocar RB0 em nível baixo enquanto RA1 está em nível alto, RA1 se mantém assim. Isso está OK.
PORÉM, se eu voltar a colocar RB0/INT em nível alto, mesmo que seja por menos de 1000mseg, RA1 volta para nível baixo sem passar pela rotina de inversão de estado do Timer0 (eu testei), o que é um problema, pois esta saída só deveria ter seu estado invertido se RB0/INT permanecesse por mais de 1000mseg em nível alto.

Alguém sabe o que pode estar gerando este comportamento estranho?

cpp code
#INT_TIMER0
void TMR0_isr(void)
{
// ROTINA DO TIMER0 COM ESTOURO DE 1MS

if (INTCON_TMR0IF) {
// Zera a flag de Timer0
INTCON_TMR0IF = 0;

// Verifica nível lógico de RB0/INT.
if (input(PIN_B0))
TMR0_counter++;
else
TMR0_counter = 0;

if (TMR0_counter > 1000){
PORTAA_0 = !PORTAA_0;
TMR0_counter = 0;
}
}
}
wBB
Bit
 
Mensagens: 23
Registrado em: 18 Nov 2016 18:45

Re: Interrupção Externa com Timer0

Mensagempor andre_luis » 21 Dez 2016 19:09

Não parece que voce está lidando com interrução externa.
Se fosse assim, deveria ter uma função ISR para esse caso.
O que está sendo feito abaixo é apenas a leitura do pino.

A proposito, essa variavel TMR0_counter é int8 ou int16 ?
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Interrupção Externa com Timer0

Mensagempor wBB » 21 Dez 2016 21:10

Opa! Na verdade a função existe, mas eu não coloquei aqui no tópico. É uma programinha bem pequeno, apenas para testes, que dei uma enxugada ainda maior para postar a dúvida (segue abaixo completo). A variável TMR0_counter é Int16.

cpp code
#include <16f73.h>
#fuses HS, NOWDT
#use fast_io(A)

// Ciclo de máquina 500E-9
#use delay(clock=8MHz,crystal=8MHz)

// Registrador do Timer0
#byte INTCON = 0x0B
// Flag estouro do TMR0
#bit INTCON_TMR0IF = INTCON.2
// Flag de interrupção Externa RB0/INT
#bit INTCON_INTF = INTCON.1

// Registrador de configuração do Timer0
#byte OPTION_REG = 0x81
// Registrador de contagem do Timer0
#byte TMR0 = 0x01

// Registrador de Porta A
#byte PORTAA = 0x05
#bit PORTAA_0 = PORTAA.0

// Inicialização da base de tempo do Timer0
#define TMR0_INIT 0x06

// Contador do Time0
int16 TMR0_counter;

#INT_EXT
void EXT_isr(void)
{
if (INTCON_INTF) {
INTCON_INTF = 0;
// apenas teste
}
}


#INT_TIMER0
void TMR0_isr(void)
{
if (INTCON_TMR0IF) {
INTCON_TMR0IF = 0;
TMR0 = TMR0_INIT; // Reinicialização de Timer0 (8bits) em 6

if (input(PIN_B0))
TMR0_counter++;
else
TMR0_counter = 0;

if (TMR0_counter > 1000){
PORTAA_0 = !PORTAA_0;
TMR0_counter = 0;
}

// Evita o estouro da variável
if (TMR0_counter > 65000)
TMR0_counter = 1000;
}
}


void main()
{
// Inicializa o registrador de configurações do Timer0
OPTION_REG = 0x82; // Prescaler 8

// Inicializa o registrador de contagem do Timer0
TMR0 = TMR0_INIT;

// Inicializa o registrador de habilitação do Timer0
INTCON = 0xE0; // Habilita a interrupção por periféricos
// Habilita o Timer0

// Seta toda a "Porta A" como entrada, exceto o pino 1
set_tris_a(0xFE);
set_tris_b(0xFF);


enable_interrupts(INT_EXT);
ext_int_edge (L_TO_H);
enable_interrupts(GLOBAL);

output_low(PIN_A0);

TMR0_counter = 0;
PORTAA_0 = 0;

while(true){

}
}
wBB
Bit
 
Mensagens: 23
Registrado em: 18 Nov 2016 18:45

Re: Interrupção Externa com Timer0

Mensagempor andre_luis » 22 Dez 2016 13:02

Eu ainda não sei se entendi direito.
Voce menciona estar com problema no RA1, mas seu código supostamente acessa apenas o RA0.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Interrupção Externa com Timer0

Mensagempor wBB » 22 Dez 2016 13:56

Sim, é RA0. Apenas escrevi errado (RA1) no início do tópico.
Na verdade o código é bem simples, até mesmo para mim, que sou iniciante. O problema é que minha experiência com microcontroladores é zero e aí fico me debatendo com coisas que normalmente não ocorrem constantemente.

Obrigado
wBB
Bit
 
Mensagens: 23
Registrado em: 18 Nov 2016 18:45

Re: Interrupção Externa com Timer0

Mensagempor andre_luis » 22 Dez 2016 19:31

Alguém sabe o que pode estar gerando este comportamento estranho?


Tem debounce nessa entrada ?
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Interrupção Externa com Timer0

Mensagempor wBB » 22 Dez 2016 21:30

Acredito que sim.... Porém, lendo o datasheet verifiquei a seguinte nota de rodapé para este pino RB0:
"This buffer is a Schmitt Trigger input when configured as the external interrupt."

Pela teoria, o Schmitt Trigger existente nessa entrada da interrupção externa RB0/INT, eliminaria o problema de ruídos (ou Bounce). Eu tinha feito um pull down neste pino e colocado um capacitor para a GND, além do resistor. Quando o botão é pressionado, o nível de RB0 vai para 5V, mas também carrega o capacitor que, ao ser descarregado, aparentemente estava gerando essa estranheza que descrevi.

Pelo que pude perceber, ao retirar o capacitor o problema sumiu e o circuito está funcionado corretamente.
Você acredita que isso que observei seja a solução para o problema?

Obrigado.
wBB
Bit
 
Mensagens: 23
Registrado em: 18 Nov 2016 18:45


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x