avatar_Selim64

Pic16F628a Pot komutu ile hız ayarlı kara şimsek devresi

Başlatan Selim64, 12 Mart 2019, 20:26:44

Selim64

Selamlar
PBP ile PiC16f628a ile Pot komutu ile hız ayarlı 7 veya 8 ledli karaşimşek nasıl yapılır ?
Mesela bende çalışan bir devre var lakin asm ile yazılmış asm de geçiş arası örneğin pause 500 yerine pause sure(pot değeri) gibi,
yani tek bilmek istediğim pause 500 yerine pot tan gelen değere göre pause yapabilmek.
Teşekkürler.
Selim Şen Teşekkürler

Selim64

Selim Şen Teşekkürler

ete

Hemde ne çaylaksın seviyen yerlerde sürünüyor. Çünki soru sormayı bilmiyorsun. Bak sebeplerini sana açıklayayımda önce bu tarafını geliştir bence.

Mesajına 7-8 ledli kara şimşek nasıl yapılır diye başlamışsın.  O kadar genel bir soru ki insan nasıl cevap vereceğini şaşırıyor. Bu soruyu yanıtlamak için bir kaç sayfa mesaj yazmak ve program mantığını açıklamak gerekiyor .
Bilgi seviyeni bilmiyoruz ki bu konuda hiç bir şey söylememişsin. Akılmı verelim kod mu verelim insan karar veremiyor.
Peki nasıl sormam gerekirdi dersen;
Öncelikle programlama bilginin seviyesini açıklaman gerekiyor. Neler yapabiliyorsun. Devre tasarımından anlıyormusun onu belirtmen gerekiyor. Kısaca elektronik bilgi seviyenide açıklaman gerekir idi. Bak çaylak olduğunu sonradan itiraf etmişsin. Peki çaylak olduğun halde burada anlatılacak olanları nasıl anlayıp da o sistemi yapacaksın sende bana bunu açıkla bakalım.
Kara şimşek sisteminin iki farklı versiyonu var. Birinde yalnızca ledler sıralı olarak yanıp sönerek sağa sola hareket vardır. Asıl orjinal olanında ise ledler yavaş yavaş yanarak (PWM ile) ve sönenlerde yavaş yavaş sönerek ilerler.
Birinci versiyon zor değil Bir İŞlemci Portunda 8 bit'e karşılık gelen pinler vardır. Mesela B portu diyelim.
PORTB=1 verirsen PORTB.0 a bağlı olan led yanar. PortB=3 verirsen Bu sefer PORTB.0 ve PORTB.1 yanar. Ne yapmış olduk. Portun değerini alıp 2 ile çarptık ve 1 ekledik. Bir değişken kullanarak yapmak daha iyi olacak. Ona LED diyelim. Başlangıçta LED=0 idi. SOnra LED=LED*2+1 formülünü kullandık ve Led=0*2+1=1 oldu SOnra PORTB=LED dedik ve 1 nolu led yandı. Sonra pause 200 verdik yada Bir analog pine bir pot bağladık onu ADCIN 0,HAM ile okuyup SURE=(HAM)*/250  formülü ile okunan pot değerine bağlı olarak 0-1000 ms lik bir gecikme aralığı yaratırız. Ve  Pause SURE deyip gereken gecikmeyi de koyup programı en başa göndeririz.
Ama bu şekilde bir müddet sonra bütün ledler yanar. Halbuki Kara şimekte yalnızca bir kaç led yanarak ilerliyor.
O halde ne yapmak lazım. Sayı belirli bir seviyeye ulaşınca önceden yananlarıda söndürmek gerekecek demektir bu.
Diyelimki en fazla 4 led yansın istiyoruz. Öncelikle bütün ledleri sırası ile yaktıracak olan sayılara bir bakalım;
1-3-7-15-31-63-127-255 sayıları birer birer hangi ledlerin yanacağını belirliyor. En fazla 4 led yansın istiyoruz o halde 4 cü led yandığı zaman sayı 15 olacak. O halde IF LED=15 then PORTB.0=0 demekle ilk ledi söndürmüş oluruz.
LED=31 olunca PORTB.1 söndürülecek, Led=63 olunca PORTB.2 söndürülecek.  ve bu şekilde sistem devam edecek.
Şİmdi de geri gidişi açıklayalım. Led=255 olduğunda ilk 4 led de sönmüş olacak bu sefer LED=LED/2 verrsek LED=127 çıkacaktır. Ancak baştan 3 led de sönük olacağı için led=127-7 vermemiz gerekecektir.
Bu şekilde de sırasıile ledleri geri götüreceğiz ve sonunda sistemi en başa gönderip bunu döngü şeklinde devam ettireceğiz.
Bir başka metod ise, Ledleri 15 den sonra hesaplanan değeri sönük olması gereken ledlere göre hesaplamaktır.
15 den sonra 31 verildiğinde 1 nolu led söneceği için bundan 1 çıkarmak gerekiyor. O halde Led=led-1 dersek led=30 olacaktır. Ama bir sonraki ledi hesaplarken LED değeri 31 olmalı bunun için çıkarma işini Porta verirken yapmak lazım. PORTB=LED-1 şeklinde olursa daha iyi olur. Yada bunu da otomatik hale getirelim. SONUK isimli değişkenimizde sönecek ledleri hesaplasın.
IF LED>30 then SONUK=SONUK*2+1 formülüde bunu yapacaktır. Başlangıçta SONUK=0 ile başlanacak ve ilk ledi yakarken LED=LED*2+1-SONUK formülüne verdiğimiz zaman otomatik sönecek ledlerde belirlenmiş olur.

Şimdi bütün bu açıkladıklarımı anlayabildinmi acaba çok merak ediyorum.

Gelelim İkinci versiyona, İkinci verisyon için her bir lede PWM uygulamak gerekiyor ki buna benim programlama bilgim bile çok sınırlı bir şekilde yetiyor. Ama yinede bunu MIBAM denilen bir sistemle yapabiliyorum. Bu sistem bir işlemcide bütün bacaklara PWM uygulamama imkan tanıyan bir sistem. Nasıl yapıldığını daha önceden bu sitede açıklamış idim ararsan bulursun. Hatta yanlış hatırlamıyor isem Kara şimşek çalışmasınıda vermiştim diye hatırlıyorum.

Şimdi gelelim asıl konuya, Elindeki programın ASM ile yazıldığını ve o programa pot ilave edilip pot deerine göre pause yapılmasını istiyorsun. Başkasının yazdığı bir programa heleki ASM ile yazılmış bir programa müdahale edip kod eklemenin neredeyse imkansız olduğunu belirterek konuya gireyim. Pot komutu Basic komutudur ve ASM ile alakası yoktur. ASM de bu işler çok daha karmaşık şekilde yapılıyor. Önce bir sor bakalım bu sitede kaç kişi  o dediklerini yapacak kadar asm biliyor. Bence 1 veya 2 kişi çıkabilir. Bunların içinde ben yokum onuda baştan belirteyim. Asm biliyorum ama bu işleri yapacak kadar bilmiyorum maalesef.
Ayrıca ASM de gecikme işleri döngü kullanılarak yapılır. Orada öyle pause gibi komıtlar yok maalesef. Gecikme denilen şey bir komutun işlenmesi esnasında geçen süre baz alınarak hesaplanır. Örneğin NOP denilen bir asm komutu vardır. Bu No Operation yani işlem yapma komutudur ama bu komut işlenirken bir komut çevrimi yada bir CLK kadar süre harcanır. 4 Mhz işlemci frekansında bu 1us lik bir süreye denk gelir. İşte bir döngü kurarak bunlardan binlercesi bir araya getirilerek uzun gecikmeler yaratılır. Senin sisteminde diyelimki pot dan bir değer okuduk bunu otomatik gecikme döngüsüne aktarabilmek için bir sürü kod yazmak gerekiyor. Anlayacağın bu istediğinde öyle her babayiğidin yapabileceği bir iş değil. Üstelik pot komutu dediğin şey port pinine bağlı bir kondansatörün 5V ile şarj edilip portun HIGH seviyesine getirilmesi ve ardından da kondansatöre bağlı direnç üzerinden boşaltııp ne zaman GND (LOW) seviyesine geldiği hesaplanarak yapılıyor. Oda başlı başına bir iş. Bunu asm de yapmak mümkün elbette zor da değil ama bir araba kod yazmak gerekiyor.
Anlayacağın istediklerin bana yapılması neredeyse imkansız gibi gelen şeyler olarak gözüküyor. Bu nedenle cevap alamadın. Heleki ASM ile basic kodlarını karıştırıp Pasue komutunu pot ile ayarlamaktan bahsedince bu vatandaş anlatsakta anlamaz imajı yaratmış oldu ve kimsede buna cevap vermedi durum böyle umarım anlamışsındır anlatılanları.

Ete

Selim64

Kusuruma Bakmayın ETE bey Türkçem biraz kısıtlı oldugu icin sorumu doğru formüle edemedim galiba en iyisi şöyle yapalım ,
arduino ile yapılmış çalışan bir devre ve yazılım var size ekte sunayım oradaki yazılıma baktığımda bunun picbasic ile de yapılabileceğini düşündüm asm ile yapılmış pic16f628a kullanılmış bir devrede var elimde lakin asm hiç bilmiyorum ve picbasic çok daha iyi diye düşünüyorum örneğin devreyi ve yazılımı yaptık çalışıyor diyelim ben led değerlerini değiştirerek karaşimşek değilde kayan ışık yapabilmek istiyorum bunu arduino ile yapabiliyorum.
Veya şöyle sorayım pic16f628a ve  potansiyometre ile akış hızını ayarlayabileceyim led efekt nasıl yaparım ?
Selim Şen Teşekkürler

ete

Tam olarak ne istiyorsun onu bilmem gerekiyor. Sorular soruyorsun sanki fikir edinmek için ama durumuna bakınca da hazır program beklentisi içindesin gibi bir his var içimde.
Bu sitede hazır program vermiyorum. Yada vermiyoruz. Bu birinci prensibimiz. Amacımız bilmeyenlere bir şeyler öğretebilmek. Yoksa cebimden para ödeyip bir site açmayı bu amaç dırışında düşünmezdim. Hazır program istiyorsanız ücretini öder alırsınız. Değilse buradaki yayınlanmış dersler ve projeler sze ilham vermeli. Aradığınızı bulamıyorsanız fikir sorabilir ve buna rağmen yapamıyorsanız sıkıştığınız noktayı açıklar ve yardım isteyebilirsiniz. Onun dışında elimizden bir şey gelmiyor maalesef. Bu nedenle önce amacınızı söyleyin ne istiyorsunuz yada ne bekliyorsunuz?

Yanlış değerlendirme olmaması için bu soruyu soruyorum. Çünki epeyce bir açıklama verdim zaten ama hala nasıl yaparım diye sorduğunuzu düşünerek yeniden sorayım dedim.

Ete

Selim64

ETE Bey 1. Ben Karıncanın bile hakkını koruyan bir kulum 2. Hazır bir yazılımda istemedim sadece sunu bilmek istedim
örneyin  özellikle pic16f628a ( Elimde çok oldugu için ) 
POT komutu kullanırken bir değişken atayıp sabit akış yerine örneyin PAUSE 500 yerine delay(sure); akış hızını deyiştirmek
Size gönderdiğim ardino yazılımındaki gibi ( PWM istemiyorum ) sade3ce ledlerin hızını ayarlamak yetiyor.
Benim Hobim Model Uçaklar ısıklandırmak istiyorum bunun bir bedeli varsa derhal öderim hiç sorun değil
Dilerseniz beni Tel ile arayabilirsiniz 0546 4144104 lakin önce mesaj atın ben geri dönerim
  digitalWrite(led7,LOW);
  digitalWrite(led6,HIGH);
  delay(sure);
  digitalWrite(led6,LOW);
  digitalWrite(led5,HIGH);
  delay(sure);
Selim Şen Teşekkürler

ete

Yolladığın yazılmalara müdahale edemem. Çünki o dilleri anlarım ama program yazacak kadar bilmiyorum.
Aynı sistemi istersen yeni bir program yazarım. Ancak ADC portu olmayan 16F628 de pot ile süre ayarlamanın çok sıhhatli çalışacağına dair şüphelerim var. Tamamen pine bağlı kondansatörün şarj deşarj sistemine göre çalışır ve bir okuduğu değeri üst üste okumaz. Ortalama alınabilir oda gecikme yaratır. Ancak sistemi çalıştırırken bir kere pot okunur ama ondan sonra tekrar okunmaz ise sistem bir nebze çalışır.

Ete

Selim64

İlgilendiğiniz için çok teşekkürler ben BASCOM AVR biliyorum lakin picbasic te yapmak istemiştim bir şekilde çözecem inşALLAH çözünce burada paylaşırım Teşekkürler.
Selim Şen Teşekkürler

Powered by EzPortal