Código correto CCS Compiler

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Re: Código correto CCS Compiler

Mensagempor picman62 » 24 Dez 2014 08:18

Bom dia pessoal.
Desculpe a demora, mas fiquei extremamente ocupado nessas últimas horas.
A boa notícia é que consegui o meu intento.
Fiquei estudando e questionando porque o código do Andre que deveria estar funcionando corretamente não estava.

Então descobri que o problema estava na linha do 'printf'. Percebi de pronto que alterando o valor do "%LU"para combinar alguns dígitos e também acrescentando e arbitrando valores a variavel 'valor' na mesma linha do printf, finalmente consegui que o contador do B5 funcionasse. Porém os valores do contador iniciavam com um offset de 10 em todos os 'cases'. Ex. 1010, 1510, etc. Então estipulei 'valor-10' na linha e tudo se resolveu. Quando finalmente comprovei que estava funcionando corretamente, parti para o intento de fazer com que o pino B6 atuasse como decremento de 15 unidades. Copiei as instruções correspondentes, compilei e quando fui testar, vi que apesar do decremento estar funcionando corretamente, o valor inicial do case 1 por exemplo não era mais '1000' e sim '1521'. Os outros cases também estavam com offset de +521. Então realizei o mesmo procedimento descrito anteriormente e escrevi na linha 'valor-531". E tudo se resolveu.
Só que no decremento de 15, ao invés de mostrar 985, o display está mostrando 1085. E assim procede com os outros cases, ou seja com decremento somente nas duas últimas casas (unidade e dezena) e mantendo centena e milhar inalterados.

Estou disponibilizando o código abaixo para que os experts andre e ze me expliquem porque tive que utilizar um offset de -10 no primeiro caso para o incremento de B5 e de -531 no segundo caso para o decremento de B6. De onde o compilador 'tirou' esses valores que iniciaram no simulador do PROTEUS, pois não consigo ver nenhuma pista no código escrito que referencie a esses valores? E como fazer para que de 1000-15 ele vá para 985 e não para 1085 (case 1), 1500-15=1485 e não 1585 (case 2), etc.?
Abçs e muito obrigado.

Código: Selecionar todos
   #include <hung1.h>
    #include <button.c>
    #include <LCD.C>
    #define LCD_ENABLE_PIN PIN_D0
    #define LCD_RS_PIN PIN_D1
    #define LCD_RW_PIN PIN_D2
    #define LCD_DATA4 PIN_D4
    #define LCD_DATA5 PIN_D5
    #define LCD_DATA6 PIN_D6
    #define LCD_DATA7 PIN_D7
 
    #include <lcd.c>
    #int_rb
 
    INT1 SW1;
    INT1 SW2;
    INT1 SW3;
     
    BOOLEAN ISPRESSED_KEY1=FALSE;       // Boolean logic=0;
    BOOLEAN ISPRESSED_KEY2=FALSE;       // Boolean logic=0;
    BOOLEAN ISPRESSED_KEY3=FALSE;       // Boolean logic=0;
 
    void main()
        {
        port_B_pullups(0xFF);
        setup_adc_ports(AN0);
        lcd_init();
       
        int8 cont;
        cont = 0;
        Int16 valor;
       
        while (true)
            {
            SW1=INPUT(PIN_B4);            // Positive inputs
            SW2=INPUT(PIN_B5);
            SW3=INPUT(PIN_B6);
           
            SET_ADC_CHANNEL(0);     // INPUT AN0
            DELAY_MS(10);
               
            if ( (SW1 && !ISPRESSED_KEY1) || (SW2 && !ISPRESSED_KEY2) || (SW3 && !ISPRESSED_KEY3) )
                {
                DELAY_MS(10);
           
            if ( (SW1 && !ISPRESSED_KEY1) ) // redefine valores padrão: 1000,2500,15000
                 {
           
            if(++cont >= 4) cont = 1;
                   
                 ISPRESSED_KEY1=TRUE ;
                 }
                   
            if ( (SW2 && !ISPRESSED_KEY2) ) // incrementa valor padrao em passos de 10 unidades
                 {
                   
                 valor+=10;
                 ISPRESSED_KEY2=TRUE;
                   
                 }
                   
            if ( (SW3 && !ISPRESSED_KEY3) ) // incrementa valor padrao em passos de 10 unidades
                 {
                   
                    valor-=15;
                    ISPRESSED_KEY3=TRUE;
                   
                 }
                     
                switch(cont)
               
                 {
                 
                   
                case 1:
                       
                if ( ISPRESSED_KEY1 ) 
                   lcd_putc("\fTEXTO1");
                   lcd_gotoxy(7,2);
                if ( ISPRESSED_KEY2 )
                   printf(lcd_putc," 1%03LU ",valor-531);
                   
                break;
                   
                    case 2:
                     
                       if ( ISPRESSED_KEY1 )
                       lcd_putc("\fTEXTO2");
                       lcd_gotoxy(7,2);
                       printf(lcd_putc," 25%02LU ",valor-531);
                     
                     
                       
                    break;
                           
                    case 3:
                   
                       if ( ISPRESSED_KEY1 )
                       printf(lcd_putc,"\f");
                       lcd_gotoxy(2,1);
                       lcd_putc("TEXTO3");
                       lcd_gotoxy(7,2);
                       printf(lcd_putc," 15%03LU ",valor-531);
                     
                       break;
                    }
                 
                       delay_ms(10);  // Required for button() function
                }
                 
                       if (!SW1) ISPRESSED_KEY1=FALSE;         // This line must be here
           
                       if (!SW2) ISPRESSED_KEY2=FALSE;
           
                       if (!SW3) ISPRESSED_KEY3=FALSE;
                       
            }
        }



picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor ze » 24 Dez 2014 11:56

o printf deve estar mantendo o dígito da conta anterior. Como disse, print-lcd: não sou padrinho deste matrimônio . Experimente apagar display antes de printf ' ar. Ou aguarde uma boa alma te orientar como formatar o printf
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Código correto CCS Compiler

Mensagempor andre_luis » 24 Dez 2014 14:13

picman62,


Não estou muito confortável com a solução de contorno que voce adotou em subtrair valores inicialmente da variável de saída do Display. Acredito que uma das provaveis causas do problema pode ser devido não ao programa, mas ao circtuito. Em outras palavras, pode ser que ao ressetar a placa, o uC esteja lendo a entrada digital antes mesmo de sua voltagem ter sido estabilizada pelo barramento VCC. Se pudesse mostrar o circuito aqui certamente não resolveria, mas ajudaria.

Também, conforme sugeri antes, voce terá de monitorar o funcionamento do programa atravéz do LED de Debug mencionado anteriormente, pois somente voce tem acesso ao circuito físico, ou mesmo á simulação no Proteus. A utilização desse recurso ( o LED de Debug ) é algo bastante comum, e se tiver uma saída de UART, pode simplificar mais ainda, pois poderia inclusive enviar por ela o valor real da variável valor, antes mesmo da sua formatação pelo printf.

Quanto á questão da formatação, é algo que podemos fazer tranquilo, mas primeiro temos de conhecer exatamente a origem do problema, que nesse momento não sabemos em qual linha está ocorrendo.
"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: Código correto CCS Compiler

Mensagempor picman62 » 24 Dez 2014 19:09

ze: pode me dar detalhes de como 'apagar' o display como menciona?

Andre: Estou anexando o PDF do esquema. Não creio que esse problema esteja relacionado com o circuito como voce diz. Mas posso estar errado.
Gostaria de saber de onde saiu o valor de -531 para o contador funcionar certo. O fato é que descobri que só o 'case 1' com 1000 funciona corretamente. Ou seja, quando decrementa 15 ela cai para 985. Os dois outros cases não funcionam corretamente no decremento.
Você não está autorizado a ver ou baixar esse anexo.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor picman62 » 25 Dez 2014 16:24

Ok, aparentemente consegui.
Abaixo está o código que reescrevi para permitir que funcionasse. As variáveis 'valor=x' travavam o display e não havia mudança alguma se colocadas dentro dos 'cases'. A solução que encontrei foi fazer tres 'if (cont>=1, 2, etc.) valor= 5000, 8000, 15000, etc. (valores que arbitrei).
Gostaria da opinião do Andre e do ZE sobre o novo código reescrito.
Apenas ainda permance um problema. Quando o display é inicializado, ele inicia com 5531, depois vou apertando B4 para toggle (mudança) dos textos e quando o último texto que contem contador de 15000 é exibio e retorna ao texto 1, o valor correto de 5000 aparece. Porque sempre que o simulador inicia o display mostra 5531 e não 5000?
Alguém consegue me responder?
Continuo agradecendo muito a ajuda de voces.

Código: Selecionar todos

   int8 cont;
   cont = 0;
   Int16 valor;
           
   while (true)
   {
   SW1=INPUT(PIN_B4); // Positive inputs
   SW2=INPUT(PIN_B5);
   SW3=INPUT(PIN_B6);
               
   SET_ADC_CHANNEL(0);     // INPUT AN0
   DELAY_MS(10);
                   
   if ( (SW1 && !ISPRESSED_KEY1) || (SW2 && !ISPRESSED_KEY2) || (SW3 && !ISPRESSED_KEY3) )
   {
   DELAY_MS(10);
               
   if ( (SW1 && !ISPRESSED_KEY1) ) // redefine valores padrão: 1000,2500,15000

   {
   
   if(cont >= 1) valor=8000;
   if(cont >= 2) valor=15000;
   if(cont >= 4) valor=5000;
   
   if(++cont >= 5) cont = 1;
   
 
   ISPRESSED_KEY1=TRUE ;
   
   
   }
   
   
   if ( (SW2 && !ISPRESSED_KEY2) ) // incrementa valor padrao em passos de 10 unidades
   {
             
   ISPRESSED_KEY2=TRUE;
 
   valor+=10;                   
   }
                       
   if ( (SW3 && !ISPRESSED_KEY3) ) // incrementa valor padrao em passos de 10 unidades
   {
                       
   valor-=15;
   ISPRESSED_KEY3=TRUE;
                       
   }
                         
   switch(cont)
                   
   {
            case 1:
         
            if ( ISPRESSED_KEY1 )
               printf(lcd_putc,"\f");
               lcd_gotoxy(2,1);
               lcd_putc("TEXTO1");
               lcd_gotoxy(7,2);
               printf(lcd_putc," %04LU ",valor);
                   
               break;
                       
            case 2:
                           
            if ( ISPRESSED_KEY1 )
               printf(lcd_putc,"\f");
               lcd_gotoxy(2,1);
               lcd_putc("TEXTO2");
               lcd_gotoxy(7,2);
               printf(lcd_putc," %04LU ",valor);
                         
               break;
                       
                                 
            case 3:
                         
            if ( ISPRESSED_KEY1 )
               printf(lcd_putc,"\f");
               lcd_gotoxy(2,1);
               lcd_putc("TEXTO3");
               lcd_gotoxy(7,2);
               printf(lcd_putc," %05LU ",valor);
                         
               break;
                           
               case 4:
                           
               if ( ISPRESSED_KEY1 )
               printf(lcd_putc,"\f");
               lcd_gotoxy(3,1);
               lcd_putc("BATTERY FULL");
                         
               break;
              }
                     
               delay_ms(10);  // Required for button() function
                    }
               
               if (!SW1) ISPRESSED_KEY1=FALSE;         // This line must be here
               
               if (!SW2) ISPRESSED_KEY2=FALSE;
               
               if (!SW3) ISPRESSED_KEY3=FALSE;
               
                }
                     
                }
           
            }
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 25 Dez 2014 16:55

picman62,


Fico satisfeito que o programa esteja eveluindo, entretanto reforço a sugestão que fiz anteriormente, de tentar descobrir a causa-raiz do problema, ao invéz de cair na tentação de fazer remendos, que podem até resolver, mas voce deixa de aprender a saber como evitar repetir esse mesmo problema numa outra vez. Ou seja, é necessário debugar o programa original ( limpo, sem o if "solução de contorno" que voce fez ).

Por exemplo, eu tinha curiosidade de saber se o valor de SW1, SW2 e SW3 são TRUE ou FALSE quando a chave está na posição de "repouso", e pra isso teria de usar o tal LED que mencionei anteriormente, mas que não tenho certeza se voce o está usando, já que não vi qualquer linha de código referente á isso na ultima versão do programa acima.

Bom, em princípio, nao consegui enxergar nada que sugerisse ser o motivo do problema, mas acredito que uma possibilidade possa ser a lógica positiva das chaves - em VCC como padrão - pode estar fazendo serem acionadas sempre no início, mas uma tentativa ( digamos, ás cegas ) seria inverter o valor inicial das seguintes vairaveis, de FALSE para TRUE, conforme abaixo:

cpp code
ISPRESSED_KEY1=TRUE; // estava como FALSE na versão original
ISPRESSED_KEY2=TRUE; // estava como FALSE na versão original
ISPRESSED_KEY3=TRUE; // estava como FALSE na versão original


Recomendo usar o programa original pra não perder o fio da meada...
"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: Código correto CCS Compiler

Mensagempor picman62 » 25 Dez 2014 21:44

Boa noite Andre.
Não houve nenhuma mudança quando troquei os 'FALSE' pelos 'TRUE'.
Em vista disso, deixei no 'FALSE' mesmo.
Voce olhou o esquema que postei?
Em relação aos LEDS, amanhã vou fazer o que me instruiu e posto o resultado.
Pelo que entendi, então posso evitar os 'ifs' que criei? Mas como fazer para ter os mesmos resultados?

Obrigado pela atenção.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor picman62 » 25 Dez 2014 21:59

Andre, consegui resolver. Bastou só um simples 'valor=5000' antes daqueles ifs e deu certo. Não sei porque quando inicializava aparecia 5531, mas bastou formalizar o valor inicial que agora o valor de 5000 está normalizado. Veja abaixo.

Código: Selecionar todos

if ( (SW1 && !ISPRESSED_KEY1) ) // redefine valores padrão: 1000,2500,15000

   {
    valor=5000;
   if(cont >= 1) valor=8700;
   if(cont >= 2) valor=12800;
   if(cont >= 4) valor=5000;
   
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 26 Dez 2014 07:27

Claro, isso tava na nossa cara o tempo todo e não haviamos percebido antes...

A variável valor não estava sendo inicializada com valor algum após o reset, e por estar provavelmente na mesma posição da RAM do uC, devia estar pegando o último valor da execução anterior. Repare que na inicialização foi feito apenas Int16 valor; quando poderia ter sido feito Int16 valor=5000;. Ou seja, enquanto voce não apertasse qualquer botão, não passaria pelo if e portanto não seria atribuido qualquer valor á essa variável, e o Display apresentaria qualquer lixo que estivesse nela.

Enfim, que bom que está resolvido.
"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: Código correto CCS Compiler

Mensagempor picman62 » 26 Dez 2014 11:57

Andre, gostaria de muito te agradecer novamente, porque sem a sua ajuda e do ZE, eu não teria conseguido. Aliás a estrutura do código é sua. Só acrescentei algumas coisas.

O que pretendo com a programação desse PIC é que ele envie pulsos de frequencia em PWM pelo pino 17 (RC2/CCP1) e receba frequencias como um receptor ou contador de frequências pelo pino 15(RC0). Vou conectar um buzzer no pino 16 (RC1/CCP2) de modo que quando uma dada frequencia de interesse entrar pelo pino 15, o buzzer dispare com alertas.

Já comecei a programar a resposta do buzzer, quando o circuito é inicializado. Ele dá um beep durante aprox. 1 segundo seguido de 3 beeps curtos de 50ms. A medida que a atividade no display do LCD está sendo inicializada.
Já que voce tem muito mais conhecimento do que eu que ainda estou iniciando nisso, gostaria que voce desse uma olhada na programação que fiz para o que descrevi acima acontecer. Como não tem como fazer o simulador do proteus emitir sons, estou utilizando um LED para simular o comportamento do buzzer. Toda a programação até agora consumiu 26% de RAM. Ainda falta programar o PWM com descrevi, portanto, gostaria de saber se na sua opinião essas linhas de programação do led(buzzer) podem ser reduzidas para consumir menos memória ou se não vale a pena me importar com isso já que mais de 70% de espaço em RAM é mais do que suficiente para programar o resto das funções.

Código: Selecionar todos
  while(TRUE){
       
 
    int Cont;
    char load[16]; //atividade de barras
     {

   lcd_gotoxy(3,1);
   lcd_putc(" VER.1.0");// text of display
 
       output_high(pin_c1);
       delay_ms(800);              // sound beep
       output_low(pin_c1);        //  LED off
       delay_ms(2000);           //  waits 2 seconds
       
   }
   
   while(TRUE){
   Cont=0;
   
   while (Cont<16){
   load [Cont]=255;//atividade das barras
   
   Printf(lcd_putc,"\n%s",load,);
   Cont++;
 
   delay_ms(100); //bargraph
   }
   output_high(pin_c1);
       delay_ms(50);              //three short beeps for init
       output_low(pin_c1);       
       delay_ms(50);               
       output_high(pin_c1);
       delay_ms(50);             
       output_low(pin_c1);       
       delay_ms(50);               
       output_high(pin_c1);
       delay_ms(50);             
       output_low(pin_c1);       
       delay_ms(50);             
   


E por último, gostaria de saber como proceder para escrever o código que me dê o aviso de 'low battery' no display. Se voce olhar o esquema, há dois resistores, sendo um trimpot agindo como divisores entrando pelo pino RA0. Se a tensão abaixar a menos de 2.5V, então gostaria que aparecesse no display: 'LOW BATT'. Se voce lembrar, os textos rolam na inicialização sendo que o último é o 'BATTERY FULL', mas se inicializar e a bateria estiver baixa, deve aparecer 'LOW BATT', ou mesmo aparecer a qualquer momento que a tensão cair abaixo de 2.5v. Como fazer?
Agradeço imensamente novamente.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 26 Dez 2014 12:48

picman62,



Eu não se preocuparia com a RAM, por enquanto parece administrável, sem necessidade ainda de qualquer otimização.

Olha, a quantidade de Delays inseridos no seu programa já está começando a crescer demais, e isso mais cedo ou mais tarde vai causar problemas, mas essa questão podemos tratar depois.

Quanto á usar as 2 funcionalidades simultaneamente, tanto de PWM (CCP1) como de COUNTER (CCP2), posso estar enganado já que faz tempo que não mexo com Microchip, mas acho que não vai funcionar, pois ambos módulos utilizam o TIMER1, de modo que essas operações terão de ser exclusivas, ora um, ora outra.

Já a leitura da bateria, voce não acha que seria melhor trabalhar com o comparador analógico referenciado ao 2,5v ao invez do conversor A/D ? Utiliza as mesmas entradas analogicas que estão disponíveis no seu circuito RA0-4. Digo isso porque com essa opção voce não terá de fazer a coisa em 2 fases, que é iniciar a conversão e depois ler o valor convertido. Mas caso prefira com A/D, podemos ir fazendo assim.
"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: Código correto CCS Compiler

Mensagempor picman62 » 26 Dez 2014 13:51

andre_teprom escreveu:Olha, a quantidade de Delays inseridos no seu programa já está começando a crescer demais, e isso mais cedo ou mais tarde vai causar problemas, mas essa questão podemos tratar depois.

É mesmo? Quais seriam?

Quanto á usar as 2 funcionalidades simultaneamente, tanto de PWM (CCP1) como de COUNTER (CCP2), posso estar enganado já que faz tempo que não mexo com Microchip, mas acho que não vai funcionar, pois ambos módulos utilizam o TIMER1, de modo que essas operações terão de ser exclusivas, ora um, ora outra.

Perfeito. Obrigado pela explicação, mas graças a Deus, é isso mesmo que pretendo. Vou enviar trem de pulsos curtos, parar e no intervalo o receptor(contador) é acionado para receber a resposta.

quanto a leitura da bateria, voce não acha que seria melhor trabalhar com o comparador analógico referenciado ao 2,5v ao invez do conversor A/D ? Utiliza as mesmas entradas analogicas que estão disponíveis no seu circuito RA0-4. Digo isso porque com essa opção voce não terá de fazer a coisa em 2 fases, que é iniciar a conversão e depois ler o valor convertido. Mas caso prefira com A/D, podemos ir fazendo assim.

Mestre Andre, estou nas suas valiosas mãos. Se voce acha melhor pelo comparador analógico, perfeito. Vamos lá. Como eu faço? I am a newbie. :D
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor ze » 26 Dez 2014 21:10

andré, chamou-te de mestre. arrumaste pra cabeça. kk. brinc amigo. Pena que tenho dificuldade em acompanhar o raciocínio dos ccszitas por isso perdão por não participar tanto.
voto que continue no ad por hora. é mais simples de entender. deixe o comparador pra daqui a pouco. é um pouco mais chatinho de configurar (pra mim, que gosto de acessar o hw direto). AD: P.ex. se está com 10 bits vai até 1023 se entrada=5V ok? Então pra 2.5V basta comparar if (adcread()<512)...e tal. capitastes? Enfim, tu decides.
Apesar do proteus gerar bip na placa de som, fizeste a escolha certa ao colocar led pra simplificar a vida
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Código correto CCS Compiler

Mensagempor picman62 » 26 Dez 2014 22:23

Obrigado pela dica ZE, mas o CCS compiler não reconhece 'adcread'. Tem que ser 'value = read_adc ()'
Mas não sei como formatar o código para que seja efetivo.
Por exemplo: Fiz

Código: Selecionar todos
 case 4:
                           
               if ( ISPRESSED_KEY1 )
               printf(lcd_putc,"\f");
               lcd_gotoxy(3,1);
               lcd_putc("BATTERY FULL");
               
               
             
               break;


O CCS compiler fornece um exemplo de código que é:
Código: Selecionar todos
setup_adc(  ADC_CLOCK_INTERNAL  );

setup_adc_ports( ALL_ANALOG );

set_adc_channel(1);

while ( input(PIN_B0) ) {

   delay_ms( 5000 );

   value = read_adc();

   printf("A/D value = %2x\n\r", value);

}

 


Como inserir da maneira correta esse código no 'case 4' de maneira que se a tensão for menor que 2.5v, apareça 'LOW BATTERY' e não BATTERY FULL? Já tentei algumas opções mas não está dando certo.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 27 Dez 2014 09:56

Coloca isso no cabeçalho do programa:
cpp code
#define           CANAL_VDC_BATERIA       1    // define canal AD para leitura do pino

Coloque esse trecho na inicialização, imediatamente antes do while (TRUE):
cpp code
setup_adc_ports( RA0_RA1_RA3_ANALOG )              ;
setup_adc( ADC_CLOCK_DIV_32 ) ;
set_adc_channel ( CANAL_VDC_BATERIA ) ;
int ValorBateria = 0 ;
Delay_ms(1) ;
read_adc ( ADC_START_ONLY ) ; // garante que na primeira passada do case, já terá uma conversão comepleta
Delay_ms(1) ;

Em elgum case do mesmo switch:
cpp code
ValorBateria = read_adc ( ADC_READ_ONLY )  ; // le valor da conversão acima, após periodo suficiente
Delay_ms(1) ; // valor empírico, mas deve ajustado
read_adc ( ADC_START_ONLY ) ; // dispara início da conversão do AD para a proxima passada do case
valor = read_adc ; transfere para a variavel do Display o valor convertido


OBS:
  • Utilizei CCS 3.2xx, mas não sei se tem diverrença a cada nova versão.
  • Esses valores utilizei para um PIC16F877A rodando com um cristal de 20MHz.
  • Suponho que voce esteja utilizando o header padrão 16F877.h, caso contrário algumas constantes acima não serão reconhecidas, gerando erro de compilação.
"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

AnteriorPróximo

Voltar para PIC

Quem está online

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

x