﻿/******************************************************
      PIC16F877 İle Bilgisayar İle Step Motor Uygulaması
******************************************/
#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // RS232 protokolü ayarları belirtiliyor

int i,hiz=500; // Tam sayı tipinde değişkenler tanımlanıyor
char islem=0;  // Karakter tipinde değişken tanımlanıyor

const int yarim_adim[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09}; // Step motor yarım adım dönüş adımları

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   output_b(0x00); // B portu çıkışı başlangıçta sıfırlanıyor

/****************MENÜ**********************************/

   printf("\n\r************************************************");
   printf("\n\r           ADIM MOTOR KONTROLÜ                  ");
   printf("\n\r************************************************");
   printf("\n\n");
   printf("\n\rIslem Seciniz:\n");
   printf("\n\r------------------------------------------------");
   printf("\n\r   Saga Dondur   (R)");
   printf("\n\r   Sola Dondur   (L)");
   printf("\n\r   Motoru Durdur (R ve L disindaki herhangi bir tus)");
   printf("\n\r------------------------------------------------");
   printf("\n\rYapmak istediginiz islemi seciniz>");

   while(1)
   {
      islem="null";    // islem değişkeninin içeriğini boş olarak ayarla
      islem=getchar(); // Seri port üzerinden gelen karakter islem değişkenine aktarılıyor
      putc(islem);     // RS232 üzerinden klavye'den girilen karakteri ekrana gönder.

      while (islem=='R'||islem=='r')   //Sağa döndürme işlemi seçildi ise
      {
         printf("\n\rMotor Saga Donuyor...");
         for (;i<8;i++)   // Sıra ile sağa dönme değerlerini gönder
         {
            output_b(yarim_adim[i]); // Step motor 1 adım ileri
            delay_ms(hiz);           // Adımlar arasındaki süre

            if (i==7)   // Eğer i değeri 7 olursa sıfırla
               i=0;

           if (kbhit()) break;   //Seri portan bir veri alındı ise döngüden çık
         }
         if (kbhit()) break;     //Seri portan bir veri alındı ise döngüden çık
      }

      while (islem=='L'||islem=='l')   //Sola döndürme işlemi seçildi ise
      {
         printf("\n\rMotor Sola Donuyor...");

         for (;i>=0;i--)   // Sıra ile sola dönme değerlerini gönder
         {
            if (i==0)   // Eğer i değeri 0 ise i değeri 7 olsun
               i=7;
            output_b(yarim_adim[i]);   // Step motor 1 adım geri
            delay_ms(hiz);             // Adımlar arasındaki süre

            if (kbhit()) break;        // Seri portan bir veri alındı ise döngüden çık
         }
         if (kbhit()) break;           // Seri portan bir veri alındı ise döngüden çık
      }
   }
}

