Ir ao conteúdo
  • Cadastre-se

juarez321

Membro Júnior
  • Posts

    1
  • Cadastrado em

  • Última visita

posts postados por juarez321

  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 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

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!