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

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

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

Mensagempor Blew » 21 Dez 2009 09:55

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??
Blew
Bit
 
Mensagens: 46
Registrado em: 24 Out 2006 10:03

Mensagempor Sergio38br » 21 Dez 2009 09:57

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
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor ze » 21 Dez 2009 10:05

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ç
Editado pela última vez por ze em 21 Dez 2009 10:40, em um total de 1 vez.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Blew » 21 Dez 2009 10:18

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...
Blew
Bit
 
Mensagens: 46
Registrado em: 24 Out 2006 10:03

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

Mensagempor Djalma Toledo Rodrigues » 21 Dez 2009 11:05

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
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

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

Mensagempor fabim » 21 Dez 2009 11:11

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
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Djalma Toledo Rodrigues » 21 Dez 2009 11:50

Ta certo não ?

Concerta aí por favor.

Antecipadamente grato .

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor fabim » 21 Dez 2009 12:57

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
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Djalma Toledo Rodrigues » 21 Dez 2009 13:27

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
Editado pela última vez por Djalma Toledo Rodrigues em 24 Dez 2009 19:35, em um total de 2 vezes.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor fabim » 21 Dez 2009 13:44

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
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?


Voltar para PIC

Quem está online

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

cron

x