Dúvida com interupção !!!

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Dúvida com interupção !!!

Mensagempor Andre_Cruz » 30 Jul 2009 14:28

Estou exercitando o meu assembler rsrsrsrs
Estou usando um 12F675, fiz um programinha para ler um botão (usando a interupção de mudança de estado, pino GPI02) e o TIMER 0 para contar tempo.

O programa funciona bem mas em alguns momento a leitura do botão falha, fiquei pensando acho que, quando a interupção do TIMER 0 esta sendo tratada, ocorre a interupção de mudança de estado, e não me lembro bem, se quando acaba de tratar a interupção do TIMER 0 ja ocorre a interupção novamente e trata a interupção de mudança de estado.

Agradeço a ajuda de todos.

Abraço
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor fabim » 30 Jul 2009 15:27

Andre. não entendi direitinho direitinho.
Mas.
você nas interrupções trabalha com 3 fragmentos.

Global
Tipo
Flags dos tipos.

Suponha o seguinte.

Você configurou o intcon para interrupção em estouro em tmr0 e borda no GP2.

se por acaso, no main, na primeira linha, você abilitar ja o gie de cara e não tiver zerado o flag de indicação do GP2 e to timer0. neste exato momento vai haver uma interrupção pois flags de GP2 e tmr0 estão a um.
Dentro da int, você zera só o GP2, e antes de sair liga novamente a int, vai acontecer outra int pois o flag do tmr0 ainda esta a 1.

Resumindo.

Suponha que dentro da int, você esta tratando algo que foi acionado pela int do tmr0, e dentro deste tempo o flag do gp2 foi acionado pois alguém apertou a chave, antes de sair da int no momento que você abilitar o gie, ja vai haver outra int....

Estou sem inspiração hoje..

Se não entender só perguntar novamente, que eu tento ser mais claro.

Abraços

Fabim
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 renanwalenczuk » 30 Jul 2009 15:34

Boa tarde amigo,
Isso depende se você configurou o GIE assim que entrou na int de TMR0, desligando assim todas as interrupções, senão irá apontar para o vetor de interrupção, memo no tratamento do TMR0.
Seria melhor se enviasse o código.
Att
"O segredo da criatividade é saber como esconder as fontes."
Albert Einstein
renanwalenczuk
Nibble
 
Mensagens: 69
Registrado em: 17 Nov 2008 14:22
Localização: Canoas - RS

Mensagempor fabim » 30 Jul 2009 15:46

renanwalenczuk escreveu:Boa tarde amigo,
Isso depende se você configurou o GIE assim que entrou na int de TMR0, desligando assim todas as interrupções, senão irá apontar para o vetor de interrupção, memo no tratamento do TMR0.
Seria melhor se enviasse o código.
Att


Renam, os PIC´s.. Quando acontece qualquer tipo de int, o INTCON.GIE é zerado por hw, antes de sair da int você precisa ligalo por software..

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 Andre_Cruz » 30 Jul 2009 16:00

fabim,

"Você configurou o intcon para interrupção em estouro em tmr0 e borda no GP2. "

Eu configurei o INTCON para a interupção de TIMER 0 e mudança de estado GPIO2.

"se por acaso, no main, na primeira linha, você abilitar ja o gie "

E deixei o INTCON,GIE setado, no momento em que configuro as interupções, antes de chegar no MAIN (Rotina Principal).

"de cara e não tiver zerado o flag de indicação do GP2 e to timer0"

É preciso limpar os flags das interupções GPIO2 e TIMER0 ?
Mesmo que a CPU acabou de ser inicializada ?

"neste exato momento vai haver uma interrupção pois flags de GP2 e tmr0 estão a um.
Dentro da int, você zera só o GP2, e antes de sair liga novamente a int, vai acontecer outra int pois o flag do tmr0 ainda esta a 1."

Quando ocorre uma interupção, eu testo o flag da int. de GPIO2 se for eu trato ela, senão testo pra ver se é de TIMER 0.
Como você disse se o flag das duas int. estiverem setados, eu vou tratar primeiro a que eu testar primeiro, no caso a de GPIO2 e logo depois que eu sair no RETFIE, acontecerá uma nova int. que dessa vez será a de TIMER 0 e ela será tratada ? Esta correta esta minha maneira de pensar ?

Muito obrigado pela resposta

Abraço
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor Andre_Cruz » 30 Jul 2009 16:07

Quando é executada a instrução RETFIE, ela não retorna da interupção e religa automaticamente a GIE ?
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor fabim » 30 Jul 2009 16:10

CORRETO.

suponha o seguinte.

FOI TMR0 ?
X
X
X
X
X
X

FOI GP2 ?
XX
XX
tratando aqui o tmr0 estourou e setou o flag de estouro
X
X
X
X
X


BSF INTCON,GIE// ele não vai executar o retfie, pois o flag
//do tmr0if soi setado, ou seja outra int volta para 0x04
// se na proxima que você lligar o intcon.gie nenhum flag estiver a 1, aí //sim ele executa o RETFIE.

retfie;


Faça um teste pra você confirmar, por exemplo no int do GP2, trate ele mas não zere o flag que indica a ocorrencia dele..
O programa vai ficar travado infinitamente na interrupção..

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 Andre_Cruz » 30 Jul 2009 16:41

fabim,

Se eu ligar o GIE, dentro da interupção como você sugeriu, como fica o registrador que armazena o endereço que o programa deve continuar, não vai subscrever o endereço de retorno anterior, e assim travando o programa ?
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor fabim » 30 Jul 2009 16:57

fabim escreveu:CORRETO.

suponha o seguinte.

FOI TMR0 ?
X
X
X
X
X
X

FOI GP2 ?
XX
XX
tratando aqui o tmr0 estourou e setou o flag de estouro
X
X
X
X
X


BSF INTCON,GIE// ele não vai executar o retfie, pois o flag
//do tmr0if soi setado, ou seja outra int volta para 0x04
// se na proxima que você lligar o intcon.gie nenhum flag estiver a 1, aí //sim ele executa o RETFIE.

retfie;


Faça um teste pra você confirmar, por exemplo no int do GP2, trate ele mas não zere o flag que indica a ocorrencia dele..
O programa vai ficar travado infinitamente na interrupção..

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 renanwalenczuk » 30 Jul 2009 17:07

Fabim,
O que você disse está correto, porém quando falei em configuração do GIE, foi isto mesmo que quiz dizer, se você realigá-lo a outra interrupção será tratada.
Sou novato no fórum, mas acompanho o mesmo a algum tempo, pois tive problemas com a ativação da conta.
Muito legal esta discução e transferência de conhecimento.
Att
"O segredo da criatividade é saber como esconder as fontes."
Albert Einstein
renanwalenczuk
Nibble
 
Mensagens: 69
Registrado em: 17 Nov 2008 14:22
Localização: Canoas - RS

Mensagempor fabim » 30 Jul 2009 17:18

renanwalenczuk escreveu:Fabim,
O que você disse está correto, porém quando falei em configuração do GIE, foi isto mesmo que quiz dizer, se você realigá-lo a outra interrupção será tratada.
Sou novato no fórum, mas acompanho o mesmo a algum tempo, pois tive problemas com a ativação da conta.
Muito legal esta discução e transferência de conhecimento.
Att

OPS, me perdoe pela falta de educação.

Seja bem vindo Renan, você esta participando na minha opinião do melhor forum de qualquer assunto que seja.

Aqui com os anos, acabamos criando vinculos muito legais de amizade.
Espero que participe aprendendo e doando um pouco dos seus conhecimentos.

Em nome de todos, novamente, seja bem vindo.

Abraços

Fabim
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 Andre_Cruz » 30 Jul 2009 17:41

fabim,

Fiz dessa maneira que você me instruiu aparentemente ficou OK, muito obrigado.
Mais uma pergunta rsrsrs
Estou com o circuito montado na protoboard, e as vezes o PIC não inicia corretamente e em outros momentos ele para de funcionar, eu reseto ele e ele volta ao funcionamento normal.

Para adiantar o PIC 12F675 esta sendo alimentado por bateria, usando oscilador externo, master clear interno, power up timer ligado, bor ligado e wdt desligado.

O fato dele estar na protoboard pode contribuir pra ele apresentar esse comportamento inesperado ?

Muito obrigado pessoal
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor fabim » 30 Jul 2009 18:13

olha, pode sim.
Mais antes de mais nada, de uma olhada no software e nos fuses.
Veja se são coerentes com o programa.

Não sei se você ja observou, mais no start tem como saber se foi algum tipo de reset por bor ou etc..

Abraços

Fabim
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 Andre_Cruz » 30 Jul 2009 19:12

fabim,

Vou tentar outras configurações dos "fuses" para ver se alguma se encaixa melhor ao meu software.
Eu tenho conhecimento que é possivel saber o que causou o reset, mas até então nunca tive esse problema.

Renan, seja bem vindo, sou novo aqui também, e aprendi bastante com o pessoal aqui, como o fabim disse esse é o melhor forum, não desmerecendo os outros.

Muito obrigado
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06


Voltar para PIC

Quem está online

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

x