Haberler:

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

Ana Menü

if then komutu

Başlatan murat0601, 23 Mayıs 2014, 12:29:12

murat0601

16f84 ile  a portuna bağlı 4 buton VAr.

B PORTUNA BAĞlı 4 led var

1.butona bastıgımızda 1.led
2.butonda 2.led ... yancak

bunu if then komutu ile nasıl yapabiliriz.


trisa = 1     
trisb = 0     

basla:
     IF  Porta.0 = 1 THEN GOTO yak
     GOTO basla
yak:
     HIGH Portb.0

bu şekilde düşündümde başka nasıl yapabilirz if then ile ? birde sormak istedigim a portuna bağlı butonlar açık ise biz  IF Porta.0=1 mi dicez yoksa kapalı ise mi böle dicez

şuda devre şeması


ferit06

butona bastığında ilgili girişi GND ye bağlıyorsun. Bu durumda ilgili giriş ne olur?

Maxim

#2
goto ile dallanmaya gerek yokki bunun için
direk şöyle yapabilirsin

if porta.0 = 1 then high portb.0 : else: low portb.0
if porta.1 = 1 then high portb.1 : else: low portb.1
if porta.2 = 1 then high portb.2 : else: low portb.2
if porta.3 = 1 then high portb.3 : else: low portb.3

mesaj birleştirme:: 23 Mayıs 2014, 12:47:04

şema çok garip çizilmiş
girişler pull-down
butona basınca giriş high oluyor

ete

Asıl sorun TRIS registerinin doğru ayarlanmamış olması bence.
Bir pin ya giriş yada Çıkış çalışır. Giriş çalışıyor ise TRIS registerinin ilgili biti "1" olmalıdır. Çıkış çalışıyor ise aynı bit "0" olmalıdır.
Sen ne yapmışsın TRISA=1 demişsin bu ne demek oluyor her halde anlamını bilmiyorsun. TRISA=1 demek TRISA=%00000001 demek olur.
Buda yalnızca PORTA.0 bitini giriş yapar. Diğerleri çıkış olur otomatikman. Halbuki sende 4 adet buton bağlı ve TRISA=%00001111 şeklinde komut vermen gerekirdi. Bu ise TRISA=15 ile eşdeğerdir.

Diğer konuya Maxim cevap vermiş. Ben bir iki ilave yapayım.
IF PORTA.0=1 THEN PORTB.0=1 demen yeterli.
Bu komut tuşa basılınca ilgili pinde bağlı ledi yakar ama sönmesi için Maxim'in verdiği gibi bir komut vermen gerekir.
IF PORTA.0=1 then
  PORTB.0=1
ELSE
  PORTB.0=0
ENDIF
şeklinde bir komut daha açıklayıcı olur sanırım. Anlamı, tuşa basılmış ise led'i yak basılmamış ise led'i söndür.
IF satırları kullanmadan aşağıdaki komut tuşlara basılması halinde ledleri yakar bırakılınca da söndürür.

PORTB=PORTA & %00001111
Bu durumda programın yalnızca şu satırlardan ibaret olabilir

@ DEVICE pic16F628 
@ DEVICE pic16F628, WDT_ON
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, PROTECT_OFF
@ DEVICE pic16F628, MCLR_ON
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT 

cmcon=7

trisA=15
trisb=0
pause 200

basla:
      portb=porta & %00001111
      pause 100
      goto basla


Ete



Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

murat0601

#4
biraz acemiyim 12.sınıfım
okuldaki hocamız öyle öğretti.
yani trisa=1  demeniz yeterli oldu diye söylemişti kendide öyle yapıyor

yardımlarnz için teşekkürler.

mesaj birleştirme:: 23 Mayıs 2014, 15:55:58

ÜSTTEKİ RESİM YANLŞ OLDU DAHA DEMİN EVDE DEGİLDİM BİLGİSAYARDA PROTEUS YKTU İNTERNETTEN BULMŞTM O DEVREYİ GERÇEK DEVRE BU



DEDİGİNİZ GİBİ YAPTM ÇALIŞMIYOR

TRISA=%00001111
TRISB=%00000000
PORTB=0
basla:
IF PORTA.0=1  THEN PORTB.0=1   ELSE PORTB.0=0

BÖLE YAZINCA ELSEYİ KABUL ETMİYOR NEDEN BÖYLE

Maxim

#5
else solunda ve saginda : isareti yok?

mesaj birleştirme:: 24 Mayıs 2014, 09:09:33

ayrica
son $ema hatali
buton ve pull-up pull-down baglantilari nasil yapilmali inceleyin.

SAKINCALI

#6
Başka bi formda bu soruyu sormuşsun orda da cevaplamıştım bakmamışsın sanırım

devredeki 4 nolu pini 15 nolu pine bağla osc kısmı tamam 4 numaralı pin mclr reset kısmı onu da 10 k lık bir direç ile 5v ver direçden hemen sonra bir buton ile vss yaparsan reset işi görür.
giriş pull up veya pull down bunu kontrol et hocan eksik söylemiş yukarıda arkadas 15 demiş doğrusu o ikilik sistem karşılığı
giriş pinleri ni % cinsinden tanımlaman daha doğru olur senin için

bunu bi dene istersen


TRISB=0 'B PORTUNU ÇIKIŞ OLARAK AYARLADIK
TRISA=%11111 'A PORTUNU GİRİŞ OLARAK AYARLADIK
PORTB=0 'B PORTUNUN İÇERİĞİNİ TEMİZLEDİK


SYMBOL BUTON0=PORTA.0 'GİRİŞ PİNLERİNE BAĞLI BUTONLARIMIZI TANIMLADIK
SYMBOL BUTON1=PORTA.1
SYMBOL BUTON2=PORTA.2
SYMBOL BUTON3=PORTA.3


SYMBOL LED0=PORTB.0 'ÇIKIŞ PİNLERİMİZE BAĞLI LEDLERİ TANIMLADIK
SYMBOL LED1=PORTB.1
SYMBOL LED2=PORTB.2
SYMBOL LED3=PORTB.3
PAUSE 200


BASLA:
IF BUTON0=0 then 'SAYET BUTON0 A BASILMIS ISE
LED0=1 'LED0 YANSIN
ELSE 'BUTON0 A BASILMAMIS ISE
LED0=0 'LED0 SONSUN
ENDIF

IF BUTON1=0 then 'SAYET BUTON1 E BASILMIS ISE
LED1=1 'LED1 YANSIN
ELSE 'BUTON1 E BASILMAMIS ISE
LED1=0 'LED1 SONSUN
ENDIF

IF BUTON2=0 then 'SAYET BUTON2 YE BASILMIS ISE
LED2=1 'LED2 YANSIN
ELSE 'BUTON2 YE BASILMAMIS ISE
LED2=0 'LED2 SONSUN
ENDIF

IF BUTON3=0 then 'SAYET BUTON3 E BASILMIS ISE
LED3=1 'LED3 YANSIN
ELSE 'BUTON3 E BASILMAMIS ISE
LED3=0 'LED3 SONSUN
ENDIF
PAUSE 200
GOTO BASLA

SAKINCALI

Alıntı yapılan: murat0601 - 23 Mayıs 2014, 13:58:02
biraz acemiyim 12.sınıfım
okuldaki hocamız öyle öğretti.
yani trisa=1  demeniz yeterli oldu diye söylemişti kendide öyle yapıyor

yardımlarnz için teşekkürler.

mesaj birleştirme:: 23 Mayıs 2014, 15:55:58

ÜSTTEKİ RESİM YANLŞ OLDU DAHA DEMİN EVDE DEGİLDİM BİLGİSAYARDA PROTEUS YKTU İNTERNETTEN BULMŞTM O DEVREYİ GERÇEK DEVRE BU



DEDİGİNİZ GİBİ YAPTM ÇALIŞMIYOR

TRISA=%00001111
TRISB=%00000000
PORTB=0
basla:
IF PORTA.0=1  THEN PORTB.0=1   ELSE PORTB.0=0

BÖLE YAZINCA ELSEYİ KABUL ETMİYOR NEDEN BÖYLE

IF ..... THEN BU KOMUTUN ARKASINDAN HEMEN ELSE Yİ YAZAMAZSIN DİYE BİLİYORUM TEK SATIRDA KOMUT DEVAMI İÇİN : İLE AYIRMAN GEREKİR DİYE BİLİYORUM YANLIŞ BİLİYOR OLABİLİRİM DOĞRUSU

IF....THEN
ELSE
ENDIF

DOĞRU KULLANIM BU ŞEKİLDE DİYE BİLİYORUM.

selimkoc

Bloğumda buton kontrolü isimli yazıyı okuyunuz. Çünkü butonların yerleşimi hatalı. Buton ya pull-up direnciyel veya pull-down direnciyle bağlanır.

Bir diğeri yapılan hata öğretmene mal edilmemeli. Mutlaka doğruyu öğretmişlerdir.

Bir diğer husus portların yönlendirme reğisterlerinin varsayılan değeri giriştir. Yani TRISA=15; yazman gerekirken hiç yazmasanda portlar giriş olarak varsayılır.

ferit06

#9
Üstteki resim yanlış oldu demişsiniz ama bu mesajınızdaki PORTA ile ilgili kısım yanlış, anahtarlar açık iken belirsizlik olur düzgün çalışmaz. İlk devreyi şimdi tekrar inceledim de daha önceki mesasjımdaki ifade de yanlış olmuş. İlk devredeki bağlatıda 5V ile GND nin yerini değiştirilmiş şeklinde görmüştüm ve ona göre mesaj yazmıştım. Devre O şekilde olursa düzgün  çalışır.

Alıntı yapılan: murat0601 - 23 Mayıs 2014, 13:58:02
Alıntı yapılan: murat0601 - 23 Mayıs 2014, 13:58:02
biraz acemiyim 12.sınıfım
okuldaki hocamız öyle öğretti.
yani trisa=1  demeniz yeterli oldu diye söylemişti kendide öyle yapıyor

yardımlarnz için teşekkürler.

mesaj birleştirme:: 23 Mayıs 2014, 15:55:58

ÜSTTEKİ RESİM YANLŞ OLDU DAHA DEMİN EVDE DEGİLDİM BİLGİSAYARDA PROTEUS YKTU İNTERNETTEN BULMŞTM O DEVREYİ GERÇEK DEVRE BU