CCS C ile Tuş Takımı Uygulamaları

pr_01_37_max

 

Kontrol sistemlerinde dış dünyadan insanlar tarafından veri girişleri genellikle tuş takımı (keypad-klavye) ile yapılır. Tuş takımı butonlarla gerçekleştirilebileceği gibi çeşitli hazır tuş takımları piyasada bulunmaktadır. Tuş takımı isimlendirmelerinde ilk sayı sütun, ikinci sayı ise satır sayısını belirtir. Örneğin 4×3’lük bir keypad, 4 sütun ve 3 satırdır. Tuş takımında hangi tuşa basıldığını bulmak için çeşitli yöntemler kullanılabilir. Bu yöntemlerden biri tarama yöntemidir. Butonların bir ucu satır kısmına, bir ucu da sütun kısmına bağlıdır. Denetleyici ile tarama yapılırken satırlar çıkış, sütunlar ise giriş olarak tanımlanır.

Sütunlarda hep lojik-0 (GND-şase) vardır. Hangi tuşa basıldığını anlamak için önce satırlardan biri lojik-1 diğerleri lojik-0 yapılır. Sonra sütunlar okunur, hangi giriş lojik-1 ise o satıra ait sütundaki tuşa basılmış demektir. İstenen tuşa hangi değerin verileceği programcıya aittir. Butona basıldığında ve bırakıldığında bir ark (parazit) meydana gelir. Buna tuş sıçraması da (key debounce) denilir. Tuş sıçraması butona bir kez basıldığı halde butona birden fazla basılmış ve çekilmiş gibi durum yaratır.Bu sıçramayı önlemek için programda gerekli önlemler alınmalıdır. Tedbir olarak butona basıldıktan sonra 15-20 msn gecikme verilmesi gerekir veya butondan el çekilene kadar içinden çıkılmayacak bir döngü
kurulmalıdır. Ayrıca tuş takımında aynı anda iki tuşa birden basılabilir. Bu gibi durumlarda hangi tuşun geçerli olacağı programla belirtilerek istenmeyen durumlar önlenmelidir.

Basılan tuşu LCD ekranda gösteren program

/******************************************************
 PIC16F877 ile Tuş Takımı ve LCD Uygulaması
PIC PROG/DEKA : Port B jumper'ı LCD konumunda olmalı
*******************************************************/

#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

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

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

#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
#use fast_io(d) //Port yönlendirme komutları B portu için geçerli

#define use_portb_lcd TRUE // LCD B portuna bağlı

#include <lcd.c> // lcd.c dosyası tanıtılıyor

#define sut1 pin_d0 // sut1 ifadesi pin_d0 ifadesine eşitleniyor
#define sut2 pin_d1 // sut2 ifadesi pin_d1 ifadesine eşitleniyor
#define sut3 pin_d2 // sut3 ifadesi pin_d2 ifadesine eşitleniyor
#define sut4 pin_d3 // sut3 ifadesi pin_d2 ifadesine eşitleniyor

#define sat1 pin_d4 // sat1 ifadesi pin_d4 ifadesine eşitleniyor
#define sat2 pin_d5 // sat2 ifadesi pin_d5 ifadesine eşitleniyor
#define sat3 pin_d6 // sat3 ifadesi pin_d6 ifadesine eşitleniyor
#define sat4 pin_d7 // sat4 ifadesi pin_d7 ifadesine eşitleniyor

 char tus=0; // karakter tipinde değişken tanımlanıyor

//*********** Keypad Tarama Fonksiyonu *********

char keypad_oku() // Fonksiyon ismi
{
 output_d(0x00); // D portu çıkışı sıfırlanıyor

 output_high(sat1); // 1. satır lojik-1 yapılıyor
 if (input(sut1)) // 1. sütun okunuyor
 { delay_ms(20); tus=1; }
 if (input(sut2)) // 2. sütun okunuyor
 { delay_ms(20); tus=2; }
 if (input(sut3)) // 3. sütun okunuyor
 { delay_ms(20); tus=3; }
 if (input(sut4)) // 4. sütun okunuyor
 { delay_ms(20); tus=0xA; }
 output_low(sat1); // 1. satır lojik-0 yapılıyor

 output_high(sat2); // 2. satır lojik-1 yapılıyor
 if (input(sut1)) // 1. sütun okunuyor
 { delay_ms(20); tus=4; }
 if (input(sut2)) // 2. sütun okunuyor
 { delay_ms(20); tus=5; }
 if (input(sut3)) // 3. sütun okunuyor
 { delay_ms(20); tus=6; }
 if (input(sut4)) // 4. sütun okunuyor
 { delay_ms(20); tus=0xB; }
 output_low(sat2); // 2. satır lojik-0 yapılıyor

 output_high(sat3); // 3. satır lojik-1 yapılıyor
 if (input(sut1)) // 1. sütun okunuyor
 { delay_ms(20); tus=7; }
 if (input(sut2)) // 2. sütun okunuyor
 { delay_ms(20); tus=8; }
 if (input(sut3)) // 3. sütun okunuyor
 { delay_ms(20); tus=9; }
 if (input(sut4)) // 4. sütun okunuyor
 {delay_ms(20); tus=0x0C; }
 output_low(sat3); // 3. satır lojik-0 yapılıyor

 output_high(sat4); // 3. satır lojik-1 yapılıyor
 if (input(sut1)) // 1. sütun okunuyor
 { delay_ms(20); tus=0xE; }
 if (input(sut2)) // 2. sütun okunuyor
 { delay_ms(20); tus=0; }
 if (input(sut3)) // 3. sütun okunuyor
 { delay_ms(20); tus=0xF; }
 if (input(sut4)) // 4. sütun okunuyor
 {delay_ms(20); tus=0xD; }
 output_low(sat4); // 3. satır lojik-0 yapılıyor

 return tus; // Fonksiyon "tus" değeri ile geri döner
}

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

void main ( )
{
 setup_psp(PSP_DISABLED); // PSP 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ışı

 set_tris_b(0x00); // B portu komple çıkış
 set_tris_d(0x0F); // Yüksek değerlikli 4 bit çıkış, düşük değerlikli 4 bit giriş

 lcd_init(); // LCD hazırlanıyor

 printf(lcd_putc,"\fBasilan Tus="); // LCD'ye string yazdırılıyor

 while(1) // Sonsuz döngü
 {
 lcd_gotoxy(13,1); // İmleç 3.sütun, 1.satıra konumlandırılıyor

 if (keypad_oku()>9) // Eğer basılan tuş değeri 9'dan büyük ise
 printf(lcd_putc,"%d",keypad_oku()); // Tuş değeri LCD'ye yazdırılıyor
 else // Eğer basılan tuş değeri 9'dan büyük değilse
 printf(lcd_putc,"%d ",keypad_oku()); // Tuş değeri LCD'ye yazdırılıyor
 }
}

Tuş Takımı Uygulamaları

CCS C Örnekleri kategorisine gönderildi | , ile etiketlendi | Yorum yapın

CCS C ile Timer Uygulamaları

pr_01_37_max

 

 

PIC16F877 ile Timer0 Uygulaması

#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

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

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

#use fast_io(b) //Port yönlendirme komutları B portu için geçerli

int i=0; // Tamsayı tipinde değişken tanımlanıyor

//****************** Timer0 Kesmesi *****************************
#int_timer0 // Timer0 kesmesi
void timer0_kesme () // Kesme fonksiyonu ismi
{
 set_timer0(60); // TMR0 değeri belirleniyor
 i++; // i değeri 1 arttırılıyor
 if (i==10) // i değeri 10'a eşitse RB0 çıkışı lojik-1 olsun
 output_high(pin_b0);
 if (i==20) // i değeri 20'ye eşitse RB0 çıkışı lojik-1 olsun ve i değeri sıfırlansın
 {
 output_low(pin_b0);
 i=0;
 }
}

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

void main ( )
{
 setup_psp(PSP_DISABLED); // PSP 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ışı


 set_tris_b(0x00); // B portu komple çıkış

 output_b(0x00); // B portu çıkışı ilk anda sıfırlanıyor

 setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); // Timer0 ayarları yapılıyor
 set_timer0(60); // TMR0 değeri belirleniyor


 enable_interrupts(INT_timer0); // int_timer0 kesmesini aktif yapar
 enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver

 while(1); // Sonsuz döngü

 }

PIC16F877 ile Timer1 Uygulaması

#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

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

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

#use fast_io(b) //Port yönlendirme komutları B portu için geçerli

int i=0; // Tamsayı tipinde değişken tanımlanıyor

//****************** Timer0 Kesmesi *****************************
#int_timer1 // Timer1 kesmesi
void timer1_kesme () // Kesme fonksiyonu ismi
{
 set_timer1(63036); // TMR1 değeri belirleniyor

 i++; // i değeri 1 arttırılıyor

 if (i==50) // i değeri 50'ye eşit olursa RB0 lojik-1 olsun
 output_high(pin_b0);
 if (i==100) // i değeri 100'e eşit olursa RB0 lojik-0 ve i=0 olsun 
 {
 output_low(pin_b0);
 i=0;
 }
}

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

void main ( )
{
 setup_psp(PSP_DISABLED); // PSP birimi 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ışı


 set_tris_b(0x00); // B portu komple çıkış

 output_b(0x00); // B portu çıkışı ilk anda sıfırlanıyor

 setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); // Timer1 ayarları yapılıyor
 set_timer1(63036); // TMR1 değeri belirleniyor


 enable_interrupts(INT_timer1); // int_timer0 kesmesini aktif yapar
 enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver

 while(1); // Sonsuz döngü

 }

PIC16F877 ile Timer2 Uygulaması

#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

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

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

#use fast_io(a) //Port yönlendirme komutları A portu için geçerli
#use fast_io(b) //Port yönlendirme komutları B portu için geçerli

unsigned int kesme=0; // Tamsayı tipinde 16 bitlik değişken tanımlanıyor

//****************** Timer2 Kesmesi *****************************
#int_timer2 // Timer2 kesmesi
void timer2_kesme () // Kesme fonksiyonu ismi
{
 kesme++; // kesme değeri 1 arttırılıyor
 output_high(pin_b0); // RB0 lojik-1 yapılıyor
 output_low(pin_b0); // RB0 lojik-0 yapılıyor
}

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

void main ( )
{
 setup_psp(PSP_DISABLED); // PSP birimi devre dışı
 setup_timer_1(T1_DISABLED); // T1 birimi 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ışı

 set_tris_a(0x01); // RA0 pini giriş
 set_tris_b(0x00); // B portu komple çıkış

 output_b(0x00); // B portu çıkışı ilk anda sıfırlanıyor

 setup_timer_2(T2_DIV_BY_16,250,16); // Timer2 ayarları yapılıyor

 enable_interrupts(INT_timer2); // int_timer2 kesmesini aktif yapar
 enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver

 while(1) // Sonsuz döngü
 {
 if (input(pin_a0)) // RA0 butonuna basıldığında
 output_b(kesme); // kesme değerini B portuna gönder
 }

 }

timer uygulamaları

CCS C Örnekleri kategorisine gönderildi | , , , ile etiketlendi | Yorum yapın

CCS C ile Step Motor Uygulaması

pr_01_37_max

 

PIC16F877 ile Step Motor Uygulaması (ULN2003A İle)

#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

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

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

// Giriş ve çıkış pinlerine isim atanıyor
#define buton_ileri pin_a0
#define buton_geri pin_a1

int i=0,hiz=10;

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_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);

 while(1) // Sonsuz döngü
 {

 if (input(buton_ileri)) // İLERİ Butonuna basıldı ise
 {
 output_b(yarim_adim[i]); // Step motor 1 adım ileri
 while(input(buton_ileri));// Basılan tuş bırakılana kadar bekle
 delay_ms(hiz); // Adımlar arası bekleme süresi

 if (i==7) // i değişkeni 7 olunca i değeri -1 olsun
 i=-1;
 i++; // i değişkenini 1 arttır

 }

 if (input(buton_geri)) // GERİ Butonuna basıldı ise
 {
 if (i==0) // i değişkeni 0 ise i değeri 8 olsun
 i=8;
 i--; // i değişkenini 1 azalt
 output_b(yarim_adim[i]); // Step motora 1 adım geri
 while(input(buton_geri)); // Basılan tuş bırakılana kadar bekle
 delay_ms(hiz); // Adımlar arası bekleme süresi
 }
 }
}

Step Motor Uygulaması

CCS C Örnekleri kategorisine gönderildi | , ile etiketlendi | Yorum yapın

CCS C ile Ses Uygulaması

pr_01_37_max

 

Melodi çalmak için için ccs c içerisinde bulunan tones.c kullanılmış. Örneği inceleyiniz.

/******************************************************************
 PIC16F877 ile Ses 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.

#include <TONES.c> // TONES.c dosyası programa ekleniyor

// Ses tonlarından oluşan dizi tanımlanıyor
const char muzik[48]={C_NOTE[0],C_NOTE[1],C_NOTE[2],C_NOTE[3],Db_NOTE[0],Db_NOTE[1],Db_NOTE[2],Db_NOTE[3],
 D_NOTE[0],D_NOTE[1],D_NOTE[2],D_NOTE[3],Eb_NOTE[0],Eb_NOTE[1],Eb_NOTE[2],Eb_NOTE[3],
 E_NOTE[0],E_NOTE[1],E_NOTE[2],E_NOTE[3],F_NOTE[0],F_NOTE[1],F_NOTE[2],F_NOTE[3],
 Gb_NOTE[0],Gb_NOTE[1],Gb_NOTE[2],Gb_NOTE[3],G_NOTE[0],G_NOTE[1],G_NOTE[2],G_NOTE[3],
 Ab_NOTE[0],Ab_NOTE[1],Ab_NOTE[2],Ab_NOTE[3],A_NOTE[0],A_NOTE[1],A_NOTE[2],A_NOTE[3],
 Bb_NOTE[0],Bb_NOTE[1],Bb_NOTE[2],Bb_NOTE[3],B_NOTE[0],B_NOTE[1],B_NOTE[2],B_NOTE[3] };

int i; // Tam sayı tipinde değişken tanımlanıyor

//******************* ANA PROGRAM FONKSİYONU *******************
void main ()
{
 setup_psp(PSP_DISABLED); // PSP 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_low(pin_b0); // RB0 çıkışı ilk anda lojik-0

 while(1) // Sonsuz döngü
 {
 for(i=0;i<48;i++)
 {
 generate_tone(muzik[i],100); delay_ms(50); // Sırayla muzık[] dizisindeki
 } // tonlar oluşturuluyor
 }
}

Ses Uygulaması

CCS C Örnekleri kategorisine gönderildi | , , ile etiketlendi | Yorum yapın

CCS C ile RS232 Seri İletişim Uygulaması

pr_01_37_max

 

/******************************************************
 PIC16F877 ile RS232 Seri İletişim Uygulaması
PIC PROG/DEKA : Port B jumper'ı LCD konumunda olmalı
*******************************************************/

#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

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

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

#define use_portb_lcd TRUE // LCD B portuna bağlı

#include <lcd.c> // lcd.c dosyası tanıtılıyor

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // RS232 protokolünün 9600 bit/sn baud hızında olacağını ve
 // TX,RX uçlarının hangi pinler olacağını tanımlıyor
 // parity bitinin olmadığını, stop bitinin 1 bit olacağı belirtiliyor

char klavye[80]; // klavye isminde 80 üyeli bir dizi tanımlanıyor

#int_rda // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi ()
{
 disable_interrupts(int_rda); // int_rda kesmesini pasif yap
 output_high(pin_c5); // RC5 çıkışı lojik-1
 gets(klavye); // String ifadeyi al ve "klavye" adlı dizi değişkenine aktar.
 printf("\n\rYazdiginiz Metin> %s\n",klavye); // Satır atla, yeni satır,RS232 üzerinden klavye string ifadesini gönder,satır atla
 printf(lcd_putc,"\f%s",klavye); //LCD'yi temizle ve klavye string ifadesini LCD'de göster
 output_low(pin_c5); // RC5 çıkışı lojik-0
 printf("\n\rKlavyeden bir metin giriniz ve enter tusuna basiniz>"); // Satır atla, yeni satır,RS232 üzerinden belirtilen metni gönder
}

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

void main ( )
{
 setup_psp(PSP_DISABLED); // PSP 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_low(pin_c5); // RC5 çıkışı ilk anda sıfırlanıyor
 lcd_init(); // LCD'yi hazırla

 printf("\r**************** Merhaba *********************"); // Yeni satır, RS232 üzerinden belirtilen metni gönder ve satır atla.
 printf("\n\rKlavyeden girdiginiz bilgiler LCD'de gorunecektir\n\n"); // Satır atla, yeni satır, RS232 üzerinden belirtilen metni gönder
 printf("\n\rKlavyeden bir metin giriniz ve enter tusuna basiniz>"); // Satır atla, yeni satır,RS232 üzerinden belirtilen metni gönder

 enable_interrupts(GLOBAL); // Aktif edilen tüm kesmelere izin ver

 while(1) // Sonsuz döngü
 {
 enable_interrupts(int_rda); // int_rda kesmesi aktif
 }
}

RS232 Seri İletişim Uygulaması

CCS C Örnekleri kategorisine gönderildi | , , ile etiketlendi | Yorum yapın

CCS C ile RC Servo Motor Uygulaması

pr_01_37_max

 

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

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

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

// R/C Servo motor dönme açı değerleri
const int8 servo_derece_1[]={8,9,10,11,12,13,14,15,16,17,18};
const int8 servo_derece_2[]={18,17,16,15,14,13,12,11,10,9,8};
const int8 servo_derece_3[]={8,12,18,8,12,18,8,12,18,8,12};

int i=0,pwm=0,duty_0=0,duty_1=0,duty_2=0;
int16 zaman=0; // 16 bitlik değişken tanımlanıyor

#int_timer0 // Timer0 taşma kesmesi
void kesme ()
{
 set_timer0(113); // TMR0 kaydedicisine 113 değeri yükleniyor
 if (pwm==0) // Eğer PWM değişkeni 0 ise
 {
 output_high(pin_b0); // RB0 çıkışı lojik-1
 output_high(pin_b1); // RB1 çıkışı lojik-1
 output_high(pin_b2); // RB2 çıkışı lojik-1
 }

 if (pwm>=duty_0) output_low(pin_b0);
 if (pwm>=duty_1) output_low(pin_b1);
 if (pwm>=duty_2) output_low(pin_b2);

 zaman++; // zaman değişkenini 1 arttır

 // Servo motor dönüş adımları arası bekleme süresi için
 if (zaman>17350) // 17350x114,4µsn=1.984.840µsn, yaklaşık 2msn
 {
 zaman=0; // zaman değişkenini sıfırla
 i++; // i değişkeni değerini 1 arttır
 if(i==11) // Eğer i değeri 11 ise-Tüm adımlar bitti ise
 i=0; // i değişkenini sıfırla
 }

 pwm++; // pwm değişkenini 1 arttır
 if (pwm>=173) // pwm değeri 173'den büyük ise
 pwm=0; // pwm değişkenini sıfırla
}

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

void main ()
{
 setup_psp(PSP_DISABLED); // PSP 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ışı


 setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4); // Timer0 ayarları belirtiliyor
 set_timer0(113); // TMR0 kaydedicisine 113 değeri yükleniyor

 enable_interrupts(int_timer0); // Timer0 taşma kesmesi aktif
 enable_interrupts(global); // Aktif edilen tüm kesmelere izin ver

 output_b(0x00); // İlk anda B portu çıkışı sıfırlanıyor

 while(1) // Sonsuz döngü
 {
 duty_0=servo_derece_1[i]; // 1. R/C servo PWM görev saykılı
 duty_1=servo_derece_2[i]; // 2. R/C servo PWM görev saykılı
 duty_2=servo_derece_3[i]; // 3. R/C servo PWM görev saykılı
 }
}

RC Servo Motor Uygulaması

CCS C Örnekleri kategorisine gönderildi | , ile etiketlendi | Yorum yapın

CCS C ile PWM Modu Uygulaması

pr_01_37_max

 

/******************************************************
 PIC16F877 ile PWM Modu Uygulaması-1
*******************************************************/
#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

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

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

#use fast_io(a) //Port yönlendirme komutları A portu için geçerli
#use fast_io(c) //Port yönlendirme komutları C portu için geçerli

int i=5; // Tamsayı tipinde değişken tanımlanıyor

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

void main ( )
{
 setup_psp(PSP_DISABLED); // PSP birimi devre dışı
 setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
 setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
 setup_adc(ADC_OFF); // ADC birimi devre dışı

 set_tris_a(0x03); // RA0 ve RA1 pinleri giriş
 set_tris_c(0x00); // RC0, RC1 ve RC2 pini giriş

 setup_ccp1(CCP_PWM); // CCP1 birimi PWM çıkışı için ayarlandı
 setup_ccp2(CCP_PWM); // CCP2 birimi PWM çıkışı için ayarlandı

 setup_timer_2(T2_DIV_BY_16,170,1); // Timer2 ayarları yapılıyor

 set_pwm1_duty(i); // PWM1 çıkışı görev saykılı belirleniyor
 set_pwm2_duty(i); // PWM2 çıkışı görev saykılı belirleniyor

 while(1) // Sonsuz döngü
 {
 if (input(pin_a0)) // Eğer RA0 girişine bağlı butona basılırsa
 {
 delay_ms(20); // Buton arkı önleme gecikmesi
 while(input(pin_a0)); // Basılı butondan el çekile kadar bekle
 i+=3; // i=i+3 anlamındadır.

 if (i>=170) // i değeri 170'dan büyükse i değeri 170 olsun
 i=170;

 set_pwm1_duty(i); // PWM1 çıkışı görev saykılı belirleniyor
 set_pwm2_duty(i); // PWM2 çıkışı görev saykılı belirleniyor
 }

 if (input(pin_a1)) // Eğer RA1 girişine bağlı butona basılırsa
 {
 delay_ms(20); // Buton arkı önleme gecikmesi
 while(input(pin_a1)); // Basılı butondan el çekile kadar bekle
 i-=3; // i=i-3 anlamındadır.

 if (i<5) // i değeri 5'den küçük ise i değeri 10 olsun
 i=5;

 set_pwm1_duty(i); // PWM1 çıkışı görev saykılı belirleniyor
 set_pwm2_duty(i); // PWM2 çıkışı görev saykılı belirleniyor
 }
 }
}

PWM Modu Uygulaması

CCS C Örnekleri kategorisine gönderildi | , ile etiketlendi | Yorum yapın

CCS C ile Paralel Slave Port Uygulaması

pr_01_37_max

 

/******************************************************
 PIC16F877A ile Paralel Slave Port Modülü Uygulaması
PIC PROG/DEKA : Port B jumper'ı LED konumunda olmalı
*******************************************************/

#include <16f877A.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

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

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

/********* ANA PROGRAM FONKSİYONU********/
void main ( )
{
 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ışı
 setup_comparator(NC_NC_NC_NC); // Karşılaştırıcı birimi devre dışı
 setup_VREF(FALSE); // Voltaj referans birimi devre dışı

 setup_psp(PSP_ENABLED); // PSP modülü açık

 while (1) // Sonsuz döngü
 {
 output_b(PSP_DATA); // PSP veri yolundaki bilgiyi B portuna gönder
 }
}

Paralel Slave Port Uygulaması

CCS C Örnekleri kategorisine gönderildi | , ile etiketlendi | Yorum yapın

CCS C ile Paralel LCD Uygulaması

pr_01_37_max

/******************************************************
 PIC16F877 ile Paralel LCD Uygulaması
PIC PROG/DEKA : Port B jumper'ı LCD konumunda olmalı
*******************************************************/

#include  // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

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

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

#use fast_io(b) //Port yönlendirme komutları B portu için geçerli

#define use_portb_lcd TRUE // LCD B portuna bağlı

#include  // lcd.c dosyası tanıtılıyor

int x; // Tamsayı tipinde değişken tanımlanıyor
float y; // Ondalıklı tipte değişken tanımlanıyor
char z; // Karakter tipinde değişken tanımlanıyor

byte dizi[6]={0x45,0xC6,0xA3,0xE2,0x56};

//********** 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ışı

 set_tris_b(0x00); // B portu komple çıkış

 lcd_init(); // LCD hazırlanıyor

 x=10; // x değişkenine değer veriliyor
 y=32.6; // y değişkenine değer veriliyor
 
 
 
 while(1) // Sonsuz döngü
 {shift_right(dizi,4,1);
 lcd_send_byte(0,0x0d); // LCD'ye komut gönderiliyor. İmleç yanıp sönsün komutu.
 printf(lcd_putc,"\f CCS C"); // LCD'ye veri gönderiliyor.
 delay_ms(1000); // 1 sn gecikme
 printf(lcd_putc,"\n Derleyicisi");
 delay_ms(1000); // 1 sn gecikme
 lcd_gotoxy(1,2); // Kursör 1.sütun, 2.satıra konumlandırılıyor.
 printf(lcd_putc,"\fX DEGERI=%d",x); // LCD'de tamsayı olarak x değişken değeri görüntüleniyor.
 delay_ms(1000); // 1 sn gecikme
 printf(lcd_putc,"\f\nY DEGERI=%f",y); // LCD'de ondalıklı olarak y değişken değeri görüntüleniyor.
 delay_ms(1000); // 1 sn gecikme
 printf(lcd_putc,"\fDIRENC"); // LCD siliniyor ve "Direnc" stringi yazdırılıyor.
 delay_ms(1000); // 1 sn gecikme
 z=lcd_getc(3,1); // LCD'de o an 3.Sütun ve 1.Satırda olan karakter alınıyor. Alınan değer z değişkenine aktarılıyor.
 printf(lcd_putc,"\f%c",z); // z değişkeni LCD'ye aktarılıyor
 delay_ms(2000); // 2 sn gecikme
 }
}

Paralel LCD Uygulaması

CCS C Örnekleri kategorisine gönderildi | , ile etiketlendi | Yorum yapın

pr_01_37_max   Standart 2×16 LCD ekranlarda türkçe karakterler bulunmamakta. Bu durumu aşmak yada kendi özel sembollerinizi yaratmak ekranda göstermek için aşağıdaki örneği ve dosyaları inceleyiniz.

/*******************************************************
PIC16F877 ile Kendi Özel Karakterli LCD Dosyamızla LCD Uygulaması
PIC PROG/DEKA : Port B jumper'ı LCD konumunda olmalı
*******************************************************/

#include  // 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.

#include <özel_karakter_LCD.c> // özelkarakter__LCD.c dosyası programa ekleniyor

float x=23.5; // Ondalıklı tipte değişken tanımlanıyor

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

void main ( )
{
 setup_psp(PSP_DISABLED); // PSP 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ışı

 lcd_hazirla(); // LCD başlangıç ayarları yaptırılıyor
 ozel_karakterler(); // Özel karakterler CGRAM'e yükleniyor

 while(1) // Sonsuz döngü
 {
 imlec(1,1); // İmlec 1.satır 1.sütunda
 printf(lcd_veri,"ÖZEL KARAKTERLİ"); // LCD'ye veri yazdırılıyor

 imlec(2,1); // İmlec 2.satır 1.sütunda
 printf(lcd_veri,"LCD UYGULAMASI"); // LCD'ye veri yazdırılıyor
 delay_ms(1000);

 lcd_komut(0x01); // LCD sıfırlanıyor
 printf(lcd_veri,"ÖZEL KARAKTERLER"); // LCD'ye veri yazdırılıyor

 imlec(2,1); // İmlec 2.satır 1.sütunda
 printf(lcd_veri,"Ç"); delay_ms(1000);
 printf(lcd_veri,"Ğ"); delay_ms(1000);
 printf(lcd_veri,"İ"); delay_ms(1000);
 printf(lcd_veri,"Ö"); delay_ms(1000);
 printf(lcd_veri,"Ş"); delay_ms(1000);
 printf(lcd_veri,"Ü"); delay_ms(1000);
 printf(lcd_veri,"'"); delay_ms(1000);
 printf(lcd_veri,"I"); delay_ms(1000);

 lcd_komut(0x01); // LCD sıfırlanıyor
 printf(lcd_veri,"SICAKLIK %f'C",x); delay_ms(3000);

 lcd_komut(0x01); // LCD sıfırlanıyor
 }
}

Özel Karakterli LCD Uygulaması

CCS C Örnekleri kategorisine gönderildi | , ile etiketlendi | Yorum yapın