Ir ao conteúdo
  • Cadastre-se

código correto


Posts recomendados

Fiz um programa com ccs , para o pic 12F683 , para monitorar uma bateria de 12 V, 7A.

Gostaria que alguém olhasse o código e me orientasse  o que devo melhorar futuramente para os programas que farei  no futuro .

Aceito dicas sugestões e críticas , quero  melhorar nessa área.

#include <12F683.h>
#FUSES NOWDT                    
#FUSES NOMCLR                   
#FUSES NOBROWNOUT 
#FUSES PROTECT

#use delay(internal=4MHz)

#device ADC=10

float analogico;

void main()
{
   setup_adc_ports(sAN0);
   setup_adc(ADC_CLOCK_INTERNAL);

   while(TRUE)
   {
      set_adc_channel (0);//configura qual entrada analógica será lida
      delay_us(10);//tempo para a seleção
      analogico = read_adc();//leitura da entrada analógica
      
      if(analogico >=660)
         {
            output_high(pin_a5);
            output_low(pin_a4);  
         }      
      if(analogico < 660)
         {
            output_high(pin_a4);
            output_low(pin_a5);      
         }
      delay_ms(100);   
   }

}

Imagem do circuito no Proteus

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

ok, vejamos...

-não use float. Este usa muita memória e recurso computacional do mc pois ocupa 32 bits ou 4 bytes. No caso do adc nem precisa: ele usa 10 bits = 2 bytes máximo.

 

-No caso dá no mesmo mas use else

if (analogico>=660)\\ cuidado: quando for 6 a mais pode acontecer algo infernal
{faça_isso();}

else
{faça_aquilo();}

-e dê uma olhadela no datasheet e hw do mc. você não fica refém de rotinas prontas e o mais importante, expande seus horizontes

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

@Isadora Ferraz

OBRIGADO pela ajuda!

O programa no teste real não funcionou deveria ficar o led acesso na tensão de 13.8 v, porém ele fica acesso de 13.8 á 11.8 , tentei fazer  troca dos valores das variáveis e nada , não consigo achar o erro , usei duas fontes para testá-lo ,uma de 5 volts para alimentar o pic e outra de 13.8 para simular a bateria .Refiz o código  só não testei ainda :

#include <12F683.h>
#device ADC=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled

#use delay(internal=4000000)
#include <monitor5.h>
unsigned int 16 analogico ;

void main()
{
   setup_adc_ports(sAN0 | VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);

   while(TRUE)
   {
      SET_ADC_CHANNEL(0);
      delay_us(100);
      analogico = READ_ADC();
      delay_ms(10);
      
      
      /*leitura da bateria
      13,8V (1023) - completamente carregada
      13,7V a 12V (1022 - 880) carregada
      11,9V a 10V (880 - 770) carregada
      9,9V a 0V (770 - 0)descarregada carregando
      */
      
       if ( analogico == 1023)      // bateria carregada com 13.8 volts
         {
            output_high(pin_a5);
            output_low(pin_a4);
            output_low(pin_a2);
            output_low(pin_a1);            
         }
      else if (analogico < 1023 && analogico >= 880 )  //bateria carregada com 12 volts
         {
            output_high(pin_a4);
            output_low(pin_a5);
            output_low(pin_a2);
            output_low(pin_a1);
         }
      else if (analogico < 880  && analogico >= 770 ) // bateria funciona até 10 volts
         {
            output_high(pin_a2);
            output_low(pin_a1);
            output_low(pin_a5);
            output_low(pin_a4);
         }
      else if (analogico < 770 && analogico >= 0 ) // bateria descarregada
         {
            output_high(pin_a1);
            output_low(pin_a2);
            output_low(pin_a5);
            output_low(pin_a4);
         }
      
   }

}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Ok. Pode funcionar sim e pode ser melhorado. P.ex. 1023 é o limite do ad. Sugiro valor menor naquele if. Ou seja nem precisa do ==1023. Algo como >1000. E outra a bateria é considerada descarregada muito muito muito antes de atingir 0V ou seja nem precisa do >=0. Algo como 10.5V já pode ser considerada totalmente descarregada.

 

Este mc se tiver serial - se não, crie uma- , a dica é: envie o resultado do ad prum terminal, varie a tensão com um pot e anote o resultado pra você comparar. Pode ser até mesmo na simulação com proteus. Use voltímetro dele e tal.  Assim você trabalha com pé mais no chão. O resultado da prática deve ser 99.99% = ao da simulação.

Link para o comentário
Compartilhar em outros sites

Em 04/09/2017 às 09:11, Isadora Ferraz disse:

Ok. Pode funcionar sim e pode ser melhorado. P.ex. 1023 é o limite do ad. Sugiro valor menor naquele if. Ou seja nem precisa do ==1023. Algo como >1000. E outra a bateria é considerada descarregada muito muito muito antes de atingir 0V ou seja nem precisa do >=0. Algo como 10.5V já pode ser considerada totalmente descarregada.

 

Este mc se tiver serial - se não, crie uma- , a dica é: envie o resultado do ad prum terminal, varie a tensão com um pot e anote o resultado pra você comparar. Pode ser até mesmo na simulação com proteus. Use voltímetro dele e tal.  Assim você trabalha com pé mais no chão. O resultado da prática deve ser 99.99% = ao da simulação.

Obrigado consegui resolver , tirei o divisor de tensão e coloquei um pot. de 50k ,  ajustei para o sinal q entra no ad seja  no máximo igual a alimentação ,tá funcionando perfeitamente segui suas dicas para melhorar!

Muito obrigado mesmo!!!

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...