Sizce Hangisi Daha Hızlı

Başlatan BenC, 28 Ekim 2009, 00:02:18

BenC

Arkadaşlar merhaba.

Aşağıdaki 2 değişik koddan hangisi daha hızlı çalışır sizce?

CODE1
void ButonOku()

	{
		unsigned char ButVeriA=0;

		
		if (But9 == 0 )
			bitset (ButVeriA,0);

		if (But4 == 0 )
			bitset (ButVeriA,1);

		if (But5 == 0 )
			bitset (ButVeriA,2);

		if (But10 == 0 )
			bitset (ButVeriA,3);



		Veri1 = ButVeriA ;
}


CODE2

void ButonOku()

	{
		unsigned char ButVeriA=0;
	
		
		ButVeriA =~PORTB;
		

		Veri1= (( 0x0F) & (ButVeriA) ) ;

	}


XT=20Mhz
PIC16F877
Derleyici HITECH C
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

ErsinErce

void ButonOku()

   {
      Veri1=0x0F& (~PORTB);
   }


Hem daha az yer kaplar hemde daha hızlı çalışır ;)

PROTECH_

tabiiki ikincisi daha kısa sürede biter çünki sadece
sadece lojik işlemler içeriyor.
Birincisi ise bir cok if yapısı içeriyor doğal olarak pic te işlenmesi daha uzun sürer.

not:Eğer ide olarak mplab kullanıyosan disassembly sinden bakıp kaç komut satırı aldığını öğrenebilirsin.

kolay gelsin.
Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN

BenC

Cevaplar için teşekkür ederim arkadaşlar. Hızlı bir biçimde okumam gereken butonlar varda emin olmak için bunu sorayım dedim.
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

Maxim

merak ettim ,
2. kodu anlatabilirmisiniz ?
proton karşılığı nasıldır ?

     ButVeriA =~PORTB;
 
     Veri1= (( 0x0F) & (ButVeriA) ) ;

portb değerini A verisine atıyoruz,
sonraki işlemi çözemedim
en son değer veri1 e atılıyor?

M_B

      
      ButVeriA =~PORTB; 
      


Hocam  
Burda PortB deki verinin tersini ButVeriA ya aktarıyor.
Ornek olarak:
PortB = 11001101 olsun.
~PortB demek ise   00110010  olur.
Veri1= (( 0x0F) & (ButVeriA) ) ;

kodu ile  ButVeriA daki bilgiyi 0F ile ve işlemine alıyor. ( ButVeriA nın LSB kısmı kalıyor Diger kısmını atıyor. Sadece LSB kısmını okuyor. )
yukardaki ornege gore gidersek

00001111 & 00110010  ve işlem sonucu:    00000010 cıkar
demekki PortB de okunan deger : 0xCD  Veri1 in degeri de 0x02 cıkıyor.
Demekki tus takımı Satır ve sutun olarak hepsi bir porta baglı.  Burda galıba normal tus okuma fonksıyonu kullanmadan ıslemı cozmek ıstıyor. Herhangi bir tusa basıldımı satır ve sutunlardan Porta bilgi gidiyor ona gore değelendiriyor.
Umarım hocam dogru  olayı dogru anlayıp dogru acıklayabilmişimdir.
En saglamı BenC Hoca mı za sormak
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

BenC

M_B üstad doğru anlatmış.

Olay şu;

Portb ye bağlı 4 butondan kaç farklı kombinasyonda veri alabilirsiniz.

0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
0110 = 6
0111 = 7
1000 = 8
1001 = 9
1010 = A
1011 = B
1100 = C
1101 = D
1110 = E
1111 = F

Eğer şu butona basılı ise şunu yap deseydim en fazla 4 butonla 4 değişik işlem yapabilirdim. Ama burda Butonların kombinasyonundan 16 değişik işlem yapabiliriyorum. Yani şu şu butonlara veya şu butona basılı ise şunu yap diyebiliyorum. 4 butona da basılı ise 0F gönder der gibi. 1 ile 8 butonuna basılınca 09 gönder gibi.  Butonların toplamını alıyorum.
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

BenC

Alıntı yapılan: "maxiboost"merak ettim ,
2. kodu anlatabilirmisiniz ?
proton karşılığı nasıldır ?

     ButVeriA =~PORTB;
 
     Veri1= (( 0x0F) & (ButVeriA) ) ;

portb değerini A verisine atıyoruz,
sonraki işlemi çözemedim
en son değer veri1 e atılıyor?

ButVeriA =~PORTB;

PORTB nin tersini almamın sebebi PortB 10K ile Pull-Up durumda butona basılınca 1 ken 0 oluyor.
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!