Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

tuşla kontrol...

Başlatan crickcrack, 26 Ocak 2006, 23:48:00

crickcrack

Arkadaşlar amacım bir robot kolu klavyedeki tuşlarla kontrol etmek. Tuşa basılı kaldığı sürece picin bacağının enerjilenmesini tuştan elimi çektiğimde ise enerjinin kesilmesini istiyorum. Bunu denedim ama çözüm olmayınca aşağıdaki gibi birşey yaptım ancak bu da kısa aralıklarla aç - kapa yaptığı için ideal değil.

ba1 var b1.0
ba2 var b1.1
.
.
.
ba8 var b1.7


if ba1 then
high portb.0
pause 50
low portb.0
endif

Burada eğer

if ba1 then
high portb.0
else
low portb.0
endif

yaparsam istediğim sonucu alamıyorum. Yardımlarınızı bekliyorum....

forsa1975

bu kadar basit bir işlem için pici neden heba ediyorsunuzki? Yazdığınız kod ve söylediğinize göre giriş varsa çıkış olsun. O zaman girişi direkt çıkış olan noktaya bağlayıp pici aradan çıkartırsınız. Mesele hallolur.

Eminim olay bu kadar basit değildir fakat bizim anladığımız bu. Biraz daha açarsanız meseleyi fena olmaz.

Eğer bahsettiğin bilgisayar klavyesi ise o zaman http://www.antrak.org.tr/gazete/012006/serafetdin-baloglu.html

buraya bir göz at derim.

crickcrack

Tam olarak anlatamadım kusura bakmayın. ben kolu rf modül kullanarak kablosuz kontrol ediyorum. Pic ise dc motorları sürdüğüm L293D entegrelerine çıkış veriyor. Amacım sadece aç-kapa yapmak değil ama bu aşamada bunu öğrenmem bile yeterli.

forsa1975

b1 var porta ' alttaki satırlara istinaden böyle bir değişkenin olmalı bu değişkene a portunu yada gelen seri data olsun
ba1 var b1.0 'yukarıdaki değişkenin 0. biti ba1 değişkenine atanıyor
ba2 var b1.1 'yukarıdaki değişkenin 1. biti ba1 değişkenine atanıyor

ba8 var b1.7 'yukarıdaki değişkenin 7. biti ba8 değişkenine atanıyor

dondur:
if ba1=1 then ' eğer ba1 değişkeni yani b1 in 0.biti 1 ise 
high portb.0 ' portb.0 ı +5v yap
pause 50 ' 50 ms bekle
low portb.0 ' portb0 ı 0v yap
endif 

goto dondur ' programı sürekli döngüye sok
end

crickcrack

Arkadaşlar sağolun ama ben sanırım anlatamadım. Ben zaten şu an aç-kapa mantığıyla kolu çalıştırıyorum. Problem şu ben tuşa bastığım (örneğin 10 sn) zaman pic in ilgili pini sürekli enerjili kalmalı , ancak elimi çektiğim vakit pin "low" olmalı. İşte bu noktada problemim var çünkü yukarıfdaki döngü yü zaten yaptım fakat söylediğim mantıkla çalışmıyor...
Hala yardım bekliyorum...

ftsahin

Alıntı yapılan: "crickcrack"
Burada eğer

if ba1 then
high portb.0
else
low portb.0
endif

yaparsam istediğim sonucu alamıyorum. Yardımlarınızı bekliyorum....

Bu mantık aslında doğru. Butona bastığın sürece ba1=1 oluyorsa portb.0 da 1 oluyordur. Acaba buton bilgisi RF'te kesintiye mi uğruyor? İstersen önce butona bastığın sürece PIC'e sürekli bilgi geliyormu onu kontrol et.

Veli B.

RX için;
SERIN PORTA.0, N2400, 100,yok,GELEN      ' A0 dan datayı bekle datayı GELEN değişkenineat,  eğer 100 ms data gelmez ise YOK etiketine dallan.


PORTB=GELEN 
GOTO MAIN
yok:
portb=0
goto MAIN


Bu hali ile istediğin gibi çalışır.Datayı güvenli hale getirmek için ilaveler yapabilirsin.Mesela bir defadan fazla göndermek gibi, kontrol byte göndermek gibi vs vs...

tnen

while dongusu ile yaparsın bu işi.
main:
while (kolu_dondur = 0)

portb.0 = 1

wend
portb.0 = 0
goto main
seklinde dene

kolu_dondur senin rf den gelen bilgine gore 1 yada 0 olsun

forsa1975

b1 var porta ' alttaki satırlara istinaden böyle bir değişkenin olmalı bu değişkene a portunu yada gelen seri data olsun 
ba1 var b1.0 'yukarıdaki değişkenin 0. biti ba1 değişkenine atanıyor 
ba2 var b1.1 'yukarıdaki değişkenin 1. biti ba1 değişkenine atanıyor 

ba8 var b1.7 'yukarıdaki değişkenin 7. biti ba8 değişkenine atanıyor 

dondur: 
if ba1=1 then ' eğer ba1 değişkeni yani b1 in 0.biti 1 ise 
high portb.0 ' portb.0 ı +5v yap 
pause 50 ' 50 ms bekle 
low portb.0 ' portb0 ı 0v yap 
endif 

goto dondur ' programı sürekli döngüye sok 
end



Yukarıdaki kodda  süreklilik sözkonusu değil. Çünkü 50 ms sonra gelen 1 se bile portu low yapıyor. O halde kod zaten istediğin gibi değil.


Bunun için  b1 in 0 dan büyük olup olmadığını kontrol etmek gerekiyor. Eğer b1 0 dan buyukse değişiklik o zaman yapılmalı. Fakat buradai sorun 0 da bir değer olduğundan ve hiçbir butona basılmadığında gitmesi gerektiğine göre. 8 bitten birini kontrol biti olarak kullanmak. Örneğin 0 bit herhangi bir butona basıldığında 1 olursa. Gelen bilgi her halukarda 0 dan buyuk olur ve gelen bilgi 0 dan buyuk aynı zamanda 0.bit 1 ise durum değiştir diyebiliriz.   Eğer devreyi yeniden tasarlamak mumkunse bu kontrol edilebilir.  Hazır kullanılan bir devrede bunları yapmanın mumkun olup olmadığını bilmiyorum.

  Şayet şartlar uygunsa ve devrede modifikasyon yapma şansı varsa;

b1 var porta ' alttaki satırlara istinaden böyle bir değişkenin olmalı bu değişkene a portunu yada gelen seri data olsun 
ba1 var b1.0 'yukarıdaki değişkenin 0. biti ba1 değişkenine atanıyor buda kontrol için kullanılıyor.
ba2 var b1.1 'yukarıdaki değişkenin 1. biti ba1 değişkenine atanıyor 

ba8 var b1.7 'yukarıdaki değişkenin 7. biti ba8 değişkenine atanıyor 

dondur: 

if ba1=1 then  ' eğer ba1 değişkeni yani b1 in 0.biti 1 ise tuşa basılmış
   if ba2=1 then ' eğer ba1 değişkeni yani b1 in 1.biti 1 ise 
      high portb.0 ' portb.0 ı +5v yap 
   else
      low portb.0 ' portb.0 ı 0v yap 
   endif 
endif
goto dondur ' programı sürekli döngüye sok 
end



yukarıdaki kodda sadece 0.bit geldiğinde çalıştığı için aradaki kayıplarda işlem yapılmayacaktır. Ve pinler kararlı çıkış verecektir düşüncesindeyim.

crickcrack

Alıntı yapılan: "ftsahin"
Alıntı yapılan: "crickcrack"
Burada eğer

if ba1 then
high portb.0
else
low portb.0
endif

yaparsam istediğim sonucu alamıyorum. Yardımlarınızı bekliyorum....

Bu mantık aslında doğru. Butona bastığın sürece ba1=1 oluyorsa portb.0 da 1 oluyordur. Acaba buton bilgisi RF'te kesintiye mi uğruyor? İstersen önce butona bastığın sürece PIC'e sürekli bilgi geliyormu onu kontrol et.

Sistemi RF modülleri aradan çıkarıp yeniden denedim fakat kesinti devam ediyor bu da yazılımda eksik olduğunu gösteriyor. While- wend ile de çalışmıyor. toplam 7 dc motor sürüyorum dolayısıyla ba1--ba8 ile 1 byte veri gönderilmiş oluyor. Ancak bu toplamda 4 dc motor eder. Geri kalan 3 motor içinde bb1--bb8 değişkenlerini kullanıyorum.

Arkadaşlar sistemimde bir pic16f877 ve 4 adet L293D entegresi mevcut. Şimdi bu 7 dc motoru aç(tuşa basılı olduğu sürece) ve kapa(tuştan el çekildiği sürece) yapacak bir yazılıma ihtiyacım var ve zamanım kalmadı.
Yazılımda değişiklik yapabilmem mümkün. Ancak sistemi değiştiremem.

"Katana" nın cevabında da işlem sadece portb için yapılıyor. ancak ben sistemde toplam 14 çıkış kullanıyorum. Dolayısıyla portb, portd ve porta danda çıkışlarım var. Yani serin deki GELEN'i her bir port a nasıl atayabilirim bilmiyorum...Yardımlarınızı bekliyorum...

Veli B.

Bütün detayları verirsen daha sağlıklı olur.Bıton pinlerin, drive pinlerin vb.
Senin ilk mesajına istinaden yeterli olduğunu düşünürek vermiştim o örneği.Aynı şekilde bütün portlar için kullanabilirsin, ufak tefek değişiklikler ile ;)

crickcrack

Arkadaşlar problemi aşağıdaki şekilde sonunda çözdüm. Umarım sizinde işinize yarar. Tek problem ise herhangi bir tuşa basılmadığında LCD de her iki port içinde sırayla duruyor yazıp tamam a geçiyor. bu döngüden kaynaklı ama sisteme zararı yok. Yinede bunu çözebilecek arkadaşlardan yardım bekliyorum. Kod şöyle:

b1 var byte

ba1 var b1.0                'DC1 ileri
ba2 var b1.1                'DC1 geri

Pause 500         ' Wait .5 second

b1 = 0

serial:
   serin si,N2400,1000,dongu,b1
     
goto dongu

dongu:
 
  if ba1 then                            'b1.0 aktif olunca şunu yap
  High portB.7                          'PORTB.7 e enerji ver
  LCDOUT, $FE, 1 , "aktif"          'LCD de durumu görüntüle
  pause 10                                'son konumda 0.01 sn bekle
 
  else          
  low portB.7                             ' PORTB.7 in enerjisini kes
  LCDOUT, $FE, 1 , "duruyor"      'LCD de durumu görüntüle
  pause 10
  endif
 
  IF ba2 then
  high portB.5
  LCDOUT, $FE, 1 , "aktif"
  pause 10
 
  else    
  low portB.5
  LCDOUT, $FE, 1 , "duruyor"
  pause 10
  endif
 
Goto don
don:
LCDOUT, $FE, 1 , "tamam"
b1=0
goto serial
end

herşey için teşekkürler. Ayrıca tuşla kontrol yaptığım visual basic programımında kodlarını da isteyen arkadaşlara gönderebilirim. Böylece klavyeden sistem kontrol etmek sıradan hale gelir.

Kolay gelsin...

OG

Alıntı YapAyrıca tuşla kontrol yaptığım visual basic programımında kodlarını da isteyen arkadaşlara gönderebilirim.
Paylaşmayı arzu edersen buraya gönder isteyen alsın.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.