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

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

Melih1802

Buradaki butonlardan herhangi biri basılı haldeyken yanlışlıkla bir değer butonada aynı anda basarsam tüm çıkışlar pasif olacak,
ve ben her 2 butondanda elimi çekinceye kadar çalışmayacaklar.



Salih

#31
   
    z       = 0;
    for(x=0;x<8;x++)
    {    
    if (bit_test(input_D() , x)) z++;
    if (z > 1)  Break; 
    }

if (z>1) çıkısı sıfırla
else
girişlere bak ve eylem yap


Önce birden fazla buton basılımı bak ve ona göre işlem yap.
Evet haklısın, biraz sadeleştirdim.
Böyle yapmazsak kodlar çok büyük ve karmaşık olur.

Melih1802

Bunu çözmem uzun sürecek :) benden çok ilerde bir satır grubu olmuş.

Salih

Alıntı yapılan: Melih1802 - 10 Haziran 2014, 20:28:19
Bunu çözmem uzun sürecek :) benden çok ilerde bir satır grubu olmuş.

Kodları biraz  sadeleştirdim. Sen devam et, yardımcı oluruz.

Melih1802


Salih

Alıntı yapılan: Melih1802 - 10 Haziran 2014, 21:30:15
Sadeleşmiş    :( ??? :'(

Sen girişlere göre eylemleri yaz, ben iptal işlemi için yukarıdakini ona göre yerleştireyim.

Melih1802

#36
Anlatmaya çalışayım.

D2 ve D7 Buton girişlerim, D0 ve D1 limit swcith' ler.

D2+D3
D2+D4
D2+D5
D2+D6
D2+D7

D3+D4
D3+D5
D3+D6
D3+D7

D4+D5
D4+D6
D4+D7

D5+D6
D5+D7

D6+D7    Basılırsa "B" portuna bağlı tüm çıkışların durumu ne olursa olsun hepsi pasif olacaklar. Ta ki her 2 buton bırakılıncaya kadar.

-------------------------------------------------------------------------------------------------------------------------------------------

Öğrenmek için bunları uzun uzun yazmakta benim için sakınca yok böylece mantığı daha iyi kavrayabilirim.

Örn:

if ((input(pin_d0)==0)&&(input(pin_d1)==0))
if ((input(pin_d0)==0)&&(input(pin_d2)==0))
if ((input(pin_d0)==0)&&(input(pin_d3)==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

Eğer yanlış anlamadı isem şöyle olacak.
D portu pinlerini şöyle tanımladığını farz ediyoruz.
#Define D0 input(Pin_D0)
...
if(
(D2&&D3)||
(D2&&D4)||
(D2&&D5)||
(D2&&D6)||
(D2&&D7)||
(D3&&D4)||
(D3&&D5)||
(D3&&D6)||
(D3&&D7)||
(D4&&D5)||
(D4&&D6)||
(D4&&D7)||
(D5&&D6)||
(D5&&D7)||
(D6&&D7))
output_B(0);// Bütün portun bitlerini sıfırlıyoruz

Melih1802

#38
Derleyici hata verdi.


Bu mantık aklıma daha çok yattı. Az önce yazdıkların gözüme çok karmaşık görünmüştü.
Şöyle;




mesaj birleştirme:: 11 Haziran 2014, 00:55:57

Alıntı yapılan: sadogan - 10 Haziran 2014, 13:09:34
Buton basılı iken "1" mi oluyor "0" mı ?


"0" oluyor.

Salih

Tanımları yapın demiştim, yapmamışsın herhalde.
Bütün girişleri tanımla
#Define D0 input(Pin_D0)
.
.
.
#Define D7 input(Pin_D7)

Melih1802

#40
Evet yapmamışım.

Melih1802

Alttaki görmüş olduğunuz KIRMIZI ve MAVİ satırlar tek başına yazıldığında çalışıyorlar.
Fakat her iki satır beraber yazılınca KIRMIZI olan çalışıyor sadece.

Neyi yapmıyorum.


#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)

//-------------------------------------------------------------------
  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);
}


//---------------------------------------------------------------
  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);
}


}

sadogan

@Melih1802
  if ((input(pin_d0)==1)&(input(pin_d1)==1))
burdaki "&" and operatörü logical and deyil yerine 
if ((input(pin_d0)==1)&&(input(pin_d1)==1))
kullanmak gerekiyor.

Şemada butonlar aktifken giriş pin i gnd ye çekiyor.
Basıldıklarını anlamak için giriş pin i "0" mı diye bakmak gerekmezmi?

Melih1802

#43
Butonları değiştirdim butona basıldığında HIGH oluyor ve pic tetikleniyor.

Koda yazdığın eklemeyi yaptım fakat yine ilk satır çalıştı. Yanlış yapmadıysam.



#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)

//-------------------------------------------------------------------
{
  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);
}

//---------------------------------------------------------------
{
  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);
}
}
{
{


Melih1802

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);
}
//---------------------------------------------------------------
}
}
}
}
}
}
}