Código correto CCS Compiler

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Re: Código correto CCS Compiler

Mensagempor ze » 27 Dez 2014 10:27

de novo, esquecei de dizer que ctrl-c ctrl-v não dá certo
vc pode tentar algo assim
Código: Selecionar todos
case 4:
                           
               if ( ISPRESSED_KEY1 )
               printf(lcd_putc,"\f");
               lcd_gotoxy(3,1);
                value = read_adc();
               if (value>512)
               lcd_putc("BATTERY FULL");
               else
               lcd_putc("bateria baixa");
           
               break;

depois de entender, vc pode melhorar criando algum tipo de histerese pra não ficar oscilando pra quando tiver exatos 512
Código: Selecionar todos
if (value>550) lcd_putc("BATTERY FULL");
else if (value<490) lcd_putc("bateria baixa)");
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Código correto CCS Compiler

Mensagempor picman62 » 27 Dez 2014 11:54

Andre, muito obrigado pelo código. Gostaria que visse abaixo se coloquei os strings nos lugares certos. Mas não vi menção ao valor mínimo que deve ser considerado para 'bateria baixa'. Arrumei desse jeito, mas não funcionou. Veja o que acha:
Código: Selecionar todos
void main()
{
   output_drive(PIN_c1); //Makes pin C3 output
 
 
   setup_adc_ports( ALL_ANALOG );
   setup_adc(  ADC_CLOCK_INTERNAL  );

   set_adc_channel(0);
   port_B_pullups(0xFF);
   setup_adc_ports(AN0);
   lcd_init();

   lcd_init();

    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;
     
  setup_adc_ports( RA0_RA1_RA3_ANALOG );
  setup_adc( ADC_CLOCK_DIV_32 );
  set_adc_channel ( CANAL_VDC_BATERIA ) ;
    UNSIGNED INT valor, min;
    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) ;   
           
    while(TRUE){
       ...

 case 4:
             
             if ( ISPRESSED_KEY1 )
             
                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
             
                min=128;
             if (valor<=min)
                printf(lcd_putc,"\f");
                lcd_putc("LOW BATTERY");
             
           
             if(valor>min) 
                printf(lcd_putc,"\f");
                lcd_putc("BATTERY FULL");
             
               break;
              }
                     
               delay_ms(10);  // Required for button() function
                    }
               


Antes de tudo devo mencionar que estou seguindo o esquema original do circuito que não é meu. De acordo com este, estou utilizando um divisor de resistores na entrada de A0. O resistor variável tem 5K e o fixo tem 2k2. A tensão chega direto do IN do regulador até a entrada de A0, portanto, 9V. O esquema original possui o resistor variável de 5K, setado em 3.5K, isso no simulador do PROTEUS com o probe ligado, dá 2.7 V. Há uma anotação no esquema em que nessa entrada está mencionado: 'máximo de 2.5 V''. Portanto me leva a crer que a tensão de entrada no pino A0 é 2.5V e se cair abaixo disso é considerado nivel baixo de bateria. É isso que voces também entendem ou não?
O fato é que se no simulador, eu aumentar o valor do trimpot para 100%, a tensão fica em 2.51V. Portanto, ainda acima de 2.5V e também acima do valor estipulado para 'bateria baixa'. Então não estou bem certo de qual valor de tensão efetiva seria considerado como 'bateria baixa' na entrada de A0.

Pouco antes de ler a sua mensagem, estava testando um código que fiz baseado no que o ZE disse sobre a tensão em relação ao bits.
O ZE passou o valor de 512 bits para 2.5V. Testei e não houve mudança. Então lembrei do detalhe dos 9V e coloquei 128 ao invés de 512. Aí funcionou. Quando elevo o valor do trimpot para quase 100% , a tensão é quase 2.5V e o display mostra LOW BATTERY. Quando faço o contrário e reduzo a resistência para pouco mais de 5% a tensão sobe e o display do LCD mostra BATTERY FULL. Mas não sei afinal qual a tensão correta que deve ser considerada como 'low battery'. Além disso, há um 'lixo' que ainda não consigo limpar nem printf nem com \f. A condição de bateria baixa, aparece 'LOW BATTERYBATT'. Não consigo limpar isso.
Eis o código que se ainda não sei se é a maneira correta de fazer, pelo menos está produzindo uma mudança o display quando o valor do trimpot é alterado. O que acham?
Código: Selecionar todos
 int8 cont;
   cont = 0;
   Int16 valor;
   unsigned int8 value, min;
 
  case 4:
             
             if ( ISPRESSED_KEY1 )
               
                min=128;
                value = read_adc();                 // Built-in A/D read function
           
             if (value<=min)
               
                printf(lcd_putc,"\f");
                lcd_putc("LOW BATTERY");
             
             if (value>min)
               
                printf(lcd_putc,"\f");
                lcd_putc("BATTERY FULL");
             
               break;
              }
                     
               delay_ms(10);  // Required for button() function
                    }
               
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor picman62 » 27 Dez 2014 12:07

ze escreveu:de novo, esquecei de dizer que ctrl-c ctrl-v não dá certo
vc pode tentar algo assim
Código: Selecionar todos
case 4:
                           
               if ( ISPRESSED_KEY1 )
               printf(lcd_putc,"\f");
               lcd_gotoxy(3,1);
                value = read_adc();
               if (value>512)
               lcd_putc("BATTERY FULL");
               else
               lcd_putc("bateria baixa");
           
               break;

depois de entender, vc pode melhorar criando algum tipo de histerese pra não ficar oscilando pra quando tiver exatos 512
Código: Selecionar todos
if (value>550) lcd_putc("BATTERY FULL");
else if (value<490) lcd_putc("bateria baixa)");


Valeu ZE, funcionou!
Agora não tenho mais o lixo mencionado acima.

Mas tive que usar 128. Com 512, não funcionou e veio um aviso do compilador:
'variable of this data type never is greater than this constant'
. Será que é porque defini: 'unsigned int8 value, min;' ?
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 27 Dez 2014 13:01

Não conheço esses tipos int8 ou int16, já que sempre usei apenas char ou int, mas suponho pela lógica que devam ser de magnitudes respectivamente de 8 ou 16 bits. Nesse caso, o Warning acima é perfeitamente explicaval pelo fato da variavel value ter sido declarado como int8 jamais irá atingir um valor superior á 255, mas voce comparou com 550.

Atenção:
Cuidado que voce agora possui 2 variáveis com nomes parecidos no mesmo programa: Value e valor, sendo cada uma de tipos diferentes. Sugiro renomear, atribuindo nomes mais descritivos das suas funções, como : ValorDeXXX, ValorDeYYY, etc...
"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 » 27 Dez 2014 13:44

Perfeito Andre. Descobri isso agora mesmo quando percebi que a INT que declarei é 8 bits e tem valor máximo de 255. Por isso, nada acontece se colocar value=512 ou mesmo value=255. Então 128 equivale a 5V. No momento a mensagem de bateria baixa se dá com menos de 5V e bateria carregada com mais de 5V. Então voce acha que devo colocar value=64 que seria o equivalente a 2.5V na entrada de A0?

E tem razão. Vou alterar valor e value como sugeriu.
Aproveito para externar a minha gratidão a voce e ao ZE que fazem desse forum um espetacular mecanismo de ajuda no assunto. Parabéns.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor picman62 » 27 Dez 2014 14:41

Fiz com value=64 e realmente o valor para acusar bateria baixa caiu para ao redor de 2.8V. Só que chega a um momento que ele não baixa mais do que 2.76V, mesmo que value<4. Impressionante. Porque será? Se o valor=128 dava 5V porque 64 não dá 2.5V?
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 27 Dez 2014 15:10

picman62 escreveu:Porque será? Se o valor=128 dava 5V porque 64 não dá 2.5V?


Verifica as entradas de REFerencias Positiva e Negativa do conversor A/D, pra ver se estão alimentadas.
Não lembro se por default essas entrdas deveriam ser o VCC e GND digital ou nã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

Re: Código correto CCS Compiler

Mensagempor picman62 » 27 Dez 2014 16:28

Andre,
Não sei se entendi bem o que quis dizer. As tensões de referencia são do RA5 e do RA4. Não estão alimentadas. Coloquei o multimetro virtual lá e mostrava 0V. Então alimentei e não houve mudança alguma. É isso o que voce quis saber?

O interessante é que comprovei que abaixo de value=50, não há mais mudança de tensão para ser reconhecido como 'low battery'. Ou seja, o limite para ser 'full battery' é 2.78V. Abaixo disso é sempre 'low battery'' mesmo que reduza de value=50 para value=4 por exemplo, não muda mais.
Gostaria de saber porque está acontecendo isso, já que value=64 daria 2.5v.e esse valor ainda seria full battery. Mas mesmo 2.76v é considerado 'low battery''. Mistério...

Código: Selecionar todos
    case 4:
                         
            if ( ISPRESSED_KEY1 )
               printf(lcd_putc,"\f");
               lcd_gotoxy(3,1);
               value_batt = read_adc();
               
            if (value_batt>50)
               lcd_putc("BATTERY FULL");
           
            else
         
               lcd_putc("LOW BATTERY");
           
       
             
               break;
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 27 Dez 2014 17:47

picman62 escreveu:O interessante é que comprovei que abaixo de value=50, não há mais mudança de tensão para ser reconhecido como 'low battery'
picman62 escreveu:Abaixo disso é sempre 'low battery'' mesmo que reduza de value=50 para value=4 por exemplo, não muda mais. Gostaria de saber porque está acontecendo isso


Mas não é exatamente isso que voce está determinando na condição abaixo ?

cpp code
if (value_batt>50)
lcd_putc("BATTERY FULL");
else
lcd_putc("LOW BATTERY");
"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 » 27 Dez 2014 19:10

Desculpe, acho que não expliquei direito. O que quis dizer é que com value=128, a coisa funcionou certo, pois 5.2V foi considerado 'bateria carregada' e 4.9V foi considerado 'low battery'. Assim sendo, o value=64 corresponderia a 2.5v, então qualquer valor abaixo de 64 corresponderia a menos de 2.5v, correto? Pois isso não acontece. Mesmo com valor=50, ou até mesmo 4, a tensão de 2.78V é considerada 'low battery'. Esse valor fica fixo e não decresce mais. Ou seja, não consigo determinar 2.6V por exemplo como 'bateria carregada'.Não sei o que está havendo.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor ze » 27 Dez 2014 22:02

que tal se vc postar o esquema? realmente falamos linguas um pouco diferentes e tenho a impressão que vc queimou a etapa do pisca led. mas enfim...

Outra coisa (chute) o compilador pode estar se perdendo entre signed e unsigned char p.ex.

Tem como vc ver as variáveis no proteus. Carregue o .cof (se o compilador gerar) no lugar do .hex. Ao pausar vc tem acesso ao fonte, variaveis e etc no debug
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Código correto CCS Compiler

Mensagempor picman62 » 28 Dez 2014 10:52

ze escreveu:que tal se vc postar o esquema? realmente falamos linguas um pouco diferentes e tenho a impressão que vc queimou a etapa do pisca led. mas enfim...

Outra coisa (chute) o compilador pode estar se perdendo entre signed e unsigned char p.ex.

Tem como vc ver as variáveis no proteus. Carregue o .cof (se o compilador gerar) no lugar do .hex. Ao pausar vc tem acesso ao fonte, variaveis e etc no debug


Bom dia ZE.
Bem, consegui resolver o problema.
Criei uma INT value_batt. Essa int é de 8 bits, ou seja, valor de 0 a 255 certo? Bom, percebi que o resistor de 2k2 do esquema original não permitia chegar ao valor de 'low battery' porque no máximo o valor da tensão só caía até 2.51V com 100% do trimpot. Então baixei o valor do resistor para 1k5 para que eu finalmente pudesse testar os valores para full batt e low batt. E finalmente cheguei ao valor de 150 que me permitiu declarar 'low batt' qualquer valor de tensão abaixo disso. Com tensão de 2.44V ainda é full bat. Já com 2.42V já é low batt. Depois foi só recolocar o valor original de 2k2 no resistor e ficar tranquilo quanto ao valor de tensão de full battery para mais de 2.5V.

Mas como sou um pentelho perfeccionista, e novato em programação e metido a besta, pensei em melhorar esse medidor de bateria de forma que pudesse ter um controle maior do real estado da bateria. Então o que fiz? Delimitei o valor de 2.42V para não mais ser battery low e sim battery half. De modo que só abaixo de um valor de value_batt de digamos, 120, fosse indicado baterry low.
No entanto deu pau. Fiz o full ser x>150, o half ser <=150 e o low <=120. Acontece que agora, quando vai a 2.42V, ele marca battery half, ok, mas quando cai mais para bem menos de 2.1v, até 1.2v, ele ao invés de marcar 'low battery', marca FULL!

Sei que deve ser um erro idiota de limites de valores, mas confesso que já tentei várias formas de escrever isso e continua não funcionando. Meu Deus, onde foi que eu errei?
Abaixo o código pra voce dar uma olhada e com certeza vai matar de primeira, mas a besta aqui ainda não achou o erro.
Quanto ao esquema, já havia postado, mas estou anexando de novo. Obrigado pela ajuda amigo.
Código: Selecionar todos
 case 4:
               set_adc_channel(0); 
               value_batt = read_adc();
             
            if ( ISPRESSED_KEY1 )
               printf(lcd_putc,"\f");
               lcd_gotoxy(3,1);
               
            if (value_batt>150)
               lcd_putc("BATTERY FULL");
               
            if (value_batt <=150)
               lcd_putc("BATTERY HALF");
             
           
            if (value_batt <=120)
               lcd_putc("BATTERY LOW");
           
           
               break;
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 andre_luis » 28 Dez 2014 11:20

Como informei numa postagem anterior, um dos requisitos do A/D é a necessidade de um tempo para a conversão, e nesse caso acho que voce não está esperando. Testa um delay entre os comandos acima:

cpp code
set_adc_channel(0);  
Delay_ms ( xxxx ) ; // VALOR EMPIRICO - VOCE NAO DEU TEMPO PARA CONVERSAO
value_batt = read_adc();


Confere também se isso aí acima que voce fez está realmente correto, pois a sequencia que sugeri antes ( e que já usei, e que funcionou ) foi a seguinte:

cpp code
set_adc_channel ( CANAL_ESCOLHIDO ) ;
Delay_ms ( xxxx ) ; // VALOR EMPIRICO
read_adc ( ADC_START_ONLY ) ; // comando para iniciar a conversão
Delay_ms ( xxxx ) ; // VALOR EMPIRICO ;
ValorBateria = read_adc ( ADC_READ_ONLY ) ; // conando para ler a conversão completa
"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 » 28 Dez 2014 11:52

Bom dia Andre.
Apesar de no valor mínimo (1.9v) não aparecer mais 'full Battery', Infelizmente não funcionou como esperado. Aparece 'battery halfBA', com esse final que inclui um lixo do outro texto. Testei tanto o primeiro quanto o segundo caso. Usei delays de 100ms.
Ao que parece o battery low está sendo 'bypasseado' e só os dois primeiros textos aparecem.
picman62
Nibble
 
Mensagens: 53
Registrado em: 21 Dez 2014 08:40

Re: Código correto CCS Compiler

Mensagempor andre_luis » 28 Dez 2014 14:18

picman62 escreveu:Criei uma INT value_batt. Essa int é de 8 bits, ou seja, valor de 0 a 255 certo?


Não conheço bem esse tipo INT que voce usou, mas apenas o char ( 8 bits ) e o int ( 16 bits ), em se tratando do CCS rodando num PIC da família 16F. Não tenho certeza, mas acho que o Ze já comentou algo sobre o fato de voce não estar usando unsigned.

Isso significa que um tipo de magnitude de 8 bits, iria assumir valores de -127 até 128, ou seja, o valor de "150" seria entendido como um valor negativo ( na verdade, seria -106 = (-1)*|256-150+1| ).

Resumindo, se não for utilizar valores negativos, passe a utilizar apenas variaveis do tipo unsigned.
"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

cron

x