CCS S Pic Programlama ile IF kullanımı sorunum var Yardım Lazım !

HALER

Üye
Katılım
31 Ağu 2012
Mesajlar
4
Puanları
1
Yaş
38
Merhaba ;
Pic16f628 ile RF alıcı verici yapıyorum. verici kısmından dört farklı bilgi göndericem.ilk iki bilgi alıcı çıkışına bağlı led leri yakıyor burda sorun yok. 3. bilgi de şunu yapmak istiyorum . eğer 1. ve 2. led yanıyor ise 3. bilgi geldiğinde 3. ledi yak.yani ilk iki bilgi gelmediyse 3. led yanmasın istiyorum. (bu arada 4. bilgi hepsini resetliyor onda da sorunum yok ) ama bu 3 koşullu satırı yazamadım. altta ALICI devreye ait pic yazılımını veriyorum .
Eğer vericiden 'D' bilgisi gelirse;
eğer vericiden pin_a1 bilgisi gelmiş ise;
eğer vericiden pin_b0 bilgisi gelmiş ise;
bu şartlar sağlandığında pin_b4 yansın.

benim yazdığım yazılımda 'D' verisi gönderildiğinde alıcıda pin_a1 sönüyor ve pin_b4 yanmıyor.

ALICI PIC:

#include "C:\Users\win7\Desktop\alici verici 3 kesme uygulaması\alici3.h"
#fuses xt,nowdt,nobrownout,nolvp,nocpd,noprotect,noput
#use delay(clock=4M)
#use rs232(baud=600,parity=N,rcv=pin_b1,bits=8)

char e;
void main()
{


setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillotar Config tab


set_tris_b(0b00000010);
set_tris_a(0x00);
output_b(0x00);
while(1)
{
if(getch()=='X')
{
e=getch();
if(e=='A')
{
output_high(pin_B0);
}
if(e=='B')
{
output_high(pin_a1);
}


if (e=='D' && input(pin_a1)==1 && input(pin_b0)==1) /*bu satırda sorunum
var
bu koşulu nasıl sağlarım*/
{
output_low(pin_b4);
}


if(e=='C')
{
output_LOW(pin_a1);
}
if(e=='C')
{
output_low(pin_b0);
}
if(e=='C')
{
output_low(pin_b4);
}
}
}
}


LAZIM OLURSA DİYE VERİCİ PIC:

#include "C:\Users\win7\Desktop\alici verici 3 kesme uygulaması\verici3.h"
#fuses xt,nowdt,nobrownout,nolvp,nocpd,noprotect,noput
#use delay(clock=4M)
#use rs232(baud=600,parity=N,xmit=pin_b2,rcv=pin_b1,bits=8)


void main()
{


setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);


while(1)
{
set_tris_b(0x00);
output_b(0x00);
if(input(pin_a0)==1)
{
putc(0b01010101);
putc('X');
putc('A');
delay_ms(50);
}
if(input(pin_a1)==1)
{
putc(0b01010101);
putc('X');
putc('B');
delay_ms(50);
}
if(input(pin_a2)==1)
{
putc(0b01010101);
putc('X');
putc('C');
delay_ms(50);
}
if(input(pin_a3)==1)
{
putc(0b01010101);
putc('X');
putc('D');
delay_ms(50);
}
}
}
 
kodun başında
#byte porta=5
#byte portb=6

ile port adreslerini tanımlayıp,


if ( ( e=='D' ) & bit_test(porta,1) & bit_test(portb,0) )/*bu satırda sorunum
var bu koşulu nasıl sağlarım*/
{
output_low(pin_b4);
}

şeklinde portun herhangibir bitine en son hangi değer yüklendiğini test edebilirsin,
(port adresleri 16f877 için datasheet den alınmıştır md ye göre değişebilir)

yada söylediğin koşullarda misal led yanıyormu kontrolü için,
ledi yaktığında kontrol adlı bir değişken tanımlayıp bu değişkene bir değer yüklersin,
yada bir bit tanımlayıp biti set reset edersin,
buna bayrak diyoruz,
istediğin yerde led yanıyormu nedir diye bu bayrağın içeriğine bakmak yeterli olur.

Senin yaptığın input...
şu oluyor, bu pini giriş yap değerini oku,
bu ancak pine buton vs. bağlama gibi durumlarda kullanılır,
bu komutla senin devrende pinin durumu dışarıdan etkiyle (misal toprağa bağlı led) ne ise o okunur.

Ancak aslında ben bu pine en son ne değer yüklemişim onu görmek istiyorum,
buda yukarıda bahsettiğim şekillerde yapılabilir,
başka şekilldede yapılabilir düşünemk lazım
 
çok teşekkür ederim. sizin yazdığınız kod satırıyla istediğim gibi çalıştı. Allah razı olsun

kodun başında
#byte porta=5
#byte portb=6
bu portlara bu değerleri niçin verdik yani tam olarak ne anlama geliyor. kusura bakmayın öğrenmeye çalışıyorum
 
Son düzenleme:
Ne kusuru, güzel soru soran kimseleri arıyor zaten gözlerimiz, siz sorun elimizden geldiğince cevaplayalım.
Aslında bu tanımlamayı ccs c de bende kullanmamıştım, vesile oldunuz öğrendim.

"bu portlara bu değerleri niçin verdik "
Portlara değer vermedik,
#byte ile portlara değer veremeyiz,
aslında bu derlenirken kod dahi oluşturmaz,
yaptığımız iş derleyiciye porta yazdığımızda 0x05 (5) adresini kasteddiğimiz söylemek,
porta nın 05 adresinde olduğunu bahsettiğim gibi datasheet ten öğrendik,
(5 adrsini mahmut diyede eşitleyebilirdik, bit_test(mahmut,0) olarak kullanırdık)
(yani porta nı 0. bitini test etmek için aslında bit_test (5,0) yazmak yeterlidir
anlaşılması kolay olsun diye porta yı eşitleyip kullanıyoruz)
kullandığınız picin datasheet ini açıp memory organization kısmına bakmanız lazım,
burada portların veya diğer registerların picin hafızasında nerede bulundukları yazar,
ben 16f877 ye baktığımda porta nın 0x05 adresinde olduğu yazıyordu o yüzden 5 olarak tanımladım,

biraz daha açıklamak lazım,
16f md. (mikrodenetleyici)miz 8 bitliktir yani 1 byte,
tanımlı olan tüm registerların (portlar, adcon, timer vs.) herbiri 8 bitlik yani 1 byte lık bir adreste bulunur,
bunlar gerçektede md içinde 1 byte lık register a sahiptirler,
biz misal
if ( bit_test(porta,0 == 1) )
veya if (bit_test(porta,0) ) (porta nın 0. biti 1 ise zaten if doğru olmuş olur)
bunu derleyici kodu compile (derle) dediğimizde
if (bit_test ( 0x05,0) ) olarak algılar,

işin dahada aslı
biz bu şekilde bir kod yazdığımızda kod asm ye dönüşür şunun gibi birşey olur
btfss porta,0 ;port a nın sıfırıncı bitini test et 1 ise bu satırın altındaki satırı işlemeden sonraki satıra atla
goto x ;0 ise bu satır
goto y ;1 ise bu satır işlenir

ve bu asm kod derlenirken derleyici
btfss porta,0 yi btfss 0x05,0 olarak görür
sonra bunu btfss yide kapsayan 14 bitlik bir komuta dönüştürür,
sonra bunlar pc de işleyebilmek için intel hex gibi formatlara dönüştürülür,
bu kısımlara hiç girmeyeyim zaten gereklide değil,
sadece şunu belirtelim 16 f md lerde yazılan herbir kod 14 bitlik bir sayıya dönüşür
bu md nin işleyebileceği anladığı bir komuttur ve program hafızasına yazılır, (programlayıcı kit vs. ile)

O kadar uzattık mevzuyu aslında mesele kısaca şu,
# byte ....... ccs c de bir derleyici komutudur,
kullanılan md ile ilgili tanımlama yapmayada yarar,
bu tanımlama yapılarak md nin registerlarına vereceğimiz herhagibir isimle erişim sağlanmış olur, bu sayede
bit_test ( _ , _ ) gibi byte üzerinde işlem yapan ccs c komutları port registerları içinde kullanılabilir olur.

Aslında bunu sormanızın sebebi asm ile program yazmamanız,
md. programlamaya önce asm ile başlayın dememizin sebebi bu vb. durumlar,
buradanda tekrar dile getirelim, asm şart.
 
Son düzenleme:
çok teşekkür ederim. baya detaylı anlatmışsınız. haklısınız asm bu işin en temeli ama ben de biraz damdan düşme ilgilenmeye başladım ve CCS C bana daha anlaşılır geldi. biraz daha kendimi böyle ufak devrelerle geliştirip temel mantığını kavradığımda inşallah ASM yede bir geçiş yaparım. yardımın için tekrar teşekkürler ..yeni sorularla sizi tekrar rahatsız edicem :)
 

Forum istatistikleri

Konular
127,956
Mesajlar
913,899
Kullanıcılar
449,606
Son üye
rasit.

Yeni konular

Geri
Üst