BUTON İLE LED YAKIP SÖNDÜRME

Başlatan harmanx, 20 Nisan 2012, 12:45:13

harmanx

Selam

A portundaki butonları okuyup led yakıyor program ama bir hata yapıyorum bulamadım program bir yerde kalıyor yardım lütfen


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 12.04.2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

TRISB=0 ' PORTB ÇIKIŞ
TRISA=%11111'PORTA GİRİŞ
PORTB=0
A VAR BYTE
B VAR BYTE

ANA:
A=%00000 'A PORT SIFIRLA
PAUSE 100
B=PORTA' 00000 PORTA OKU B DEĞİŞKENİNE  YAZ
B=NCD B 'B DEĞİŞKENİNDEN EN BÜYÜK BİTİ AL B YE YAZ
BRANCH B,[YAK1,YAK2,YAK3,YAK4,YAK5]



YAK1:

A=0
FOR A=1 TO B
HIGH PORTB.0
PAUSE 100
LOW PORTB.0
PAUSE 100
NEXT
RETURN



YAK2:
A=0
FOR A=1 TO B
HIGH PORTB.1
PAUSE 100
LOW PORTB.1
PAUSE 100
A=0
NEXT
RETURN



YAK3:
A=0
FOR A=1 TO B
HIGH PORTB.2
PAUSE 100
LOW PORTB.2
PAUSE 100
A=0
NEXT
RETURN



YAK4:
A=0
FOR A=1 TO B
HIGH PORTB.3
PAUSE 100
LOW PORTB.3
PAUSE 100
A=0
NEXT
RETURN


YAK5:
A=0
FOR A=1 TO B
HIGH PORTB.4
PAUSE 100
LOW PORTB.4
PAUSE 100
A=0
NEXT
RETURN

GOTO ANA
END










harmanx

problemi halletim return yerine gosub kullanarak..

t2

#2
yukarıdaki kodda return yerine gosub kullanarak program şişme yapar. gerçekten böyle kullanıysan yani.

yok fazla kelime kullanmadan az kelime sarfedeyim  diye böyle yazdıysan başka. 

Alıntı Yap

BRANCH Index,[Label{,Label...}]

BRANCH B4,[dog,cat,fish]

This is the same as:

If B4=0 Then dog ' goto dog
If B4=1 Then cat ' goto cat
If B4=2 Then fish ' goto fish

mustafa_cmbz

#3
Start:   
  BRANCH INDEX,[Lab_0, Lab_1, Lab_2]  ' Jump to label 2 (Lab_2) because INDEX = 2 
Lab_0:  INDEX = 2      ' INDEX now equals 2 
  GOTO Start 
Lab_1:  INDEX = 0      ' INDEX now equals 0 
  GOTO Start 
Lab_2:  INDEX = 1      ' INDEX now equals 1 
  GOTO Start



basic kullanmayalı uzun süre oldu ama protonda bi göz attım ta olay tam olarak şöyle olmalıymış diyor...

yani sen branç komutunun içinde çağırdığın etiketleri return ile geri göndertip kaldığın yerden kaldğın işlemi yaptırmaya çalışıyorsan orda yalnışın var (protona göre onun yalancısıyım)

verdiğim örneğe göre etiketi geri döndürmek içi goto diyor farkettiysen lanch ın etiketine göndertiyor...


artı olarak ana etiketinin sonuna goto ana diyerek sorunu çözebilirsin gibi...


TRISB=0 ' PORTB ÇIKIŞ
TRISA=%11111'PORTA GİRİŞ
PORTB=0
A VAR BYTE
B VAR BYTE

ANA:
A=%00000 'A PORT SIFIRLA
PAUSE 100
B=PORTA' 00000 PORTA OKU B DEĞİŞKENİNE  YAZ
B=NCD B 'B DEĞİŞKENİNDEN EN BÜYÜK BİTİ AL B YE YAZ
BRANCH B,[YAK1,YAK2,YAK3,YAK4,YAK5]

[color=red][b]goto ana[/b][/color]

YAK1:

A=0
FOR A=1 TO B
HIGH PORTB.0
PAUSE 100
LOW PORTB.0
PAUSE 100
NEXT
[color=red][b]goto ana[/b][/color]



YAK2:
A=0
FOR A=1 TO B
HIGH PORTB.1
PAUSE 100
LOW PORTB.1
PAUSE 100
A=0
NEXT
[color=red][b]goto ana[/b][/color]



YAK3:
A=0
FOR A=1 TO B
HIGH PORTB.2
PAUSE 100
LOW PORTB.2
PAUSE 100
A=0
NEXT
[color=red][b]goto ana[/b][/color]


 
YAK4:
A=0
FOR A=1 TO B
HIGH PORTB.3
PAUSE 100
LOW PORTB.3
PAUSE 100
A=0
NEXT
[color=red][b]goto ana[/b][/color]


YAK5:
A=0
FOR A=1 TO B
HIGH PORTB.4
PAUSE 100
LOW PORTB.4
PAUSE 100
A=0
NEXT
[color=red][b]goto ana[/b][/color]


END

ete

Programında ibazı kusurlar var.
Birincisi, PORTA mademki hepsi giriş o halde PORTA=%00000 gibi bir komut bir işe yaramayacaktır. Giriş olarak atanmış pinleri komutla sıfırlama yapman mümkün değil. O komutu ve peşindeki Pause 100 komutlarını kaldır oradan.

İkincisi, Branch komutundan sonra herhangi bir aktarma komutu gözükmüyor. Branch komutunun geçilme ihtimali belki olmayabilir. Ama sen yinede Branch Komutundan sonra bir GOTO ANA demen iyi olur.

Branch komutu goto komutu gibi davranır. Dolayısıyla gittiği yerden programı bir başka goto ile geri döndürmeli yada bir başka yere aktarmalısın. Halbuki sen gidiş yerlerinden dönüşü RETURN ile yapmışsın. Return kullanmak için oraya Gosub ile gelmiş olman gerekir.
Programlarındaki RETURN  ları  GOTO ANA ile değiştirirsen program doğru çalışır.

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

mustafa_cmbz

giriş çıkış olayalarını kontrol etmedim bilginiz olsun ete hocamın gözünden kaçmamış ama :P

@ete hocam çok hızlısın aramızda 1sn fark var :P

ete

Mustafa,
Benden önce yazmışsın sen daha hızlısın demekki. Ama ben bir iki konuya daha değinmişim fark ordanda geliyordur.
Ete 
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

mustafa_cmbz

yok hocam hızlı olan sizsiniz...


Alıntı Yap« Son Düzenleme: Bugün, 15:55:34 Gönderen: mustafa_cmbz »

Gönderen: ete
« : Bugün, 15:55:33 » Alıntı Yap

harmanx

selam yazılanları yaptım fakat
if komutu ile buton okutuyorum devre proteusta çalışıyor breadbord üzerinde denedim butonlar tam çalışmıyor butonlarda arak olayımıdır nasıl
hallederim butonlar 4k7 dirençle +5v pullup var..

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 23.04.2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F628A
@ DEVICE pic16F628A,WDT_ON
@ DEVICE pic16F628A,PWRT_ON
@ DEVICE pic16F628A,PROTECT_OFF
@ DEVICE pic16F628A,MCLR_OFF
@ DEVICE pic16F628A,INTRC_OSC_NOCLKOUT
include"modedefs.bas"
TRISB=0 'PORT B ÇIKIŞ YAP
TRISA=%11111111
PORTA=%11111111
PORTB=0'PORTB SIFIRLA
CMCON=7
DURUM VAR BYTE
W VAR BYTE
I VAR BYTE


'*********************************************************************
ANA:
IF PORTA.0=0 THEN YAK1
PAUSE 50
IF PORTA.1=0 THEN YAK2
PAUSE 50
IF PORTA.2=0 THEN YAK3
PAUSE 50
GOTO ANA
END

YAK1:
DURUM=%00000001          '00001111
FOR I =0 to 7    ' işlem 4 adım
PORTB=DURUM
FOR W=0 to 2 '3 defa flash yapacak
PORTB=0
PAUSE 30 'GEÇİŞ HIZI
PORTB=DURUM
PAUSE 20  'FLASH hızı
NEXT
DURUM=DURUM<<1  '2 şer sola kay
Next
GOSUB ANA

YAK2:
PORTB=0
DURUM=%10000000
FOR I =7 to 0 STEP -1'
PORTB=DURUM
FOR W=0 to 2 '3 defa flash yapacak
PORTB=0
PAUSE 30
PORTB=DURUM
PAUSE 20
NEXT
DURUM=DURUM>>1
NexT
GOSUB ANA


'*******************************************************************************
'yeni
'BASLA:
YAK3:
PORTB=0
DURUM=3          '00000011
FOR I =0 to 3    ' işlem 4 adım
PORTB=DURUM
FOR W=0 to 2 '3 defa flash yapacak
PORTB=0
PAUSE 30 'GEÇİŞ HIZI
PORTB=DURUM
PAUSE 20  'FLASH hızı
NEXT
DURUM=DURUM<<2  '2 şer sola kay
NEXT

PORTB=0
DURUM=%11000000
FOR I =3 to 0 STEP -1'
PORTB=DURUM
FOR W=0 to 2 '3 defa flash yapacak
PORTB=0
PAUSE 30
PORTB=DURUM
PAUSE 20
NEXT
DURUM=DURUM>>2
NexT

'----------------------------------------------------------
PORTB=0
DURUM=%00001111          '00001111
FOR I =0 to 1    ' işlem 4 adım
PORTB=DURUM
FOR W=0 to 2 '3 defa flash yapacak
PORTB=0
PAUSE 30 'GEÇİŞ HIZI
PORTB=DURUM
PAUSE 20  'FLASH hızı
NEXT
DURUM=DURUM<<4  '2 şer sola kay
Next
PAUSE 30


PORTB=0
DURUM=%00001111          '00001111
FOR I =0 to 1    ' işlem 4 adım
PORTB=DURUM
FOR W=0 to 2 '3 defa flash yapacak
PORTB=0
PAUSE 30 'GEÇİŞ HIZI
PORTB=DURUM
PAUSE 20  'FLASH hızı
NEXT
DURUM=DURUM<<4  '2 şer sola kay
Next
PAUSE 30

PORTB=0
DURUM=%00001111          '00001111
FOR I =0 to 1    ' işlem 4 adım
PORTB=DURUM
FOR W=0 to 2 '3 defa flash yapacak
PORTB=0
PAUSE 30 'GEÇİŞ HIZI
PORTB=DURUM
PAUSE 20  'FLASH hızı
NEXT
DURUM=DURUM<<4  '2 şer sola kay
Next
PORTB=0

GOSUB ANA

ete

Yukarıdan başlayarak kusurları yazıyorum.
ANA:
IF PORTA.0=0 THEN YAK1
PAUSE 50
IF PORTA.1=0 THEN YAK2
PAUSE 50
IF PORTA.2=0 THEN YAK3
PAUSE 50
GOTO ANA
END

Komutlarına bakalım. İlk satırda PortA.0=0 ise YAK1 isimli etikete dallandırıyor. Program o butona basılırsa YAK1 etiketine gidecek zaten. Peki peşinden gelen PAUSE 50 komutu ne işe yarıyacak? Hiç bir işe yaramadığı gibi işini geciktirecek ve aksatacak. Onu oradan kaldır.
Bence oradaki pasue lerin hepsini kaldır.
END komutu bütün program satırlarının en sonuna yazılır. END komutunu en alta taşı.

YAK1 etiketinin sonunda ;
GOSUB ANA  şeklinde bir komut var. Bu komut ANA isimli etikete gidilip geri dönülmesini sağlar. ANcak geri dönme RETURN komutu ile olmalıdır.
ANA etiketi altına bakarsak orada RETURN olmadığını görebiliriz. O halde bu uygulama yanlıştır. Bu satırı GOTO ANA şeklinde değiştirmen gerekiyor. Çünki GOSUB orada kullanılmaması gereken bir komuttur.

YAK2 ve YAK3 alt programlarının sonlarında yer alan GOSUB ANA komutlarıda yanlış olup yukarıda açıkladığım sebeplerden dolayı onları kaldırıp yerine GOTO ANA yazman gerekiyor.

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

harmanx

ilginize teşekkür ederim ete hocam :) :) :)