rgb devresi yardım ?

Başlatan kemald78, 12 Kasım 2012, 17:49:58

kemald78

eve kendime lamba yapmak istiyorum odanın tamamını rgb şerit led ile döşeyecem ve kartıda kendim yapmak istedim ama 3 aydır araştırma yaptım bulamadım istediğim ekte ekli hız ayarı ve program olmasını istiyorum ve siz üstadlarımdan yardım istemek geldi aklıma yardım ederseniz çok sevinecek

aslında uzaktan kumadalı olmasını istemiştim başta ama çok zor olduğundan normalini yapamadım uzaktan kumandalı çok zor olur diyerekten sizlere sığındım

şimdiden teşekkür ederim

ete

Yazdığın programa bakınca bu işte epeyce acemi olduğun anlaşılıyor. Program da, sanki yazılmamış sağdan soldan toplanmış gibi. 3 aydır araştırma yapan kişi en azından kullandığı işlemcinin özelliklerini öğrenirdi. Öğrendiklerinide programa yansıtman beklenirdi ama yapmamışsın. Çünki ne yaptığından haberin yok henüz. Biraz daha çalışman gerekiyor.
Alt yapını sağlamlaştırmadan hemen zor programlar peşinde koşmaman gerekir. Bu iş adım adım ilerleyerek gelişir. Tamam sana bir RGB sistemi lazım ama madem kendin yapacaksın birşeyler öğrenipde yapmaya çalışsan daha iyi olacak.
Programın bana göre alaksız şeylerle dolu. Bu nedenle sana detay anlatmaya bile elim gitmiyor. Anlamayacaksın çünkü.
Şayet istediğini verebilecek birisi var ise yardımcı olur. Yoksa ben olamayacağım.

Ete

kemald78

yok kardeş sen beni yanlış anladın galiba ben hazır istemedim programı öğrenmek istiyorum ve güzel yazmışsın işlemcinin özellikleri diye sağol yardımın için ben bizar daha çalışıp öğle senden yardım isteyeyim sağol

ete

Ben doğru anladım da sen yanlış anlatın sanırım. Madem bu düşüncedesin sana eksiklerinide hatırlatayım o zaman,
1. Kullandığın işlemcide dahili OSC frekansı kalibrasyon değeri program hafızası son adresi olan 3FFF adresine kayıt edilir. İşlemci programlanırken programnlayıcı bu değeri okur ve geriye kayıt eder. Aksi halde kalibrasyon değeri silinir ve işlemcin abuk subuk çalışır. Bunu yaptıracak komut;
DEFINE OSCCAL_1K 1  dir ve programın en başına eklenmesi gerekir.

Her programa onun hangi frekansta çalışacağı DEFINE OSC komutu ile verilmelidir. Aksi halde zamanlama komutları yanlış çalışır.
DEFINE OSC 4  şeklindeki komut sistemin 4 Mhz de çalıştığını gösterir.

Her programda kullanılan işlemcinin pinlerinin hangileri giriş pini hangileri çıkış pini belirlenmesi gerekir. Bunu TRIS registerleri yapar.  Bak bakalım senin programında bir tane bile tanımlama varmıdır. Yok tabiiki. Üstelik kullandığın işlemcide port adı GPIO olarak geçer PORTA değildir. Bu nedenle programına ,
TRISIO=%00000000 şeklinde tanımlama eklemen gerekirdi. Burada Giriş pinleri için "1" çıkış pinleri için "0" kullanman gerekir.

Kullandığın işlemcininbazı pinleri default olarak analog çalışır. Bu pinleri digital kullanacak isen analog işlemini iptal etmen gerekirdi. Üstelik senin işlemcinde 2 tane analog işlem var birisi analog komparatör diğeri ise analog voltaj okuma.
Analog komparatörleri CMCON=7 komutu ile iptal etmen gerekirdi.
Analog voltaj okuma işlemini ise  ANSEL=0 diyerek iptal etmen gerekirdi.

Her programın bir açılış gecikmesi olması gerekir. Hiç bir işlemci registerlerini yerine yerleştirmeden programı çalıştırmaya geçemez. geçerse saçmalar. Bu nedenle programın çalışmaya başlamasından evvel en azından 250-500 ms lik bir açılış gecikmesi verilmesi uygun olur. Sende buda yok.  Pause 250 şeklinde programa eklemen gerekiyor.

Buraya kadar olanlar eksiklerin idi. Şİmdi yanlışlarına geçelim.

PORTA=%111  : CALL TUSOKU   şeklinde yazılmış bir satır ne işe yarar?. Bir defa port adı PORTA değil GPIO olacak idi bu yanlışı belirtmiş idim. Sonra, tuş bağlamış olduğun pinlere atama yapıyorsun. Verdiğin PORTA=%111 komutu 3 adet tuş pinine 1 değerini yerleştirir. Halbuki senin orada tuşların bağlı. Ne yapmak istedin acaba anlamış değilim. Tamamen yanlış bir uygulama bence.

CALL komutu Asm de kullanılan bir komutdur. Basic karşılığı GOSUB olmalıdır.
RESUME komutu ise kesmeden çıkılırken kullanılan bir komut olup programın kesmeden çıktıktan sonra kesme oluşmadan önceki geldiği yere dönmesini sağlar. Senin RESUME yerine kullanman gereken komutun RETURN olmalı idi.

İlginç bir hata da burada var;
For i = 0 To SON
    POT PORTA.4,200,HIZ
    SON = HIZ + 10
    If tus1 = 1 Then arttir
    If tus2 = 1 Then azalt
    If tus3 = 1 Then program
Next i
komutlarında sıfırdan SON isimli değişken değerine kadar bir döngü kuruyorsun. Ama döngü içinde SON değerini değştiriyorsun. Peki döngü neye göre çalışacak?. İlk başlangıçta SON=0 olduğu için senin döngü sıfırdan sıfıra olarak kurulur.
Programda nalamsız ve amaçsız bir şekilde POT komutu kullanılmış. Ne işe yarıyor belli değil. PortA.4 pini (GPIO.4 olsa gerek) okunuyor bu komut ile. POT komutu bir kondansatörle şaselenmiş bir pine bağlı direnç değerini okumada kullanılır ve kondansatör önce şarj edilir ardından boşalma süresi zaman tutularak ölçüm yapılır. Burada senin PORTA.4 diye isimlendirdiğin pinde zaten senin çıkış pinin olduğu için pot komutu orada çalışmayacaktır. Peki amacı nedir o da belli değil. Kafadan atma rastgele koyulmuş bir komut olarak görüyorum.
Zaten döngü kurulum mantığıda tamamen atmasyon olmuş .

EN önemlisi programda RGB mantığının eseri yok. RGB denilen sistemde 3 ayrı renkteki ledlerin herbirinin değişken PWM değeri mantığı ile sürülmesi işlemidir. Nerede PWM tekniği eseri bile yok. Peki nedir bu program ne işe yarar oda belli değil.

Bir işlemcide donanımsal PWM modülü yok ise (bu işlemcide yok) o zaman kesme veya dah abaşka yöntemlerle senin en azından 3 pin için değişken pwm sistemini oluşturman gerekir idi. Burada basit bir mantık açıklayayım.
Diyelimki ledlere 500 Hzlik bir sinyal uygulayacaksın. Frekansı 500 hz olan bir kare dalganın peryodu (yükselen kenardan bir sonraki yükselen kenara kadr olan zaman) T=1000/500 = 2 ms olacaktır. 2 ms lik sürey, mikro saniye cinsinden düşünürsen 2000 us eder. O halde duty değeri %100 olduğu zaman süre 2000us oluyor ise %1 lik duty değerine 2000/100=20 us gibi bir zaman dilimi düşer. Bu şu demektir. Eğer sen her 20 us de bir kesme oluşturur isen istediğin PWM sinyal veya sinyallerini elde edebilirsin demektir. Şöyleki.
Diyelimki RED ledine %50 , GREEN ledine %70 ve BLUE ledine ise %80 duty değeri yükleyeceksin.
RED=%50 yani 50 kesme HIGH olacak 50 Kesme LOW olacakdır bu çıkış.
GREEN=%70 yani 70 kesme HIGH ve (100-70=30) 30 kesme LOW olacaktır bu çıkış.
BLUE=%80 yani 80 kesme HIGH ve 20 kesme Low olacaktır bu çıkış.

Kesme kısmında karşılaştırmalarını yapacaksın. Mesela RED için yapalım, Ancak işi kolaylaştırmak için her bir ledin bir HIGH süresi Red_H ve LOW süresi RED_L gibi değişkenlerin olsun.
Red_H=70
Red_L=100-70=30
Kesme oluştu
IF REDçıkışı=1 ise yani high da ise High süresinden düşme yapacaksın.
Red_H=Red_H-1
if Red-H=0 then  Konum değiştireceksin Yani çıkış High dan LOW a dönecektir.
If Red=0 then çıkış LOW da ise
Bu seferde Red_L=Red_L-1
If Red_L=0 then Konum değiştir
Şeklinde bu işi yapacaksın.
Konu çok uzadı ama umarım neler demek istediğimi anlamışsındır.

Ete


Powered by EzPortal