CAD

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

CAD

Mensagempor MOR_AL » 14 Out 2013 18:16

Estou tentando fazer com que um valor de 0v a 5v seja convertido, via CAD do PIC, para um aplicativo rodando no PC. Este trecho do programa fica em loop.
Estou usando o kit EasyPic4. Configurei o kit corretamente e obtive algumas surpresas desagradáveis.

O aplicativo transmite uma string pela serial com 9 bytes (IN000000\r). \r é o retorno do carro.
O firmware transmite o valor da conversão via UART assíncrona, 8 bits de dados e 1 de stop. O CAD está configurado para 10 bits, com justificativa à direita.
O PIC é o 16F873A e o cristal é de 20MHz.
A linguagem é assembly.
O PIC identifica a string recebida do aplicativo, portanto a recepção pela UART está ok.
Como o valor da conversão estava aparecendo errado no aplicativo, comecei a pesquisar.
Isolei o CAD e entrei com outros dois registros, como suposto resultado da conversão. Chamei de BinH e BinL. Fiz estes registros variarem de 0 a 1023 em sequência crescente e estabelecendo um loop. A justificativa ficou à direita também. Igual ao CAD.
Converti o valor binário dos dois bytes em 5 bytes BCD, dos quais apenas 4 são utilizados (milhar, centena, dezena e unidade). Converti os bytes de BCD para ASCII e enviei para o transmissor da UART. O aplicativo mostrou todos os 1024 possíveis valores corretamente.
Isso prova que o erro está no CAD. Depois de inúmeras verificadas, juntamente com o manual do PIC, na rotina de configuração do CAD (AD_Config) e na rotina de conversão (AD_Converte), não encontrei erro algum. Aliás, já tinha usado estas rotinas antes, apenas com 8 bits e não 10.
O resultado da conversão sempre fornecia o registro menos significativo do CAD (ADRESL) com zero. Apenas os dois bits do registro mais significativo (ADRESH) funcionavam corretamente. Os 4 valores obtidos, ao se variar o potenciômetro, eram 0000, 0256, 0512 e 0768.
Primeiramente comecei a desconfiar do PIC. Troquei por outro e o byte menos significativo do CAD (ADRESL) passou a fornecer 4 constante. Os valores passaram para 0004, 0260, 0516 e 0772.
Isso certamente não poderia ocorrer. Mudar o PIC e obter resultados diferentes. :?:
Apesar de grande parte do firmware estar funcionando corretamente (UART e lógicas), o CAD não estava.
Comecei a ler os capítulos do manual que elegi como possíveis candidatos ao problema.
Ao ler sobre a frequência máxima do cristal, encontrei 16MHz para os PICs comuns e 20MHz para os industriais. O meu é o comum. :shock:
PQP. Finalmente vislumbrei uma possibilidade de encontrar o problema. :wink:
Mudei o cristal para 10MHz e a configuração da UART.
O firmware apresentou o mesmo problema!!! :cry:
Seguem as rotinas principais que têm a ver com o problema:

Código: Selecionar todos
;   ******************************************************************************************************************
;   Portas @
    bsf      banco
    bcf      STATUS,RP1
    movlw   b'10001011'
    movwf   TRISA      ; Porta A.
    movlw   b'00000000'
    movwf   TRISB      ; Porta B.
    movlw   b'10000000'   ; RC7 como Rx da UART (entrada).
    movwf   TRISC      ; Porta C.
    bcf      banco
...
;   *******************************************************************************************************************
;   Rotina AD_Config. Já incorpora as variáveis do CAD.

AD_Config:
   ; Configure as entradas analógicas como entradas no registro TRISA.
   bsf      banco      ; Banco 1.
   bsf      TRISA,0      ; A0 é entrada.
   bcf      banco      ; Banco 0.
   ; Configure o registro ADCON1 no banco 1.
   ; Neste ponto deve ser conhecida a sua opção de acordo com o seu sistema. Há 15 opções diferentes. Verifique no
   ; quadro “Register 11-2” na página 128 do manual PIC16F877A, qual a opção desejada. As opções são configuradas
   ; por meio dos bits 3, 2, 1 e 0 do registro ADCON1. Aqui será considerada a opção 1110, ou seja, apenas uma
   ; entrada analógica (AN0). A tensão de referência VRef conectada ao Vdd. (O Vdd não possui precisão).
   ; O tempo total para uma conversão é igual ao tempo de aquisição mais o tempo de conversão. Tmín >= TAcq + TConv
   ; Tmín >= 19,7us + 1,6us * FXtal >= 19,7us + 1,6us + 20e6 >= 32. NFOsc >= 32 -> NFOsc = 32.
   bsf      banco         ; Banco 1.
   movlw   b'10001110'      ; Resultado justificado à direita (10 bits), FOSC / 32, modo 14, apenas AN0 é entrada.
   movwf   ADCON1         ; analógica. VRef = Vdd.Todos os pinos restantes deixados como digitais.
   bcf      banco         ; Banco 0.

   ; Configure o registro ADCON0 no banco 0.

   movlw   b'10000000'      ; FOSC / 32, conectado o canal 0 (AN0), CAD não atuando (DONE) e
   movwf   ADCON0         ; desenergizado.
   return
;   *******************************************************************************************************************************************
;   Rotina AD_Converte

AD_Converte:
   ; Pode-se aguardar o término da rotina AD_Converte, monitorando-se a bandeira de fim da conversão.
;   bsf      ADCON0,ADON      ; Energize o módulo do CAD (ADCON0,ADON = 1). Neste caso a energização é externa à rotina.
   btfsc   ADCON0,GO      ; Há conversão em curso? Aguarda o fim de conversão.
   goto   $-1            
   call   T20us         ; Aguarda pelo tempo de aquisição (Taq >= 19,7µs)
   bsf      ADCON0,GO      ; Inicia a conversão. ADCON0, GO/DONEbarra = 1
   btfsc   ADCON0,GO      ; Aguarda pelo término da conversão. Espera que ADCON0,GO = 0. As interrupções do CAD estão
   goto   $-1            ; desabilitadas. Aguarda o fim de conversão.
;   bcf      ADCON0,ADON      ; Desenergize o módulo do CAD (ADCON0,ADON = 0). Neste caso a desenergização é externa à
   return   



Bom!
Cheguei no meu limite. :oops:
Talvez eu esteja passando pelo erro e não esteja enxergando.

Se alguém, que também use a linguagem assembly puder ajudar, ficarei grato.
[]'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

Re: CAD

Mensagempor vtrx » 14 Out 2013 22:04

Acho que faltou o principal,que é como voce está interpretando(a rotina que carrega as variáveis) o ADRESH e ADRESL.
Poderia postar?
Editado pela última vez por vtrx em 15 Out 2013 08:27, em um total de 1 vez.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: CAD

Mensagempor ze2 » 15 Out 2013 07:53

moris não sou fã do asm. No entanto veja esta função em c que pode não lhe ser totalmente inútil

Código: Selecionar todos
unsigned int adc_read(unsigned char channel)
{
unsigned char dla=0x20;
    ADCON0 = (channel << 3) + 0x81;     // enable ADC, fosc/32
   while(dla--); //pequeno delay
    GO_DONE = 1;
    while(GO_DONE)
        continue;   // wait for conversion complete
    return ADRESH*256 + ADRESL; //10 bits
}

perdoe algumas observações óbvias:
-TRISx = 1
-pinos tem múltiplas funções: verifique se está apenas na função analógica
abç
ze2
Byte
 
Mensagens: 193
Registrado em: 09 Fev 2009 13:37

Re: CAD

Mensagempor MOR_AL » 15 Out 2013 21:38

vtrx escreveu:Acho que faltou o principal,que é como voce está interpretando(a rotina que carrega as variáveis) o ADRESH e ADRESL.
Poderia postar?

Estou fazendo assim:
O registro ADRESH está no banco 0 e ADRESL no banco 1.
banco = STATUS,RP0

Código: Selecionar todos
   call   AD_Converte
   movf   ADRESH,w
   movwf   BinH
   bsf      banco
   movf   ADRESL,w
   movwf   BinL
   bcf      banco
   call   Bin2BCD5
   call   ASCII8_PIC_UART_PC

Cara. Acho que você me alertou para o detalhe. :idea:
A variável BinL está no banco 0. Eu fui para o banco 1 para copiar o ADRESL para o W. Aí eu deveria retornar para o banco 0 ANTES de passar do W para o registro BinL. Como está, eu copio do W para outro registro do banco 1. Assim o registro BinL fica sempre fixo.
Como informei antes, já tinha usado o CAD com a linguagem Assembly, mas sempre com 8 bits e justificado à esquerda. Nesse caso só usava o registro ADRESH, que está no banco 0. Nunca tive problemas...Até nesse caso!!! :?
Valeu, garoto.
Obrigado pela sua observação. Eu passei pelo erro muitas vezes e não atinei.
[]'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

Re: CAD

Mensagempor vtrx » 15 Out 2013 21:50

Eu sabia pois ja alertei sobre esse descuido em outro forum. :mrgreen:

Código: Selecionar todos
   call   AD_Converte
   movf   ADRESH,w
   movwf   BinH
   bsf      banco
   movf   ADRESL,w
   bcf      banco
   banksel Binl
   movwf   BinL
   call   Bin2BCD5
   call   ASCII8_PIC_UART_PC
Editado pela última vez por vtrx em 15 Out 2013 21:55, em um total de 1 vez.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: CAD

Mensagempor MOR_AL » 15 Out 2013 21:53

ze escreveu:moris não sou fã do asm. No entanto veja esta função em c que pode não lhe ser totalmente inútil

Código: Selecionar todos
unsigned int adc_read(unsigned char channel)
{
unsigned char dla=0x20;
    ADCON0 = (channel << 3) + 0x81;     // enable ADC, fosc/32
   while(dla--); //pequeno delay
    GO_DONE = 1;
    while(GO_DONE)
        continue;   // wait for conversion complete
    return ADRESH*256 + ADRESL; //10 bits
}

perdoe algumas observações óbvias:
-TRISx = 1
-pinos tem múltiplas funções: verifique se está apenas na função analógica
abç


Ze!
Agradeço pelo seu auxílio.
Na verdade eu também programo em MikroBasic, que tem muitas rotinas prontas, inclusive a da ADC.
Eu mantenho o uso da linguagem Assembly só para pequenos programas (menos de 2k). Isso me mantém próximo ao hardware do PIC e me ajuda muito com a linguagem de mais alto nível.
Também, atualmente, andei estudando C, mas já tinha feito programas não óbvios em outros campos de estudo, que não o de microcontroladores.
Não sei. É que quando iniciei na programação, foi ensinado Fortran, que é bem parecido com o Basic. Depois vieram os primeiros micros com 8 bits, já com a linguagem Basic incorporada (TKs). Depois veio o Matlab, que é praticamente em Basic. Daí minha melhor afinidade com Basic.
Valeu mesmo assim.
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

Re: CAD

Mensagempor andre_luis » 15 Out 2013 22:01

MOR_AL,


Uma outra opção seria compilar o programa em "C" acima no CCS, que possui uma opção de apresentação do compilado em ASM.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: CAD

Mensagempor MOR_AL » 15 Out 2013 22:15

andre_teprom escreveu:MOR_AL,


Uma outra opção seria compilar o programa em "C" acima no CCS, que possui uma opção de apresentação do compilado em ASM.


+++

André!
Este trabalho é de um livro e nele já há o programa em C, tanto do CCS como do C18.
O fato é que eu não gosto de fazer nada sem entender. Apesar dos dois programas (em C) serem quase que óbvios, eu penso (me acostumei) melhor com Assembly.
Mas como informei antes, também uso o uBasic quando é necessário.
[]'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


Voltar para PIC

Quem está online

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

cron

x