16F684 - interrupt on change

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

16F684 - interrupt on change

Mensagempor Abuda » 29 Abr 2012 10:48

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.
Abuda
Byte
 
Mensagens: 214
Registrado em: 04 Mai 2007 09:38
Localização: SP

Mensagempor tcpipchip » 29 Abr 2012 12:35

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
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor MOR_AL » 29 Abr 2012 16:11

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
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor FabioSom12 » 30 Abr 2012 07:12

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.
FabioSom12
Nibble
 
Mensagens: 94
Registrado em: 26 Nov 2009 14:01

Mensagempor Abuda » 30 Abr 2012 09:18

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;
}
}
}
Abuda
Byte
 
Mensagens: 214
Registrado em: 04 Mai 2007 09:38
Localização: SP

Mensagempor FabioSom12 » 30 Abr 2012 12:50

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.
FabioSom12
Nibble
 
Mensagens: 94
Registrado em: 26 Nov 2009 14:01

Mensagempor Abuda » 30 Abr 2012 13:41

Olá Fabio,

Como coloquei em post anterior:

O IOCA é IOCA=0b00100000;

E sim já fiz com apenas essa interrupção ligada.
Abuda
Byte
 
Mensagens: 214
Registrado em: 04 Mai 2007 09:38
Localização: SP

Mensagempor FabioSom12 » 01 Mai 2012 20:11

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?
FabioSom12
Nibble
 
Mensagens: 94
Registrado em: 26 Nov 2009 14:01

Mensagempor Abuda » 02 Mai 2012 08:33

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.
Abuda
Byte
 
Mensagens: 214
Registrado em: 04 Mai 2007 09:38
Localização: SP

Mensagempor Abuda » 03 Mai 2012 08:59

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.
Abuda
Byte
 
Mensagens: 214
Registrado em: 04 Mai 2007 09:38
Localização: SP

Mensagempor mhagnumdw » 09 Ago 2012 01:16

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
Avatar do usuário
mhagnumdw
Bit
 
Mensagens: 49
Registrado em: 26 Out 2009 15:30

Mensagempor Abuda » 09 Ago 2012 08:30

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é
Abuda
Byte
 
Mensagens: 214
Registrado em: 04 Mai 2007 09:38
Localização: SP


Voltar para PIC

Quem está online

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

x