Notlar..

320volt / Elektronik Kaynakları/

CCS C ile Microchip PIC Programlama

Elektronik Kaynakları, blog arşivinde CCS C ILE MICROCHIP PIC PROGRAMLAMA konusu "ccs c* ccs c kitap* ccs c programlama* ccs türkçe* kılavuz ders* PIC programlama* " ile etiketlendi

CCSC ile Micro chip PIC Programlamamak isteyenler için hazırlanmış detaylı Türkçe bilgilerin örnek devrelerin kodların bilgilerin bulunduğu bir ebook

ccs c dersleri kılavuz eğitim

Bu kitap PICPROJE Ekibi tarafından eğitime katkı amacıyla yapılmıştır. Emeği geçen arkadaslarımız.. (Alfabetik) CoskuN-Bunalmis-CaFFeiNe-Gsever-Kurumahmut-Macera-Microcozmoz-Otm-Oyhan-Petek-Picusta-Respected-SpeedyX-Timpati-Ziya

İçindekiler
Önsöz
Tarihçe
Neden C?
PC’ ye karsı PICmicro MCU tabanlı program geliştirme
Ürün geliştirme
Terminoloji
Kodu deneme ve test etme
C kodlama standartları
Temeller

C Temelleri
C programlarının yapısı
Bir C programının bileşenleri
#pragma
main()
#include
printf Fonksiyonu
degişkenler
Sabitler
Yorumlar
Fonksiyonlar
C komutları

degişkenler
Veri Tipleri
degişken Bildirimleri
degişken Atamaları
Sıralama
typedef
Tip Dönüşümleri

Fonksiyonlar
Fonksiyonlar
Fonksiyon Prototipleri
Fonksiyon Argümanlarının Kullanımı
Fonksiyonlardan değer Döndürme
Klasik ve Modern Fonksiyon Bildirimleri

Operatörler
Aritmetik
ilişkisel
Mantıksal
Bit Operatörleri
Arttırma ve Azaltma
Operatör Öncelikleri

Program Kontrol ifadeleri
if
if-else
?
for döngüsü
while döngüsü
do-while döngüsü
Program Kontrol ifadelerinin içiçe Kullanımı
Break
Continue
Null
Return

Diziler / Katarlar
Tek Boyutlu Diziler
Katarlar
Çok Boyutlu Diziler
Öndeğerli Diziler
Katar Dizileri

işaretçiler
işaretçi Temelleri
işaretçiler ve Diziler
Fonksiyonlara Geçen işaretçiler

Yapılar / Birleşimler
Yapı Temelleri
Yapı işaretçileri
içiçe Yapılar
Birleşim Temelleri
Birleşim işaretçileri

PICmicro MCU’e özgü C
Girisler ve çıkışlar
C ve Assembly Birlikte Kullanımı
gelişmis BIT işleme
Zamanlayıcılar
A/D Çevrim
Veri iletişimi
I²C iletişimi
SPI iletişimi
PWM
LCD Sürme
Kesmeler
Kütüphaneler

Önsöz

Neden C?

C dili Dennis Ritchie ve Brian Kernighan tarafından 1970’li yılların başlarında Bell laboratuarlarında geliştirilmistir. ilk uygulama platformlarından biri UNIX ortamında çalışan bir PDP-11 olmustur. Tanıtımından bu yana, kendini kanıtlamıs bir uygulama geliştirme dili olarak bilgi işlem endüstrisinin basından sonuna dek evrim geçirmistir ve standartlastırılmaktadır. PC, C++ ve diğer ANSI standardındaki versiyonları için düsük maliyetli bir geliştirme ortamı olmustur. C, programların bir bilgisayardan baska bir bilgisayara minimum degişiklik yapılarak aktarılabilmesi için tasınabilir bir dil olarak tasarlanmıştır.

PC’ler ve anabilgisayarlar ile çalışırken bu çok iyi bir özelliktir. Fakat mikrokontrolörler ve mikroişlemciler farklı türlerdir. Ana program akısı degişmeden kalacaktır ama çesitli ayarlar ve port/çevresel kontroller mikroişlemciye özgüdür. Buna örnek olarak PICmicro MCU için port yön yazmaçlarını verebiliriz, 1=Giris 0=çıkış iken H8 mikrokontrolörler için 0=Giris 1=çıkışı belirtir.

Üreticilerin daha fazla program ve RAM hafızaları ile yüksek işletim hızları sunması C dilinin mikrodenetleyici uygulamalarında kullanılmasına sebep olmustur. Bana aktarılan bir örnek – hiçbir seye inanmayan biri olarak – suydu: bir zamanlayıcı fonksiyonunu assemblyde iki haftada C’ de ise birgünden kısa bir sürede yazabilirsiniz. Yani hemen kosup bir C derleyicisi almamı mı söylüyorsunuz – assemblyde yazmaktan niye sıkılayımki? Daha kısa kod üretiyor – assemlyde yazılmıs bir program C’ de yazılmıs bir programa göre ortalama %20 daha az yer kaplıyor. Program hafızası yüksek modellerde iyi fakat düsük
modellerde pek randımanlı değil.

PC’ ye karsı PICmicro MCU tabanlı program geliştirme

Mühendisler temel donanımının (klavye, işlemci, hafıza, G/Ç, yazıcı ve ekran gibi) hazır olmasından dolayı PC tabanlı birimlerle ürün geliştirmeye başlamıslardır. Ürün geliştirme yazılımı hazırlamaktan ve hatalarını gidermekten oluşuyordu.

PIC tabanlı ürün geliştirmek, MCU’nun dıs dünya ile iletişiminin giris çıkış donanımları seklinde oluşturulmasıyla başlar. Bir PC programcısı “Merhaba Dünya” yazan bir programı derleyip çalıştırdığında ekranda mesajı hemen görür. PIC programcısı mesajı görebilmek için RS232 arabirimini yapmak, PIC
içerisinde iletişim portunu ayarlamak ve geliştirme kartını PC üzerindeki iletişim portuna bağlamak zorundadır.

Bu kadar zahmete gerek varmı? dediğinizi duyar gibiyim. Eger tüm PC’ yi (monitör ve klavye ile birlikte) 40 bacaklı bir entegre kılıfında edinebilseydik onu kullanırdık: bu günkü imkanlarla henüz buna sahip değiliz. Bunun için düsük maliyet ve tasınabilir uygulamalar için PIC veya benzeri mikrodenetleyiciler kullanmaya devam edecegiz.

PIC tabanlı sistemler için geliştirme araçları grafik kütüphaneler haricinde PC tabanlı sistemlerdeki gibi geliştiriciye bazı temel kolaylastırıcı seçenekler sunar.

Ürün geliştirme

Ürün geliştirme tecrübe ve sansın birleşimidir. Bazı çok küçük program parçaları uzun geliştirme sürelerine malolur fakat ürünün mükemmelliginde büyük pay sahibidirler.

Bir ürün geliştirmek için sunlara ihtiyaç vardır: zaman – huzur ve sessizlik – mantıksal düsünce ve en önemlisi ihtiyaçların tam olarak anlasılmasıdır. Bana göre geliştirmeye başlamak için en kolay yol fikirlerle beraber birkaç sayfa temiz kagıttır.

ise mümkün olan çözümleri çiziktirmekle başlayın ve en basit, en güvenilir seçenegi bulmak için herbirini dikkatle gözden geçirin. Bu asamada diğer fikirleri çöpe atmayın içlerinde güzel düsünceler olabilir. Akıs diyagramı, blok diyagram, G/Ç bağlantılarını çizin. Tüm G/Ç pinleri ile prototip kartınızı oluşturun. Kartınızı G/Ç pinleri degiştirilebilecek şekilde dizayn etmeniz kullanıslı olacaktır.

Programınızı – test edilebilir bloklar seklinde – yazmaya başlayın ve yavaş yavaş büyüterek programınızı oluşturun. Bu sizi 2000 satırlık bir programı tek seferde hatalardan arındırmaktan kurtarır!

Eger ilk projenizse – O ZAMAN BASiT TUTUN – devasa bir uygulamadan önce komutlara alışmak, assembly tekniklerini ve hata ayıklamayı ögrenmek için bir LED i butonlarla yakıp söndürme gibi basit uygulamalar yapın. Programınızı basit adımlarla test ederek oluşturun. Akıs diyagramınızı elden geçirerek güncel kalmasını sağlayın.

Fikir

Bir fikir belki EVREKA! tarzında sizden çıkabilir veya baska birinin bir ihtiyacı olarakta dogabilir.

Tasarım işlemine başlamadan önce gerekli olan temel terminoloji anlasılmalıdır. Bu durumda PICmicro MCU tabanlı tasarım yapmaya başlamadan önce PIC dili (komut seti, terimler ve geliştirme kiti) tam olarak anlasılmalıdır. Simdi genel terimlerle, PIC’ler hakkındaki gerçeklerle ve mikroişlemci ile mikrodenetleyici sistemler arasındaki farklarla baslıyoruz.

Terminoloji

Kullanılan bazı temel terimler

Mikrodenetleyici bir yazılım olmadan hiçbir is yapmayan plastik, metal ve kum yıgınından baska birsey değildir. Yazılım ile kontrol edildiginde sınırsız bir uygulama alanı vardır.

G/Ç dıs dünya ile iletişime geçen MCU bacagıdır. Giris veya çıkış olarak ayarlanabilir. Çogu durumda G/Ç birimleri mikrodenetleyicinin iletişim, kontrol ve bilgi almasına imkan verirler.

Yazılım mikrodenetleyicinin işlem yapması ve çalışması için gerekli olan bilgidir. Basarılı bir uygulama veya ürün için hatalardan arındırılmıs olması gerekir. Yazılım degişik dillerle yazılabilir C, pascal, basic veya assembly gibi (binary kodlardan oluşan makine dilinin bir üstü)

Donanım mikrodenetleyici, hafıza, arabirim bileşenleri, güç kaynagı, sinyal şartlandırma devreleri ile sistemin çalışmasını ve dıs dünya ile iletişimini sağlayan bileşenlerden oluşur.

Baska bir bakıs açısıyla (özellikle çalışmadığında) donanımı fırlatıp atabilirsiniz.

Simülatör MPLAB® geliştirme ortamı mikrodenetleyicinin dahili işlemlerine erisebilmeyi sağlayan kendi simülatörüne sahiptir. Olayların ne zaman meydana geleceginin biliyorsanız bu tasarımınızı test etmeniz için iyi bir yoldur.

In Circuit Emülatör PC ile mikrodenetleyicinin takıldıgı sokete bağlanan çok kullanıslı bir ekipmandır. Yazılımın PC üzerinde çalıştırılmasını fakat devre kartında mikrodenetleyici tarafından çalıştırılıyor gibi görünmesini sağlar. ICE programı adım adım çalıştırabilmenizi ve mikrodenetleyici kısmında neler oldugunu dıs dünya ile nasıl iletişime geçtiğini izlemenizi sağlar.

Programlayıcı programı mikrodenetleyici hafızasına yüklemeye yarayan ve ICE yardımı olmadan çalışabilmesini sağlayan ünitedir. degişik şekillerde, boyutlarda ve fiyatlarda olabilir. Microchip’ in PICSTART PLUS ve PROMATE II modelleri seri porta bağlanır.

Kaynak dosyası anlayabileceginiz şekilde assembly dili ile yazılmıs programdır. Kaynak dosyasının mikrodenetleyicinin anlaması için işlemden geçirilmesi gerekir.

Assembler / Derleyici kaynak dosyasını obje dosyasına çeviren yazılım paketidir. Hata kontrol özelligi vardır ve assembly işlemi esnasında oluşan hataları bildirir. MPASM Microchip’ in tüm PIC’ leri destekleyen en son assembler yazılımıdır.

Obje dosyası Assembler / Derleyici tarafından üretilen ve programlayıcı, simülatör yada ICE’ nin anlayabileceği formdaki dosyadır. Dosya uzantısı assembler direktifine bağlı olarak .OBJ veya .HEX olabilir.

Liste dosyası Assembler / Derleyici tarafından üretilen kaynak dosyasındaki tüm komutları bunların hexadesimal karsılıklarını ve yazdığınız açıklamaları içeren dosyadır. Dosya uzantısı .LST’ dir.

diğer dosyalar .ERR uzantılı dosyalar hataları içeren hata dosyalarıdır. .COD dosyaları emülatör tarafından kullanılır.

Hatalar sizin tarafınızdan yapılan yanlıslardır. Basit yazım hatalarından programlama dilinin yanlıs kullanımına kadar çesitli sebepleri vardır. Büyük bir çogunlugu derleyici tarafından yakalanır ve .LST dosyasında gösterilir.

Mikroişlemci bir mikroişlemci veya dijital bilgisayar üç temel birimden oluşur. MiB (CPU), G/Ç ve hafıza – ile diğer destek devreleri


TiPiK BiR MiKROişlemCi SiSTEMi

Giriş/çıkış (G/Ç) dış dünya ile iletişimi sağlayan dijital, analog ve özel fonksiyonlardan oluşan birimdir.

Merkezi işlem birimi (MiB) hesaplama ve veri işleme işlemlerini yapan 4, 8 yada 16 bit veri formatları ile çalışabilen ve sistemin kalbi sayılan birimdir.

Hafıza RAM, ROM, EPROM, EEPROM veya bunların bir kombinasyonu seklinde olabilir ve program ve verileri depolamaya yarar.

Osilatör mikroişlemcinin çalışabilmesi için gerekli saat frekansını sağlar. Osilatör degişik bileşenlerle oluşturulabilir veya hazır modül olarak elde edilebilir.

Mikroişlemci ile bağlantılı diğer devreler watchdog zamanlayıcısı – sistemin kitlenmesini önler –, adres ve veri yolları için tampon devreleridir – aynı yol üzerinde birden çok çipin birbirine zarar vermeden çalışabilmesini sağlar.

Mikroişlemci denildiğinde esas olarak MiB’ den bahsedildigi anlasılır. G/Ç ve hafıza ayrı çiplerden oluşur ve düzgün bir şekilde çalışabilmek için adres ve veriyolları ile adres çözme devrelerine ihtiyaç duyarlar.

Mikrodenetleyiciler

PICmicro MCU ve diğer mikrodenetleyiciler tek çip içerisinde MiB (CPU), hafıza, osilatör, watchdog ve G/Ç birimlerini barındırırlar. Bunun sonucunda yerden tasarruf, tasarım zamanının azalması ve harici birimlerle ilgili uyumluluk sorunlarının azalması sağlanır fakat bazı durumlarda sabit hafıza boyutu ve
sınırlı G/Ç kapasitesi nedeniyle tasarımın sınırlarını daraltır.

PIC mikrodenetleyici ailesi geliştiricilere en çok ihtiyaç duyacakları genis bir aralıkta G/Ç, hafıza ve özel fonksiyonları sunar.

Neden PIC kullanırız

Kod verimliliği PIC Harvard mimarisini esas alan 8 bit bir mikrodenetleyicidir. – bunun anlamı içerisinde hafıza ve veri için farklı yollar bulunur. Program ve veri hafızasına aynı anda erisebildiginden dolayı hızı yüksektir. Geleneksel mikrodenetleyicilerde program ve veri hafızası aynı veriyolunu kullanır. Bu PICmicro ile karsılastırıldığında hızı en az 2 kat düsürür.

Emniyet tüm komutlar 12 veya 14bit genisligindeki program hafızasına sıgar. Bu yüzden programın VERi bölgesine atlayıp VERi’ yi program komutları gibi çalıştırması gibi bir ihtimal yoktur. Bu Harvard mimarisinde olmayan 8bit program adres yolları kullanan mikrodenetleyicilerde oluşabilir.

Komut seti 16C5X ailesi ve 14bit genislikteki 16CXX ailesi için program yazabilmek için ögrenmeniz gereken sadece 33 komut vardır. CALL, GOTO ve bit test amaçlı komutlar haricindeki (BTFSS, INCFSZ vs.) komutlar tek komut adımında işletilirler.

Hız PIC osilatör ile dahili saat yolu arasında 4’e bölücü bir devre içerir. Bu özellikle 4Mhz kristal kullanıldığında komut zamanının hesaplanmasını kolaylastırır. Bu durumda her bir komut adımı (çevrimi) 1uS (yani 1µs) tutar. PIC 20Mhz gibi bir kristal kullanıldığında saniyede 5 milyon komut isletebilen
oldukça hızlı bir işlemcidir. – hemen hemen 386SX33’ün iki katı!

Statik işletim PIC tamamen statik bir mikrodenetleyicidir; diğer bir deyişle saat frekansını durdurursanız tüm yazmaç içerikleri oldugu gibi kalır. Pratikte tam olarak bunu yapmazsınız, PIC’i uyku moduna geçirirsiniz – bu saat frekansını durdurur ve PIC’ in uyku modundan önce hangi durumda oldugunu
bilebilmesi için bazı bayrakları ayarlar. Uyku modunda iken PIC 1uA’den az akım çeker.

çıkış sürme yeteneği PIC yüksek çıkış sürme kapasitesine sahiptir ve LED triyak vs. direk sürebilir. Herhangi bir G/Ç pininden 25mA kadar veya tüm çipten 100mA-200mA akım çekilebilir.

Seçenekler neredeyse tüm ihtiyaçlarınıza cevap verebilecek şekilde hız, sıcaklık, kılıf, G/Ç hatları, zamanlayıcı fonksiyonları, A/D ve hafıza seçenekleri mevcuttur.

Çok yönlülük PIC yüksek adetlerde düsük maliyetli ve çok yönlü bir mikrodenetleyicidir. Özellikle yerin önemli oldugu uygulamalarda birkaç mantık kapısının yerine bile kullanılabilir.

pic16f84a blok diagram
PIC16F84A (14BIT) BLOK DiYAGRAMI

Güvenlik PICmicro MCU endüstrideki en güvenli kod koruma özelliklerinden birine sahiptir. Koruma biti birkez programlandığında program hafızası okunamaz.

geliştirme PIC geliştirme için pencereli veya FLASH yapıda, üretim için ise OTP (birkez programlanabilir) yapıda bulunabilir. geliştirme araçları ev kullanıcıları için kolayca ve uygun fiyatlı olarak temin edilebilir.

Kodu deneme ve test etme

C’yi kavramak için başlangıç masrafları olarak C derleyicisi, in circuit emülatör
ve gerekli donanımı edinmek projenin değerlendirme safhasında insanın
gözünü korkutabilir. C derleyicisi diskte verilir ve internetten sağlanabilir.

C kodlama standartları

Program yazmak ev insa etmeye benzer – temel sağlam ise isler iyi gider. aşağıdaki öneriler C++ standartları dokümanından alınmıs ve PIC’e adapte edilmistir.

isimler – fonksiyonlarına uygun olmasını sağlayın isimler programlamanın kalbidir ve programda kullanılıs amacı ile yerine getirdigi isleve uygun olarak verilmelidir. Okunabilirligi arttırmak için büyük küçük harfleri birlikte kullanabilirsiniz.

HataKontrol, HATAKONTROL‘ den daha kolay okunur. Yine okunabilirligi arttırmak için ön ek olarak bir küçük harf kullanılabilir.

g Global gLog;
r Referans rStatus();
s Statik sValueIn;

Parantezler { }
Parantezler geleneksel UNIX yöntemiyle;

if(kosul){
……………
}

veya kolay okunan şu yöntemle kullanılabilir

if(kosul)
{
……………
}

Kenar boşlukları
Kenar boşlukları kullanarak yazıları içeriden başlatmak programın okunabilirliğini arttırmak için gereklidir.

Satır uzunluğu
Monitör ve yazıcı uyumlulugu için satır uzunluğunun 78 karakteri geçmemesine dikkat edin.

Else If formatı
Herhangi bir kosulu yakalamak için koyacagınız ekstra Else ifadesi önceki if’ ler tarafından kapsanmaz.

if(kosul)
{
}
else if(kosul)
{
}
else
{
………… /* yukarıdakiler tarafından kapsanmaz */
}

Kosul formatı
Derleyici izin veriyorsa sabit değerleri esitlik/esitsizlik karsılastırmalarında sol tarafa yazın. = işaretinin biri unutulursa derleyici hata bildirir. Ayrıca değer göze batan yerde olmus olur.

if(6 == HataNo)…

degişkenlere başlangıç değeri verin Rastgele değer içermemesi için tüm degişkenlere önceden değer verin.

int a=6, b=0;

Yorumlar
yorumlar hikayenin öbür yarısıdır. Programınızın bugün nasıl çalıştıgını biliyorsunuz peki iki hafta veya iki yıl sonra hatırlayabilecek misiniz? Programınızı baska biri incelese neler oldugunu anlayabilecek mi? ileriki çalışmalarınızı kolaylastırmak, hataları bulabilmek ve ileride ürününüzü geliştirebilmek için yorumları kullanın.

Temeller
Bütün bilgisayar programları bir başlangıç noktasına sahiptir. Bu başlangıç noktası mikrodenetleyicilerde reset vektörüdür. 14bit PIC16CXX ailesinin reset vektörü 00h, 12bit PIC16C5X ve 12C50X ailesinin reset vektörü ise hafızanın en yüksek adresidir. – 1FFh, 3FFh, 7FFh

Bitis noktası eger program sadece bir kez çalışacaksa (örneğin iletişim için hızı ayarlayan bir rutin gibi) programın durdugu yerdir. Trafik ısık kontrolü gibi diğer programlar sürekli başlangıç noktasına dönerler.

Yüksek seviyeli dillerde en yaygın olarak kullanılan ilk programlama örnegi ekrana “Merhaba Dünya” yazdırmaktır.

PC ile C kullandığınızda, açıkçası ekran, klavye ve işlemcinin tümü birbirine bağlıdır. Yapmanız gereken programlarla programları ve çevrebirimlerini birbirine bağlamaktır. PICmicro MCU veya diğer mikroişlemci/mikrodenetleyici sistemleri için program geliştirdiğiniz zaman ise programı yazmaktan baska
mikroyu dıs dünyaya bağlamak için fiziksel donanımı da oluşturmanız gerekir. Buna benzer bir sistem aşağıda görülmektedir.

fiziksel donanımı

PIC ögretirken kullandıgım basit bir program bir butonla bir ledi yakma programıdır. Basit bir programla başlayın – 2000 satırlık bir program ile değil!

Assembly’de su şekilde:

Assembly yazılımı

C’ de su şekilde:

c yazılımı

derlendiğinde kod şu hale gelir:

derlenmiş hali

Gördügünüz gibi derlenmiş hali hafızada assemblyden daha fazla yer kaplar – 14 word C, 9 word Assembly. Fakat programlar büyümeye başladığında C kod kullanımında daha etkili olur.

1. C Esasları

Bu bölümde C programlamanın bazı temel yönlerinden bahsedilecektir. Amaç size temel C bilgilerini vermek ve ilerki bölümlerdeki alıştırmaları anlamanızı sağlamaktır.

Ele alınacak başlıklar sunlardır:

Program yapısı
Bir C programının bileşenleri
#pragma
main
#include direktifi
printf deyimi
degişkenler
Sabitler
Yorumlar
Fonksiyonlar
C komutları

1.1 C Programının Yapısı
Tüm C programları önişlemci direktifleri, bildirimler, tanımlamalar, ifadeler, durum ifadeleri ve fonksiyonlar içerir.

Önişlemci direktifi
Önişlemci direktifi C önişlemcisine gönderilen bir komuttur (program derlenirken ilk adımı oluşturur). En çok kullanılan iki önişlemci direktiflerinden #define, özel bir tanımlayıcının yerine geçen bir metin belirtmek için ve #include ise program içerisine harici bir dosyadan tanımlama ya da program parçaları dahil etmek için kullanılır.

Bildirimler
Bildirimlerle programda kullanılan degişkenler, fonksiyonlar ve tiplerin nitelikleri ve isimleri ayarlanır. Global degişkenler fonksiyonların dışında tanımlanır ve tanımlandıkları yerden itibaren dosyanın sonuna kadar geçerlidirler. Local degişkenler ise fonksiyonların içinde tanımlanır ve tanımlandıkları yerden itibaren fonksiyonun sonuna kadar geçerlidirler.

Tanımlamalar
Tanımlamalarla bir degişken veya fonksiyonun içerigi ayarlanır. Ayrıca degişkenler ve fonksiyonlar için gerekli hafıza ayrılır.

ifadeler
ifade tek bir değer üreten isleçler ve islenenler kombinasyonudur.

Durum ifadeleri

Durum ifadeleri bir C programında program akısının kontrolünü sağlarlar.

Fonksiyonlar
Fonksiyonlar özel bir işlem yapan bildirimler, tanımlamalar, ifadeler ve durum ifadeleri bütünüdür. Parantezler fonksiyonun gövdesini kapsar. Fonksiyonlar C’ de bulunmak zorunda değildir.

main Fonksiyonu
Tüm C programları main isimli bir fonksiyon içermek zorundadır ve program buradan başlar. main fonksiyonunu kapsayan parantezler programın başlangıç ve bitis noktalarını belirler.

Örnek: Genel C program yapısı

Genel C program yapısı

1.2 Bir C programının bileşenleri
Tüm C programları ifadeler ve fonksiyonlar gibi gerekli bileşenler içerir. ifadeler aslında programın işlemleri gerçeklestiren kısımlarıdır. Bütün C programları bir veya daha fazla fonksiyon içerir. Fonksiyonlar bir veya daha fazla ifadeden oluşan altprogramlardır ve programın diğer kısımları tarafından çagırılırlar.

Programları yazarken tablar, boş satırlar ve açıklamalar okunurlulugu arttırır sadece ileriki tarihlerde sizin için değil, aynı zamanda programınızı inceleyen baskaları içinde. aşağıdaki örnek bir C programının gerekli bileşenlerini göstermektedir.

#include
/* ilk C programım */
main()
{

printf(“Merhaba Dünya”);
}

#include ifadesi derleyiciye ‘stdio.h’ dosyasının programa dahil edilmesini bildirir.

.h uzantısı başlık dosyasını belirtir. başlık dosyası programda kullanılan standart fonksiyonlar hakkında bilgi içerir. Standart giris çıkış başlık dosyası stdio.h adıyla anılır ve en çok kullanılan giris çıkış fonksiyonlarını içerir. Sadece programda standart giris çıkışlarla ilgili bölümler oldugunda kullanılması
gerekir.

/* ilk C programım */ ifadesi C için bir açıklama satırıdır. Geleneksel olarak açıklamalar /* ve */ karakterleri arasında bulunur. Yeni sitil açıklamalar ise // karakterleri ile başlar ve satır sonuna kadar açıklama kabul edilir. Açıklamalar derleyici tarafından dikkate alınmaz ve bu nedenle derlenmiş kodun boyutu ve hızı üzerinde bir etkisi yoktur.

Bütün C programlarında main()fonksiyonu bulunmak zorundadır. Bu programa giris noktasıdır. Bütün fonksiyonlar aynı formata sahiptir.

FunctionName()
{
code
}

Fonksiyon içerisindeki ifadeler sırayla işletilirler.

Süslü parantezler { ve } C’de kod bloklarının başlangıcını ve bitisini gösterirler.

Son olarak printf(“Merhaba Dünya”); ifadesi tipik bir C ifadesidir. Hemen hemen tüm C ifadeleri noktalı virgül (;) ile biter. Satır sonu karakteri (CR+LF) C tarafından satır sonlandırıcı olarak tanınmaz. Bu sebepten dolayı ifadelerin bir satıra sıgması gibi bir zorunluluk yoktur ve bir satırda birkaç ifade bulunabilir.

Bütün ifadelerin sonunda, derleyiciye ifadenin sonuna gelindiğini bildiren noktalı virgül (;) bulunur ve aynı zamanda ifadeyi diğer ifadeden ayırır. Noktalı virgül unutulursa bir sonraki satırda hata oluşur. if ifadesi bilesik bir ifadedir ve noktalı virgülün bilesik ifadelerin sonuna konması gerekir.

if (BuDogruysa)
BunuYap();

1.3 #pragma
Pragma komutu derleyiciye derleme zamanında özel bir işlem yapmasını bildirir mesela hangi PICmicro MCU’ nun kullanıldığını bildirmek gibi

#pragma device PIC16C54

CCS C’ de pragma komutu zorunlu değildir ve aşağıdaki yazımda kabul edilir
#device PIC16C54

1.4 main()

Her programda sadece birkez görünen bir main fonksiyonu olmak zorundadır. () parantezler arasında parametreler bulunamaz. void sözcügü parantezler içerisinde parametre olmadığını göstermek için kullanılabilir. main fonksiyon olarak sınıflandırılmıstır ve ardından gelen komutlar {} parantezleri arasında
bulunmak zorundadır.

main
{
komutlar
}

1.5 #include

Her programda sadece birtane main fonksiyonu olmak zorundadır. başlık dosyası, (*.h uzantısıyla belirtilen) fonksiyonların aldıgı argümanlar, fonksiyonların döndürdükleri değerler ve belirli bir PIC modelinin kaydedicilerinin adresleri gibi bilgileri barındırır.

#include <16C54.H>

Bu bilgi derleyici tarafından bütün donanımla ilgili tanımların ve kaynak programların bağlanması sırasında kullanılır.

#include <16c71.h>
#include
#use rs232(baud=9600,xmit=PIN_B0,rcv=PIN_B1)
main()
{
printf(“Enter characters:”);
while(TRUE)
putc(toupper(getc()));
}

PIN_B0 ve PIN_B1 tanımlamaları 16C71.H adlı başlık dosyasında bulunur. toupper fonksiyonu da CTYPE.H başlık dosyasında belirtilmistir. Her iki başlık dosyası da derleyicinin kullanılan fonksiyonlar hakkında bilgi sahibi olması için kullanılmalıdır. Ayrıca birçok C derleyicisi printf ve putc gibi G/Ç fonksiyonları için başlık dosyalarını kullanımına ihtiyaç duyar.Bu fonksiyonlar programlara #use rs232 direktifi ile eklenirler ve harici bir başlık dosyasına ihtiyaç duymazlar.

#include

önişlemciye dosya1 adlı başlık dosyasının başlık dosyaları klasöründe bulundugunu belirtir. Çift tırnak içerisindeki başlık dosyası ismi ise derleyiciye kaynak kodun bulundugu klasöre bakmasını söyler.

#include “dosya2.h”

ilk olarak o anda kullanılan klasöre bakmasını belirtir. Dikkat ettiyseniz #include direktifinden sonra noktalı virgül konulmuyor. Bunun nedeni #include direktifinin bir C ifadesi değil önişlemci direktifi olmasıdır. Bütün başlık dosyasının içerigi derlenme zamanında kaynak dosyasına eklenir.

1.6 printf Fonksiyonu

printf fonksiyonu yazılabilir bilginin gönderilmesini sağlayan ve standart kütüphanede bulunan bir fonksiyondur. printf() için genel biçim su şekildedir:

printf(“kontrol karakterleri dizisi”, argument_list);

Kontrol karakterleri dizisi çift tırnak içinde bulunan bir karakter dizisidir. Bu dizi içinde harf, rakam ve sembol kombinasyonları bulunabilir. Özel semboller % işareti ile birlikte kullanılırlar. Bir printf() fonksiyonu içinde mutlaka bir kontrol karakteri dizisi olmalıdır. Eger biçim belirteçleri kullanılmadıysa argüman listesi
bulunmayabilir. Argüman listesi sabitler ve degişkenlerden oluşabilir. aşağıda printf() fonksiyonunun sabit ve degişkenlerle kullanımına dair iki örnek bulunmaktadır:

printf(“Merhaba Dünya”);
printf(“Microchip® #%d numara!”,1);

Biçim belirteci (%d) gösterilecek olan verinin tipine bağlıdır. aşağıda C’de kullanılan bütün biçim belirteçleri ve ilgili veri tipleri gösterilmistir:

printf() Biçim Belirteçleri

%c tek bir karakter character
%d işaretli Desimal Tamsayı
%f Kayar noktalı (ondalık gösterim)
%e Kayar noktalı (Üstel veya bilimsel gösterim)
%u işaretsiz Desimal tamsayı
%x işaretsiz hexadesimal tamsayı (küçük harf)
%X işaretsiz hexadesimal tamsayı (Büyük harf)
l öneki uzun tamsayıları belirtmek için %d, %u, %x ile birlikte kullanılır

NOT: % karakterinden sonra kullanılan 0(sıfır)’ların sayısı, sayı dizilerinde kaç adet sıfırın gösterilecegini belirler. 0’ları takip eden sayı da, kaç hanenin gösterilecegini belirler.

printf(“ 12’nin onaltılık karsılığı %02xn”,12);

Bu program satırının çıktısı: 12’nin onaltılık (hexadesimal) karsılığı olan 0c dir.

Ters bölü karakter sabitleri(Escape Sequences):

n yenisatır

t yatay tab
r carriage return
f formfeed
’ tek tırnak
” çift tırnak
\ backslash
%% yüzde işareti
? Soru işareti
b backspace
boş(null) karakter
v dikey tab
xhhh insert HEX code hhh

Format belirteçleri %[bayraklar][genislik][.hassasiyet], seklinde de kullanılabilir.

printf(“Alan %6.4f birim karedirn”,alan);

alan degişkeni 6 haneli ve 4 ondalık hane kullanılarak yazılacaktır.

”Varsayılan” olarak printf’in çıktısı en son tanımlanmış RS232 portuna gönderilir. Çıktılar herhangi bir fonksiyon yoluyla baska bir yere de yönlendirilebilir.

örneğin:

void lcd_putc(char c)
{
// Insert code to output one
// character to the LCD here
}
printf(lcd_putc, “value is %u”, value);

1.7 degişkenler

degişken, bellekteki belirli bir konuma verilen isimdir. Bu bellek bölgesi degişkenin bildirimine göre degişik değerleri tutabilir. C dilinde bütün degişkenlerin kullanılmadan önce bildirimleri yapılmış olmalıdır. degişken
bildirimleri derleyiciye ne tür bir degişken kullanıldığını bildirir. Bütün degişken bildirimlerinin sonunda noktalı virgül (;) bulunmalıdır. Temel C veri tipleri char, int, float, ve long’dur. degişken bildirimlerinin genel biçimi su şekildedir:

tip degişken_ismi;

degişken bildirimine örnek olarak char kar; örneğini verebiliriz.Burada kar degişkeni karakter olarak tanımlanıyor (8 bit işaretsiz tamsayı)

1.8 Sabitler

Sabit, program tarafından degiştirilemeyen değer demektir. örneğin 25 sayısı bir sabittir. -100 ve 40 gibi tamsayı sabitler olabilecegi gibi 456.75 gibi kayar

noktalı sabitler de olabilir. Karakter sabitler tek tırnak içerisinde gösterilirler: ‘A’ veya ‘&’ gibi.

Derleyici programınızda bir sabit ile karsılastığında bu sabitin türü hakkında karar vermesi gerekir. C derleyicisi varsayılan olarak verinin yerlestirilebilecegi en ufak veri tipini kullanacaktır. örneğin 15 sayısı bir int , 64000 işaretsiz long tiptir.

Sabitler ayrıca #define ifadesi ile de belirtilebilinir:

#define etiket değer

Derleyici programı derlerken etiket kısmında yazılı olan isimle her karsılastığında bunun yerine belirtilen değeri koyacaktır.

#define TRUE 1
#define pi 3.14159265359

C sabitleri 16lı veya 8lik tabanda yazmanıza olanak verir: Onaltılık tabandaki sabitler ‘0x’ öneki ile başlamalıdır. örneğin 0xA4 geçerli bir onaltılı sabittir. Sayısal sabitlerin yanında C dizge sabitlerini de destekler. Dizge sabitleri çift tırnak arasında yazılan karakter takımlarıdır.

#define ifadesi ile tanımlanan sabitler aslında derlenmeden önceki asamada yapılan yazınsal degişimlerdir. # işareti ile başlayan satırlar ön-işlemci direktifleridir.

#define sözcügüyle herhangi bir metni tanımlayabilirsiniz. örneğin:

#define YASLI_değil (YAS<65)
.
.
.
.
.
if YASLI_değil
printf(“GENC”);

#define verisi bellekte saklanmaz. Derlenme anında islenir.

Sabitleri ROM’a kaydetmek için const sözcügünü kullanmalışınız. örneğin:

char const id[5]={“1234”};

Buradaki diziyi bellekte saklamak için 5 adet bellek bölgesi kullanılır. Çünkü dizinin sonuna boşluk karakteri () eklenmektedir.

1.9 Yorumlar

Yorumlar kaynak kodda yapılan işlemleri anlatmak ve çalışmasını göstermek için kullanılır. Yorumlar derleyici tarafından göz ardı edilir. Yorumlar bir C anahtar kelimesinin, fonksiyon veya degişken isminin ortası dışında herhangi bir yerde bulunabilirler. Yorumlar birçok satırdan oluşabilirler ve bazen kodların
geçici olarak kaldırılması için de kullanılabilirler. Yorumlar satırlarca uzunlukta olabilirler ve bazen de bir kod satırının geçici olarak kaldırılması için kullanılabilirler. Yorumlar iç içe gömülemezler. Yorumların iki tür kullanım biçimleri vardır. ilk biçim bütün C derleyicileri tarafından desteklenmektedir.

/* Bu bir yorumdur*/

ikinci format ise birçok derleyici tarafından desteklenmektedir.
// Bu bir yorumdur
alıştırma: aşağıdaki yorum biçimlerinden hangileri geçerli,hangileri geçersizdir?

/* Kısa bir yorum */

/* Çok çok çok çok çok çok çok çok çok çok çok çok çok çok çok çok uzun bir yorum */

/* Bu yorum /* geçerli */ değildir */

1.10 Fonksiyonlar

Fonksiyonlar C programlarının temel yapıtaslarıdır. Her bir C programı en az bir fonksiyon, main(), barındırır. Yazdığınız birçok program birden fazla fonksiyon bulunduracaktır. Birçok fonksiyonu barındıran bir C programının genel yapısı su şekildedir:

main()
{
fonksiyon1()
{
}
fonksiyon2()
{
}
}

main() program çalıştırıldığında çagırılan ilk fonksiyondur. diğer fonksiyon1() ve fonksiyon2() programın herhangi bir yerinde çagırılabilirler.

Geleneksel olarak main() fonksiyonu baska bir fonksiyon tarafından çagırılmaz, ancak C’de kısıtlamalar yoktur. aşağıda iki C fonksiyonu görülmektedir:

main()
{

printf(“C’yi“);
fonksiyon1();
printf(“’cok“);
}
fonkisyon1()
{
printf(“ seviyorum “);
}

Bir fonksiyonda en son paranteze ( } )gelince program tekrar fonksiyonun çagırılmıs oldugu satırdan itibaren işletilmeye devam eder. Bölüm 3.1’e bakınız.

1.11 Makrolar

#define önceki bölümlerde de görüldügü gibi güçlü bir direktiftir. C define direktifinin parametre almasını da sağlayarak daha da güçlü hale getirir. Parametrelerle birlikte kullanıldığında bunlara makro denilir. Makrolar programların okunabilirliğini artırmak veya yazma kolaylığı sağlamak için kullanılırlar. Basit bir makro

örnegi:

#define var(x,v) unsigned int x=v;
var(a,1);
var(b,2);
var(c,3);

aşağıdakine esdeğerdir:

unsigned int a=1;
unsigned int b=2;
unsigned int c=3;

aşağıdaki örnek de kısa bir fonksiyon tanımlanmaktadır:

#define MAX(A,B) (A>B)?A:B)

z = MAX(x,y); // z ,x ve y değerlerinin en büyügü olacaktır

1.12 Durumsal Derleme

C’de bazı derleme esnasında kodun belirli bölümlerinin derlemeye dahil edilmesi veya çıkarılması için ön-işlemci direktifleri bulunur. aşağıdaki örnegi inceleyelim:

#define HW_VERSION 5
#if HW_VERSION>3
output_high(PIN_B0);
#else
output_low (PIN_B0);
#endif

Yukarıdaki programda HW_VERSION değerine bağlı olarak sadece bir satır derlenecektir. Aynı kodda onlarca #if ifadesi bulunabilir ve aynı kod degişik

donanımlar için derlenebilir. #if ifadeleri, normal if ifadelerinden farklı olarak kod derlenirken değerlendirilirler. #ifdef ifadesi herhangi bir kimlik ifadesinin daha önce tanımlanıp tanımlanmadığını belirlemede kullanılır.

Örnek:

#define TANIM
#ifdef TANIM
printf(“X Fonksiyonu çalıştırılıyor”);
#endif

Bu örnekte #define TANIM satırı kaldırıldığında printf fonksiyonunun bulundugu satır derleyici tarafından göz ardı edilecektir (yani derlenmeyecektir).

1.13 Donanım Uyumlulugu

Derleyici kodun düzgün derlenebilmesi için donanım hakkında bilgiye ihtiyaç duyar. Tipik bir program su şekilde başlar:

#include <16c74.h>
#fuses hs,nowdt
#use delay(clock=800000)

ilk satır kullanılan işlemcinin pinlerine ait define direktiflerini içeren dosyanın programa eklenmesini sağlar. ikinci satırda PICmicro®MCU‘nun ayar değerleri atanır. Bu örnekte yüksek hızlı osilatör kullanılmakta ve watchdog timer devre dışı bırakılmaktadır. Son satır da osilatörün hızı belirtilmektedir. aşağıda baska bir örnek görülmektedir:

#use rs232(buad=9600,xmit=PIN_C6,rcv=PIN_C7)
#use i2c(master,scl=PIN_B6,sda=PIN_B7)

Bu kitaptaki örneklerde yukarıda görülen donanım tanımlayan satırlar gösterilmemistir.

Buna ilave olarak, C degişkenleri tanımlanıp donanım kontrol kayıtçılarına (registers) yönlendirilebilirler. Bu degişkenler bayt veya bitler seklinde olabilirler. Tanımlandıktan sonra programda diğer normal degişkenler gibi kullanılabilirler. Örnek olarak

#bit carry=3.0 ; STATUS registerindeki carry flagi degişken tanımlandı
#byte portb=6 ; PortB dogrudan degişkenmis gibi tanımlandı
#byte intcon=11; INTCON kayıtçısı degişken olarak tanımlandı

1.14 C Anahtar Kelimeleri

ANSI C standardı 32 adet C anahtar kelimesi tanımlar. C’de belirli kelimeler derleyici tarafından veri tiplerinin tanımlanmasında veya döngülerde kullanılırlar. Bütün C anahtar kelimeleri küçük harfle yazılmalıdır. Genellikle, C derleyicileri işlemcinin özelliklerinden faydalanabilmek için fazladan anahtar atanır. Bu örnekte yüksek hızlı osilatör kullanılmakta ve watchdog timer devre dışı bırakılmaktadır. Son satır da osilatörün hızı belirtilmektedir.

Hazırlayan: PicProje Ekibi – Emeği geçen kişilere Teşekkürler CCS Çeviri kitabına Buradan ulaşabilirsiniz

  • HazarfenÇelebi

    Arkadaşlar 9 bölüm neden yok bu kitapta başka kaynaklardan da indirdim ama hep aynı durum bana 9 bölüm lazım!Yardımcı olursananız sevinirim.

  • riza

    arkadaşım ozaman 16 ytl ne kıyıp kital alcaksın 22 bölüm war onda ;)
    ccs ile pic programlama

  • Pasan

    Does some one hv English Version of this ?

  • Guray

    This e-book is translated from an english version, so the original language is english. Author’s name is Nigel Gardner. With a little effort you can find it on the net. A little determination plase…

  • MIE

    16 YTL ye nerede satılıyor bu kitap?

  • eaagless

    pdf için gerçekten teşekkürler..

  • elektrotman

    Orjinalini nerede bulabilirim tüm bölümlerini türkçe olarak

  • Şevki Şahin

    Pic C Compiler ile 16F84 entegresini kullanarak yanıp sönen led uygulamasının kodunu yazdım fakat yazdığım kod hata içeriyor.Oruç oruç kafayı yemek üzereyim yardımcı olabilecek olan var mı?? yazdığım kodu aşağıda paylaşıyorum :

    #include “C:\Users\fermiyon\Desktop\pic c compiler\yenideneneme\aqasd.h”
    #if defined( PCM )
    #include
    #fuses XT,NOWDT,NOPROTECT
    #use delay(clock=4000000)
    #include

    void main(){

    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

    tekrar:
    output_bit(PIN_B0,1);
    delay_ms(250);
    output_bit(PIN_B0,0);
    delay_ms(250);
    output_bit(PIN_B1,1);
    delay_ms(250);
    output_bit(PIN_B1,0);
    delay_ms(250);
    goto tekrar;
    #ENDIF

    }

  • KEIL uvision

    #include “C:\Users\fermiyon\Desktop\pic c compiler\yenideneneme\aqasd.h”

    #fuses XT,NOWDT,NOPROTECT
    #use delay(clock=4000000)

    void main(){
    set_tris_b(0×00);output_b(0×00);
    //setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
    delay_ms(100);
    while(1){
    output_bit(PIN_B0,1);
    delay_ms(250);
    output_bit(PIN_B0,0);
    delay_ms(250);
    output_bit(PIN_B1,1);
    delay_ms(250);
    output_bit(PIN_B1,0);
    delay_ms(250);

    }

    }