Páginas

quarta-feira, 8 de junho de 2011

Escrita do Programa

Segue escrita do programa em C. Obviamente que para enteder o que está escrito, é necessário conhecer a liguagem C.

Todas as definições do programa estão descritas abaixo.




// Descrição

#include <16F628A.h>                     // Inclui a biblioteca do microcontrolador.

#FUSES INTRC_IO                        // Habilita o oscilador interno.
#FUSES NOMCLR                        // Desabilita o uso do Master Clear, pino RA5 disponível para uso como I/O.
#FUSES NOPROTECT                     // Desabilita a proteção contra leitura do código.
#FUSES NOLVP                        // Desabilita a programação em baixa tensão, pino RB4 disponível para uso como I/O.
#FUSES NOBROWNOUT                     // Desabilita o reset por Brownout.
#FUSES NOCPD                        // Desabilita a proteção da EEPROM
#FUSES NOWDT                        // Desabilita o Watch Dog Timer
#FUSES NOPUT                        // Desabilita o Power Up Timer

#use delay(clock=4000000)                  // Seta a fequencia do oscilador em 4MHz

#define Servo1_RA0                      // Definição da porta A0 para conrole do servo
#include <1Servo-MIB.h>                   // Inclusão da biblioteca desenvolvida pela Meca In Brasil.com

int qtd_passo, lib, qtd_corte, lib1, np, npx, nc;
int pen, sent_giro_my, corte = 3;

#define PROG input(PIN_A4)                        // Atribui o nome "MXH" à entrade RA4
#define COMP input(PIN_A3)               // Atribui o nome "NUM_CORTE" à entrad RA5
#define NUM_CORTE input(PIN_A2)
#define START input(PIN_A2)


// Interrupção do Timer0 para utilização de servo-motor.

void STP_Y_AH() // Giro antihorario motor eixo Y
{
   output_high(PIN_B4);
   delay_ms(100);
   output_low(PIN_B4);
   delay_ms(100);
   output_high(PIN_B5);
   delay_ms(100);
   output_low(PIN_B5);
   delay_ms(100);
   output_high(PIN_B6);
   delay_ms(100);
   output_low(PIN_B6);
   delay_ms(100);
   output_high(PIN_B7);
   delay_ms(100);
   output_low(PIN_B7);
   delay_ms(100);
}

void STP_Y_H()  // Giro horario do motor eixo Y
{
   output_high(PIN_B7);
   delay_ms(100);
   output_low(PIN_B7);
   delay_ms(100);
   output_high(PIN_B6);
   delay_ms(100);
   output_low(PIN_B6);
   delay_ms(100);
   output_high(PIN_B5);
   delay_ms(100);
   output_low(PIN_B5);
   delay_ms(100);
   output_high(PIN_B4);
   delay_ms(100);
   output_low(PIN_B4);
   delay_ms(100);
}

void STP_X_AH () // Giro antihorario motor X.
{
   output_high(PIN_B0);
   delay_ms(100);
   output_low(PIN_B0);
   delay_ms(100);
   output_high(PIN_B1);
   delay_ms(100);
   output_low(PIN_B1);
   delay_ms(100);
   output_high(PIN_B2);
   delay_ms(100);
   output_low(PIN_B2);
   delay_ms(100);
   output_high(PIN_B3);
   delay_ms(100);
   output_low(PIN_B3);
   delay_ms(100);
}

 void  STP_X_H() // Giro horario motor X
{
   output_high(PIN_B3);
   delay_ms(100);
   output_low(PIN_B3);
   delay_ms(100);
   output_high(PIN_B2);
   delay_ms(100);
   output_low(PIN_B2);
   delay_ms(100);
   output_high(PIN_B1);
   delay_ms(100);
   output_low(PIN_B1);
   delay_ms(100);
   output_high(PIN_B0);
   delay_ms(100);
   output_low(PIN_B0);
   delay_ms(100);
}

void STATUS_PEN(pen) //Controle da posição da caneta de corte
{
      if (pen==1)     //Caneta Alta
         {
            servo1=9;
         }
      if (pen==0)  // Caneta Baixa
         {
            servo1=0;
         }
}




void main()
{
   init_servo();                       // Inicialização do Servo
   STATUS_PEN(1);

   while(true)                        // Laço infinito para executar as instruções anteriores apenas uma vez
   {
      while (PROG == 1)              // Laço de programação.
      {
         if (COMP == 1 && lib == 0)
         {
            ++qtd_passo;
            lib = 1;
         }
          if (COMP == 0 && lib == 1)
         {
            lib = 0;
         }
          if (NUM_CORTE == 1 && lib1 == 0)
         {
            ++qtd_corte;
            lib1 = 1;
         }
          if (NUM_CORTE == 0 && lib1 == 1)
         {
            lib1 = 0;
         }
      }

      if (START == 1)                        // Início da rotina de comandos.
      {
         for (nc=1;nc<=qtd_corte;++nc)      //Laço que representa a quantidade de cortes.
         {
           if (sent_giro_my == 0)
           {
              STATUS_PEN(0);
              delay_ms(500);

              for (np=0; np <= corte; np++)
              {
                  STP_Y_AH();
              }

              sent_giro_my=1;
              STATUS_PEN(1);
              delay_ms(500);

              for (npx=1;npx<=qtd_passo;++npx)
              {
                 STP_X_H();
              }
           }

           if (sent_giro_my == 1)
           {
              STATUS_PEN(0);
              delay_ms(500);

              for (np=0; np <= corte; np++)
              {
                  STP_Y_H();
              }

              sent_giro_my=0;
              STATUS_PEN(1);
              delay_ms(500);

              for (npx=1;npx<=qtd_passo;++npx)
              {
                 STP_X_H();
              }
           }


         }


        qtd_corte=0;
         qtd_passo=0;


   }
   }
}

Nenhum comentário:

Postar um comentário