R

uçan nesne simülasyonu

Başlatan Reytabu, 30 Temmuz 2012, 12:24:12

Reytabu

Ete hocam

üç değişik yöne uçan ve ses komutuyla hareket eden bir nesnenin
simülasyonunu led ışıklarıyla yapmak istiyorum.
Şöyle ki:
3 yön için ortalama 50'şer led kullanacağım.
Program çalışınca her ses komutunda belli bir sırayı takip etmeden rasgele 10 defa 1. yön 5 defa 2. yön 10 defa 3 yön 2 şer led yanarak   yürüyecek Yani 25 ses komutu ve 25 üç yöne yürüyen ledlerden sonra program bitecek.
Böyle bir devreyi hangi PIC veya entegreleri kullanarak nasıl yapabilirim.


Saygılarımla


ete

Bu sorunun iki yanıtı olmalı yada karşılık olarak ben bir soru sormalıyım ve bu sorunun yanıtına göre cevap vermeliyim.
Böyle bir sistemi yaptınmı yani ledleri nasıl sürmeyi düşündün yada düşünüyorsun. Sorunun cevabı tamamen devre şemasına bağlı.
Yok zaten devreyi nasıl tasarlarım diye soruyorsan direk olarak her bir yönü 74HC595 ler ile yapmanı öneririm.
6 adet 595 toplamda 48 adet ledi sürebilir. 50 yerine 48 led olurmu bilmem ama 7 adet kullanırsan 56 adet led sürersin yada bir kısmını boş bırakarak 50 adet sürersin.
Ledleri iki şerli yürütmek için başlangıçta her bir yön hattına 3 rakamını verip sonra her yürütme sırası geldiğinde bir clk plasi verirsen 2 şerli ledler hattın sonuna kadar yürür. Bu cevap galiba hem donanım hemde yazılım sorusunu cevaplayacak neteliktedir.

Ete

Reytabu

Hocam

projem için tavsiyeniz üzerine 74HC595 kullanacağım.
Denemek için isiste 2 adet 74HC595 yi port çoğullama
örneğiniz üzerine seri bağladım. Fakat aşağıdaki komutları uyguladığımda
her iki  74HC595 ye bağlı ledler ayrı ayrı yürüyor. Yardım lütfen


PORTA=0

TRISA=%00000000  'A portu tamamı çıkış yapıldı.
'-----------------------------------------------------------------

'-----------------------------------------------------------------
CMCON=7
symbol CLK=PortA.0
SYMBOL DTA=PORTA.1
SYMBOL AKTAR=PORTA.2
BILGI  VAR  WORD

bILGI=1
'-----------------------------------------------------------------

BASLA:  IF BILGI=256 THEN BILGI=1
        SHIFTOUT DTA,CLK,1,[BILGI]
        HIGH AKTAR
        PAUSE 50
        LOW AKTAR 'BILGI ÇIKIŞA AKTARILDI
       
        BILGI=BILGI*2
       
        PAUSE 50
        GOTO BASLA

greatgonzo

Mantığı basit olmasına ve ETE hoca takribi bir word (65535) defa anlatmasına rağmen bende çözemedim. İlginç biçimde ikisi eş olarak işlem yapıyor. Bir ara benzer bir uygulamada başarılı olmuş farklı animasyonlar yapmıstım fakat unutmuşum :-(  SHIFTOUT DTA,CLK,1,[BILGI/16] gibi bir uygulaması vardı. Yani bilgi değişkenini 16 bit olarak yolluyordu. Oda iş görmedi. Çalışan kod ise şu;

CMCON=7
symbol CLK=PortA.0
SYMBOL DTA=PORTA.1
SYMBOL AKTAR=PORTA.2
BILGI  VAR  WORD
I VAR BYTE

bILGI=1
'-----------------------------------------------------------------

BASLA:  FOR I=0 TO 16 STEP 1
        SHIFTOUT DTA,CLK,1,[BILGI.BYTE1,BILGI.BYTE0]
        HIGH AKTAR
        PAUSE 50
        LOW AKTAR 'BILGI ÇIKIŞA AKTARILDI
        PAUSE 100
        BILGI=BILGI*2
        NEXT I
        BILGI=1
        GOTO BASLA
END

Çareyi [BILGI.BYTE1,BILGI.BYTE0] şeklinde düşük ve yüksek baytları ayırmakta buldum. Bu şekilde çalışıyor ama 8 den fazla led kullanacaksan eğer daha farklı döngülere ihtiyaç duyabilirsin. Basic word yani 16 bitten fazla değişkeni desteklemez ve zorlarsan belki 32 biti ama sadece tek kullanımlık. Yani yanlış hatırlamıyorsam 32 bir sonuç oluştuktan 1 satır sonra kullanabiliyordun.

Yada faklı bir bakış açısı olarak mesela BILGI VAR BYTE[3] deyip 4 byte bilgi oluşturacan. Bu sıra değişkeni BILGI[0] dan itibaren 1 den 255 saydıracaksın , 255 olunca 0 layıp BILGI[1] i 1 yapacak ve işlemi tekrar edeceksin. Her oluşturduğun değeride registere aynı sıra ile yukleyeceksin. Bu mantıkla kaç register bağlayabiliyorsan hepsini sürersin.



Reytabu

Muhteşem GONZO kardeşim

Verdiğin döngülü kodlarla 2 register çalışıyor fakat dediğin gibi 3 ve fazlası çalışmıyor.

Son paragrafında bahsettiğin 4 byte bilgi oluşturma tavsiyeni bir türlü beceremedim.
Değişik denemeler de yaptım. (aşağıdaki gibi) Sonuç maalesef. Ete hoca 2. registeri dersinde ödev olarak bırakmış
ödevden kırık aldım maalesef :((  Bu iş bu kadar zor olmasa gerek. Denediğim kod ve bağlantı(ekte) şöyle .

PORTA=0

TRISA=%00000000  'A portu tamamı çıkış yapıldı.

CMCON=7
symbol CLK=PortA.0
SYMBOL DTA=PORTA.1
SYMBOL AKTAR=PORTA.2
symbol AKTAR2=PORTA.3
BILGI  VAR  WORD

PORTA=0:bILGI=1
'-----------------------------------------------------------------

BASLA:  IF BILGI=256 THEN GOTO IKI
        SHIFTOUT DTA,CLK,1,[BILGI]
        HIGH AKTAR:PAUSE 5 :LOW AKTAR
       
       
        BILGI=BILGI*2
       
        PAUSE 500
        GOTO BASLA
IKI:
BILGI=0
IF BIlGI=256 THEN GOTO SON
        SHIFTOUT DTA,CLK,1,[BILGI]
        HIGH AKTAR2:PAUSE 5 :LOW AKTAR2
       
       
        BIlGI=BIlGI*2
       
        PAUSE 500
        GOTO IKI
        SON:
        END     

greatgonzo

Al bendende o kadar :-)  Sorundan sorun türetmiş gibi olmak istemem ama bende 5 register için bir şeyler karaladım ama oda çalışmıyor. İstersen onun mantığına bir bak. Hatamı ben göremedim.

symbol CLK=PortA.0
SYMBOL DTA=PORTA.1
SYMBOL AKTAR=PORTA.2
BILGI  VAR  byte[4]
SAY VAR BYTE


D VAR BYTE
D=0
bILGI[D]=1
'-----------------------------------------------------------------

BASLA: 
       
        SHIFTOUT DTA,CLK,1,[BILGI[0],BILGI[1],BILGI[2],BILGI[3],BILGI[4]]
        HIGH AKTAR
        PAUSE 50
        LOW AKTAR 'BILGI ÇIKIŞA AKTARILDI
        PAUSE 1000
        BILGI[D]=BILGI[D]*2
        SAY=SAY+1
             
              SELECT CASE SAY
             
              CASE 9  :BILGI[D]=0:D=1:BILGI[D]=1:GOTO BASLA
              CASE 17 :BILGI[D]=0:D=2:BILGI[D]=1:GOTO BASLA
              CASE 25 :BILGI[D]=0:D=3:BILGI[D]=1:GOTO BASLA
              CASE 33 :SAY=0:BILGI[D]=0:D=0:BILGI[D]=1:GOTO BASLA
              END SELECT
              GOTO BASLA
END

greatgonzo

Bi'de çalışmayanlardan bu var :-)

symbol CLK=PortA.0
SYMBOL DTA=PORTA.1
SYMBOL AKTAR=PORTA.2
BILGI  VAR  byte[5]
SAY VAR BYTE


D VAR BYTE
D=0
bILGI[D]=1
BASLA: 
        SHIFTOUT DTA,CLK,1,[BILGI[0],BILGI[1],BILGI[2],BILGI[3],BILGI[4]]
        HIGH AKTAR
        PAUSE 50
        LOW AKTAR 'BILGI ÇIKIŞA AKTARILDI
        PAUSE 100
        BILGI[D]=BILGI[D]*2
        IF BILGI[D]>255 THEN
        BILGI[D]=0:D=D+1:BILGI[D]=1
            IF D=5 THEN
            D=0:BILGI[D]=1
            ENDIF
        ENDIF
GOTO BASLA
END

ete

Önce ortaya bir şema koyun ki en azından bağlantınız doğrumu onu anlayalım.
İkincisi ben olsam her bir yön'ü bağımsız yönetirdim. Bu durumda her yön için tek bir register (değişken) kullanmanız yeterli olur. Hatta hiç register bile kullanmaya bile gerek yok.

Aşağıdaki linkte verdiğim dosyaları inceleyin. FLY ismi ile verdiğim sistem registersiz direk puls ile çalışmaktadır.
Ama illaki registerle çalışmak isterseniz bu seferde FLY_REG isimli sistemi inceleyin.
Tabiiki registerli sistem ileri geri kaydırmaya imkan tanır. Ben yalnızca ileri kısmını yaptım. Benzer mantıkla bir sürü if satırı ilave ederek sistem geri doğruda çalıştırılabilir elbette.
İki şema arasında tek fark birinde kilit bacağı clk ile birleşmiş vaziyette diğerinde ise kilit bacağı bağımszı çalışmaktadır.

Anlaşılmayan bir yer olursa sorarsınız.

Ete

https://dl.dropbox.com/u/25364674/FLY.rar

Reytabu

Ete hocam

Çok teşekkür ederim. Eline aklına sağlık.
Registersiz sistem de daha kolay ve işimi görecek.
Siz bu işte bir dahisiniz. 


Reytabu

Hocam projemde  ses(mikrofon)  ile pic'in herhangi bir portunu
high yapmak için ekteki araştırmadaki 4 ve 5. bölümdeki  devreleri buldum.
Bu devreler picin bir portunu high yapmak için uygun mu?
Başka bir devre öneriniz var mı?

Reytabu


ete

Biraz dersleri okusan ihtiyacın olan şeyin devre değil bilgi olduğunu anlarsın.
Ôğrenmen gereken bilgi de şu,
Bir işlemcide herhangi bir port pinini high yada low yapabilmek icin önce o pini çıkış olarak ayarlamak gerekir. Bunun icin ilgili port icin belirlenmis TRIS yani yön registerinde pine karsılık gelen bit sıfır yapılır. Biti bir yaparsa o pin giris pini olur.
Bu asamadan sonra artık pin kontrolü senin elindedir. Örnekle devam edlim.
Diyelimki PortD.3 pinini çıkış yapıp hemen high yapacağız.
Once pini çıkış yapıyoruz.    TrisD=%00000000.     'bu komutla butun pinler cıkıs oldu
Sonra ilgili pini high yapıyoruz.  PortD.3=1.   Veya şöylede yapılabilir.  High portD.3

Hepsi bu kadar.
Ete

Reytabu

Hocam

İlk mesajımda bahsettiğim için sorumda konuyu tam ifade etmemiştim.
Port giriş- çıkış, pin  high-low komutları bu işin alfabesi onları öğrendim tabii ki.

Sorum şu idi:
Pic'in herhangi bir pinini mikrofondan gelen bir ses ile high yapmak istiyorum.
Yani ses komutu ile ledleri  yürütmek için bir devreye ihtiyacım var.

ete

Bildiğim bir devre yok. Böyle devrelerle uğraşmayı bırakalı neredeyse 20 sene oldu. Bu nedenle ya bilen varsa fikir versin yada sen interneti iyice araştır.
Ete

mg1980

Sayın Reytabu,
Yanlış anlamadıysam ses algılanınca Pic'e komuta etmek istiyorsunuz. Bunun için değişik devreler olabilir ama ben biraz uğraşmıştım.Hassasiyeti yüksek bir devre.Şu anda ANKARA'dan uzakta-yım.15 gün sonra vereceğiniz faksa gönderebilirim.Kolay gelsin.

Powered by EzPortal