pic ile led yakıp söndürme problem

Başlatan a4tech33, 05 Mayıs 2011, 16:35:36

a4tech33

ö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

Mucit23

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

a4tech33

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.

Maxim

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

a4tech33


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

Mucit23

Aklında bulunsun bu komutta toggle ile aynı görevi görür

PORTB.0=1-PORTB.0

ipek

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 ??????

Maxim

#7
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

ipek

Maxim hocam klavyenize sağlık taşlar yerine oturdu sayenizde WEND !in önemini kavradım.....

a.zorba

bit tipinde bir değişken i nasıl 1 ve 0 yani  toggle  yapabiliriz.
Bilenler bilir . Biz maraşlilar için şehir olarak şubat ay' i bayram ,kurtuluş ,yaz in gelmesiydi. Şimdi karalar in yas in ayı oldu.

ilhan_mkp

üstteki mesajlarda anlatılmış zaten anlamadiğiniz yer nedir :-\

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

sezgiin

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..  :)

a.zorba

#13
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
Bilenler bilir . Biz maraşlilar için şehir olarak şubat ay' i bayram ,kurtuluş ,yaz in gelmesiydi. Şimdi karalar in yas in ayı oldu.