CCS PIC C İle PIC Programlama
PIC programlamak için birçok farklı dil kullanılabiliyor. Başta assembly olmak üzere,
Basic ve C dilleri de mevcut. Bildiğiniz gibi assembly dili en temel dil olmasına rağmen kavraması ve program yazması
çok kolay değildir. Kısa zamanda hızlı program yazmak çok tecrübe gerektirir. Ama günümüzde Basic ve C gibi üst seviye
programlama dilleri sayesinde bu zorluğu aşabiliyoruz. Bu dilleri kavramak için önceden biraz Visual Basic ve C, C++
dilerini biliyorsanız hiç zorluk çekmezsiniz. Bu yazı dizisinde sizlere C dili ile PIC nasıl programlanır onu anlatmaya
çalışacağım.
İlk olarak yapmanız gereken, yazacağını programları derlemek için bir program bulmak. Burada size CCS C compiler'ı
tavsiye ederim. http://www.ccsinfo.com adresinden bu dilin şirketine ulaşabilirsiniz, compiler'in demo versiyonunu
indirebilirsiniz. Bundan başka Hi-Tech firmasınında PICC compiler'ı var fakat ben başta bu compiler'i denememe rağmen
bir takım komutlarda zorluk yaşayınca CCS compiler kullanmaya başladım. Bunların haricinde Pasfic C, MikroC gibi
compilerlar da var, artık gerisine siz karar verin. CCS sitesinden indireceğiniz demo versiyonla yapabilecekleriniz
çok kısıtlı. LCD komutlarını bile kullanmanıza izin vermiyor ve kullanabileceğiniz PICmikro çeşiti de az. Bu programların
full sürümlerini P2P paylaşım programlarıyla bulup indirebilirsiniz. Özellikle Emule programı tavsiye edilir.
Bulamazsanız itina ile yardımcı olunur...:)

Compiler'ı bulduktan sonra bilgisayarınıza kurun. Programın bu haliyle sadece
kendi arayüzünde program yazıp derleyebilirsiniz. Ama ben MPLAB'da program yazarım diyorsanız CCS sitesinden
MPLAB 6.xx Plug In yazılımını indirmeniz gerekli. Bunu da kurup MPLAB'da ">>Project>>>Set Language Tool Location" dan
dil ayarını şekildeki gibi yapmanız gerekli. Bundan sonra MPLAB da yazacağınız programları yine MPLAB da
derleyebeilirsiniz. Yazdığınız programda hata varsa çıkışta ne .COF ne de .HEX dosya oluşturuyor, bi önceki
düzgün derlenmiş programın oluşturduğu HEX ya da COF dosyasını da siliyor. Yani yazdığımız programın düzgün
olup olmadığını buradan anlıyoruz :)) CCS'in kendi programında derlerseniz kullandığınız PIC'in RAM ve ROM'undan
ne kadar tükettiğinizi de gösteriyor.
Compiler'ı bilgisayarınıza kurduktan sonra kurduğunuz dizin altındaki Drivers, Devices ve Examples klasörlerini
inceleyiniz, hangi PIC'lerin kulanılabildiği, neler yapılabildiği hakkında bişeyler kapabilirsiniz. İşin kötü tarafı
bu C ile PIC programlamayı öğrenmek isteyenler için kötü bi haberim var: İnternette bu konu hakkında Türkçe doyurucu
bilgi yok. Yani herçey size ve ingilizcenize bağlı. En büyük yardımcınız CCS'in compiler Manual'i. Manual'i BURADAN
indirebilirsiniz. Kullanmak istediğiniz konutları çok iyi anlatıyor ve basit örnekleri de var.
C dilinde benim gözümü en çok Assembly dilimde çok zor olan LCD, seri port, ADC gibi karmaşık işlerin nasıl yapılacağıydı.
Ama kortuğum olmadı. Sağolsun elemanlar hazır kodu vermişler zaten geriye sadece komutları yazıp kullanmak kalıyor.
Drivers klasörüne bakın demiştim, işte orada tüm bu hazır fonksiyonların olduğu .C ve .H dosyalarını bulabilirsiniz.
Artık programlar hazır olduğuna göre programlamaya geçebiliriz. Dikkat!!! Burada anlatacağım kodlar, temel C bilginizin
olduğu kabul edilerek hazırlanmıştır. Çok fazla ayrıntısına girmeyeceğm. Sadece En çok kullanacağınız buton kontrolü,
LCD, Seri port veri alışverişi gibi işlemleri anlatacağım.
İlk Programımızı Yazalım
//***************************************************
//BU PROGRAM B0 DAKİ BUTONA BASILDIĞI SÜRECE B3 DEKİ
//LEDİ YANIK TUTAR, A YI 1 ARTTIRIR VE LCD YE A
//DEĞERİNİ YAZAR. BUTONA BASILMASINI VE BASILDIKTAN
//SONRA BIRAKILMASINI BEKLER.
//***************************************************
// PROGRAM DİLİ:: CCS C
//*************************************************** #if defined(__PCM__)
#include <16F877.h>
#DEVICE ADC=10 //ADC 10 BİT OKUMA MODUNDA
#fuses XT, NOPROTECT, NOWDT, NOLVP, PUT //SİGORTA AYARLARI
#use delay(clock=4000000) //KRİSTAL 4 MHz
#include <LCD.C> //LDC KOMUTLARINI KULLANABİLMEK İÇİN LCD.C Yİ PROGRAMA EKLE
#include <STDLIB.H> //ADC KOMUTLARINI KULLANABİLMEK İÇİN STDLIB.H I PROGRAMA EKLE
#define led pin_b3 //B3 E LED BAĞLI
#define buton pin_c0 //C0 A BUTON BAĞLI
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //SERİ PORT İLETİŞİM AYARLARI, 9600 BAUDRATE, TRANSMİT PİNİ=C6, RECEİVEPİNİ=C7
SET_TRIS_C(0b00000001); //C0'A BAĞLI PİNİ GİRİŞ YAPMAK İÇİN TRİS AYARI
void main() //MAIN PROGRAM
{
int a=0; //TANIMLAMA
long value0,value1; //TANIMLAMA
float b; //TANIMLAMA
lcd_init(); //LCD Yİ HAZIRLA
printf("BUTONA BASINIZ..\n\r"); //SERİ PORTA "BUTONA BASINIZ.." YAZDIR
for(;;) //SONSUZ DÖNGÜ
{
output_low(led); //LEDİ SÖNDÜR
delay_us(250); //250ms BEKLE
if (!input(buton)) //PİN 0 (BUTONA BASILDIYSA) İSE.........
{
output_high(led); //LEDİ YAK
a=a+1; //A YI 1 ARTTIR
b=1.45*a; //1.45*A YI B YE ATA
lcd_putc("\f"); //LCD Yİ TEMİZLE
printf(lcd_putc,"SONUC= %3.2f",b); //LCD YE B Yİ YAZ (ONDALIKLI SAYIYI LCD'YE YAZMA)
printf("a= %d\n\r",a); //SERİ PORTA YAZ (İNTEGER SAYIYI SERİ PORTA YAZMA)
while(!input(buton)); //BUTON YENİDEN 0 OLANA (BIRAKILANA) KADAR BEKLE.....
}
setup_adc( ADC_CLOCK_INTERNAL ); //ADC AYARI
setup_adc_ports( ALL_ANALOG ); //TÜM ANALOG PORTLARI KULLANIMA AÇ
set_adc_channel(0); //AN0 KANALINI AYARLA
value0 = read_adc(); //AN0 DAKİ ANALOG VERİYİ OKU, VALUE0' A YAZ
set_adc_channel(1); //AN1 KANALINI AYARLA
value1 = read_adc(); //AN1 DAKİ ANALOG VERİYİ OKU, VALUE1' A YAZ
lcd_putc("\f"); //LCD'Yİ TEMİZLE
printf(lcd_putc,"value0 = %lu", value0); //1. SATIRA VALUE0 DEĞERİNİ YAZ
lcd_putc("\n"); //2. SATIRA GEÇ
printf(lcd_putc,"value1 = %lu", value1); //2. SATIRA VALUE1 DEĞERİNİ YAZ
delay_ms( 100 ); //100ms BEKLE
}
}
//BU PROGRAM B0 DAKİ BUTONA BASILDIĞI SÜRECE B3 DEKİ
//LEDİ YANIK TUTAR, A YI 1 ARTTIRIR VE LCD YE A
//DEĞERİNİ YAZAR. BUTONA BASILMASINI VE BASILDIKTAN
//SONRA BIRAKILMASINI BEKLER.
//***************************************************
// PROGRAM DİLİ:: CCS C
//*************************************************** #if defined(__PCM__)
#include <16F877.h>
#DEVICE ADC=10 //ADC 10 BİT OKUMA MODUNDA
#fuses XT, NOPROTECT, NOWDT, NOLVP, PUT //SİGORTA AYARLARI
#use delay(clock=4000000) //KRİSTAL 4 MHz
#include <LCD.C> //LDC KOMUTLARINI KULLANABİLMEK İÇİN LCD.C Yİ PROGRAMA EKLE
#include <STDLIB.H> //ADC KOMUTLARINI KULLANABİLMEK İÇİN STDLIB.H I PROGRAMA EKLE
#define led pin_b3 //B3 E LED BAĞLI
#define buton pin_c0 //C0 A BUTON BAĞLI
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //SERİ PORT İLETİŞİM AYARLARI, 9600 BAUDRATE, TRANSMİT PİNİ=C6, RECEİVEPİNİ=C7
SET_TRIS_C(0b00000001); //C0'A BAĞLI PİNİ GİRİŞ YAPMAK İÇİN TRİS AYARI
void main() //MAIN PROGRAM
{
int a=0; //TANIMLAMA
long value0,value1; //TANIMLAMA
float b; //TANIMLAMA
lcd_init(); //LCD Yİ HAZIRLA
printf("BUTONA BASINIZ..\n\r"); //SERİ PORTA "BUTONA BASINIZ.." YAZDIR
for(;;) //SONSUZ DÖNGÜ
{
output_low(led); //LEDİ SÖNDÜR
delay_us(250); //250ms BEKLE
if (!input(buton)) //PİN 0 (BUTONA BASILDIYSA) İSE.........
{
output_high(led); //LEDİ YAK
a=a+1; //A YI 1 ARTTIR
b=1.45*a; //1.45*A YI B YE ATA
lcd_putc("\f"); //LCD Yİ TEMİZLE
printf(lcd_putc,"SONUC= %3.2f",b); //LCD YE B Yİ YAZ (ONDALIKLI SAYIYI LCD'YE YAZMA)
printf("a= %d\n\r",a); //SERİ PORTA YAZ (İNTEGER SAYIYI SERİ PORTA YAZMA)
while(!input(buton)); //BUTON YENİDEN 0 OLANA (BIRAKILANA) KADAR BEKLE.....
}
setup_adc( ADC_CLOCK_INTERNAL ); //ADC AYARI
setup_adc_ports( ALL_ANALOG ); //TÜM ANALOG PORTLARI KULLANIMA AÇ
set_adc_channel(0); //AN0 KANALINI AYARLA
value0 = read_adc(); //AN0 DAKİ ANALOG VERİYİ OKU, VALUE0' A YAZ
set_adc_channel(1); //AN1 KANALINI AYARLA
value1 = read_adc(); //AN1 DAKİ ANALOG VERİYİ OKU, VALUE1' A YAZ
lcd_putc("\f"); //LCD'Yİ TEMİZLE
printf(lcd_putc,"value0 = %lu", value0); //1. SATIRA VALUE0 DEĞERİNİ YAZ
lcd_putc("\n"); //2. SATIRA GEÇ
printf(lcd_putc,"value1 = %lu", value1); //2. SATIRA VALUE1 DEĞERİNİ YAZ
delay_ms( 100 ); //100ms BEKLE
}
}
2. programımızı yazalım
#if defined(__PCM__)
#include <16F877.h> //PIC16F877
#fuses XT, NOPROTECT, NOWDT, NOLVP, PUT //SİGORTALAR
#use delay(clock=4000000) //4MHz KRİSTAL AYARI #include <LCD.C> //LD.C Yİ EKLE
#include <STDLIB.H> //adc için
#define led pin_b3 //B3 E LED BAĞLI
#define buton pin_c0 //C0 A BUTON BAĞLI
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //SERİ PORT AYARLARI
SET_TRIS_C(0b00000001); //TRIS C Yİ, BUTON İÇİN GİRİŞ OLARAK AYARLA
void main() //MAIN PROGRAM
{
int a=0,value0,value1; //TANIMLAR
float b; //TANIMLAR
char string[5];
lcd_init(); //LCD Yİ HAZIRLA
printf("BUTONA BASINIZ..\n\r"); //SERİ PORTA "BUTONA BASINIZ.." YAZDIR
for(;;) //SONSUZ DÖNGÜ
{
output_low(led); //LEDİ SÖNDÜR
delay_us(250); //BEKLE
setup_adc( ADC_CLOCK_INTERNAL ); //ADC İÇİN.....
setup_adc_ports( ALL_ANALOG ); //TÜM ANALOG PORTLARI KULLANIMA AÇ
set_adc_channel(0); //AN0 KANALI
value0 = read_adc(); //AN0 KANALINI OKU, VALUE0 A YAZ
set_adc_channel(1); //AN1 KANALI
value1 = read_adc(); //AN1 KANALINI OKU, VALUE1 E YAZ
lcd_putc("\f"); //LCD Yİ TEMİZLE
printf(lcd_putc,"value0 = %2U", value0); //LCD 1. SATIRA VALUE0 I YAZ
lcd_putc("\n"); //2. SATIRA GEÇ
printf(lcd_putc,"value1 = %2U", value1); //LCD 2. SATIRA VALUE1 İ YAZ
delay_ms( 100 ); //BEKLE
printf("4 ELEMANLI STRING GIR,ENTERE BAS!!!\n\r"); //SERİ PORTA "4 ELEMANLI STRING GIR,ENTERE BAS!!!" YAZ
gets(string); //STRİNG GİRİLMESİNİ BEKLER
printf("GIRIS TAMAMLANDI, LCD YE BAK, GIRDIGIN STRINGI EKRANA YAZDIM!!!\n\r"); //SERİ PORTA "GIRIS TAMAMLANDI, LCD YE BAK, GIRDIGIN STRINGI EKRANA YAZDIM!!! YAZDIR"
lcd_putc("\f"); //LCD'Yİ TEMİZLE
printf(lcd_putc,string); //GİRİLEN STRİNGİ LCD'YE YAZDIR
delay_ms( 1000 ); //1000ms BEKLE
}
}
#include <16F877.h> //PIC16F877
#fuses XT, NOPROTECT, NOWDT, NOLVP, PUT //SİGORTALAR
#use delay(clock=4000000) //4MHz KRİSTAL AYARI #include <LCD.C> //LD.C Yİ EKLE
#include <STDLIB.H> //adc için
#define led pin_b3 //B3 E LED BAĞLI
#define buton pin_c0 //C0 A BUTON BAĞLI
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //SERİ PORT AYARLARI
SET_TRIS_C(0b00000001); //TRIS C Yİ, BUTON İÇİN GİRİŞ OLARAK AYARLA
void main() //MAIN PROGRAM
{
int a=0,value0,value1; //TANIMLAR
float b; //TANIMLAR
char string[5];
lcd_init(); //LCD Yİ HAZIRLA
printf("BUTONA BASINIZ..\n\r"); //SERİ PORTA "BUTONA BASINIZ.." YAZDIR
for(;;) //SONSUZ DÖNGÜ
{
output_low(led); //LEDİ SÖNDÜR
delay_us(250); //BEKLE
setup_adc( ADC_CLOCK_INTERNAL ); //ADC İÇİN.....
setup_adc_ports( ALL_ANALOG ); //TÜM ANALOG PORTLARI KULLANIMA AÇ
set_adc_channel(0); //AN0 KANALI
value0 = read_adc(); //AN0 KANALINI OKU, VALUE0 A YAZ
set_adc_channel(1); //AN1 KANALI
value1 = read_adc(); //AN1 KANALINI OKU, VALUE1 E YAZ
lcd_putc("\f"); //LCD Yİ TEMİZLE
printf(lcd_putc,"value0 = %2U", value0); //LCD 1. SATIRA VALUE0 I YAZ
lcd_putc("\n"); //2. SATIRA GEÇ
printf(lcd_putc,"value1 = %2U", value1); //LCD 2. SATIRA VALUE1 İ YAZ
delay_ms( 100 ); //BEKLE
printf("4 ELEMANLI STRING GIR,ENTERE BAS!!!\n\r"); //SERİ PORTA "4 ELEMANLI STRING GIR,ENTERE BAS!!!" YAZ
gets(string); //STRİNG GİRİLMESİNİ BEKLER
printf("GIRIS TAMAMLANDI, LCD YE BAK, GIRDIGIN STRINGI EKRANA YAZDIM!!!\n\r"); //SERİ PORTA "GIRIS TAMAMLANDI, LCD YE BAK, GIRDIGIN STRINGI EKRANA YAZDIM!!! YAZDIR"
lcd_putc("\f"); //LCD'Yİ TEMİZLE
printf(lcd_putc,string); //GİRİLEN STRİNGİ LCD'YE YAZDIR
delay_ms( 1000 ); //1000ms BEKLE
}
}
Bu program 1. programın neredeyse aynı, sadece ek olarak seri porttan 4
elemanlı string gelmesini bekler, elemanlar girilip entere basılınca giriş tamamlanır, girilen string LCD'ye yazılır.
Step Motor Programı
//*****************************************************
//Bu program C0 ve C1 deki butonlara basılmasını bekler.
//C0 butonuna basılınca step motora sağ yön sinyallerini,
//C1 butonuna basılınca step motora sol yön sinyallerini
//gönderir. Adım sayısını stepright(x) ve stepleft(x)
//fonksiyonları içindeki x belirler.
//*****************************************************
#if defined(__PCM__)
#include <16F877.h>
#DEVICE ADC=10 //ADC 10 BİT
#fuses XT, NOPROTECT, NOWDT, NOLVP, PUT
#use delay(clock=4000000) #include <LCD.C> //LDC KOMUTLARINI KULLANABİLMEK İÇİN LCD.C Yİ PROGRAMA EKLE
#define butonright pin_c0 //C0 A BUTON BAĞLI
#define butonleft pin_c1 //C0 A BUTON BAĞLI
SET_TRIS_C(0b00000001); //C0'A BAĞLI PİNİ GİRİŞ YAPMAK İÇİN TRİS AYARI
SET_TRIS_B(0b00000000); //PORTB'Yİ ÇIKIŞ YAPMAK İÇİN TRİS AYARI
void stepright(int x) //STEP MOTOR SAĞ YÖN ADIM FONKSİYONU
{
int i; //TANIMLAMA
printf(lcd_putc,"Step Right"); //LCD'YE "Step Right" YAZ
lcd_putc("\n"); //2. SATIRA GEÇ
for(i=1;i<=x;i++) //ADIM SAYISI KADAR.....
{
lcd_gotoxy(1,2); //2. SATIRA GEL.........
printf(lcd_putc,"ADIM: %d",i); //LCD YE "ADIM: ..." ŞEKLİNDE ADIM SAYISINI YAZDIR
OUTPUT_B(0b00000001); //MOTORA 1-2-4-8 SİNYALİNİ GÖNDER
delay_ms(30); //ADIMLAR ARASINDA BEKLE
OUTPUT_B(0b00000010); //MOTORA 1-2-4-8 SİNYALİNİ GÖNDER
delay_ms(30);
OUTPUT_B(0b00000100); //MOTORA 1-2-4-8 SİNYALİNİ GÖNDER
delay_ms(30);
OUTPUT_B(0b00001000); //MOTORA 1-2-4-8 SİNYALİNİ GÖNDER
delay_ms(30);
}
}
void stepleft(int x) //STEP MOTOR SOL YÖN ADIM FONKSİYONU
{
int i;
printf(lcd_putc,"Step Left"); //LCD'YE "Step Left" YAZ
lcd_putc("\n"); //2. SATIRA GEÇ
for(i=1;i<=x;i++) //ADIM SAYISI KADAR.....
{
lcd_gotoxy(1,2); //2. SATIRA GEL.........
printf(lcd_putc,"ADIM: %d",i); //LCD YE "ADIM: ..." ŞEKLİNDE ADIM SAYISINI YAZDIR
OUTPUT_B(0b00001000); //MOTORA 8-4-2-1 SİNYALİNİ GÖNDER
delay_ms(30); //ADIMLAR ARASINDA BEKLE
OUTPUT_B(0b00000100); //MOTORA 8-4-2-1 SİNYALİNİ GÖNDER
delay_ms(30);
OUTPUT_B(0b00000010); //MOTORA 8-4-2-1 SİNYALİNİ GÖNDER
delay_ms(30);
OUTPUT_B(0b00000001); //MOTORA 8-4-2-1 SİNYALİNİ GÖNDER
delay_ms(30);
}
}
void main() //MAIN PROGRAM
{
lcd_init(); //LCD Yİ HAZIRLA
printf("BUTONA BASINIZ..\n\r"); //SERİ PORTA "BUTONA BASINIZ.." YAZDIR
for(;;) //SONSUZ DÖNGÜ
{
delay_us(250); //250ms BEKLE
if (!input(butonright)) //PİN 0 (BUTONA BASILDIYSA) İSE.........
{
stepright(25);
lcd_putc("\f"); //LCD Yİ TEMİZLE
while(!input(butonright)); //BUTON YENİDEN 0 OLANA KADAR BEKLE.....
}
if (!input(butonleft)) //PİN 0 (BUTONA BASILDIYSA) İSE.........
{
stepleft(25);
lcd_putc("\f"); //LCD Yİ TEMİZLE
while(!input(butonleft)); //BUTON YENİDEN 0 OLANA KADAR BEKLE.....
}
}
}
//Bu program C0 ve C1 deki butonlara basılmasını bekler.
//C0 butonuna basılınca step motora sağ yön sinyallerini,
//C1 butonuna basılınca step motora sol yön sinyallerini
//gönderir. Adım sayısını stepright(x) ve stepleft(x)
//fonksiyonları içindeki x belirler.
//*****************************************************
#if defined(__PCM__)
#include <16F877.h>
#DEVICE ADC=10 //ADC 10 BİT
#fuses XT, NOPROTECT, NOWDT, NOLVP, PUT
#use delay(clock=4000000) #include <LCD.C> //LDC KOMUTLARINI KULLANABİLMEK İÇİN LCD.C Yİ PROGRAMA EKLE
#define butonright pin_c0 //C0 A BUTON BAĞLI
#define butonleft pin_c1 //C0 A BUTON BAĞLI
SET_TRIS_C(0b00000001); //C0'A BAĞLI PİNİ GİRİŞ YAPMAK İÇİN TRİS AYARI
SET_TRIS_B(0b00000000); //PORTB'Yİ ÇIKIŞ YAPMAK İÇİN TRİS AYARI
void stepright(int x) //STEP MOTOR SAĞ YÖN ADIM FONKSİYONU
{
int i; //TANIMLAMA
printf(lcd_putc,"Step Right"); //LCD'YE "Step Right" YAZ
lcd_putc("\n"); //2. SATIRA GEÇ
for(i=1;i<=x;i++) //ADIM SAYISI KADAR.....
{
lcd_gotoxy(1,2); //2. SATIRA GEL.........
printf(lcd_putc,"ADIM: %d",i); //LCD YE "ADIM: ..." ŞEKLİNDE ADIM SAYISINI YAZDIR
OUTPUT_B(0b00000001); //MOTORA 1-2-4-8 SİNYALİNİ GÖNDER
delay_ms(30); //ADIMLAR ARASINDA BEKLE
OUTPUT_B(0b00000010); //MOTORA 1-2-4-8 SİNYALİNİ GÖNDER
delay_ms(30);
OUTPUT_B(0b00000100); //MOTORA 1-2-4-8 SİNYALİNİ GÖNDER
delay_ms(30);
OUTPUT_B(0b00001000); //MOTORA 1-2-4-8 SİNYALİNİ GÖNDER
delay_ms(30);
}
}
void stepleft(int x) //STEP MOTOR SOL YÖN ADIM FONKSİYONU
{
int i;
printf(lcd_putc,"Step Left"); //LCD'YE "Step Left" YAZ
lcd_putc("\n"); //2. SATIRA GEÇ
for(i=1;i<=x;i++) //ADIM SAYISI KADAR.....
{
lcd_gotoxy(1,2); //2. SATIRA GEL.........
printf(lcd_putc,"ADIM: %d",i); //LCD YE "ADIM: ..." ŞEKLİNDE ADIM SAYISINI YAZDIR
OUTPUT_B(0b00001000); //MOTORA 8-4-2-1 SİNYALİNİ GÖNDER
delay_ms(30); //ADIMLAR ARASINDA BEKLE
OUTPUT_B(0b00000100); //MOTORA 8-4-2-1 SİNYALİNİ GÖNDER
delay_ms(30);
OUTPUT_B(0b00000010); //MOTORA 8-4-2-1 SİNYALİNİ GÖNDER
delay_ms(30);
OUTPUT_B(0b00000001); //MOTORA 8-4-2-1 SİNYALİNİ GÖNDER
delay_ms(30);
}
}
void main() //MAIN PROGRAM
{
lcd_init(); //LCD Yİ HAZIRLA
printf("BUTONA BASINIZ..\n\r"); //SERİ PORTA "BUTONA BASINIZ.." YAZDIR
for(;;) //SONSUZ DÖNGÜ
{
delay_us(250); //250ms BEKLE
if (!input(butonright)) //PİN 0 (BUTONA BASILDIYSA) İSE.........
{
stepright(25);
lcd_putc("\f"); //LCD Yİ TEMİZLE
while(!input(butonright)); //BUTON YENİDEN 0 OLANA KADAR BEKLE.....
}
if (!input(butonleft)) //PİN 0 (BUTONA BASILDIYSA) İSE.........
{
stepleft(25);
lcd_putc("\f"); //LCD Yİ TEMİZLE
while(!input(butonleft)); //BUTON YENİDEN 0 OLANA KADAR BEKLE.....
}
}
}
Farklı Yöntemle Step Motor Programı
3. programımız olan step motor programına bakarsanız step motora adım sinyallerini
"OUTPUT_B(0b00001000); " gibi bi komutla gönderiyoruz. Yani B portunun 8 bitini de sadece step motorun 4 pinini
kontrol etmek için ayırmış oluyoruz, geri kalan 4 biti boşa gitmiş oluyor. Bu israftan kurtulmak için C dilinin
STRUCT şeklinde yapı tanımlama özelliğinden yararlanacağız. Bu şekilde geri kalan 4 biti de başka amaçlarda kullanabileceğiz.
Aynı zamanda programda "stepright" ve "stepleft" fonksiyonlarında da ufak bi değişiklik yaparak "süre" değişkenini de
parametre olarak fonksiyonlara gönderiyorum.
#if defined(__PCM__)
#include <16F877.h>
#DEVICE ADC=10 //ADC 10 BİT
#fuses XT, NOPROTECT, NOWDT, NOLVP, PUT
#use delay(clock=4000000) #include <LCD.C> //LDC KOMUTLARINI KULLANABİLMEK İÇİN LCD.C Yİ PROGRAMA EKLE
#include <STDLIB.H> //ADC KOMUTLARINI KULLANABİLMEK İÇİN STDLIB.H I PROGRAMA EKLE
#define butonright pin_c0 //C0 A BUTON BAĞLI
#define butonleft pin_c1 //C0 A BUTON BAĞLI
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //SERİ PORT İLETİŞİM AYARLARI, 9600 BAUDRATE, TRANSMİT PİNİ=C6, RECEİVEPİNİ=C7
struct {
int step_data : 4;
int led_data : 4;} b_port;
#byte b_port = 6
SET_TRIS_C(0b00000011); //C0'A BAĞLI PİNİ GİRİŞ YAPMAK İÇİN TRİS AYARI
SET_TRIS_B(0b00000000); //C0'A BAĞLI PİNİ GİRİŞ YAPMAK İÇİN TRİS AYARI
void stepright(int adim,int sure) //STEP MOTOR SAĞ YÖN ADIM FONKSİYONU
{
int i; //TANIMLAMA
printf(lcd_putc,"Step Right"); //LCD'YE "Step Right" YAZ
lcd_putc("\n"); //2. SATIRA GEÇ
for(i=1;i<=adim;i++) //ADIM SAYISI KADAR.....
{
lcd_gotoxy(1,2); //2. SATIRA GEL.........
printf(lcd_putc,"ADIM: %d",i); //LCD YE "ADIM: ..." ŞEKLİNDE ADIM SAYISINI YAZDIR
b_port.step_data=1; //MOTORA 1-2-4-8 SİNYALİNİ GÖNDER
b_port.led_data=1; //LEDLERE 1-2-4-8 SİNYALİNİ GÖNDER
delay_ms(sure); //sure PARAMETRESİ KADAR BEKLE
b_port.step_data=2; //MOTORA 1-2-4-8 SİNYALİNİ GÖNDER
b_port.led_data=2; //LEDLERE 1-2-4-8 SİNYALİNİ GÖNDER
delay_ms(sure); //sure PARAMETRESİ KADAR BEKLE
b_port.step_data=4; //MOTORA 1-2-4-8 SİNYALİNİ GÖNDER
b_port.led_data=4; //LEDLERE 1-2-4-8 SİNYALİNİ GÖNDER
delay_ms(sure); //sure PARAMETRESİ KADAR BEKLE
b_port.step_data=8; //MOTORA 1-2-4-8 SİNYALİNİ GÖNDER
b_port.led_data=8; //LEDLERE 1-2-4-8 SİNYALİNİ GÖNDER
delay_ms(sure); //sure PARAMETRESİ KADAR BEKLE
}
}
void stepleft(int adim,int sure) //STEP MOTOR SOL YÖN ADIM FONKSİYONU
{
int i;
printf(lcd_putc,"Step Left"); //LCD'YE "Step Left" YAZ
lcd_putc("\n"); //2. SATIRA GEÇ
for(i=1;i<=adim;i++) //ADIM SAYISI KADAR.....
{
lcd_gotoxy(1,2); //2. SATIRA GEL.........
printf(lcd_putc,"ADIM: %d",i); //LCD YE "ADIM: ..." ŞEKLİNDE ADIM SAYISINI YAZDIR
b_port.step_data=8; //MOTORA 8-4-2-1 SİNYALİNİ GÖNDER
b_port.led_data=8; //LEDLERE 8-4-2-1 SİNYALİNİ GÖNDER
delay_ms(sure); //sure PARAMETRESİ KADAR BEKLE
b_port.step_data=4; //MOTORA 8-4-2-1 SİNYALİNİ GÖNDER
b_port.led_data=4; //LEDLERE 8-4-2-1 SİNYALİNİ GÖNDER
delay_ms(sure); //sure PARAMETRESİ KADAR BEKLE
b_port.step_data=2; //MOTORA 8-4-2-1 SİNYALİNİ GÖNDER
b_port.led_data=2; //LEDLERE 8-4-2-1 SİNYALİNİ GÖNDER
delay_ms(sure); //sure PARAMETRESİ KADAR BEKLE
b_port.step_data=1; //MOTORA 8-4-2-1 SİNYALİNİ GÖNDER
b_port.led_data=1; //LEDLERE 8-4-2-1 SİNYALİNİ GÖNDER
delay_ms(sure); //sure PARAMETRESİ KADAR BEKLE
}
}
void main() //MAIN PROGRAM
{
lcd_init(); //LCD Yİ HAZIRLA
printf("BUTONA BASINIZ..\n\r"); //SERİ PORTA "BUTONA BASINIZ.." YAZDIR
OUTPUT_B(0b00000000);
for(;;) //SONSUZ DÖNGÜ
{
delay_us(250); //250ms BEKLE
if (!input(butonleft)) //PİN 0 (BUTONA BASILDIYSA) İSE.........
{
stepleft(25,100);
lcd_putc("\f"); //LCD Yİ TEMİZLE
while(!input(butonleft)); //BUTON YENİDEN 0 OLANA KADAR BEKLE.....
}
if (!input(butonright)) //PİN 0 (BUTONA BASILDIYSA) İSE.........
{
stepright(25,100);
lcd_putc("\f"); //LCD Yİ TEMİZLE
while(!input(butonright)); //BUTON YENİDEN 0 OLANA KADAR BEKLE.....
}
}
}
#include <16F877.h>
#DEVICE ADC=10 //ADC 10 BİT
#fuses XT, NOPROTECT, NOWDT, NOLVP, PUT
#use delay(clock=4000000) #include <LCD.C> //LDC KOMUTLARINI KULLANABİLMEK İÇİN LCD.C Yİ PROGRAMA EKLE
#include <STDLIB.H> //ADC KOMUTLARINI KULLANABİLMEK İÇİN STDLIB.H I PROGRAMA EKLE
#define butonright pin_c0 //C0 A BUTON BAĞLI
#define butonleft pin_c1 //C0 A BUTON BAĞLI
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) //SERİ PORT İLETİŞİM AYARLARI, 9600 BAUDRATE, TRANSMİT PİNİ=C6, RECEİVEPİNİ=C7
struct {
int step_data : 4;
int led_data : 4;} b_port;
#byte b_port = 6
SET_TRIS_C(0b00000011); //C0'A BAĞLI PİNİ GİRİŞ YAPMAK İÇİN TRİS AYARI
SET_TRIS_B(0b00000000); //C0'A BAĞLI PİNİ GİRİŞ YAPMAK İÇİN TRİS AYARI
void stepright(int adim,int sure) //STEP MOTOR SAĞ YÖN ADIM FONKSİYONU
{
int i; //TANIMLAMA
printf(lcd_putc,"Step Right"); //LCD'YE "Step Right" YAZ
lcd_putc("\n"); //2. SATIRA GEÇ
for(i=1;i<=adim;i++) //ADIM SAYISI KADAR.....
{
lcd_gotoxy(1,2); //2. SATIRA GEL.........
printf(lcd_putc,"ADIM: %d",i); //LCD YE "ADIM: ..." ŞEKLİNDE ADIM SAYISINI YAZDIR
b_port.step_data=1; //MOTORA 1-2-4-8 SİNYALİNİ GÖNDER
b_port.led_data=1; //LEDLERE 1-2-4-8 SİNYALİNİ GÖNDER
delay_ms(sure); //sure PARAMETRESİ KADAR BEKLE
b_port.step_data=2; //MOTORA 1-2-4-8 SİNYALİNİ GÖNDER
b_port.led_data=2; //LEDLERE 1-2-4-8 SİNYALİNİ GÖNDER
delay_ms(sure); //sure PARAMETRESİ KADAR BEKLE
b_port.step_data=4; //MOTORA 1-2-4-8 SİNYALİNİ GÖNDER
b_port.led_data=4; //LEDLERE 1-2-4-8 SİNYALİNİ GÖNDER
delay_ms(sure); //sure PARAMETRESİ KADAR BEKLE
b_port.step_data=8; //MOTORA 1-2-4-8 SİNYALİNİ GÖNDER
b_port.led_data=8; //LEDLERE 1-2-4-8 SİNYALİNİ GÖNDER
delay_ms(sure); //sure PARAMETRESİ KADAR BEKLE
}
}
void stepleft(int adim,int sure) //STEP MOTOR SOL YÖN ADIM FONKSİYONU
{
int i;
printf(lcd_putc,"Step Left"); //LCD'YE "Step Left" YAZ
lcd_putc("\n"); //2. SATIRA GEÇ
for(i=1;i<=adim;i++) //ADIM SAYISI KADAR.....
{
lcd_gotoxy(1,2); //2. SATIRA GEL.........
printf(lcd_putc,"ADIM: %d",i); //LCD YE "ADIM: ..." ŞEKLİNDE ADIM SAYISINI YAZDIR
b_port.step_data=8; //MOTORA 8-4-2-1 SİNYALİNİ GÖNDER
b_port.led_data=8; //LEDLERE 8-4-2-1 SİNYALİNİ GÖNDER
delay_ms(sure); //sure PARAMETRESİ KADAR BEKLE
b_port.step_data=4; //MOTORA 8-4-2-1 SİNYALİNİ GÖNDER
b_port.led_data=4; //LEDLERE 8-4-2-1 SİNYALİNİ GÖNDER
delay_ms(sure); //sure PARAMETRESİ KADAR BEKLE
b_port.step_data=2; //MOTORA 8-4-2-1 SİNYALİNİ GÖNDER
b_port.led_data=2; //LEDLERE 8-4-2-1 SİNYALİNİ GÖNDER
delay_ms(sure); //sure PARAMETRESİ KADAR BEKLE
b_port.step_data=1; //MOTORA 8-4-2-1 SİNYALİNİ GÖNDER
b_port.led_data=1; //LEDLERE 8-4-2-1 SİNYALİNİ GÖNDER
delay_ms(sure); //sure PARAMETRESİ KADAR BEKLE
}
}
void main() //MAIN PROGRAM
{
lcd_init(); //LCD Yİ HAZIRLA
printf("BUTONA BASINIZ..\n\r"); //SERİ PORTA "BUTONA BASINIZ.." YAZDIR
OUTPUT_B(0b00000000);
for(;;) //SONSUZ DÖNGÜ
{
delay_us(250); //250ms BEKLE
if (!input(butonleft)) //PİN 0 (BUTONA BASILDIYSA) İSE.........
{
stepleft(25,100);
lcd_putc("\f"); //LCD Yİ TEMİZLE
while(!input(butonleft)); //BUTON YENİDEN 0 OLANA KADAR BEKLE.....
}
if (!input(butonright)) //PİN 0 (BUTONA BASILDIYSA) İSE.........
{
stepright(25,100);
lcd_putc("\f"); //LCD Yİ TEMİZLE
while(!input(butonright)); //BUTON YENİDEN 0 OLANA KADAR BEKLE.....
}
}
}
struct {
int step_data : 4;
int led_data : 4;} b_port;
#byte b_port = 6
İfadesi C dilindeki Struct ifadesidir. Yani "b_port" adı altındaki yapı ifadesinin "step_data" ve "led_data" olmak üzere ikisi de 4 bitlik elemanı tanımlanıyor. "#byte b_port = 6" ifadesiyle de "b_port" un adresi 0x06 olan PORTB'ye atanıyor. Böylece mesela programda kullanılan şekliyle "b_port.step_data=8;" dediğimizde PIC'in B portuna binary ifadeyle 0b00001000 yazılmış oluyor. Peki bu bilgi B portunun üst 4 bitine mi yoksa alt 4 bitine mi yazılıyor? Struct ifadesinde önce hangisi yazıldıysa ona yani "int step_data : 4;" üstte olduğundan b0,b1,b2,b3 pinleri "step_data" yani motora gönderilecek sinyallerin yazılacağı pinleri ifade ediyor. Geri kalanı da motora giden sinyallerin aynısını görmek için ledlere bağladım(ben led olarak aldım, siz istediğiniz gibi kullanabilirsiniz.
int step_data : 4;
int led_data : 4;} b_port;
#byte b_port = 6
İfadesi C dilindeki Struct ifadesidir. Yani "b_port" adı altındaki yapı ifadesinin "step_data" ve "led_data" olmak üzere ikisi de 4 bitlik elemanı tanımlanıyor. "#byte b_port = 6" ifadesiyle de "b_port" un adresi 0x06 olan PORTB'ye atanıyor. Böylece mesela programda kullanılan şekliyle "b_port.step_data=8;" dediğimizde PIC'in B portuna binary ifadeyle 0b00001000 yazılmış oluyor. Peki bu bilgi B portunun üst 4 bitine mi yoksa alt 4 bitine mi yazılıyor? Struct ifadesinde önce hangisi yazıldıysa ona yani "int step_data : 4;" üstte olduğundan b0,b1,b2,b3 pinleri "step_data" yani motora gönderilecek sinyallerin yazılacağı pinleri ifade ediyor. Geri kalanı da motora giden sinyallerin aynısını görmek için ledlere bağladım(ben led olarak aldım, siz istediğiniz gibi kullanabilirsiniz.