Página 1 de 1
16F684 - interrupt on change

Enviado:
29 Abr 2012 10:48
por Abuda
Olá pessoal,
Estou com um problema estranho.
Configurei a interrupção "interrupt on change" para a porta RA5 essa porta está com um pull-up externo de 4k7(5V).
Config:
TRISA=0b00111101;
TRISC=0b11010010;
PORTA=0;
PORTC=0;
CMCON0=0b00000111;
IOCA=0b00100000; //interrupt on change RA5
INTCON=0b11001000;
Dentro da interrupção eu jogo 1 ou 0 em outra porta como forma de debug dessa interrupção.
O que ocorre é que grande parte das vezes a interrupção funciona como deveria.
Ex: Jogo zero na porta e recebo zero no pino que uso para debug, jogo 1 e recebo 1.
Porém com certa frequência a interrupção fica "disparada", ou seja fica ocorrendo sem que exista uma alteração no sinal de entrada(RA5).
Ex: Deixo RA5 aterrado e leio no osciloscópio um sinal quadrado de 13khz.
Deixando RA5 em 5V o problema também ocorre, um sinal de 13khz aparece.
Se vou alternando o sinal uma hora fica disparado outra funciona como deveria.
Alguém tem ideia do que pode estar ocorrendo?
Obrigado e até logo.

Enviado:
29 Abr 2012 12:35
por tcpipchip
Qual o valor do cristal do teu processador ?
4Mhz...????
Se sim, tua interrupt nao pode ter instrucoes que juntas nao leve mais de 7us (1/13KHz)
O ciclo de maquina é 1us por instrução para 4Mhz...
TCPIPCHIP

Enviado:
29 Abr 2012 16:11
por MOR_AL
tcpipchip escreveu:Qual o valor do cristal do teu processador ?
4Mhz...????
Se sim, tua interrupt nao pode ter instrucoes que juntas nao leve mais de 7us (1/13KHz) 77us
O ciclo de maquina é 1us por instrução para 4Mhz...
TCPIPCHIP
Verifique sua montagem. É em protoboard? Capacitor de 100nF próximo ao PIC? Etc.
MOR_AL

Enviado:
30 Abr 2012 07:12
por FabioSom12
Abuda
1) Faz um programa somente com essa interrução e testa.
Pode ter algo em outras rotinas interferindo. Principalmente configuração de banco ou paginação.
2) Depois implementa um timer de uns 150us fora da interrupção e fica piscando outro led.
Se o uC estiver saindo de rotina esse daqui deve travar. Se ele não travar e o led da interrupção de ra5 ficar doido posta o código.

Enviado:
30 Abr 2012 09:18
por Abuda
O oscilador é o interno a 8MHz.
O sistema esta montado em uma PCB e todo o resto funciona(produto rodando a mais de 5 anos por volta de 2000 placas no mercado), apenas estou adicionando está interrupção em uma porta que já era entrada.
O objetivo é a leitura de um encoder.
Eu tinha outras duas interrupções ativas mas desativei tudo no programa, pra ver se o problema continuava.
E sim ele continua.
Já vi que a Microchip tinha uma errata a respeito do interrupt on change onde alguns pulsos podem ser perdidos se a leitura da porta coincidir com um ciclo de máquina ou algo assim.
Hoje a errata é uma característica. hehe.
Para evitar erro na contagem de pulsos é necessário armazenar o último valor para que se compare com o atual o que nos permite saber se aconteceu uma perda de pulso.
Não encontrei nada a respeito de a interrupção ficar disparada.
A parte da interrupção mesmo é isso aqui, nada mais.
if(RAIE)
{
if(RAIF)
{
RAIF=0;
encoder_counter++;
if(f_led)
{
f_led=0;
led=0;
}
else
{
f_led=1;
led=1;
}
}
}

Enviado:
30 Abr 2012 12:50
por FabioSom12
Verifica o IOCA, é o registro que define qual bit da porta A vai ter interrupção, pode ser que tenha mais de 1.
_____________________________________
Abuda, vc não acha válido só pra poder testar a interrupçao fazer um programinha só com ela?
Há um tempinho atrás eu usei essa interrupçao para ler um encoder com velocidade um pouco elevada e variada, nao perdia pulso nem dava problema.
Tambem já tive problema com paginação e bancos de memória na saida da interrupção que dava umas coisas meio doidas, por isso sugeri o segundo teste.

Enviado:
30 Abr 2012 13:41
por Abuda
Olá Fabio,
Como coloquei em post anterior:
O IOCA é IOCA=0b00100000;
E sim já fiz com apenas essa interrupção ligada.

Enviado:
01 Mai 2012 20:11
por FabioSom12
Caracas mano... que bucha..
Vi um site com as informações que vc disse, pode perder pulsos. Pelo site isso está sendo corrigido nas linhas (PIC16F1xxx). O F*** é que não é isso o que está acontecendo.
http://www.xargs.com/pic/portb-change-bug.html
---------
Eu tava revirando as anotações por e aqui e me surgiu uma dúvida.
Seu encoder é da Horner?

Enviado:
02 Mai 2012 08:33
por Abuda
Fabio,
O problema ocorre tanto com o encoder como pegando um fio e aterrando o sinal, entende.
Como disse vendo o sinal com o osciloscópio não existe qualquer ruído muito menos algo na casa dos 13khz que é o que tenho lido.
Hoje vou perder o dia nisso e no final passo os resultados aqui.
Obrigado a todos pela ajuda.

Enviado:
03 Mai 2012 08:59
por Abuda
Bom tentei de tudo um pouco e não consegui resolver.
Como o encoder me gera no máximo 250Hz optei por ler no próprio loop do programa.

Enviado:
09 Ago 2012 01:16
por mhagnumdw
Abuda,
imagino que você já tenha feito mas não custa dizer: já leu a porta em questão para evitar
mismatch condition? É uma dica da própria microchip.
http://www.microchip.com/forums/tm.aspx ... print=true
--
MhagnumDw

Enviado:
09 Ago 2012 08:30
por Abuda
Olha faz tanto tempo que não me lembro mais.
Como disse, como não era algo crítico fiz a leitura direto no loop do programa.
O importante é que funcione.
Valeu pela dica, se voltar aqui pra alguma alteração vou ver se isso resolve.
Até