Ir ao conteúdo
  • Cadastre-se
Cristian Biasuz Lemos

Contador up down com pic em ccs ao pressionar um botão

Recommended Posts

Fala galera!

Estou com uma dificuldade, estou montando uma automação para uma maquina que que fabrica uma determinada peça, esta peça depois de pronta cai em uma esteira de transporte nesta esteira instalei um sensor infra-vermelho que cada vez que passa uma peça por ele aciona um relê e manda um pulso, até aí tudo certo, minha duvida vem agora, estou montando um controlador que dentre outras funções terá a seguinte: cada vez que receber este pulso (pino D0) vai incrementar 1 na variável X e imprimir o resultado no display de LCD e se uma peça estiver com defeito que for descartada ela passa por um segundo sensor ( pino D1) que vai decrementar 1 na variável e imprimir o resultado no display... Segue abaixo como estou fazendo ( só lembrando estou programando no PIC CCS )

#include <contador.h>
#include <flex_204A.c>
int X;
void main()
{
   lcd_init();
   delay_ms(50);
   output_high(pin_e2);
   lcd_gotoxy(5, 1);
   printf(lcd_putc,"QUANTIDADE:");
   

   while(TRUE)
   {
   if( input(pin_d0)==1)
      {delay_ms(200);
      if (input(pin_d0) ==1)
         X = X+1;
         lcd_gotoxy(7, 2);
         printf(lcd_putc,"        ");
         lcd_gotoxy(7, 2);
         printf(lcd_putc,"%d",X);
      }
   
   if( input(pin_d1)==1)
      {delay_ms(200);
      if (input(pin_d1) ==1)
         X = X-1;
         lcd_gotoxy(7, 2);
         printf(lcd_putc,"        ");
         lcd_gotoxy(7, 2);
         printf(lcd_putc,"%d",X);
      }
   
   
   }
   }

 

O LCD funciona perfeito, a incrementação e decrementação esta funcionando também o meu problema é que começa a contar 1,2,3,4....127 até o 127 conta normal quando soma mais uma peça ele passa para -128 e aí por diante,-127,-126,-125... até 0. Como esta maquina faz em torno de 1.000 peças por ciclo, não tenho como trabalhar assim. Provavelmente seja alguma coisa que estou fazendo errado, penso até que seja na declaração da variável, mas já tentei de tudo e nada deu certo...

PS: quando mudei a variável para float X e a impressão no display para %f deu certo, soma certo porém aparece 1.00,2.00,3.00...1000.00, como as peças são números inteiros, não quero ter que usar números reais.

Se alguém puder revisar e me ajudar agradeço.

  

Editado por DiF
Botão CODE <>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos ver,

int X -> o compilador interpreta a variável X como 8bits, inteiro sem sinal (0 – 255).

%d   -> o compilador interpreta que a variável a ser impressa no LCD é do tipo 8bits com sinal (-128 - 127).

%u  -> o compilador interpreta que a variável a ser impressa no LCD é do tipo 8bits sem sinal (0 - 255).

 

Então deveria ser printf(lcd_putc,"%u",X);

 

Digita printf() depois type specifiers em pesquisar no arquivo de ajuda do ccs, dá uma lida e terás mais respostas, principalmente se precisar aumentar valor dessa contagem.

Obs: não olhei todo o código somente bati o olho e vi que o tipo de dados recebido pela função printf não é compatível com o tipo de variável declarada em X.

Editado por venturafvj
correção
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para representar numero de 0-65535,deve usar int16,e para imprimir %lu,assim imprimira um numero inteiro sem sinal de 16bits

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@venturafvj

Em 25/10/2016 às 12:42, venturafvj disse:

Vamos ver,

int X -> o compilador interpreta a variável X como 8bits, inteiro sem sinal (0 – 255).

%d   -> o compilador interpreta que a variável a ser impressa no LCD é do tipo 8bits com sinal (-128 - 127).

%u  -> o compilador interpreta que a variável a ser impressa no LCD é do tipo 8bits sem sinal (0 - 255).

 

Então deveria ser printf(lcd_putc,"%u",X);

 

Digita printf() depois type specifiers em pesquisar no arquivo de ajuda do ccs, dá uma lida e terás mais respostas, principalmente se precisar aumentar valor dessa contagem.

Obs: não olhei todo o código somente bati o olho e vi que o tipo de dados recebido pela função printf não é compatível com o tipo de variável declarada em X.

Opa beleza obrigado pela dica

adicionado 1 minuto depois
20 horas atrás, Nao Sei disse:

Para representar numero de 0-65535,deve usar int16,e para imprimir %lu,assim imprimira um numero inteiro sem sinal de 16bits

Opa amigo beleza....

 

Cara obriga fiz da forma que me explicou e deu certinho, segue como fiz:

 

#include <contador.h>
#include <flex_204A.c>
int16 X;

void main()
{
   lcd_init();
   delay_ms(50);
   output_high(pin_e2);
   lcd_gotoxy(5, 1);
   printf(lcd_putc,"QUANTIDADE:");
   


   while(TRUE)
   {

   if( input(pin_d0)==1)
            {delay_ms(50);
            if (input(pin_d0) ==1)
            X++;
            lcd_gotoxy(7, 2);
            printf(lcd_putc,"        ");
            lcd_gotoxy(7, 2);
            printf(lcd_putc,"%lu",X);
      }
      

   
   if( input(pin_d1)==1)
      {delay_ms(50);
      if (input(pin_d1) ==1)
         lcd_gotoxy(7, 2);
         printf(lcd_putc,"        ");
         lcd_gotoxy(7, 2);
         printf(lcd_putc,"%lu",X);
      }
   
   
   }
   }

 

Obrigado!

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×