Ir ao conteúdo
  • Cadastre-se

Contador de voltas para bobinadeira


juarez321

Posts recomendados

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 baico 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 DIRETO\n2-PROGRAMAR"};
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,"Aperte uma tecla \n Para continuar",);
 // 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,"\fSE *****");
          // 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 outra vez =0
 // delay_us(1000); 
  printf(lcd_putc,"\f* Ligar Motor\n# sair");
 // delay_us(1000); 
  do
  {
    caracter=kbd_getc();

    switch (caracter)
    {
       case '*':
          if (tecla_enter==0)
          {
            // delay_us(1000); 
             printf(lcd_putc,"\fMotor Ligado\nConte:");
            // 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 Desligado");
          // 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. de Espiras\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* Para Iniciar\n# Para sair");
  // 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,"\fTotal: %Lu\nConta: ",vueltas);
            // delay_us(1000); 
             set_tris_a(0x10);
            puertoA3=1; //Activo motor
          }
          else
          {
           // delay_us(1000); 
             lcd_gotoxy(1,1);
             printf(lcd_putc,"Off Fim: %Lu\n conta:",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,"\fEnrolamento com: \n  %Lu Espiras",n);
   // delay_us(1000); 
    do
      caracter=kbd_getc();
    while (caracter=='\0');
  }
}
 

 

  • Curtir 1
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...