CCS C ve PIC16F877A. "D" ve "B" Portu Hakkında.

Başlatan Melih1802, 09 Haziran 2014, 14:07:26

Salih

Fazlalıkları sildim.
Alıntı yapılan: Melih1802 - 12 Haziran 2014, 11:49:04
Arkadaşlar bu kodları yazdım ve çalıştı.
Sorum şu bu kodların en altındaki süslü " {} " parantezler sadeleşirmi. Gereksiz kullanım varmı.



#include "C:\Users\melih\Desktop\MD800\MD800.h"


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   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);


  set_tris_d(0b11111111);//
  set_tris_a(0x00);
  set_tris_b(0x00);
  set_tris_c(0x00);
    output_a(0x00);
    output_b(0x00);
    output_c(0x00);
     
while(1)
{
//-------------------------OR kapısı B0 B1--------------------------

  if ((input(pin_d0)==1)&&(input(pin_d1)==1))
{
output_high(pin_b0);
output_high(pin_b7);
}
else
{
output_low(pin_b0);
output_low(pin_b7);
}

//------------------------------------------------------------------

//---------------------------OR Kapısı B2 B3-----------------------

  if ((input(pin_d2)==1)&&(input(pin_d3)==1))
{
output_high(pin_b1);
output_high(pin_b7);
}
else
{
output_low(pin_b1);
output_low(pin_b7);
}
//-------------------------------------------------------------------

//----------------------------Buton B4---------------------------------------

  if (input(pin_d4)==1)
{
output_high(pin_b2);
output_high(pin_b7);
}
else
{
output_low(pin_b2);
output_low(pin_b7);
}
//--------------------------------------------------------------------

  //--------------------------Buton B5-----------------------------------------

  if (input(pin_d5)==1)
{
output_high(pin_b3);
output_high(pin_b7);
}
else
{
output_low(pin_b3);
output_low(pin_b7);
}
//---------------------------------------------------------------

  //---------------------------Buton B6--------------------------

  if (input(pin_d6)==1)
{
output_high(pin_b4);
output_high(pin_b7);
}
else
{
output_low(pin_b4);
output_low(pin_b7);
}
//---------------------------------------------------------------

  //---------------------------Buton B7-------------------------

  if (input(pin_d7)==1)
{
output_high(pin_b5);
output_high(pin_b7);
}
else
{
output_low(pin_b5);
output_low(pin_b7);
}
}
}

Melih1802

Hımm demek "if" komutu öncesi {} gereksizmiş.

Aynı anda 2 butona birde basılırsa " Aktif " olan tüm çıkışların ( yada aralarından bazılarını seçeceğim )  "Pasif" olmasını istiyorum.

Bu kodları yazdım ve derledim fakat çalışmadı. Yanlış bir yere' mi koydum yoksa bu kodlar düzenlemiş olduğun kodların arasında çalışmazmı.

if ((input(pin_d0)==0)&&(input(pin_d2)==0))
if ((input(pin_d0)==0)&&(input(pin_d4)==0))
if ((input(pin_d0)==0)&&(input(pin_d5)==0))
if ((input(pin_d0)==0)&&(input(pin_d6)==0))
if ((input(pin_d0)==0)&&(input(pin_d7)==0))

{
output_low(pin_b0);
output_low(pin_b1);
output_low(pin_b2);
output_low(pin_b3);
output_low(pin_b4);
output_low(pin_b5);
output_low(pin_b6);
output_low(pin_b7);
}

Salih

Bunu bir denermisin.
if ((input(pin_d0)==0)&&(input(pin_d2)==0)||
(input(pin_d0)==0)&&(input(pin_d4)==0)||
(input(pin_d0)==0)&&(input(pin_d5)==0)||
(input(pin_d0)==0)&&(input(pin_d6)==0)||
(input(pin_d0)==0)&&(input(pin_d7)==0))
{
output_low(pin_b0);
output_low(pin_b1);
output_low(pin_b2);
output_low(pin_b3);
output_low(pin_b4);
output_low(pin_b5);
output_low(pin_b6);
output_low(pin_b7);
}

Melih1802

#48
Aynı anda 2 buton basıldığında yine çıkış verdi.





Bu şekilde ekledim. Belkide ekleyemedim.
  //---------------------------Buton B7-------------------------

  if (input(pin_d7)==1)
{
output_high(pin_b5);
output_high(pin_b7);
}
else
{
output_low(pin_b5);
output_low(pin_b7);
}


if ((input(pin_d0)==1)&&(input(pin_d2)==1)||
(input(pin_d0)==1)&&(input(pin_d4)==1)||
(input(pin_d0)==1)&&(input(pin_d5)==1)||
(input(pin_d0)==1)&&(input(pin_d6)==1)||
(input(pin_d0)==1)&&(input(pin_d7)==1))
{
output_low(pin_b0);
output_low(pin_b1);
output_low(pin_b2);
output_low(pin_b3);
output_low(pin_b4);
output_low(pin_b5);
output_low(pin_b6);
output_low(pin_b7);
}
}
}



Üstad aklımın henüz almadığı bir nokta var. Bolt işaretli komutlar biribirinle nasıl bağdaşıyor burayı kavrayamadım.

vitruvius

Hocam ben mi yanlış takip ediyorum yoksa durum şu mu? D0 ile birlikte başka bir tuşa basınca ledler sönsün mü istiyorsunuz? Resimde D0 sıfırda bu yüzden and kapısından sıfır çıkar. D6 ve D7'ye aktif yapmışsınız ama ikisinin birden basılı olma durumunu kontrol eden bir if yok. İkisini de ayrı ayrı D0 ile and kapısına sokup bakıyorsunuz D0 da sıfır olduğu için işlemin sonucu hep sıfır oluyor. Dolayısıyla if'in altına girmiyor. Ben bu şekiilde görüyorum.

Melih1802

Üstad istediğim şu;
D0,D2 aynı anda basılı olursa (1) tüm çıkışlar LOW olacak.
Butonu bırakıncaya kadar.

vitruvius

while(1)
 
 {
    if ((input(pin_D0)==1)&&(input(pin_D2)==1))
    {
      output_b(0x00);
    }
    else
    {
    output_b(0xFF);
    }
 }

Melih1802

#52
Böyle ekledim. Ledler karaşimşek gibi oldu.

  //---------------------------Buton B7-------------------------

  if (input(pin_d7)==1)
{
output_high(pin_b5);
output_high(pin_b7);
}
else
{
output_low(pin_b5);
output_low(pin_b7);
}

//---------------Çift tuş basma satırları--------------------------

    if ((input(pin_D0)==1)&&(input(pin_D2)==1))
    {
      output_b(0x00);
    }
    else
    {
    output_b(0xFF);
    }
   
//---------------Çift tuş bitti.----------------------------------
  }
}


mesaj birleştirme:: 13 Haziran 2014, 07:16:10

CCS C de programın seçtiğimiz bir bölgesini çalıştırmak gibi bir imkan varmıdır.
Örn yeni eklediğim bu komutu seçerek sadece burayı çalıştırmak istiyorum.

mesaj birleştirme:: 12 Haziran 2014, 17:27:30

Yapmak istediğim;

D1 ve D3 hariç
diğer butonlardan herhangi biri basılıyken bir diğer butona basılırsa
tüm çıkışlar her 2 butonda bırakılıncaya kadar pasif olacak.



vitruvius

Buyrun hocam. D1 ve D3 hariç herhangi iki butona basılırsa ikisinin de çekilmesini bekliyor. D1 yada D3 + 2 butona daha basılırsa yine aynısını yapıyor. Yani D1 ve D3 yokmuş gibi davranıyor. Aksi durumlarda tüm ledler yanıyor, iki veya daha fazla buton basılma durumunda tüm ledler sönüyor. Elimden geldiğince sade yazmaya çalıştım.

16F877'de denedim, bahsettiğim gibi çalışıyor. Bir kontrol edin, olmayan yer varsa belirtin.

#include <16F877.h>
#FUSES NOWDT,XT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD, NOWRT, NODEBUG
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(d)

char data_d=0x00;
char bit_cnt[8];
char sum=0;
char multiple=0;

void main()
{
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);   

   set_tris_d(0xFF);   
   set_tris_b(0x00);
   output_b(0x00);   
   
 while(1)
 
 {
    data_d=input_d();

    bit_cnt[0]=bit_test(data_d,0);
    bit_cnt[2]=bit_test(data_d,2);
    bit_cnt[4]=bit_test(data_d,4);
    bit_cnt[5]=bit_test(data_d,5);
    bit_cnt[6]=bit_test(data_d,6);
    bit_cnt[7]=bit_test(data_d,7);
    
    sum=bit_cnt[0]+bit_cnt[2]+bit_cnt[4]+bit_cnt[5]+bit_cnt[6]+bit_cnt[7];
    
    if(sum>=2)
    {
      multiple=1;
    }

    if(multiple==1)
    {
      output_b(0x00);
         if(data_d==0x00)
         {
            output_b(0xFF);
            multiple=0;
         }
    }
    else
    {
      output_b(0xFF);
    }
 } 
}

Melih1802

Üstad onca mesajın sonunda ortaya çıkan ve çalışan program bu. Bu programın içersine senin satırları entegre ettim fakat çalıştıramadım.

D0 Buton,
D1 Limit swicth


D2 Buton,
D3 Limit swicth


D0 ve D2 ye basıldığında Limit swicth ler " Kapalı kontak' tan çıkıncaya kadar " işlem yapacak. Fakat D0,D2,D4,D5,D6,D7 kendi arasında aynı anda basılırsa tüm çıkışlar her iki butonda bırakılana kadar aktif olsa dahi low olacaklar.

Ricam işin başında olduğumdan karmaşık formülleri anlayamıyorum bana biraz kulağını tersten gösterecek, bu mantığı kavramama yarayacak bir format çok iyi olur. Böyle kıt bilgimle satırlarda ne olduğunu nasıl olduğunu kavrayabilirim.

Niyetim hazırcılık değil bu bana kazandırmaz. Anlamak istiyorum.

Proteus çizimi: http://www.dosya.tc/server31/shbWTx/MD800.rar.html


#include "C:\Users\melih\Desktop\MD800\MD800.h"


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   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);


  set_tris_d(0b11111111);
  set_tris_a(0x00);
  set_tris_b(0x00);
  set_tris_c(0x00);
    output_a(0x00);
    output_b(0x00);
    output_c(0x00);
     
while(1)
{
//-------------------------AND kapısı B0 B1--------------------------

  if ((input(pin_d0)==1)&&(input(pin_d1)==1))
{
output_high(pin_b0);
output_high(pin_b7);
}
else
{
output_low(pin_b0);
output_low(pin_b7);
}

//------------------------------------------------------------------

//---------------------------AND Kapısı B2 B3-----------------------

  if ((input(pin_d2)==1)&&(input(pin_d3)==1))
{
output_high(pin_b1);
output_high(pin_b7);
}
else
{
output_low(pin_b1);
output_low(pin_b7);
}
//-------------------------------------------------------------------

//----------------------------Buton B4---------------------------------------

  if (input(pin_d4)==1)
{
output_high(pin_b2);
output_high(pin_b7);
}
else
{
output_low(pin_b2);
output_low(pin_b7);
}
//--------------------------------------------------------------------

  //--------------------------Buton B5-----------------------------------------

  if (input(pin_d5)==1)
{
output_high(pin_b3);
output_high(pin_b7);
}
else
{
output_low(pin_b3);
output_low(pin_b7);
}
//---------------------------------------------------------------

  //---------------------------Buton B6--------------------------

  if (input(pin_d6)==1)
{
output_high(pin_b4);
output_high(pin_b7);
}
else
{
output_low(pin_b4);
output_low(pin_b7);
}
//---------------------------------------------------------------

  //---------------------------Buton B7-------------------------

  if (input(pin_d7)==1)
{
output_high(pin_b5);
output_high(pin_b7);
}
else
{
output_low(pin_b5);
output_low(pin_b7);
   }
  }
}

vitruvius

#55
Benim programın kendisi istediğiniz gibi çalışıyor mu? Çalışıyorsa kodları satır satır izah ederim, pek bir numarası yok. Yada ufak eklerle istediğiniz hale gelecek gibi mi?

Melih1802

Yazdığınız programı tek başına derleyip test yapmadım siz ben test ettim deyince.
Bendeki satırların içinde entegre ettiğimde çalıştıramadım. Biraz anlamaya ve neden çalışmadığını çözmeye çalıştım ama bazı komutları henüz tanıyamadım bu sebeple bir yerde tıkandım.

vitruvius

#57
Bir deneyin onun üzerinden gidelim bence eğer oluru varsa. İşin içine çok fazla if kontrolü girince bazı şeyler gözden kaçabiliyor. Ayrıca gönderdiğiniz dosyada sadece proteus dosyası var. C kodlarını da koyup yollar mısınız?

Melih1802

#58
http://www.dosya.tc/server31/uvD0oq/MD800.rar.html

mesaj birleştirme:: 12 Haziran 2014, 22:28:55

Programını bendekinin içine koydum.

- Hiç bir buton basıl değilken hiç çıkış olmayacak ( çıkış var )
- D0,D1 basıldığında bir değişme olmuyor ( normalde B0 portu çıkış verecek )
- D2,D3 basıldığında bir değişme olmuyor ( normalde B1 portu çıkış verecek )


Sanki tam tersi çalışsa oldu.

vitruvius

Tamamdır, ben çıkışları pek kurcalamamıştım mantığı göstermek için. Gerekli ekleri ve açıklamaları yapıp bir daha yollarım bir yemek yedikten sonra =)