Arkadaşlar yaptığım bir projede uzaktan kumanda ile step motor kontrol etmeyi planlıyorum fakat programlama bilgimin yetmediği bir yerde takılıp kaldım sizlerin yardımını bekliyorum sorunşu programdada görüldüğü gibi seri girişten bilgi geliyor bilginin içeriği seçiliyor eğer bilgi 253ise "v "adresine giriliyor "v "adresindeki işlem yapılıyor bu işlem arkadaşlar step motorun sağ doğru adım atmasını sağlıyor sonra tekrar v adresine gidilerek tekrar aynı işlem v döngüsü içinde devam ediyor yani motor sag adım atarak sag doğru sürekli dönüyor 247 bilgisi geldiğinde ise p adresine giriliyor ve p adresindeki işlem yapılıyor burdaki işlemde motorun sola dönmesi işlemi ve buda programda görüldüğü gibi sonsuz döngüde çünkü sürekli adım ata ata dönmesi lazım şidi buraya kadar güzel problem şu anlaşıldığı gibi kumandadan bastımızda p veya v adresine girecek sağ veya sola dönecek adrese göre yalnız adreslerden birine girdi diyelim p ye girdi döngünün sürekli olması gerektiği için doğal olarak döngüden çıkmıyoryani baska tusa basıp v adresine girmeye çalışırsak olmuyor kumandadan ilk hangi tuşa basarsak(ilk hangi adrese girerse)o yönde dönüyor diyer tuşa bassak bile aynı yönde devam ediyor programda döngünün olması şart döngüyü kaldırdımızda farklı tuşlara basınca sağ veya sola dönüyor step motor ama adım adım dönüyor yani her tuşa bastımızda bir adım atıyor sürekli dönmüyorKısaca döngü şart ama kumandadan diyer tuşa basıldığında döngüden çıkıp diyer döngüye girmeside gerek ben bir yol bulamadım umarım uzman arkadaşlar bir çözüm üretir şimdiden teşekkürler. TRISA=%00000001 TRISB=0 porta.1=0 BILGI var BYTE SYMBOL VERIIN=PORTA.0 PORTB=0 MAIN: BILGI=0 Z serIN2 VERIIN,813,[WAIT ("ETE"),BILGI] SELECT CASE BILGI CASE 253 V high porta.1 'step motoru sağa döndüren döngü PAUSE 500 low porta.1 PAUSE 500 high portb.5 PAUSE 500 low portb.5 PAUSE 500 GOTO V CASE 247 P high portb.6 'step motoru sola döndüren döngü PAUSE 500 low portb.6 PAUSE 500 high portb.7 PAUSE 500 low portb.7 PAUSE 500 GOTO P END SELECT GOTO Z END
Bu işlemi kesmelerle(sanırım interrupt diye yazılıyo ingilizcesi) yapabilirsin. p ve v nin yanında : olması gerekiyor yani p: v: şeklinde yazmalısın
Sonraa kodları şu şekilde düzenlesen daha şık olur
TRISA = 31
TRISB = 0
Bilgi var byte
Temp var byte
Konum var byte
Yon var byte
Konum = %1000
PORTB = konum
Ana:
bilgi = PORTA
if bilgi = 253 then Yon = 1
if bilgi = 247 then Yon = 2
if yon = 1 then goto sag
if yon = 2 then goto sol
goto ana
Sag:
konum = konum >> 1
if konum = 0 then konum = %1000
portb = konum
pause 200
goto ana
Sol:
konum = konum << 1
if konum = %10000 then konum = %0001
portb = konum
pause 200
goto ana
Ben burda com portu kullanarak veri almayı bilmiyorum sen orada "bilgi=porta" yerine veri almak için gereken kodu yazacaksın. Sonra oradaki pause lerin önündeki 200 değerini istediğin gibi değiştirebilirsin bu motorun hızını etkiler
Edit: Bu kodlar motoru öncelikle belirli bir konuma getirir, sen yön seçene kadar sabit kalır sen yön seçincede motor aynı yönde sürekli dönmeye başlar taki sen aksi yönde dönmesini söyleyene kadar Durdurmak için reset tuşunu kullanabilirsin bu kodlara görede motor portb ye bağlı
< Bu mesaj bu kişi tarafından değiştirildi samed2005 -- 5 Temmuz 2008; 2:33:31 >
Gelen değeri bir yere kaydet , interrupt kullan her bilgi geldiğinde gidip baksın gelen ne diye ... Tabii bu iş için yollanan bilginin de tekrarlanıyor olması lazım(aynısı olsa bile).
Edit : @samed2005 benden önce yollamış ve daha güzel açıklamış sağolsun.
< Bu mesaj bu kişi tarafından değiştirildi musallim -- 5 Temmuz 2008; 2:33:53 >
Beyler ilgilendiğiniz için saolun fakat yine olmuyor sorun şu dediğin gibi bilgi=porta kısmında porta.0 dan gelen seri bilgiyi okuttum (serIN2 VERIIN,813,[WAIT ("ETE"),BILGI]) komutuyla bilgi okutuluyor bilginin 253 yada 247 olmasına göre adresede dallanıyor motor sağ yada sola adım atıyor adrese dallanıp fakat sag sol adresinden çıkıp ana adresine tekrar dallanıldığında serIN2 VERIIN,813,[WAIT ("ETE"),BILGI] komutuna gelindiğinde burada kalıp porta.0 dan veri gelmesi bekleniyor gelmediği sürece burda kalıyor yani döngü dönmüyor. veri geldiğinde tekrar veriye göre adrese dallanıyor 1 adım atıyor tekrar ana adrese gelip seri bilgi yi okuma komutu serIN2 VERIIN,813,[WAIT ("ETE"),BILGI] burda kalıyor tek çare var gibi görünüyor oda interrupt kesme yapmak sanırım şöyle olacak porta.0 dan seri bilgi geldiğinde kesme yapılacak ve kesme adresindeki işlem uygulanacak döngülerden porta.0 dan seri bilgi geldiğinde kesme yapılarak çıkılacak fakat 16f84de kesme nasıl yapılıyor bilmiyorum 8051de seri haberleşme kesmesi vardı sanırım 16f84dede vardır bilen arkadaşlar lütfen yardımcı olabilirlermi şimdiden teşekkürler
TRISA = 31
TRISB = 0
Bilgi var byte
Temp var byte
Konum var byte
Yon var byte
Konum = %1000
PORTB = konum
Ana:
serin2 PortA.0,813,100,dallan,[wait("ETE"),bilgi]
Dallan:
if bilgi = 1 then Yon = 1
if bilgi = 2 then Yon = 2
if yon = 1 then goto sag
if yon = 2 then goto sol
goto ana
Sag:
konum = konum >> 1
if konum = 0 then konum = %1000
portb = konum
pause 200
goto ana
Sol:
konum = konum << 1
if konum = %10000 then konum = %0001
portb = konum
pause 200
goto ana
Derlemeyle ilgili bir sıkıntı yok ama proteusta seri portun nasıl kullanıldığını bilmediğim için simüle edemedim.