Página 1 de 1

16F684 - interrupt on change

MensagemEnviado: 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.

MensagemEnviado: 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

MensagemEnviado: 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

MensagemEnviado: 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.

MensagemEnviado: 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;
}
}
}

MensagemEnviado: 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.

MensagemEnviado: 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.

MensagemEnviado: 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?

MensagemEnviado: 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.

MensagemEnviado: 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.

MensagemEnviado: 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

MensagemEnviado: 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é