Contador de Voltas para Bobinadeira


#1

Boa noite pessoal, é minha primeira vez por aqui e já venho pedindo ajuda, vamos ao pedido, estou montando um contado de voltas para uma maquina de enrolar transformador, ele é muito interessante, tem a opção de programar a quantidade de espiras para desligar o motos apos atingir o numero programado, ou contar direto sem programação, toda programação ta funcionando muito bem, o que ta acontecendo é o seguinte, ele conta normalmente em qualquer velocidade até 254, ai pula para 256, ai segue normal até 510, ai pula para 512, ou seja, ele pula 1 a cada multiplo de 255, segue a baixo o código fonte.

// Debe recordarse que las líneas RA0-RA2 actúan ahora como salida de señales de control
// hacia el LCD. Al estar conectadas con sendos interruptores en la MicroPIC Trainer,
// estos deben estar a nivel lógico "1" permanentemente, es decir en la posicion
//marcada como 0 en la placa
//Datos del LCD conectado al puerto B
// Teclado conectado al puerto B: Columna 0,1,2 a B5,B6 y B7. Fila 0,1,2 y 3 a B1, B2,B3 y B4
//RA3 conecto la salida para el motor. En un principi funciona como salida de enable. Se puede
//estudiar posibilidad de implementar un control PWM para la velocidad.
//RA4 entrada para el Timer0

#include <16f877a.h>
#include <stdlib.h>
#include <stdio.h>


#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT
#use delay(clock=4000000)
//#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_B1,RCV=PIN_B2)

#define use_portb_kbd TRUE // para evitar error (undefined identifier --set_tris_d)
//#define use_portb_lcd TRUE // para evitar error (undefined identifier --set_tris_d)
#include <LCD2.c>
#include <KBD.c>

#use fast_io(A)
#use fast_io(B)

//#include
//#include

#bit puertoA3 = 5.3   //Usado para control on/off motor

void menu1(void);
void menu2 (void);
int16 contar(void);
int16 introducir_valor(void);

char cadena1[]={"\f1-Contar Vuelt\n2-Introd. Vaelt"};
int desbordamiento=0;
int amp=0;

void main()
{


   char caracter;



   port_b_pullups(TRUE);
   lcd_init();
   kbd_init();
   set_tris_a(0x10); //A4 como entrada
   puertoA3=0; //inicializo motor con 0

   //lcd_enviar(LCD_COMANDO,LCD_CURSOR_BLINK); No activo cursor ni blinker

   setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
  // delay_us(1000);
   printf (lcd_putc,"Contador de Pulsos\n    By Rober    ",);
 // delay_us(1000);
   do
     caracter=kbd_getc();
   while (caracter=='\0');
   // delay_us(1000); 
   printf(lcd_putc,"%s",cadena1);
   // delay_us(1000); 
   while (1)
   {
     caracter=kbd_getc();

     switch (caracter)
     {
        case '1':
           desbordamiento=0;
           set_timer0(0);
           menu1();
          // delay_us(1000); 
           printf(lcd_putc,"%s",cadena1);
          // delay_us(1000); 
           break;
        case '2':
           desbordamiento=0;
           set_timer0(0);
           menu2();
          // delay_us(1000); 
           printf(lcd_putc,"%s",cadena1);
         // delay_us(1000); 
           break;
        case '*':
           printf(lcd_putc,"\f BY BY");
          // delay_us(1000); 
           sleep();
     }
   };

}

int16 contar()
{
     int cuenta=0;
     int16 n;


     cuenta=get_timer0();

     if (cuenta==255)
     {
       set_timer0(0);
       desbordamiento++;
     }
     n=256*desbordamiento+cuenta;

     lcd_gotoxy(10,2);
    // delay_us(1000); 
     printf(LCD_PUTC,"%Lu",n);
   //  delay_us(1000); 
     return(n);
}



void menu1()
{
  char caracter;
  int contador_parcial=0;
  int motor_off=1;
  int tecla_enter=0;  //control de la tecla asterisco pulsada primera vez=1, pulsada otra vez =0
 // delay_us(1000); 
  printf(lcd_putc,"\f* Motor On/off\n# salir");
 // delay_us(1000); 
  do
  {
    caracter=kbd_getc();

    switch (caracter)
    {
       case '*':
          if (tecla_enter==0)
          {
            // delay_us(1000); 
             printf(lcd_putc,"\fMotor ON\n cuenta:");
            // delay_us(1000); 
             set_timer0(contador_parcial);
             tecla_enter=1;
             motor_off=0;
             set_tris_a(0x10);
             puertoA3=1; //activo motor
          }
          else
          {
            lcd_gotoxy(1,1);
            contador_parcial=get_timer0();
          // delay_us(1000); 
            printf(lcd_putc,"Motor OFF");
          // delay_us(1000); 
            motor_off=1;
            tecla_enter=0;
            set_tris_a(0x10);
            puertoA3=0;  // motor apagado
          }
          break;
       case '#':
          tecla_enter=0;
          motor_off=1;
          set_tris_a(0x10);
          puertoA3=0;
          break;
    }

    if (tecla_enter)
        contar();
  }while (caracter!='#');
}

int16 introducir_valor()
{
  char caracter;
  char numeros[6];
  int contador_caracter=0;
  int16 vueltas;
 // delay_us(1000); 
  printf(lcd_putc,"\fN. Vueltas (4cifras)\n  ");
 // delay_us(1000); 
  
  //lcd_send_byte(LCD_COMANDO,LCD_CURSOR_ON); // activo cursor y blinker
  lcd_enviar(LCD_COMANDO,LCD_CURSOR_ON); // activo cursor y blinker
 // delay_us(1000); 
  do
  {

    caracter=kbd_getc();

    if (caracter!='\0')
    {
      // delay_us(1000); 
      //printf(lcd_putc,"%c"caracter);
       printf(lcd_putc,"%c",caracter); // aqui faltaba la coma antes de la palabra caracter
     // delay_us(1000); 
       numeros[contador_caracter]=caracter;
       contador_caracter++;
    }
  }
  //while (caracter!='#'&amp,&amp;contador_caracter<=4); //Cambiar los punto y coma por coma como en la siguiente linea
  while (caracter!='#'&amp,&amp,contador_caracter<=4);
  numeros[contador_caracter]='\0';
  vueltas=atol(numeros);
  // delay_us(1000); 
  lcd_enviar(LCD_COMANDO,LCD_CLEAR);
 // delay_us(1000); 
  lcd_enviar(LCD_COMANDO,LCD_HOME);
  // delay_us(1000); 
  printf(lcd_putc,"\f* Motor On/off\n# salir");
  // delay_us(1000); 
  return (vueltas);
}


void menu2()
{
  char caracter;
  int16 vueltas;
  int motor_off=1;
  int tecla_enter=0;  //*es la tecla enter y asi controlo si la he pulsado 1 o ninguna vez

  int16 n;

  vueltas=introducir_valor();

  do
  {
    caracter=kbd_getc();

    switch (caracter)
    {
       case '*':
          if (tecla_enter==0)
          {
             tecla_enter=1;
             motor_off=0;
            // delay_us(1000); 
             printf(lcd_putc,"\fON Fin: %Lu\ncuenta:",vueltas);
            // delay_us(1000); 
             set_tris_a(0x10);
            puertoA3=1; //Activo motor
          }
          else
          {
           // delay_us(1000); 
             lcd_gotoxy(1,1);
             printf(lcd_putc,"Off Fin: %Lu\n cuenta:",vueltas);
            // delay_us(1000); 
             motor_off=1;
             tecla_enter=0;
             set_tris_a(0x10);
             puertoA3=0; //motor apagado
          }
          break;
       case '#':
          tecla_enter=0;
          motor_off=1;
          set_tris_a(0x10);
         puertoA3=0; //motor apagado
          break;
    }

    if (tecla_enter)
    {
       n=contar();

       if (vueltas==n) /*debo parar motor*/
       {
           motor_off=2; /*Usado para salir de la función*/
           set_tris_a(0x10);
           puertoA3=0; //apago motor
       }
    }
  //}while (caracter!='#'&amp;&amp;motor_off!=2);     //Cambiar los punto y coma por coma como en la siguiente linea
  }while (caracter!='#'&amp,&amp,motor_off!=2);
  if (motor_off==2)
  {
   // delay_us(1000); 
    printf(lcd_putc,"\fSe han Bobinado: \n  %Lu Vueltas",n);
   // delay_us(1000); 
    do
      caracter=kbd_getc();
    while (caracter=='\0');
  }
}

#2

Quando chega a 255 ele zera o auxiliar “cuenta”, pois o timer (de interrupção) utilizado é de 8 bits, logo seu valor máximo é 255. Ele aparentemente pula mesmo o 255, talvez se você trocar , mas ele começa do 0 né, então às vezes isso é compensado no resto do código…
Não sei… no fim das contas só parece mesmo que ele não mostra o 255 na tela


#3

Bom dia Thomasz Barros, ele pula de 254 para 256, de 510 para 512, de 766 para 768 e assim por diante, sempre a cada 255 ele pula, voce teria alguma solução para isso? eu sou praticamente leigo em programação,


#4

talvez se você trocar:

int16 contar()
{
     int cuenta=0;
     int16 n;
     cuenta=get_timer0();

 n=256*desbordamiento+cuenta;
 if (cuenta==255)
 {
   set_timer0(0);
   desbordamiento++;
 }

 lcd_gotoxy(10,2);
// delay_us(1000); 
 printf(LCD_PUTC,"%Lu",n);
   //  delay_us(1000); 
     return(n);
}

#5

Boa noite Thomas Barros, testei essa modificação e não deu certo
se tiver mais alguma sugestão, será bem vinda


#6

mude:
n=256*desbordamiento+cuenta;

para

n=255*desbordamiento+cuenta;


#7

Boa tarde maumaker, quando faço essa alteração ele conta até 255 e depois passa a contar da seguinte forma, chega a 255 e volta 155, 255, 355, 455 555 e assim por diante