Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

PORTA IF SORUNU

Başlatan dyonizos, 08 Ekim 2011, 11:57:12

dyonizos

merhabalar

aşağıdaki kod örneğinde if komutunu porta.0 gibi ayırarak yaptıgımda çalışan if neden PORTA nın tamamını kontrol ettiğimde çalışmıyor olabilir.

Device 16F628A
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF, CP_OFF, MCLRE_OFF, DATA_CP_OFF

TRISA=%11111111
TRISB=%00000000
CMCON=7
OPTION_REG.7=1

Symbol led=PORTB.1

If PORTA=%00010011 Then (çalışmıyor)
'If PORTA.4=1 And PORTA.1=1 And PORTA.0=1 Then (çalışıyor)
High led
DelayMS 1500
Low led
GoSub sifrekontrol
EndIf

teşekkürler

-Hasan-

If PORTA=%00010011 Then (çalışmıyor)

Diğer bitlerin maskelenmesi gerekiyor:

If (PORTA & %00010011) = %00010011 Then

bu şekilde bir deneyin bakalım.

dyonizos

çok teşekkür ederim hocam verdiğiniz gibi çalıştı.
peki diğer bitleri if içinde kullanmadığımız zaman olur diye düşünmüştüm ama oda olmadı bu şekilde de çalışması gerekmezmiydi?
If PORTA = %10011 then

dyonizos

birde bu if komutunda decimal olarak sayı verebilirmiyiz. daha dogrusu ben verdım calısmadı :)

Device 16F628A
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF, CP_OFF, MCLRE_OFF, DATA_CP_OFF

TRISA=%11111111
TRISB=%00000000
CMCON=7
OPTION_REG.7=1

Symbol led=PORTB.1

'%00010011 decimal 19
If PORTA=19 Then (çalışmıyor)

High led
DelayMS 1500
Low led
GoSub sifrekontrol
EndIf


-Hasan-

Çalışmaz; siz sadece PORTA.0, PORTA.1, PORTA.4 pinlerinin "1" olmasını istiyorsunuz, yani; diğer bitler sizin için önemli değil.

If PORTA=%00010011 Then

Bu ifadeyi kullandığınızda diğer bitleri de kontrol etmiş olsursunuz. Bunun çalışabilmesi için PORTA.0, PORTA.1, PORTA.4 "1" olmasının yanında, diğer pinlerin de "0" olması gerekir. O pinler farklı durumlarda olabileceği için  çalışmıyor.

If (PORTA & %00010011) = %00010011 Then
If PORTA.4=1 And PORTA.1=1 And PORTA.0=1 Then


Bu şekilde yaptığımızda sadece bize lazım olan bitlere bakıyoruz. O yüzden bu şekilde çalışıyor.

If PORTA=19 Then (çalışmıyor) ile If PORTA=%00010011 Then aynıdır.

Yine aynı hatayı yapıyorsunuz.  :)

dyonizos

yok ben hatadan döndüm sayenizde ancak söyle bir durumumda var. ikinci bir yerde de bu PORTA nın girişlerini decimal bir sayı ile kontrol ettirmem gerekiyor ona bir çözüm bulmam gerekiyor.
yani PORTAnın decimal karşılığının örnek olarak 19 oldupu durumu nasıl kontrol ettirebilirim.

yani if PORTA=19 then mantıgında bir if nasıl yazmalıyım?

-Hasan-

If PORTA=19 Then
.......
Endif


Yanlış anladınız galiba; sizin yazdığınız kodda yazım hatası yok, yukarıdaki gibi yapabilirsiniz. Ancak; bu komutu aşağıdakinin yerine kullanmak istiyorsanız yine çalışmaz.

If PORTA.4=1 And PORTA.1=1 And PORTA.0=1 Then

Yine bu şekilde yapmanız gerekir:

If (PORTA & %19) = 19 Then


dyonizos

peki bu if içinde bir değişken varsa ne yapmamız lazım.
bu arada çok soruyorum kusura bakmayın. ama deli oldum kaç gündür.

yani bu 19 x değişkeni ise 19 yerine bu x i nasıl yazabilirim.


If (PORTA & %19) = 19 Then

-Hasan-

Alıntı Yapbu arada çok soruyorum kusura bakmayın

Hiç önemli değil, rica ederim.  :)

X VAR BYTE

X=19

IF PORTA=X THEN
.....
ENDIF


PORTA=X olunca şart doğru oluyor. İstediğiniz bu mu?

dyonizos

hmm evet bu sanırım :)

byte olarak tanımlamak yetıyor o zaman dogrumu.
o zaman dırek ıf ıcınde kullanabılıyoruz

-Hasan-

Evet IF içinde değişken kullanabilirsiniz. Değişken BYTE olarak tanımlanırsa, diğer BYTE değişkenlerle, eğer WORD tipinde tanımlarsanız, diğer WORD değişkenlerle karşılaştırırsınız.

Kolay gelsin.

dyonizos

tekrar tekrar çok teşekkür ederim.
çok yardımcı oldu bu bilgiler.

dyonizos

BIRLER VAR BYTE
BIRLER=19

If PORTA=BIRLER Then
High led
DelayMS 500
Low led
EndIf

bu kodlara göre %00010011 gelen porta nın eşitliği saglaması gerekmıyormu?


-Hasan-

Evet, bu karşılaştırmaya göre PORTA=19 olduğunda şart doğru oluyor ancak, yine söylüyorum; aşağıdaki kodun yerine kullanırsanız olmaz:

If PORTA.4=1 And PORTA.1=1 And PORTA.0=1 Then

dyonizos

bu kodda da yıne bostakı portların maskelenmesımı gerekıyor yani.

BIRLER VAR BYTE
BIRLER=19

'If PORTA=BIRLER Then
If (PORTA & BIRLER) = BIRLER Then
High led
DelayMS 500
Low led
EndIf

gibi