Yeni Başlayan Birinin Sorabileceği Sorular

Başlatan muskut, 14 Nisan 2010, 14:51:05

muskut

Merhaba arkadaşlar,

Size bir kaç ufak sorum olacaktı. C dili (Hi Tech C) yeni yeni uğraşmaya başladım. Uzun süredir pic üzerinde projeler geliştiriyorum fakat C diline bir türlü geçiş yapamamıştım. Şu sıralar Hi Tech ile bu geçişi yapmaya çalışıyorum ve malumunuz yeni başlayan biri olarak basit olacak bir kaç sorum var. Tahmin ediyorum ki ilerleyen zamanlarda da bu soru listemi güncelleyeceğim. Gelelim sorularıma;

1. include komutu ile eklenen kütüphaneler arasında "htc.h" ve "pic.h" diye kütüphaneler var. Belkide ileride yeni karşılaşacağım Hi Tech i veya pic'i ilgilendiren yeni kütüphaneler gelecektir. Şuan için sadece şu 2 kütüphaneye rastladım. Bu kütüphanelerin içeriği nedir? Hangi bilgiler bu kütüphanede tutuluyor. Hangi durumlar için bu kütüphaneleri eklemem gerekiyor.

2. Mikroişlemciyi ilgilendiren register'lar üzerinde işlem yaparken, bu değişkenleri kullanırken, bir kütüphane tanımlaması yapmam gerekir mi? Mikroişlemcinin Register isimlerini C dili içinde nasıl kullanabiliyorum. Yani diyelim ki "PORTA" yı çıkış yaparken register adı olarak "PORTA" veya "_porta" ve ya 2 alt çizgili "__porta" gibi yazmalar görüyorum. Bunun bir farkı varmıdır? Nasıl kullanmalıyım?

3. (20.04.2010) Bugüne ait yeni bir soru ile bu başlığı güncelliyorum. Sorum şu; Portların (RC1, RA2.. gibi) varsayılan tanımlamaları mevcut. Fakat ben RC1 yerine BUTON1 gibi bir tanımlama, RA2 yerinede ALARM gibi bir isimlendirme yapıp, bu adlandırmalar ile bu portlara ulaşmak istiyorum. Fırat Deveci'nin hazırlamış olduğu dökümanda bu tanımlamalar;

#define sut1 RD0 // sut1 ifadesi RD0 ifadesine esitleniyor
#define sut2 RD1 // sut2 ifadesi RD1 ifadesine esitleniyor

gibi atamlar ile yapıldığı ifade ediliyor. Ama ben benzer bir atamayı yaptığımda, incelmiş olduğum list çıktısında herhangi bir atama işleminin yapılmadığını görüyorum. Zaten programımda da böyle bir atama sonucu çalışma olmuyor. Belki ben yanlış anlamışda olabilirim. Sorum şu "Portların isimlendirilmeleri nasıl yapılıyor?"

4.(22.04.2010) Bugün için yeni bir sorum daha olacak. MCU'nun dahili EEPROM larına yazma okuma ile ilgili. Aslında daha çok yazma ile ilgili. HI-TECH'in manuel'ini incelediğim de 2 çeşit yazma ve okuma komutunun olduğunu gördüm. Birisi "eeprom_write(); fonksiyonu" diğeride, "EEPROM_WRITE(); makrosu". Ben kaynak koduma şöyle 2 satır ekledim;


eeprom_write(0,4);
EEPROM_WRITE(6,4);


eeprom_write(0,4); fonksiyonu ile 0 adresine "4" değerini, EEPROM_WRITE(6,4); makrosu ile de 6. adrese "4" değerini yazmak istiyorum. "eeprom_write(0,4);" fonksiyonu çalışmıyor fakat "EEPROM_WRITE(6,4);" makrosu çalışıyor. 6. adreste "4" değerini görebiliyorum. Gelelim bu konu ile ilgili soruma
  i) eeprom_write(); fonksiyonu neden çalışmıyor olabilir? Derlerken herhangi bir hata ile karşılaşmıyorum.
ii) Fonksiyonlar ile Makrolar arasındaki fark nedir? Neden eeprom_write() fonksiyonu varken EEPROM_WRITE(); makrosuna ihtiyaç duyulmuş olabilir? Birde makro kavramınada azcık değinen olursa çok sevinirim.



Şimdilik sorularım bunlar, tahmin ediyorum ki ilerleyen zamanlarda bu başlığın altındaki sorulara yenilerini eklerim. Cevaplarınız için şimdiden teşekkür ederim

Logan

Sorularına kısaca cevap verecek olursak;

1- "htc.h" ve "pic.h" dosyaları header dosyalarıdır. "Program files" içerisinde, hi-tech klasöründe bulunur. Genel olarak kullanmak istediğin işlemcinin register haritası ve tanımlamaları yer alır. Bu tanımlamalar arasında program içerisinde kullanabileceğin bütün bit ve byte'lar mevcuttur. Esasen "htc.h" dosyası bunları barındırmaz. Sadece ilgili işlemcinin header dosyasına ulaştırır. Bunu da şu şekilde yapar. Yeni bir proje oluşturduğumuz zaman sizden derleyici seçmenizi ister. Sizde kullanacağınız pic serisine göre 24 serisi-16 serisi veya 18 serisi bir derleyici seçersiniz. İşte "htc.h" dosyası da burada seçilen derleyiciye göre header dosyası tanımlar. Siz programınızın başına "pic.h" eklemeseniz bile, o sizin seçmiş olduğunuz derleyiciden hangi dosyayı eklemesi gerektiğine karar verir. 16 serisi işlemiler için "pic.h" kullanılır. Bu "pic.h" dosyası içerisinde de kullandığınız işlemcinin header dosyaları belirlenir. Toparlayacak olursak , programın başına "htc.h" eklemekle kullanacağımız işlemciye ait bütün register ve bit girdilerini-adreslerini tanıtmış bulunuyoruz.

2- Aslında bu sorunun cevabını kısmen yukarıda verdim. Fakat genel olarak açıklayacak olursak, hi-tech derleyicisi datasheet içerisinde register veya bitin ismi nasıl geçiyorsa, program içerisinde de o şekilde tanır. Örnek;

ADON=1;
PORTA=0xff;
RBPU=0;

gibi.

Umarım açıklayıcı olmuştur.
İmza.

muskut

"Umarım" da ne demek. Çok güzel izah etmişsiniz. Ellerinize sağlık. Bahsetmiş olduğunuz klasörlerleri ve header dosyalarını inceledim. Şimdi daha iyi anladım ne için gerekli olduklarını.

Logan

Klasörleri açıp dosyaları incelemiş olmanız çok güzel. Eminim daha da kalıcı olmuştur.
İmza.

muskut


Logan

@muskut,

Açıkçası bu tarz bir problem ile hiç karşılaşmadım. Şimdi bahsettiğin gibi bir atamanın yer aldığı program açtım. Orada bulunan bir satırı aynen yazıyorum.

#define reset_pin RC5

Yalnız şöyle bir durum var. Ben genelde bit,byte, bacak ve atama tanımlamalarını "main.c" içerisinde yapmam. "global.c" ve "global.h" dosyaları oluşturur, herşeyi bu dosyalar içerisine atarım. #define ile başlayan tanımlamalar ise ( #define reset_pin RC5, #define origin 450 gibi ) "global.h" içerisinde yer alır. Sana tavsiyem programın en başında "#include <htc.h>" ve diğer tanımlamalar altına osilatör ayarları yaptıktan hemen sonra bu define tanımlamalarını eklemendir. "void main (void)" altında yapıyorsan tanımıyor olabilir.
İmza.

muskut

Normalde bende projelerimde dosyalandırma yapılarını kullanırım. Şuan C öğrenmeye çalışıyorum. O yüzden böyle bir header, source parçalamasına girmiyorum. Tanımlamalarımı htc.h tanımamasının hemen altında yapıyorum. Derlemede problem olmuyor fakat list dosyasını incelediğimde assembler kodları içinde hiç bir atamayı bulamıyorum.

#define   LED RC1

gibi bir tanımlamayı hemen htc.h ın altında yapıyorum. Fakat program içinde

LED = 1;

atamasını yapınca

"Error   [195] D:\Projects\PIC\C_PROJECTS\16F886\main.c; 38.6 expression syntax"

hatası alıyorum. Fakat

RC1 = 1;

yapınca, bağlı olan ledi yakabiliyorum.

Logan

Yazdığın programı ekler misin, bir de ben denemek istiyorum.
İmza.

ahmet2004


Çalışmaması için bir neden yok.

çalışan kod:
// pic16f84a

#include <htc.h>

__CONFIG(HS & UNPROTECT & WDTDIS & PWRTEN);

#include "delay.h" 

#define   LED RB5

void
main(void)
{
	TRISB=0x00; 
	PORTB=0x00;
	while (1)
	{
	      LED=1; 
	      DelayMs(250); //MAX 255 değeri var
	      LED=0; 
	      DelayBigMs(450);
	      
	}
}

muskut

Arkadaşlar sorun çözüldü. Problemşuymuş;

#define   LED RC1;
#define   LED RC1

ikisi arasındaki fark NOKTALI VİRGÜL!!! Aman yeni başlayanlar dikkat edin benim gibi 2 gününüzü harcamayın :) Tanımlamanın sonunda noktalı virgül olmaması lazımmış (3. Sorumun cevabıdır)

Teşekkürler

t2

Daha önceden galiba Proton kullandığınızı duymuştum.  Protonu bırakıp başka bir derleyiciye geçmenizini sebebini öğrenebilir miyim? ( ben hala proton kullanıyorum duruma göre belki ben de geçebilirim.)

muhittin_kaplan

basic syntax dan c ye geçince noktalı virgül hep unutulur.

Tagli

Normalde preprocessor ifadelerinden sonra noktalı virgül kullanılmaz diye biliyorum. En azından bilgisayardaki C dilinde durum böyle. ahmet2004'ün verdiği kodda da noktalı virgül göremedim.
Gökçe Tağlıoğlu

acemi2010

Herkese Kolay gelsin;
Yeni bir başlık atmaktansa buraya sormyı uygun buldum. PBP'dan Hi-tech'e geçtim ve tırmalıyorum. Hi-Tech v9.70PL0 kullanıyorum.
Sorum şu :
PBP'da DATA diye bir komut var; pic'i programlama sırasında, bu komut yardımı ile dahili EEPROM'a bilgiler yazabiliyoruz diye biliyorum.
Hi-tech'de bunu nasıl yapabiliriz?
şimdiden teşekkürler

Saygılarımla;
Timuçin
---------------------------------------------------------------------------------------------------------------------------------------------------
Bizi inciten şey; insanların bize yaptıkları değil, yaptıklarına vermeyi seçtiğimiz tepkidir. STEPHEN COVEY

acemi2010

Tekrar merhaba;
Sanırım buldum;
Alıntı YapHave a line before your main(void){...}
__EEPROM_DATA(0x55,1,2,3,4,5,6,7);

this will preload your EEPROM when you compile and program your device.

http://forum.htsoft.com/all/showflat.php/Cat/0/Number/143322/page/1/fpart/4/vc/1

Saygılarımla;
Timuçin
---------------------------------------------------------------------------------------------------------------------------------------------------
Bizi inciten şey; insanların bize yaptıkları değil, yaptıklarına vermeyi seçtiğimiz tepkidir. STEPHEN COVEY