PIC C ile ilgili bir soru

Başlatan XX_CİHAN_XX, 16 Kasım 2005, 21:59:29

XX_CİHAN_XX

Arkadaşlar bu konudakı cehaletımı bagışlayın.Uzun bır asm gecmısınden sonra pıcc ye basladım.Tabi daha yenıyım bircok seyı sızlerın sayesınde ogrenıyorum.Eksık olmayın.Bu konu ile ilgili bir de kıtap aldım ama kıtap demeye bın sahıt gerek bır cok uygulama ya eksık anlatılmıs yada yanlıs.Neyse yayın evını ve kıtabın adını burda soylemeyım.Bakarsın dava acarlar.Dertsız basıma dert almayım.Benim bir sorum olcak aslında bırkac soru ama ilk sunu sormak ıstıyorum degerlı arkadaslar.Bir cogunuz ıcın emınım cok basıt bır sorudur.
PICC de pıc ın her hangı bır bıtını gırıs yaptıktan sonra dıyelım kı o pıne bir buton bagladık.Butona bastıgımızda o pın lojik "0" oluyor.Butona basılmadıgı zaman ise lojık "1" de oluyor.Diyelımkı soz konusu ayak porta,0. bit olsun bunu pıcc de nasıl yaparız.Soyle yapsak olur mu;

loop:                                    //bekle
if(PORTA,0==1)goto loop;     //butona basılmadı
//butona basıldı gereklı ıslemlerı yap

bu yontem dogru mu?dogru degılse yada baska sekıldede yapılabılırse kı emınım yapılıyordur nasıl yapıldıgını benımle paylasırsanız cok sevınırım.
birde  "bit_test"  diye bır komut var o bu ıs ıcın mı kullanılıyor.Daha dogrusu nasıl kullanılıyor.Yardım edersenız cok sevınırım.Saygılarımla,
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Erol YILMAZ

Pic icin C derleyicisi olarak en cok CCS ve HI-TECH kullaniliyor.
Ben de senin daha onceki mesajina bagli olarak CCS kullandigini tahmin ediyorum.
Portun h.h.bir bitini okumak icin,

degisken = input(PIN_B1);

seklinde kullanabilirsin. PIN_B1 i de main fonksiyonundan once #define ile tanimlarsan

#define BUTON_KAPI  PIN_B1        gibi


if(input(BUTON_KAPI)==0) olarak kullanabilirsin...

Ayrica ornekleri incelersen bu konularda cok sayida uygulama var!

XX_CİHAN_XX

Arkadaşım ilgilendiğin için çok teşekkür ederim ama,
Alıntı yapılan: "Erol"
degisken = input(PIN_B1);
seklinde kullanabilirsin. PIN_B1 i de main fonksiyonundan once #define ile tanimlarsan
#define BUTON_KAPI  PIN_B1        gibi
if(input(BUTON_KAPI)==0) olarak kullanabilirsin...
Bu şekilde yazınca hata veriyor.Atladığım birşeymı var acaba.Birde bit_test komutunun işlevini öğrenmem mümkün mü acaba.Saygılarımla,
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

piedos

while( !bit_test(*5,0) );


*5 PORTA ya pointer
Einstein: "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."

Erkan Gench

merhaba. öncelikle hangi derleyiciyi kullandığını anlamamız lazım. benim tahminin hi-tech picc'yi kullanıyorsun. ilk verdiğin örneğe bakıncada c'ye yeni başladığın anlaşılıyor. ben sana c'ye yeni başladığından hi-tech'i kullanmanı tavsiye etmem çünkü hem C'yi hemde hi-tech'i öğrenmen çok sıkııntı olur.

Aslında en güzeli PC'de C'yi öğrenip sonra pic'e geçmektir ama bunun için çok vakit gerek. acelem var diyorsan bence hemen forumu araştır ve ccs'nin son versiyonunu indir. hatırladığım kadarıyla ingilizce sorunun vardı. eğer ingilizce biliyor olsaydın ccs'nin help'i ve forumu bir çok soruna cevap olurdu ama şimdi işin biraz daha zor. neyse ccs'nin kendisiyle beraber gelen birçok örnek var bunları proteus ile simule edip inceleyebilirsin.  

öncelikle forumda ccs ile ilgili sorulan soruları inceleyip bunların cevaplarına bakarsan ve kendi kendine ufak bişeyler yapmaya çalışırsan iyi bir başlangıç olur. tabi unutmaki ccs öğrenmek ile C öğrenmek ayrı şeyler bundan dolayı C'yi anlatan ayrı bir kitap edinmen çok daha iyi olur. ben A'dan Z'ye C klavuzu kitabını tavsiye ederim.

bahsettiğin kitabın ismini verebilirsin dava falan açamazlar merak etme. hatta vermen lazım ki bizde gidip almayalım böyle kitaplarda piyasadan silinsin.

evet C'de ilk öğreneceğin şey label kullanmanın C programcıları tarafından hiçte hoş karşılanmadığıdır :) çünkü C'nin mantığına tamamen ters bişey. bunun benim bildiğim tek bir istisnası var oda iç içe döngülerden çıkmak için.

şimdilik bu kadar kolay gelsin ama kısa zamanda çok şey bekleme. zamanla verdiğin emeğin hakkını aldığını göreceğine inanıyorum.
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

XX_CİHAN_XX

Alıntı yapılan: "piedos"while( !bit_test(*5,0) );


*5 PORTA ya pointer
Arkadaşlar ilginize çok teşekkür ederim.Yazmayı unutmusum kusra bakmayın ben ccs kullanıyorum.Yukardakı ornegı help dosyasında gormustum zaten ama hıc bırsey anlamadıgım için kullanamadım.Keske ornegın altına benım anlıyacagım sekılde ufak bır acıklama koysaydın. Neyse yınede çok teşekkur ederım.Bu arada kitap konusunda haklısın adını soylemelıyım kı baskaları aynı hatayı yapmasın.
Ben infogate in "PIC C İLE PIC PROGRAMLAMA" adlı kitabını aldım.(almaz olaydım:))
Kitap tavsiyen içinde çok teşekkür ederim.En kısa zamanda alıcam.Ya bir şey aklıma takıldı,
while(PORTA,0==1)
{
}
şeklinde soruyu soramazmıyız. yada,
if(PORTA,0==1)
komut;
else
komut;
seklınde soramazmıyız.(Porta nın 0. biti "1" mi sorusunu)
Goto komutunu kullanmadan.
Çünkü bu şekilde yazınca derleyıcı hata vermıyor:)
İlginize çok teşekkürler.Saygılarımla,
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Erkan Gench

if(input(pin_a0))
{
    komutlar; 
}
else
{ 
    komutlar;
}


normal şartlarda bu şekilde kullanırsın girişin bir olup olmadığını kontrol etmek için. sıfır içinde if(!input(pin_a0)) şeklinde. tabi başka yolları var ama bu genelde yeterli oluyor. küme parantezlerini kullanmazsan sadece bir komut yazabilirsin.
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

XX_CİHAN_XX

Arkadaşlar yardımlarınız için sağol un sanırım anladım birde ornek bır program yazdım yanlısım varsa lutfen uyarın.Gayet basıt bır program.
verireg degıskenını porta0 a baglı butona her basısta bır artıran program;

#include <16F877.h>           //16f877 ınclude dosyasını programa dahıl et
#define  clk  PORTA,0         //porta,0 ı clk olarak tanımla
void main() {                    //ana dongu baslangıcı
short int verireg=0;      //veriregi 8 bitlik bir degisken olarak tanımla ve sil
for(;;){                        //sonsuz dongu baslangıcı
if( !bit_test (clk) ){      //butona basıldıysa
verireg++;                //veriregi 1 artır
}                            //basılmadıysa gerı don
}                           //sonsuz dongu bıtısı
}                          //ana dongu bıtısı
Umarım dogru yazmısımdır yanlışım varsa lutfen uyarın.çok teşekkurler
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

XX_CİHAN_XX

Alıntı yapılan: "Erkan Gench"
if(input(pin_a0))
{
    komutlar; 
}
else
{ 
    komutlar;
}

Çok teşekkur ederım ilginden dolayı da bu sekılde yazdıgımda,pın_a0 hata veriyor.Onun yerıne PORTA ,0 YAZIYORUM yine hata veriyor.
#define clk PIN_A0 şeklınde tanımlama yapıp clk yı kullanıyorum yıne yata verıyor.O yuzden bende bıt_test komutunu kullanarak bı deneme yaptım hata vermedı o yazdıgım dogru mu onu merak edıyorum.Birde pıc basıc ten hatırladıgım kadarıyla input komutu kullandıgın pını, diyelım kı porta,0. bit uzerınde kullanalım.o biti once gırıs yapıyor sonra porta ,0 ı gırıs yaptıktan sonra 1 mı 0 mı dıye soruyor diye biliyorum.(pıc basıc ten)
eger bu pıcc içinde gecerliyse ınput komtu pek hosuma gıtmıyor.
Zaten gosterdıgınız sekılde yazınca derledımgımde pın_a0 kısmı hata verıyor nedense.Benım yukarıda yazdıgım ornektekı bıt_test komutunu dogru kullandım mı acaba.Eger dogru yazdıysam o programı o sekılde kullanmamda bır sakınca varmı.Yoksa o sekılde yazdıgımda hata vermedıgı ıcın oyle kullanıcamda.
Kusra bakmayın bu kadar basıt bır konu ıcın epey basınızı agrıttım galıba.
Yardımlarınız ıcın cok teşekkürler.Saygılarımla,
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

XX_CİHAN_XX

Alıntı yapılan: "XX_CİHAN_XX"Arkadaşlar yardımlarınız için sağol un sanırım anladım birde ornek bır program yazdım yanlısım varsa lutfen uyarın.Gayet basıt bır program.
verireg degıskenını porta0 a baglı butona her basısta bır artıran program;

#include <16F877.h>           //16f877 ınclude dosyasını programa dahıl et
#define  clk  PORTA,0         //porta,0 ı clk olarak tanımla
void main() {                    //ana dongu baslangıcı
short int verireg=0;      //veriregi 8 bitlik bir degisken olarak tanımla ve sil
for(;;){                        //sonsuz dongu baslangıcı
if( !bit_test (clk) ){      //butona basıldıysa
verireg++;                //veriregi 1 artır
}                            //basılmadıysa gerı don
}                           //sonsuz dongu bıtısı
}                          //ana dongu bıtısı
Umarım dogru yazmısımdır yanlışım varsa lutfen uyarın.çok teşekkurler
Çok ilginc kullandıgım ccs nın help ınden aldıgım input la ilgili programı derledıgımde yıne hata verıyor program bu
while ( !input(PIN_B1) ) ;
{
}
yukarıda yazdıgım program dogruysa inputa gerek kalmıyor.Mumkunse bu noktaya bı yorum getırırsenız cok sevınecem ve bu konuya oktayı koyucam.Yardımlarınız ıcın cok teşekkürler.Saygılarımla.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Erkan Gench

şu aldığın hatayı bi yazsan belki daha iyi yardımcı olabilirim. neyse yanlış anlamadıysam ccs'nin wizardını kullanmıyorsun ki bu özellik ccs'nin en güzel özelliklerinden birisi.

bunun için project menüsünden new>pic wizard'ı seçiyorsun. sonra projeni kaydedeceğin ismi belirleyip gelen pencerede istediğin pici ve bu picin özelliklerini seçiyorsun. ccs senin için gereken başlangıç kodunu üretiyor. özellikle picin frekans ayarını ve kristal tipini dikkatli seç. lvp'yi kapatsan iyi olur.

belkide aldığın hatalar bu başlangıç kodlarının yazılmamış olmasındandır.

bu arada short int ile bir bitlik değişken tanımlarsın 8 bit tanımlamak için char yada int8 demen lazım

#include <16F877.h> //16f877 ınclude dosyasını programa dahıl et
void main() { //ana dongu baslangıcı
short int verireg=0; //veriregi 8 bitlik bir degisken olarak tanımla ve sil
for(;;){ //sonsuz dongu baslangıcı
if( !input(pin_a0) ){ //butona basıldıysa
verireg++; //veriregi 1 artır
} //basılmadıysa gerı don
} //sonsuz dongu bıtısı
} //ana dongu bıtısı


bu kod bende hata vermiyor fakat bir işede yarayacağını sanmıyorum :)
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

XX_CİHAN_XX

:roll: Öncelıkle bana ve bu olanlara sabredıp usenmeden cevap yazdıgın ıcın cok teşekkür edıyorum
aynen verdigin kodu kopyaladım ve yıne pın_a0 ı gosteren bır hata ıle karsılastım.hata su: undefıned ıdentıfıer yanı pın_a0 ı tanımıyor derleyıcı.Dedıgın gıbı yapıp aynı seyı pıc wızard ı kullanarakta yaptım sonuc degısmedı.pın_a0 yerıne PORTA,0 yazdım hata yıne degısmedı.Gerçekten çok ilginç.Ya bunu baska bır yontemı yokmudur.Çok merak edıyorum.Mesela bu da bır yontem sanırım,
if( !bit_test (PORTA,0) ){
}
Sanırım diyorum çunku emin değilim aydınlatırsanız sevinirim.
İlginize teşekkürler.Saygılarımla,
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

XX_CİHAN_XX

Arkadaşlar yardımlarınız için sağol un sonunda becerdım su ısı.Şole yaptım ve hata vermeden derledı.Umarım yanlıs bısı yapmamısımdır.
#define  clk  40      //porta 5 de oldugu için 5*8+0=40 porta,0 a erismek için 40 yazdım ve bu adresı clk olarak tanımladım(umarım dogrudur)
if( !input(clk) ){
komut;
}
yukarıdakı sekılde yazdıgımda derleyınce hata ıle karsılasmadım.ama pın_a0 seklınde yazdıgımda yukarıda soledıgım gıbı tanımsız karakter hatasını verıyor.Acaba benım kullandıgım ccs eskı versıon oldugu ıcın mı oyle yazınca kabul etmıyor.
Benım kullandıgım ccs nın versıonu 2.78
Birde bu sekılde yazdım hata vermedı ama dogru mu yazdım onu merak edıyorum.İlginize şimdiden teşekkürler.Saygılarımla, :roll:
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Erkan Gench

kullandığın versiyon çok eski. sanırım pin tanımlamaları eskiden pin_a0 şeklinde değildi sonradan böyle yaptılar onun için senin compiler tanımıyor. bu tanımlamalar 16f877.h dosyasının içinde yapılır bu dosyayı açıp gerçekten böyle olup olmadığına bakabilirsin.

neyse sen hiç vakit kaybetmeden buradan en son versiyonu indir

http://picproje.org/index.php/topic,6961

sonra sorunların çözülecektir inşaallah. yalnız compilerın çalışması için patch yapman lazım heralde biliyorsundur ama bilmiyorsan forumda ccs bölümünde nasıl yapıldığı yazılı.
Zorluklar, zamanında yapmamız gerekip de yapmadığımız kolay şeylerin birikmesiyle oluşur. Henry Ford ----------- Ya Rabbi Filistin'deki ve dünyanın her tarafındaki Müslüman kardeşlerime yardım et.

XX_CİHAN_XX

Evet arkadaşım dediğin gibi sorun eski version olmasından kaynaklanıyormuş.Yardımların için çok teşekkür ederim. Herkese başarılar.Saygılarımla,
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.