Página 1 de 1

Interrupção mudança de estado...

MensagemEnviado: 21 Dez 2009 09:55
por Blew
Olá amigos,
Estou com uma duvida quanto a interrupção por mudança de estado no PIC 16F628A. Ela ocorre nos pinos RA4, RA5, RA6 e RA7. É possivel selecionar os pinor que quero que ela atue? tipo, só o RA4...

Outra coisa, fiz um programinha aqui só pra testar a interrupção, a ideia é quando ela ocorrer aciona uma saida, mas a saida fica acionada direto, como se estivesse ocorrida a interrupção, mas não ocorreu.... vejam o programa:

void interrupt()
{
GIE=0;
if(RBIF)
{
saida=1;
}
GIE=1;
}

e é só isso!!
a sacana da saida liga no momento em que ligo a interrupção...
tem mais algum registrador que tenho que configurar??

MensagemEnviado: 21 Dez 2009 09:57
por Sergio38br
olha senão me engano ( não olhei o datasheet), tem os tais CMCON e outro do comparador que tem de desligar..

[ ]'s
Sergio

P.S. Detesto olhar dataxit...hehe

MensagemEnviado: 21 Dez 2009 10:05
por ze
do jeito que tá vai ficar direto mêmo fio. que tal:
...
RBIF=0;//num pode esquecer
saida=1;
delay(alguma coisa)
saída=0;
...
pra num ficar incrementando posts atôa (será que tem gente que posta 2ou+x seguidos só pra isso? só pra ganhar alguns bits de status? não...num acredito que exista alguém tão idiota assim)

sua chave de saída=0 está fazendo entrar na int. desabilite a int dela (também tô com pregui de ver o dataxit). Ou faça aquele lance de delay() pra teste.

abç

MensagemEnviado: 21 Dez 2009 10:18
por Blew
ops! na hora que copiei acabei apagando a linha...agora sim:

void interrupt()
{
GIE=0;
if(RBIF)
{
RBIF=0;
saida=1;
}
GIE=1;
}


no CMCON está tudo certo:
CMCON = 0x07;

Outras configurações antes do loop:
saida=0;
RBIE=1;
GIE=1;

Coloquei uma chava que quando pressionada deveria: saida=0;
mas a saida não desliga...
Na verdade o programa começa com a saida desligada, mas apartir do momento que eu mando um sinal para a mudança de estado, liga a saida e não desliga mais...

Re: Interrupção mudança de estado...

MensagemEnviado: 21 Dez 2009 11:05
por Djalma Toledo Rodrigues
void interrupt()
{
GIE=0; // Desnecessário se ocorreu Interrupção GIE = 0
if(RBIF)
------ {
------ saida=1;
------ delay nn
------ saida =0 // Como bem colocou o Lellis
------ }
RBIF =0 // Se não volta a interromper

// GIE=1; Errado

} // aqui Saí da ISR e habilita a Interrupção Geral automaticamente, equivale a Instrução RETFIE do ASM

DJ

Re: Interrupção mudança de estado...

MensagemEnviado: 21 Dez 2009 11:11
por fabim
Djalma Toledo Rodrigues escreveu:void interrupt()
{
GIE=0; // Desnecessário se ocorreu Interrupção GIE = 0
if(RBIF)
------ {
------ saida=1;
------ delay nn
------ saida =0 // Como bem colocou o Lellis
------ }
RBIF =0 // Se não volta a interromper

// GIE=1; Errado

} // aqui Saí da ISR e habilita a Interrupção Geral automaticamente, equivale a Instrução RETFIE do ASM

Só se for no seu compilador...!!
hehehe

DJ

MensagemEnviado: 21 Dez 2009 11:50
por Djalma Toledo Rodrigues
Ta certo não ?

Concerta aí por favor.

Antecipadamente grato .

DJ

MensagemEnviado: 21 Dez 2009 12:57
por fabim
void interrupt() {
INTICON.GIE=0;
// nunca se sabe como o compilador ou o uC se
// comporta, por isto sempre desligue o GIE ao entrar

if(intcon.intif){
trata;;;
intcon.intif = 0;
//zera flag dentro do teste.
//sempre, se limpar ao sair da rotina de teste desse flag, nunca ao sair. pois se fizer na saida pode causar paus de logica
}


//a maioria dos compiladores não liga o GIE nem o PIE ao sair
//por este motivo sempre ligue o que estiverusando ao sair
INTCON.GIE = 1; // ou PIE aí vareia.
}

o DJ passou a idéia corretissima, só que esqueceu deste detalhe.

Abraços

MensagemEnviado: 21 Dez 2009 13:27
por Djalma Toledo Rodrigues
Mas. Fabim se fizer :

INTCON,GIE = 1

E houver uma requisição de Interrupção pendente , ela será atendida sem concluir a atual ISR

Não seria melhor então "apelar" para a instrução RETFIE ?


-----

DJ

MensagemEnviado: 21 Dez 2009 13:44
por fabim
AÍ QUE ESTA DJ.,
Por isto que se procura nos testes de flag´s quais foram ativados, trata, zera, sai para o proximo teste.
lá no finzão antes "}"//end interrupt.
Coloca-se intcon.gie = 1.
Se no meio tempo, que ele estava tratando alguma coisa aconteceu outra interrupt, ela vai ser tratada novamente ao se ligar o GIE antes de sair.

E exatamente por este motivo, que quando se trabalha com interrupções, existem apenas duas formas que não de pauzzzz.
Faz maquina de estados para tratar no main, ou trata no interrupt, mais tudo sincronizado de tal forma que um tratamento não vai ferrar o outro.

abraços