INTERRUPÇÃO AD

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

INTERRUPÇÃO AD

Mensagempor Vonnilmam » 22 Mai 2009 12:00

Saudações a todos,

Pode até parecer bobeira minha, mas não é:

Eu particularmente uso muito pouco as interrupções nos pics, mas me deparei com uma situação interessante agora: Onde eu tenho que utilizar a interrupção no AD...porém gostaria de compartilhar com os colegas a minha dúvida: No circuito estou utilizando a leitura de 16 potenciometros através de um demux 4051 em uma única entrada do AD do pic (an1), no atual software não uso interrupção, apenas executo a leitura dessa MACRO "adint.inc". Minha dúvida "ingênua" é a seguinte (mas serve para os iniciantes saber essas coisas, ok). Se eu colocar o AD na interrupção como é processado o disparo para a leitura do AD? Ou seja, imagino eu que o AD leu um valor qualquer, ex> 50 e foi disparada a interrupção e esse valor carregado no registro do AD, se essa leitura atual (50) não se alterar o AD não efetua nova interrupção? A interrupção só ocorrerá se um leitura diferente da atual (50) foi realizada? por ex.: 51, aí então o AD provoca nova interrupção?....

Me perdõem os colegas mais experientes, é que eu achei interessante postar essa dúvida, até mesmo por questões de aprendizagem mútua para todos...

muito obrigado
von
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Mensagempor RobL » 22 Mai 2009 13:20

Desconheço, pelo menos nos Pics mais clássicos que este venha a fazer a leitura por interrupção, ou seja, que há como escolher um tempo para que seja feita a leitura no ADC, automaticamente com certo intervalo de tempo. Isto se faz por um tempo escolhido pelo usuário através de uma interrupção de um dos temporizadores e não no ADC, caso queira por interrupção.
O que há é interrupção para avisar leitura pronta, pelo ADC.
Porém, posso estar desatualizado em termos de Pics.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor MOR_AL » 22 Mai 2009 15:17

Você verifica antes se há conversão em andamento, via o bit GO_DONE do registro ADCN0....

Sem usar interrupção:

Se '1', há (aguarde...), se '0', não há (continue).
Caso não haja conversão, já com tudo o mais correto (CAD ligado, pino de entrada conectado ao CAD, tempo para a tensão de entrada do pino se estabilizar na entrada do CAD, etc.), sete ('1') o bit GO_DONE do registro ADCN0. Isso inicia a conversão.
Você pode monitorar este mesmo bit, até que ele valha '0', ou aguarde um período mínimo especificado no manual. É preferível monitorar o bit.

Caso você esteja usando a interrupção, proceda do mesmo modo, sem precisar monitorar o bit, pois quando a conversão terminar, ocorrerá interrupção.

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 ze » 22 Mai 2009 16:05

boa mor, nem eu teria dado um explicação melhor. (rs) mas qual a vantagem de se usar interrupt no ad mesmo? seria pra ganhar velocidade máxima na conversão? mas aí a cpu não teria muito + tempo pra nada. (se bem que posso habilitar ou não esta int alternadamente)
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor MOR_AL » 23 Mai 2009 08:57

Olá Lellis.

Se não usar interrupção, aí você precisa saber quando a conversão terminou. Ou você lê o valor do resultado após um número de ciclos mais que suficiente para isso, ou você fica monitorando o bit GO_DONE.
No primeiro caso, a CPU pode ir fazendo outras coisas, que você considera necessário. No segundo caso, a CPU fica exclusivamente "esperando" o bit alterar para '0'.
Sempre que possível eu evito usar interrupção. É mais uma coisa em que pensar. O momento correto em habilitar, desabilitar, etc.
Mas há casos em que ela é bem-vinda.
[]'s
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 Vonnilmam » 24 Mai 2009 18:40

Agradeço a todos,

Resumindo: No modo em que esperamos o go_done sinalizar o fim da conversão AD ficamos "com esse tempo de espera" aguardando a MCU excutar a leitura do AD e com isso perdemos esse tempo "precioso", que poderia a MCU fazer outras coisas (algo em torno de 100useg) no meu caso, ok!

já no modo interrupção, o flag de interrupção irá disparar a interrupção sempre que haver uma "NOVA" conversão em andamento (o que não ficou claro foi o seguinte:) Imagine que ocorreu uma interrupção - Foi chamada a rotina para colher essa informação e armazena-la numa variavel qualquer - suponha que esse valor serja: 50H - Mas agora houve uma alteração na entrada AD e gerou-se uma nova interrupção e o valor agora é 80H, ok.

A dúvida caros colegas é se o modulo de conversão AD fica constantemente (e independentemente) da MCU fazendo a leitua AD e só interrompe a MCU quando houve um valor diferente do anteriomente "LIDO"...

Será que eu consegui expressar a dúvida...

Bom, muito podem estar pensando, porque eu não faço uma simulação!

É exatamente isso que vou fazer agora mesmo, vou simular na pratica, e postarei aquí a rotina e o resultado, ok...

Muito obrigado,
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Mensagempor MOR_AL » 24 Mai 2009 21:37

Vonnilmam escreveu:Agradeço a todos,

Resumindo: No modo em que esperamos o go_done sinalizar o fim da conversão AD ficamos "com esse tempo de espera" aguardando a MCU excutar a leitura do AD e com isso perdemos esse tempo "precioso", que poderia a MCU fazer outras coisas (algo em torno de 100useg) no meu caso, ok! Para uma freq. oscilação de 4Mc/s, o período dá cerca de 70us.
já no modo interrupção, o flag de interrupção irá disparar a interrupção sempre que haver uma "NOVA" conversão em andamento. Releia minha postagem. Você dispara a conversão e a interrupção ocorre quando a conversão estiver terminada. (o que não ficou claro foi o seguinte:) Imagine que ocorreu uma interrupção - Foi chamada a rotina para colher essa informação e armazena-la numa variavel qualquer - suponha que esse valor serja: 50H - Mas agora houve uma alteração na entrada AD e gerou-se (Não é o MC que toma iniciativa e sim o programador) uma nova interrupção e o valor agora é 80H, ok.

A dúvida caros colegas é se o modulo de conversão AD fica constantemente (e independentemente) da MCU fazendo a leitua AD e só interrompe a MCU quando houve um valor diferente do anteriomente "LIDO"... Releia minha postagem.

Será que eu consegui expressar a dúvida...

Bom, muito podem estar pensando, porque eu não faço uma simulação!

É exatamente isso que vou fazer agora mesmo, vou simular na pratica, e postarei aquí a rotina e o resultado, ok...

Muito obrigado,
Editado pela última vez por MOR_AL em 26 Mai 2009 11:54, em um total de 1 vez.
"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 ze » 25 Mai 2009 07:49

Olá. Nos pics que [penso que] conheço a interrupt (hw) ocorre mesmo se o valor for igual. A decisão do que fazer se for igual ou não deve ser tomada no sw. Mas pensando bem, mesmo se não ocorresse a interr. ele teria que fazer a conversão pra saber se é = ou não. E teria usado o tempo Tad do mesmo jeito.
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor RobL » 25 Mai 2009 14:50

A dúvida caros colegas é se o modulo de conversão AD fica constantemente (e independentemente) da MCU fazendo a leitua AD e só interrompe a MCU quando houve um valor diferente do anteriomente "LIDO"...

Veja abaixo deu pau.
Editado pela última vez por RobL em 25 Mai 2009 14:57, em um total de 1 vez.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor RobL » 25 Mai 2009 14:51

A dúvida caros colegas é se o modulo de conversão AD fica constantemente (e independentemente) da MCU fazendo a leitua AD e só interrompe a MCU quando houve um valor diferente do anteriomente "LIDO"...


Não. Por que?
O circuito interno do ADC do pic, logo em sua entrada, é do tipo amostragem, conforme sugere o modelo nos manuais da MC.
Portanto o seu "capacitor" de amostragem necessita ser descarregado e carregado com o valor da tensão medida.
Isto é feito através do bit GO / DONE. Observe que é necessário setar esse bit para iniciar a leitura e automaticamente ele é ressetado ao final da leitura.
Em outras palavras, mesmo com o ADC ligado, consumindo energia, bit ADON = 1 ele não fica medindo. Só mede se o bit GO/DONE for setado.
Conforme já havia lhe respondido no inicio e talvez não tenha ficado claro. Da mesma forma, na primeira resposta acima, somente através de uma interrupção por um temporizador determinada pelo software, o bit GO/DONE poderá ser setado, respeitado o tempo de aquisição necessário pelo HW se for para ficar medindo com certo intervalo de tempo automaticamente. Poderia ser disparado também por um evento externo de forma aleatória.

Tentando não restar dúvida, mesmo que a leitura anterior tenha o mesmo valor, sempre que o bit GO/DONE for setado o ADC realizará uma nova leitura e pára. Só medirá novamente se o bit GO/DONE for setado outra vez.
Conforme o Lelis colocou, uma vez lido os valores, o SW verificará se são iguais e por exemplo, não atualizar o display que já contém o mesmo valor.
Cabe observar que é um pouco difícil, não impossível, que um ADC com 1024 níveis tenha o mesmo valor entre duas medidas. Para tal é necessário um sinal sem ruído, ou melhor, ruído menor que 1/1024 unidades.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

cron

x