öncelikle merhaba sorum şuki işlemcim pic16f84a porta.0 bitine bağlı 1 buton var normal isis teki button bastıgımız zaman 1 gönderen bıraktıgımız zaman kesen buton. bu butona 1 kere basıp elimizi çektiğimiz zaman portb.0 bitine bağlı led yanık kalacak aynı butona tekrar basıp elimizi çektiğimizde gene porb.o bitine bağlı olan led busefer sönecek tabiki hep aynı döngü. ben çok denedim olmadı ıf then else ile yapamadım basşka türlü yapabilecek olan arkadaşlar varsa yardımlarınızı bekliyorum. bu arada dili proton yada basic olacak. teşekkürler
PORTA' nın 0. bitini pulldown yaptığını varsayıyorum.
Aşağıdaki program işini görür.
DEFINE OSC 4
TRISA=1:TRISB=0
PORTA=0:PORTB=0
BASLA:
IF PORTA.0=1 THEN
TOGGLE PORTB.0
WHILE PORTA.0=1:WEND
ENDIF
GOTO BASLA
END
toggle komutunun olmaması gerekiyor bunu bir değişken ile yapmam istendi cok ugrastım yapamadım bu bilgiyide vermediğim için özür dilerim.
o zaman şöyle yapabilirsin
bir bit değişkeni tanımla
örnek:
DIM AAA AS BIT
toggle yerine "INC AAA" yaz
her basmada AAA değeri 1 ve 0 olacak .
led çıkışı içinde şunu yap
IF AAA=1 THEN PORTA.0 = 1 :ELSE: PORTA.0 = 0
Input PORTA.1
Output PORTB.1
Dim AA As Byte
AA=0
basla:
If PORTA.1=0 And AA=0 Then
PORTB.1=1
DelayMS 200
AA=1
EndIf
GoTo YAK
YAK:
If PORTA.1=0 And AA=1 Then
PORTB.1=0
DelayMS 200
AA=0
EndIf
GoTo basla
End
hocam çok teşekkür ederim
Aklında bulunsun bu komutta toggle ile aynı görevi görür
PORTB.0=1-PORTB.0
Maxim hocanın verdiği çalışıyor, fakat Mucit23'ün verdiği kod daha sağlıklı kısaca butona basık tutsamda vazifesini yerine getiriyor.
merak ettim Maxim'in verdiği kod butonu basık tutar isem Flip flop gibi davranıyor ??????
Alıntı yapılan: ipek - 07 Mayıs 2011, 03:18:19
Maxim hocanın verdiği çalışıyor, fakat Mucit23'ün verdiği kod daha sağlıklı kısaca butona basık tutsamda vazifesini yerine getiriyor.
merak ettim Maxim'in verdiği kod butonu basık tutar isem Flip flop gibi davranıyor ??????
çünkü kod eksik hocam arkadaş while kullanmamış ben sadece toggle komutuna alternatif önermiştim.
EDIT:
doğru kod :
Input PORTA.1
Output PORTB.1
PORTB=0
Dim AA As Bit
AA=0
Basla:
If PORTA.1=0 Then
Inc AA
While PORTA.1=0:Wend
EndIf
If AA=1 Then PORTB.1=1 :Else: PORTB.1=0
GoTo Basla
Maxim hocam klavyenize sağlık taşlar yerine oturdu sayenizde WEND !in önemini kavradım.....
bit tipinde bir değişken i nasıl 1 ve 0 yani toggle yapabiliriz.
üstteki mesajlarda anlatılmış zaten anlamadiğiniz yer nedir :-\
A var Bit
A=1-A
A =0 iken A=1-A formülüne göre A=1 olur
A=1 iken A=1-A formülüne göre A=0 olur.
Toggle A demekde aynı şey.
Ete
denetleyiciler ile buton kontrolü veya başka bir işlem yaparken program akışını bir noktada bekletmek pek kullanışlı değildir. yukarıdaki örneklere baktığımda işlemci porta.0=0 olduğu sürece WHILE ve WEND komutu arasında kısır döngüye sokulmuş bu sırada başka bir butondan işlem yapma istesek yapamayacağız yapılan uygulama tek bir buton üzerinede olsa çok gerekmedikçe kısır döngüye sokulmaması gerekir.bu ileride karışık programların algoritmasının çöülmesinde bize büyük kolaylık sağlayacaktır. bu nedenle uygulamalarda döngü sürekli aktif durumda olmalıdır. bu sayede birbirinden bağımsız birden çok butonla gereken uygulamalarımızı yapabiliriz. bu anlattığım mantık aynı PLC mantığına benzer. PLC' ler bizim başla ve goto başla değimiz program döngüsünü sürekli aktif durumda tutarlar. bu sayede birçok sensörden butondan veya transdüserden gelen bilgileri 2ms daha kısa bir sürede cevap verirler. bu durumu göz önünde bulundurarak yukarıdaki uygulamamızı şu şekilde düzeltmeliyiz;
DEVICE =16F84A
XTAL=4
INPUT PORTA.1
INPUT PORTA.2
TRISB=%00000000
PORTA=0
PORTB=0
DIM AA AS BIT
DIM BB AS BIT
CLEAR AA
CLEAR BB
SYMBOL LED=PORTB.4
Basla:
DELAYMS 100 ' Ana döngü süresi 100ms
IF PORTA.1=1 AND AA=0 THEN
TOGGLE PORTB.1
AA=1
ENDIF
IF PORTA.1=0 THEN AA=0
IF PORTA.2=1 AND BB=0 THEN
TOGGLE PORTB.2
BB=1
ENDIF
IF PORTA.2=0 THEN BB=0
TOGGLE LED
GOTO Basla
END
Programda kullanılan led döngü işlemini görmemiz için konulmuştur. programın ana döngü süresi 100ms seçilmiştir. aslında bu süre 2ms gibi küçük bir değer seçilmelidir biz ledin yanıp sönmesini görmemiz için 100ms seçtik. programın çalışması gayet basittir. yukarıda istenilen tek butonla on off işlemini yapmaktadır. ben programın gelişebilirliğini göstermek için,birbirinden bağımsız iki farklı butonla on off yaptım bu sayı daha da artırılabilir. yazılan Algoritma gereği bir buton sürekli basılı tutulsa bile ana program döngüsü kısır döngüye sokulmamaktadır.Bu sayede diğer buton veya butonlara basılsa bile işlemci çok kısa sürede cevap vermektedir. programı mutlaka yazmanızı ve denemenizi isterim bu sayede ufkunuzun genişleyecegine inanıyorum kolay gelsin.. :)
aradıgım buydu sagolun cevablar için
dim FR as bit
If FRin = 1 Then
FR =~ FR
While FRin = 1
DelayMS 100
Wend
EndIf
iş yapan kısım
FR =~ FR