Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Port Okuma

Başlatan ercanatnr, 20 Ekim 2015, 19:53:21

ercanatnr

Merhaba,
DTMF projesi için B portunun RB1,RB2,RB3,RB4 pinlerini okuyup bir değişkene aktarmak istiyorum ve daha sonra if döngüsü ile sorgulamak istiyorum.
Yalnız PORTB den binary olarak okunan deger if dögüsünde şu şekilde sorgulanacak.

if(sifre[1]==6 && sifre[2]==16)//Decimal=6 Binary=00001100 koduna karşılık geliyor. Decimal=16 ise Binary=00010000 koduna karşılık geliyor
{
.
.
.
.
işlemler.
}

Benim aradığım kod B Portunun sadece RB1,RB2,RB3,RB4 pinlerini okuyacak.

selimkoc

maskeleme kavramını araştır. lojik operatörlere bak.

Salih

sifre = ((input_B()&0b00011110)>>1);


sifre içeriği pinlerin lojik durumuna göre değişir.

ercanatnr

Alıntı yapılan: Salih - 21 Ekim 2015, 12:18:24
sifre = ((input_B()&0b00011110)>>1);


sifre içeriği pinlerin lojik durumuna göre değişir.
Çoğu yerde buna benzer kodlar gördüm ancak nasıl çalıştığını anlayamadım. Diyelimki b portuna RB1=1 RB2=1 RB3=0 RB4=0 şeklinde bilgi geldi. Bunun desimal karşılığı 6 olduğuna göre aşagıdaki kodu çalıştırabilirmiyim.
if(sifre==6)
{
.
.
.
.
işlemler

}

sadogan

Hayır çalıştıramasın.
0b0000011X & 0b00000110 = 0b00000110 olur burdan  0b00000110 >>1 = 0b00000011 olur buda 3 eşittir.

ercanatnr

Alıntı yapılan: sadogan - 23 Ekim 2015, 13:15:07
Hayır çalıştıramasın.
0b0000011X & 0b00000110 = 0b00000110 olur burdan  0b00000110 >>1 = 0b00000011 olur buda 3 eşittir.

Bu durumda RB1=0 RB2=0 RB3=0 RB4=1 olduğunda ise sifre==8 olur.

ercanatnr

Alıntı yapılan: sadogan - 23 Ekim 2015, 13:15:07
Hayır çalıştıramasın.
0b0000011X & 0b00000110 = 0b00000110 olur burdan  0b00000110 >>1 = 0b00000011 olur buda 3 eşittir.
Söyledikleriniz doğrultusunda aşağıdaki kodu yazdım çalıştıramadım. Neden çalışmadığı hakkında bir fikriniz var mı?
#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(internal=4000000)

#define std    pin_b0
#define role_1 pin_a0
#define role_2 pin_a1
#define role_3 pin_a3
#define buzzer pin_a2

int sifre[1],i,zaman,kontrol;
#INT_TIMER0
void kesme() 
{
   set_timer0(60);
   zaman++;
      if(zaman==100)
      {
         kontrol=1; 
      }
}
void rolekontrol()
{
///////////////////////////////////////////////////////////////////////////////
if(sifre[0]==3 && sifre[1]==8)
 {
   output_high(role_1);
   output_high(buzzer);
   delay_ms(1000);
   output_low(role_1);
   output_low(buzzer);
   


 }
///////////////////////////////////////////////////////////////////////////////
else if(sifre[0]==3 && sifre[1]==4)
 {
   output_high(role_2);
   output_high(buzzer);
   delay_ms(1000);
   output_low(role_2);
   output_low(buzzer);
 }

}
void main()
{  set_tris_a(0x00);
   set_tris_b(0xFF);
   output_a(0x00);
   
   delay_ms(1000);
   output_high(role_3);
   
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);   
   set_timer0(60);
   
   enable_interrupts(GLOBAL);

while(1)
{
sifreoku:
{
zaman=0;

   for(i=0;i<2;i++)
   {
   kontrol=0;
   enable_interrupts(INT_TIMER0);
      while(input(std)==0)
      {
         if(kontrol==1) goto sifreoku;
         
      }
      disable_interrupts(INT_TIMER0);
      zaman=0;     
      while(input(std)==1);        
      sifre[i]=((input_B()&0b00011110)>>1);
   }//for
   rolekontrol();
}//sifreoku:


}
}

JKramer

int sifre[1]

Köşeli parantez içindeki sayı, dizideki eleman sayısıdır. Yani iki yazmanız gerekiyor.

ercanatnr

Alıntı yapılan: JKramer - 24 Ekim 2015, 08:30:49
int sifre[1]

Köşeli parantez içindeki sayı, dizideki eleman sayısıdır. Yani iki yazmanız gerekiyor.
Diziler 0 dan başladığı için sıfırı da saymıştım. (2 yazmam gerektiğini bilmiyordum. Teşekkürler.)Peki bundan başka kodun çalışmasına engel bir sorun var mı?