Bilgisayar İle Step Motor Kontrol Uygulaması

pr_01_37_max

 

Adım motorları adından da anlaşılacağı gibi adım adım hareket eden yani sargılarından birinin enerjilenmesi ile sadece 1 adım hareket eden motorlardır. Bu adımın kaç derece olacağı motorun tasarımına bağlıdır.

Adım motor, elektrik enerjisini dönme hareketine çeviren eletro-mekanik bir cihazdır. Elektrik enerjisi alındığında rotor ve buna bağlı şaft, sabit açısal birimlerde (adım-adım) dönmeye başlar. Adım motorlar, çok yüksek hızlı anahtarlama özelliğine sahip bir sürücüye bağlıdırlar (adım motor sürücüsü). Bu sürücü, bir encoder, PC veya PLC’den giriş darbeleri (pals) alır. Alınan her giriĢ darbesinde, motor bir adım ilerler. Adım motorlar bir turundaki adım sayısı ile anılırlar. Örnek olarak 400 adımlık bir adım motor bir tam dönüşünde (360º) 400 adım yapar. Bu durumda bir adımın açısı 360/400 = 0.9º derecedir. Bu değer, adım motorun hassasiyetinin bir göstergesidir. Bir devirdeki adım sayısı yükseldikçe adım motor hassasiyeti ve dolayısı ile maliyeti artar.

/******************************************************
 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_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
 }
 }
}

Bilgisayar İle Step Motor Kontrol Uygulaması

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

CCS C ile B Portundaki B4…B7 Pinlerinde Değişiklik Kesmesi Uygulaması

pr_01_37_max

 

Kesme işlemini günlük hayattan bir örnek vererek açıklayalım. Mesela yemek yiyorsunuz ve telefon çaldı. Ne yaparsınız? Yemek yemeyi bir süre için bırakır, telefona bakar sonra dönüp yemek yemeye devam edersiniz. İşte günlük hayatta karşılaştığınız bir kesme. Asıl işiniz yemek yeme olayı iken ihtiyaçtan (telefon çalması) dolayı asıl işinizi bırakıp diğer bir işi yaptınız (telefona bakma) ve geri dönüp asıl işinizde kaldığınız yerden devam ettiniz.

Mikrodenetleyicilerdeki kesme olayı yukarıdaki örneğe oldukça benzerdir. Kesme, mikrodenetleyicilerin herhangi bir kesme kaynağından gelen sinyal nedeniyle çalışmakta olan programı bırakması ve önceden hazırlanan kesme altprogramını çalıştırması olayıdır. Alt programın çalışması bittikten sonra ana program kaldığı yerden itibaren tekrar çalışmasına devam eder.

Aşağıda verilen örnekte mikrodenetleyiciye ait B4-B5 pinlerinde bir değişiklik olduğunda program mevcut işini bırakır ve kesme alt programınında tanımlanan işlemleri yapar.

/******************************************************
 PIC16F877 ile B portu RB4...RB7 Değişiklik Kesmesi Uygulaması
 PIC PROG/DEKA : Port B jumper'ı LED konumunda olmalı
*******************************************************/
#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 fast_io(b) //Port yönlendirme komutları B portu için geçerli

//*Port B RB4, RB5, RB6 ve RB7 pinleri değişiklik Kesme Fonksiyonu *
#int_RB // PORTB de B4...B7 pinlerinde meydana gelen değişim kesmesi
void B_degisiklik () // Kesme fonksiyonu ismi
{
 if (input(pin_b4)) // RB4 pini girişi okunuyor.
 output_high(pin_b0); // RB0 çıkışı lojik-1 yapılıyor.
 if (input(pin_b5)) // RB5 pini girişi okunuyor.
 output_high(pin_b1); // RB1 çıkışı lojik-1 yapılıyor.
 if (input(pin_b6)) // RB6 pini girişi okunuyor.
 output_high(pin_b2); // RB2 çıkışı lojik-1 yapılıyor.
 if (input(pin_b7)) // RB7 pini girişi okunuyor.
 output_high(pin_b3); // RB3 çıkışı lojik-1 yapılıyor
 delay_ms(2000); // 2 sn gecikme veriliyor.
 output_b(0x00); // B portu çıkışı komple sıfırlanı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ışı

 set_tris_b(0xF0); // RB7,RB6,RB5,RB4 giriş, diğer uçlar çıkış

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

 enable_interrupts(INT_RB); // INT_EXT kesmesini aktif yapar
 enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver

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

 }

B Portundaki B4…B7 Pinlerinde Değişiklik Kesmesi Uygulaması

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

CCS C ile ADC Uygulaması

pr_01_37_max

 

Analog değerler zamana göre sürekli (kesintisiz) olduğundan, bütün zaman dilimlerine karşılık gelen bir analog gerilim değeri vardır. Her analog değer için bir dijital değer oluşturmak imkânsız denilecek kadar karmaşık ve maliyetli olacaktır. Bu nedenle analog değer üzerinden belirlenmiş zaman aralıklarında örnekler alınır. Her örnek için seviyesine göre kodlanmış dijital bir değer üretilir. ADC devrelerin çalışmasını “örnekle, karşılaştır, dijital olarak kodla” şeklinde özetleyebiliriz.

Aşağıdaki örekte 0-5V arası ölçüm yapan voltmetre tasarlanmıştır

/******************************************************
 PIC16F877 ile Dahili ADC Uygulaması
PIC PROG/DEKA : Port B jumper'ı LCD konumunda olmalı
*******************************************************/
#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#device ADC=10 // 10 bitlik ADC kullanılacağı belirtiliyor.

// 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(c) //Port yönlendirme komutları C portu için geçerli
#use fast_io(e) //Port yönlendirme komutları E 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

#INT_AD // ADC çevrimi bitti kesmesi
void ADC_Kesmesi ( )
{
 output_high(pin_c5); // RC5 çıkışı 1
 delay_ms(200);
 output_low(pin_c5); // RC5 çıkışı 0
}

unsigned long int bilgi; // İşaretsiz 16 bitlik tam sayı tipinde değişken tanımlanıyor
float voltaj; // ondalıklı tipte voltaj isminde değişken tanıtılı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_CCP1(CCP_OFF); // CCP1 birimi devre dışı
 setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

 set_tris_c(0x00); // C portu komple çıkış
 set_tris_e(0x0F); // E portu komple giriş

 output_c(0x00); // C portu çıkışını sıfırla

 setup_adc(adc_clock_div_32); // ADC clock frekansı fosc/32
 setup_adc_ports(ALL_ANALOG); // Tüm AN girişleri analog
 enable_interrupts(INT_AD); // AD çevrimi bitti kesmesi tanıtılıyor
 enable_interrupts(GLOBAL); // Tüm kesmeler aktif

 lcd_init(); // LCD hazır hale getiriliyor

 printf(lcd_putc,"\f ADC UYGULAMASI "); // LCD'ye yazı yazdırılıyor
 delay_ms(1500);

 while(1) // sonsuz döngü
 {
 set_adc_channel(5); // RE0/AN5 ucundaki sinyal A/D işlemine tabi tutulacak
 delay_us(20); // Kanal seçiminde sonra bu bekleme süresi verilmelidir
 bilgi=read_adc(); // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor

 voltaj=0.0048828125*bilgi; // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor

 printf(lcd_putc,"\fAN5 Kanali");
 delay_ms(1500);
 printf(lcd_putc,"\fDijital=%lu",bilgi); // AN5 ucundaki sinyalin dijital karşılığı LCD'ye aktarılıyor
 printf(lcd_putc,"\nVoltaj=%fV",voltaj); // AN5 ucundaki sinyalin gerilim değeri LCD'ye aktarılıyor
 delay_ms(2500);

 set_adc_channel(6); // RE1/AN6 ucundaki sinyal A/D işlemine tabi tutulacak
 delay_us(20); // Kanal seçiminde sonra bu bekleme süresi verilmelidir
 bilgi=read_adc(); // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor

 voltaj=0.0048828125*bilgi; // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor

 printf(lcd_putc,"\fAN6 Kanali");
 delay_ms(1500);
 printf(lcd_putc,"\fDijital=%lu",bilgi); // AN6 ucundaki sinyalin dijital karşılığı LCD'ye aktarılıyor
 printf(lcd_putc,"\nVoltaj=%fV",voltaj); // AN6 ucundaki sinyalin gerilim değeri LCD'ye aktarılıyor
 delay_ms(2500);

 set_adc_channel(7); // RE2/AN7 ucundaki sinyal A/D işlemine tabi tutulacak
 delay_us(20); // Kanal seçiminde sonra bu bekleme süresi verilmelidir
 bilgi=read_adc(); // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor

 voltaj=0.0048828125*bilgi; // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor

 printf(lcd_putc,"\fAN7 Kanali");
 delay_ms(1500);
 printf(lcd_putc,"\fDijital=%lu",bilgi); // AN7 ucundaki sinyalin dijital karşılığı LCD'ye aktarılıyor
 printf(lcd_putc,"\nVoltaj=%fV",voltaj); // AN7 ucundaki sinyalin gerilim değeri LCD'ye aktarılıyor
 delay_ms(2500);
 }
}

adc uygulamaları

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

CCS C ve 74164 İle 2 Çıkışla 7 Segment Display Sürme

pr_01_37_max

 

74164 entegresi seri giriş paralel çıkış kaydedici entegresidir. Küçük güçlü yedi segmentleri sürmek için idealdir. Uç uca eklenerek segment sayısı artırılabilir. Daha ayrıntılı bilgiyi kitapta bulabilirsiniz.

/******************************************************
 Uygulama Adı : 74164 ile 2 Çıkışla 7 Segment Display Sürme
*******************************************************/

#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ılan osilatör frekansı belirtiliyor

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

#define data pin_b0 // data sabiti pin_b0'a eşitleniyor
#define clock pin_b1 // clock sabiti pin_b1'e eşitleniyor

// Ortak katot display için veri değerleri
int digit[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F};

char i=0,j=0; // Karakter tipinde değişken tanımlaması yapılı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ışı

 set_tris_b(0x00); // B portu tümüyle çıkış olarak yönlendiriliyor

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

 while(1)
 {
 for(i=0;i<10;i++) // Displayde gösterilecek 0-9 sayıları için döngü

 {

 for(j=0;j<8;j++) // Gönderilecek verinin bit bit gönderilmesi için
 // oluşturulan döngü
 {
 output_bit(data,bit_test(digit[i],j)); // Bit değeri data pinine gönderiliyor

 output_high(clock); // Clock sinyali lojik-1 yapılıyor
 output_low(clock); // Clock sinyali lojik-0 yapılıyor
 }
 delay_ms(500); // Gecikme veriliyor
 }
 }
}

74164 İle 2 Çıkışla 7 Segment Display Sürme

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

CCS C 74138 İle Port Çoğullama Uygulaması

pr_01_37_max

 

74138 entegresi 3 giriş 8 çıkış demultiplexer entegresidir. Pic ile kullanıldığında mikrodenetleyiciye ait  3 çıkış  8 çıkışa artırılmış olur.Daha fazla bilgiyi kitapta bulabilirsiniz. Örnek kod ve proteus simülasyonu aşağıdadır.

/******************************************************
 Uygulama Adı : 74138 İle Port Çoğullama 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ılan osilatör frekansı belirtiliyor

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

int i; // 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_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 tümüyle çıkış olarak yönlendiriliyor

 while(1) // Sonsuz döngü
 {
 for(i=0;i<8;i++) // 1. 74138 entegresi çıkış kontrolü
 {
 output_b(i|0b00000000); // İlk 74138 seçiliyor ve sırayla çıkışlar aktif yapılıyor
 delay_ms(250); // Gecikme veriliyor
 }
 for (i=0;i<8;i++) // 2. 74138 entegresi çıkış kontrolü
 {
 output_b(i|0b00010000); // İkinci 74138 seçiliyor ve sırayla çıkışlar aktif yapılıyor
 delay_ms(250); // Gecikme veriliyor
 }
 for(i=0;i<8;i++) // 3. 74138 entegresi çıkış kontrolü
 {
 output_b(i|0b00100000); // Üçüncü 74138 seçiliyor ve sırayla çıkışlar aktif yapılıyor
 delay_ms(250); // Gecikme veriliyor
 }
 for (i=0;i<8;i++) // 4. 74138 entegresi çıkış kontrolü
 {
 output_b(i|0b00110000); // Dördüncü 74138 seçiliyor ve sırayla çıkışlar aktif yapılıyor
 delay_ms(250); // Gecikme veriliyor
 }
 }
}

74138 İle Port Çoğullama Uygulaması

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

Sudoku Çözme Yöntemi

sudoku

Bir dönem salgın hastalık gibi yerde çözülmeye çalışılan ve hala modasını koruyan sudoku amerikan asıllı olup japonların meşhur ettiği zeka oyunudur. Uğraşması her nekadar gereksiz zaman kaybı gibi görülse de kafayı çalışıtıran, beyni zinde tutan bir oyundur. Bu oyunun çözümü için recursive (iç içe kendini tekrar eden) fonksiyonlarla yapılmış çeşitli bilgisayar programları ve web uygulamaları mevcuttur. Aslında programlayıcılığa yeni başlayacak arkadaşlar için bu oyunun çözümünü sağlayacak programı yapmaya çalışmak programlama öğrenmenin en kolay yolu olacaktır. Eğer başarılı olursanız sonuç olarak porgramlayıcılığın temeli olan döngüler, koşullar, diziler ve fonksiyon yazmayı yalayıp yutmuş olacaksınız.(Ara not: ccs recursive fonksiyonlara izin vermez bilgisayar ile deneyiniz)

Şimdi biz kağıt kalemle nasıl çözülür ona bakalım:

1. Adım olarak kurşun kalem ve silgimizi hazırlıyoruz

s1

2. Adım Her boş kutunun içine 1′den 9′a kadar sayıları yazıyoruz.

s2

3. Adım İçi dolu olan kutudaki sayının üstüne bir çizgi çiziyoruz ve o satırda o sayıdan bizim yazdıklarımız içersinde var ise onları siliyoruz. Burada 6 için aynı satırda azdığımız bütün 6′ları siliyoruz.

s3

 4. Adım Bir önceki adımdaki işlemleri bu sefer 6 rakamının yer aldığı sütun için gerçekleştirip bütün 6′ları siliyoruz

s4

5. Adım Şimdi 6 rakamının sağındaki solundaki bütün 6 rakamlarını sildikten sonra yuvarlak içine alarak o rakamla işlemi bitirdiğimizi gösteriyoruz.

s5

6. Adım Yukarıdaki işlemleri bize verilen diğer sayılar için de gerçekleştiriyoruz.

s6

7. Adım Silme karalama işlemlerini bitirdikten sonra sudokuyu karşımıza alarak inceleyelim. Göreceğiniz üzere bazı kutularda sadece bir rakam kaldı.Bazı kutuların içerisinde sadece tekbir sayı kaldığını göreceksiniz. Yani bu kutularda olması gereken sayıları bulduk demektir. Şimdi bu sayıları BÜYÜK olarak kutularına yazalım

s7

8. Adım Bir diğer eleme metodu olarak kalemin gösterdiği 3 rakamına bakacak olursak yer aldığı sütunda başka 3 yok. Demekki o kutuda 3 kalacak.

s8

9. Adım Her kutuda şansımız yaver gitmeyebiliyor. Burada aşamada yukarıdaki satır ve sütün taramasını tekrar yapmalıyız ya da dikkatle bakacak olursak o sütunda sadece bir kere 5 olduğunu görürüz.

s9

10. Adım İşlem tamam

s10

Çeşitli kategorisine gönderildi | , ile etiketlendi | Yorum yapın

CCS C ile 8255 İle Port Kontrol Uygulaması

pr_01_37_max

8255A yaygın olarak kullanılan, oldukça hızlı, genel amaçlı kullanımlarda karşılaşılacak her duruma uygun özellikleri sağlayan bir entegredir. Esnek, kullanışlı ve ucuz olmasına rağmen, bazı kullanıcılar kullanımını çok karışık bulmaktadır. Bu entegre genel amaçlı paralel Giriş/Çıkış (I/O) cihazıdır ve neredeyse tüm mikroişlemcilerle beraber kullanılabilir. 8255A’nın 24 tane Giriş/Çıkış ucu  vardır. 24 bit giriş çıkış yapılabilmektedir. Bu 24 bit 8 bitlik gruplar halinde gruplanmıştır ve ilk 8 bit A portu, ikinci 8 bit B portu ve üçüncü 8 bit C portu, olarak adlandırılır. C portu ayrıca 4 bitlik iki küçük grup olarak kullanılabilir. (CU ve CL) (Şekil 13). Tüm portların hangi fonksiyonları sağlayacağı kontrol
kaydedicisine (Command register) yazılacak sayı ile belirlenir.
Temel olarak iki mod mevcuttur. Bunlar bit boyutlu işlemler yapmak veya Giriş/Çıkış modlu yani 4-8 bitlik gruplar boyutunda işlemler yapmaktır. Bu ikinci modda kendi içerisinde 3 ayrı işletim moduna ayrılarak incelenir. Bu karmaşık işletim modlarında temel olarak sadece Giriş/Çıkış mod sıfır tercih edilir ve yaygın olarak kullanılır. Diğer modlarda belirli ihtiyaçlara cevap vermek üzere hazırlanmış özel fonksiyonları kolayca elde etmemizi sağlar. Örneğin Giriş/Çıkış Mode1 fonksiyon olarak bir mikroişlemcinin (yazıcı) printer amacı ile de kullanılabilir. Mod2’de ise A port çift yönlü data aktarımı amacıyla kullanılır. C port ise bu haberleşme sistemi içinde karşılıklı onaylama ve diğer gerekli haberleşmeleri içeren tokalaşma (Handshake) sinyallerini sağlar.

Konuyla ilgili daha fazla detayı kitapta bulabilirsiniz. Örnek kodlar ve proteus şeması aşağıdadır.

/******************************************************
 Uygulama Adı : 8255 İle Port Kontrol 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ılan osilatör frekansı belirtiliyor

#use standard_io (a) // A portu için giriş/çıkış yönlendirmesi yapılmasına gerek yok
#use standard_io (b) // B portu için giriş/çıkış yönlendirmesi yapılmasına gerek yok

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

//************** 8255 OKUMA FONKSİYONU ***************
void _8255_yazma (char x, char bilgi)
{
 switch (x)
 {
 case 'k': // Kaydediciye yazma seçilirse
 output_a(0b00001101); // Kaydediciye yazma
 output_b(bilgi); // Yazılacak bilgi gönderiliyor
 break;

 case 'a': // A portuna yazma seçilirse
 output_a(0b00000001); // A portuna yazma
 output_b(bilgi); // Yazılacak bilgi gönderiliyor
 break;

 case 'b': // B portuna yazma seçilirse
 output_a(0b00000101); // B portuna yazma
 output_b(bilgi); // Yazılacak bilgi gönderiliyor
 break;

 case 'c': // C portuna yazma seçilirse
 output_a(0b00001001); // C portuna yazma
 output_b(bilgi); // Yazılacak bilgi gönderiliyor
 break;

 default:
 break;
 }
}

//************** 8255 YAZMA FONKSİYONU ***************
int _8255_okuma (char x)
{
 switch (x)
 {
 case 'k':
 output_a(0b00001110); // Kaydediciden okuma
 return(input_b()); // Kaydedici değeri okunuyor
 break;
 case 'a':
 output_a(0b00000010); // A portundan okuma
 return(input_b()); // A portu değeri okunuyor ve fonksiyondan bu değerle çıkılıyor
 break;
 case 'b':
 output_a(0b00000110); // B portu okuma
 return(input_b()); // B portu değeri okunuyor ve fonksiyondan bu değerle çıkılıyor
 break;
 case 'c':
 output_a(0b00001010); // C portu okuma
 return(input_b()); // C portu değeri okunuyor ve fonksiyondan bu değerle çıkılıyor
 break;
 default:
 break;
 }
}
/********* 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ışı

 _8255_yazma('k',0b10001001); // A portu çıkış, C portu giriş, B portu çıkış yapılıyor

 while(1) // Sonsuz döngü
 {
 data=(_8255_okuma('c')); // C portu okunuyor
 _8255_yazma('a',data); // A portuna okunan C portu değeri yazılıyor
 }
}

8255 İle Port Kontrol Uygulaması

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

CCS C Dosyalarını Kullanarak 24C02 Harici EEPROM Uygulaması

pr_01_37_max

/******************************************************
 PIC16F877 ile CCS C Dosyalarını Kullanarak 24C02 Harici EEPROM Uygulaması
*******************************************************/

#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ılan osilatör frekansı belirtiliyor

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

#use i2c(master,sda=pin_c4,scl=pin_c3,slow=100000) // I2C Fonksiyonu,SDA ve SCL pinleri ve iletişim hızı belirleniyor

#include  // input.c dosyası programa ekleniyor
#include  // 2402.c dosyası programa ekleniyor

byte veri,adres; // byte tipinde değişken tanımlanıyor
char islem; // char tipinde değişken tanımlanıyor

#int_ssp // I2C iletişiminde yazma veya okuma yapıldığında meydana gelen kesme
void I2C_kesmesi()
{
 output_high(pin_C5); // RC5'e bağlı LED yansın
 delay_ms(250); // Gecikme veriliyor
 output_low(pin_C5); // RC5'e bağlı LED sönsün
}

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

 enable_interrupts(int_ssp); // SSP kesmesine izin ver
 enable_interrupts(GLOBAL); // Tüm izin verilen kesmeler

 printf("\n\r***********************************************************");
 printf("\n\r 24C02C Harici EEPROM Bilgi Okuma Yazma ");
 printf("\n\r***********************************************************");
 printf("\n\r");
 printf("\n\r Bir islem seciniz>");

 while(1)
 {
 do // do-while döngüsü tanımlanıyor
 {
 printf("\n\rOkuma (O) veya Yazma (Y) >"); // RS232 portuna veri gönderiliyor
 islem=getc(); // RS232 portundan gelen veri alınıyor
 islem=toupper(islem); // toupper fonksiyonu tüm karakterleri büyük karaktere çevirir a>A
 putc(islem); // "islem" değişkeni içeriği RS232 portuna gönderiliyor
 } while ( (islem!='O') && (islem!='Y') ); // Girilen karakter "0" veya "Y" dışında ise döngü başına dön

 if (islem=='O') // Eğer okunan karakter "O" ise
 {
 printf("\n\rOkumak istediginiz adresi giriniz> ");
 adres=gethex(); // RS232 portundan gelen veriyi hex formatında al
 printf("\n\rDeger= %X",read_ext_eeprom(adres) );
 }

 if (islem=='Y') // Eğer okunan karakter "Y" ise
 {
 printf("\n\rBilgi yazmak istediginiz adresi giriniz> ");
 adres=gethex(); // RS232 portundan gelen veriyi hex formatında al
 printf("\n\rBilgiyi giriniz> ");
 veri=gethex(); // RS232 portundan gelen veriyi hex formatında al
 write_ext_eeprom(adres,veri); // Harici EEPROM'da belirtilen adrese "veri" değerini yaz
 }
 }
}

CCS C Dosyalarını Kullanarak 24C02 Harici EEPROM Uygulaması

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

LCD Kayan Yazı

lcdkayanyazi

Sık kullanılan HD44780 chipset 2×16 lcd ekranların 40 karaktere kadar hafızası vardır. Hafızasına aldığı bütün karakterleri 16 satırlık ekranda göstermesi için sağa yada sola kaydırma işlemini aşağıdaki programdan yapabilirsiniz

Okumaya devam et

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

Karaşimşek Devresi ve Programı

yuruyenyazi

Çocukluğumuzun meşhur dizisi Knight Rider yada kara şimşek’deki siyah arabanın önündeki led efektini sanırım hepimiz biliriz. Bu uygulamada B,C,D portları kullanarak 18 led ile yürüyen ışık devresi yapılmıştır. Kodlarda yapacağınız değişiklik ile led sayısını artırıp azaltabilirsiniz.

Okumaya devam et

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