Sd kart pic16f628a ile ssd1289 da fotograf basma

Başlatan homer380, 20 Temmuz 2013, 17:13:04

homer380

74hc595 ile komut ve veri gönderimi için

komut_gonder:
yuksek_deger=komut.highbyte
dusuk_deger=komut.lowbyte
cs=0      'komut yazma 
rs=0 
shiftout portb.5,portb.6,1,[dusuk_deger,yuksek_deger] 'data pini, clock pini 74hc595 için
high portb.7
low portb.7          '74hc595 veriyi tetiklemek için
wr=0
wr=1:cs=1
return




ben 74hc595 kullandığım için 16 bit veriyi 2'ye böldüm.

74hc595 ile veri gönderimi için

veri_gonder:
yuksek_deger=veri.highbyte
dusuk_deger=veri.lowbyte
cs=0      
rs=1             'veri yazma
shiftout portb.5,portb.6,1,[dusuk_deger,yuksek_deger] 'data pini, clock pini
high portb.7
low portb.7        '74hc595 tetiklemek için
wr=0
wr=1:cs=1
return



74hc595 kullanmadan komut ve veri gönderimi
komut_gonder:

cs=0      'komut yazma 
rs=0
 
'bu kısma data bacaklarına gidecek komut örnek : porta=komut.highbyte, portb=komut.lowbyte şeklinde olabilir

wr=0
wr=1:cs=1
return


veri göndermek için tek fark ise rs=1 çekmektir.



veri_gonder:

cs=0     
rs=1         'veri yazma 
 
'bu kısma data bacaklarına gidecek komut örnek : porta=veri.highbyte, portb=veri.lowbyte şeklinde olabilir

wr=0
wr=1:cs=1
return


mustafa_cmbz



Merhabalar..

veri_gonder:

cs=0     
rs=1         'veri yazma 
 
'bu kısma data bacaklarına gidecek komut örnek : porta=veri.highbyte, portb=veri.lowbyte şeklinde olabilir

wr=0
wr=1:cs=1
return


Hocam şunu merak ediyorum..

Mesela ekran tft renkli olduğu için atıyorum ekrana kırmızı renkle "ISI:" yazıp normal lcd lerdeki gibi karşısına 18b20 den okuduğum değeri nasıl yazarım?

bu tarz bir uygulama için nasıl bir yöntem uygulamak gerekiyor bu tarz lcdler de ?


yani illa veri.low byte veri hıgh byte demek mi gerekiyor direkt veri desek ekranın ilgili kordinatlarına nasıl yazabiliriz?

homer380

adreslemeyi de anlattıktan sonra harf basmaya da gelecem biraz sabır.
renkli yazmak için adres bilgisi tft'ye gönderilir. sonra hangi renk isteniyorsa veri_gonder'e bir kez gönderilirse o pikselin rengi değişir. adres otomatik olarak bir artar.

harf basmaya resimle anlatmaya çalışayım. adresleme bizim için önemli onuda bugün gönderecem.


windows automatic screenshot

frederic

Soruları derslerden sonra sormak daha mantıklı bence, bu şekilde konsantre dağılmamış olur.

homer380

#19
sıra geldi tft resim yada resim basma glcd ile aynı mantığa sahip tek fark renk seçimi

eğer biz adres belirtmessek x ve y başlangıç adresini sıfır alır ve her piksel basma da adresi kendisi otomatik bir artırır. tft ekranda x1, x2, y1 ve y2 şeklinde iki tane adres yerleri belirtilir yani x1:başlagıç, x2:bitiş adresidir.y içinde aynısı geçerlidir. satırdaki tarama bitince bir alt sutuna geçer.
resimle umarım daha iyi anlaşılır.


  istenen adrese veri basmak için şu komut satırları kullanılır.

adresleme:
 x2=x1+a:y2=y1+b                                   'burdaki a ve b yatay ve dikeyde ne kadar ilerleme olacağını söylüyor.
        komut=$0044:gosub komut_gonder       'x adresi
        veri=(x2<<8)+x1: gosub veri_yazma
        
        komut=$0045:gosub komut_gonder       'y adresi 
       veri=y1: gosub veri_yazma
       
       komut=$0046:gosub komut_gonder       'y2 adresi 
       veri=y2: gosub veri_yazma
'############################################################################### 
       komut=$004e:gosub komut_gonder       'x1 baslama  adresi 
       veri=x1: gosub veri_yazma
       
       komut=$004f:gosub komut_gonder       'y1 baslama adresi 
       veri=y1: gosub veri_yazma
       
       komut=$0022:gosub komut_gonder       'yazma yapacağımızı bildiriyoz 
return


bir üstteki "H" harfi için adres belirtmezsek yatay da tüm satırları basar(istenmeyen bir durum.yatayda 320 piksel var adresleme yapmazsak 16*16 yatayda basar).harfi basmak için adresleme şart;
x1=120 x2=x1+16 (16x16 olduğu için harf genişliği kadar)
y1=100 y2=y1+16 olsun.    (harf için adresleme yaptık)
burda x:120 başlar 136 (y 100 dür) kadar devam eder böylece ilk satır basılır(veri_gondere renk kodu gönderdiğimizi varsayıyorum). tekrar adreslemeye gerek kalmaz. çünkü "y" otomatik olarak bir artar ve 100 olan "y" 101 olur yani bir alt piksele geçer.

y =101 olunca x=120 dir ve harfin ikinci satırı basılmaya hazırdır. yukardaki "H" karakteri için işlem basamakları anlatılmış kodu ise şöyle yaptım ben

harf:
for i= 0 to 1
        lookup al,[  $00,$00,$00,$00,$1C,$70,$1C,$70,$1C,$70,$1C,$70,$1C,$70,$1F,$F0,$1F,$F0,$1C,$70,$1C,$70,$1C,$70,$1C,$70,$1C,$70,$00,$00,$00,$00],yuksek_deger  
        
        
            if i=1 then
            deger=deger+yuksek_deger
            else
            deger=yuksek_deger<<8
            endif

if al >= 32 then al =0
al=al+1

return

'lookup tablosunda 16 bit olmadığından bu şekilde yaptım . her iki byte birleştirilip harfin ilk satırı elde ediliyor


'*******************************************
for i=0 to 15
gosub harf	     'harfin ilk satırını almaya git
for j=0 to 15    'satır basmak için 
          
    if deger>>i//2=0  then		''bit değerinin 1 mi 0 mı olduğunu anlamak için
    veri=$ffff:gosub veri_yazma		'0 ise beyaz
    else
    veri=$0000:gosub veri_yazma 	'1 ise siyah renk
    endif
next 

next 
        
 

temel mantık bu harf basma ile resim basma aynı mantık sadece renk olayı işin içine fazla giriyor.

harf basımı içini birde video ekleyim

[url=http://youtu.be/PaC9T1dayp0]http://youtu.be/PaC9T1dayp0[/url]

safaka123

kendi dosyalama sistemimi oluşturmak aklımdan bile geçmez zira çok gizli bir şey yapmayacağım ama sd karttan okumak için neler yapmam lazım. FAT 32  çok yabancı değil ama sd card haberleşmesi nasıl olacak onu anlayamadım. Sanırım konunun bitmesine yakın okuma konusu da işlenir o zaman bir şeyler bulurum. Okuma yapıp dosya isimlerine ve başlangıç adreslerine ulaşabilsem bunları seçmek o zaman kolay fakat tabiki bilgiyi istenen başlangıç adresinden kayıt sonuna kadar okuyup bittiğini anlamak önemli. Konuyu takip etmeye devam ediyorum.

homer380

resim basma ve harf basma dan sonra sıra geldi dokunmatik kısma. bu kısımda spi  haberleşme işin içine giriyor. bu kısımda kolay.dikkat edilmesi gereken yer dokunmatik ekrandan gelen veriler ham veriler bunu anlamlı hale dönüştürme önemli o kısmı daha önce bunla ilgili örnek vardı formda bende aynısını yaptım.  dokunmatikte XPT2046 (ads7843) entegresi kullanılmaş. pin dağılımını kırmızı renkle işaretledim.


green shot screen capture

Tp_irq  ===> ekrana dokunulursa lojik "0" seviyesine çekilir.(haberleşmeye başlama anlamına geliyor.)
Tp_cs  ===>  chip secimi
tp_sck===> saat darbeleri
tp_is  ===> veri girişi
tp_os ===> veri çıkışı

if tp_irq=0 then         'istenirse bu kısım cıkarılabilir ve sürekli okuma yapılır.
for dongu=0 to 2
  if dongu=1 then   t_komut=$00D4      'x cevirisi için gerekli komut
  if dongu=2 then   t_komut=$0094      'y cevirisi için gerekli komut
                                                   
                pauseus 2
                d_in=1
                clk=0
                t_cs=0                                  'ads7843 aktif hale getirdik           
        shiftout  d_out,clk,5,[t_komut]     'clk düşen kenarda( x mi y mi cevrimi komutla haber veriyoruz.)
        pauseus 3                                    'cevrim için bir süre bekleniyor.
        shiftin d_in,clk,0,[al_dusuk\12]    '12 bit veriyi alıyoruz
        t_cs=1
        if t_komut=$00D4  then  gosub hesapla 
        if  t_komut=$0094 then gosub hesapla       

        pauseus 1
 next 
endif 


okunan ham veriyi ben şu şekilde işledim.



hesapLA:                        'touch gelen x ve y leri anlamlı hale getirmek için
if t_komut=$00D4then 
x1=al_dusuk-108                 'burdaki 108 touch okunan en küçük değer
x1=x1**1000                     'touch en büyük x ile en küçük x arasındaki farkın 240 bölümünden
x1=div32 7675                   '7,675 gibi bir değer cıkıyor. x1'i 1000 ile carpar 7,675 bölersek
PAUSE 1                         'x1 değerini 7,675 bölmüş oluyoruz.
endif

if t_komut=$0094 then 
y1=al_dusuk-94
y1=y1**1000
y1=div32 5575
PAUSE 1
endif

return                          'algilaya geri dönüş var.



free pic


homer380

son olarakta sd kart okuma nasıl oluyor ondan bahsedelim. burda dikkat etmemiz gereken bir kaç nokta var. Bunlardan birincisi kartınızın SD olması, çünkü bazı kartlar SDHC olabiliyor(4 gb ve yukarısı) bunların komut dizilimi farklı. İkinci olarak zamanlama sd kartlar 100 - 400 kilohertz(yanlış hatırlamıyorsam) hızında haberleşiyorlar. Ben picbasic de SHIFTOUT ve SHIFTIN komutlarıyla kartı hazırladım ve okudum.( Pic16f628a ya 20 mhz kristal bağlı)
INCLUDE "modedefs.bas"  
 DEFINE SHIFT_PAUSEUS 5


kart ile haberleşme hızını ayarlamak için  "DEFINE SHIFT_PAUSEUS 5" komutunu kullandım. 100 kilohertz 10 mikro saniyeye denk geliyor.

20 mhz de pauseus komutunun gecikme süresi



(sd kart uygulaması için http://yadi.sk/d/wUNZKSAO7IzXh bu word belgesinden yararlandım.kesinlikle okuyun. site ismi yada hazırlayan aklıma gelmediği için tekrar yükledim.)
cmd0 komutu

for i=0 to 9 
shiftout sd_d_out,sd_clk,5,[$ff]
next
sd_cs=0
repeat
shiftout sd_d_out,sd_clk,5,[$40,$00,$00,$00,$00,$95,$FF]
shiftin sd_d_in,sd_clk,0,[okunan]
until okunan=1

10 kez sd_d_in pinine $ff verisi gönderiyoz. istenirse daha fazla gönderilebilir.

daha sonra cmd0 komutu gönderiliyor sd karttan cevap olarak bir gelmesi gerekiyor.  "1" dışında gelen komut hata anlamına gelir.
ikinci olarakda cmd1 komutu gönderilir bu sefer gelen cevap sıfır olmalıdır.

cmd1 komutu
repeat 
shiftout sd_d_out,sd_clk,5,[$ff,$41,$00,$00,$00,$00,$ff,$ff]
shiftin sd_d_in,sd_clk,0,[okunan]
until okunan=0


cevap "0" ise kart hazırdır.

bu kısımdan sonra kart okunmaya hazırdır.(okuma fat12/16/32 dosya sistemi olmadan olacak. siz dosyanın adresini winhex ile öğrenip okuma yapmalısınız.)

karta komut yada veri gönderirken cs bacağını "0" çekmek gerekli komut yada veri gönderildikten sonra cs=1 olur.


cs=0
shiftout sd_d_out,sd_clk,5,[$ff,$50,$00,$00,$00,$02,$ff,$ff,$ff]    'cmd16 ile kaç byte veri okunacak o belirtilir. ben 2 byte okuma yaptım.
                                                                                                         'eğer cmd16 belirtilmezse 512 byte veri okur. size kalmış bu kısım
cs=1




veri okuma ise

sd_cs=0
          
            repeat 
            shiftout sd_d_out,sd_clk,5,[$ff,$51,adres1[0],adres1[1],adres1[2],adres1[3],$ff,$ff,$ff]             'adresleme bilgisi gönderiliyor.
            shiftin sd_d_in,sd_clk,0,[okunan]
            
            until okunan=0
             
            
            repeat    
            shiftin sd_d_in,sd_clk,0,[okunan]
            until okunan =$fe                                    'okunan değer $fe ise kart ben veri gönderem  diyor
            
            for i=0 to 1
            shiftin sd_d_in,sd_clk,0,[okunan[i]]            'veri okuma kısmı ben 2 byte okuduğum içinn verileri okunan[0] ve okunan[1] yükledim.
                                                                               'istenirse döngü sayısı değiştirilebilir.
            next


kart okuma tamamdır. burdaki değişkenleri kendinize göre düzenleyebilirsiniz.
hepsi bu kadar umarım yararlı olur.

RaMu

#23
homer380 öncelikle tebrik ve teşekkür ediyorum,
çok güzel bir çalışma olmuş,
ve aydınlatıcı bilgiler paylaşman çok güzel.

Bende uzun zamandır sd kart ile uğraşıyorum,
programı asm ile yazdığım için çok uzun zaman aldı,
bende faydalandığım kaynakları yazayım dedim,
projem halen elle tutulur vaziyette olmadığı için henüz paylaşmadım,

sd kartla ilgili ilk anlamlı bilgileri elm chan dan öğrendim,
ayrıca sdassociations ve sd kartın elde edebildiğim tüm datasheet lerini kullandım, çok detaylı bir konu,
chan ın hazırladığı kütüphaneyi kullanan firmalar var,
http://elm-chan.org/docs/mmc/mmc_e.html
elm chan sd card - mmc card- fat gibi aramalarla daha fazla bilgi edinilebilir sanırım,
sonra Barış Samancının çalışmalarına denk geldim,
sd kart ve fat32 dosya sistemi ile ilgili güzel bilgiler var,
ayrıca örnek çalışmalarıda mevcut,
http://www.barissamanci.net/Makale/11/sd-kart-programlama-klavuzu/
http://www.barissamanci.net/Makale/2/her-yonuyle-fat32/

Birde Chan ın sd karta giriş işlemi için hazırladığı flowchartı paylaşayım,

http://elm-chan.org/docs/mmc/sdinit.png


Senin paylaştığın dökümanda hoşuma gitti,
sayende faydalanacak bir dökümanım daha oldu.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

homer380


homer380

yeni bir başlık açmayım dedim. ekrana görüntü basma işini daha kısa sürede(daha hızlı) nasıl yapabiliriz? şuan ellimde pic18f4550 var ama istediğim hıza yetişemedim(görüntü basmasını göz farketmeyecek.)
burdaki örnekteki gibi

PIC32 3D rotation with IMU input. Arduino compatible with QVGA LCD

donanımsal spi kullanmak ne kadar işe yarar? yardımlarınızı bekliyorum.

camby

Örnek gerçekten çok güzel.

Hocam TFT'de hız = MCU çalışma frekansı diyebiliriz kabaca. Gerisi detaylar.

Ekranın tüm piksellerini yenilemek için geçen süre önemli. Driver Datasheeti eğer detaylı ise hesaplanabilir.

MCU tarafında bu süreye ne kadar yaklaşabildiğimizi hesaplamak önemli.

C yada ASM harici bir dilde yazılıyorsa , yüksek seviyeli kodların arka planda oluşturduğu asm kodlar iyi incelenmeli. En küçük döngü içerisindeki fazladan 1-2 asm satırı bile toplam süreyi 1.5/2 katına çıkarabilir.


Donanımsal SPI aktarım hızını yavaşlatıyor , Örneğin R-G-B için tek cycle 'da toplamda 18bit aktarabilecek iken paralel olarak , SPI ile yaptığınızda aynı data 18 cycle'da gönderiyorsunuz. Pin sayısından avantaj fakat hızdan kayıp oluyor.

Videoyu yapan kişi de 16 bit arayüz kullanmış , saniyede 27 kare basıyor gibi duruyor. 37 ms içerisinde hesaplamaları + data göndermeyi halletmiş. Data göndermeyi de tahmini 7-8 ms 'de halletmiştir diye tahmin ediyorum.

Mucit23

İlk önce şunu söyliyeyim, Basicde Donanımsal spi ile Yazılımsal Spi arasında epeyce bir hız farkı var. Örnek verecek olursak 40Mhz de 16Byte datanın yazılımsal spi ile gönderilmesi 660uS sürerken donanımsal spi de 72uS sürüyor. Bu farka çok şaşırmıştım.

Sende ilk baştaki örneği donanımsal spi ile denersen faydasını görebilirsin.

Neyse asıl soruna dönersek,

Pic18 ile LCD spi kullanarak haberleştiriyorsan bu dediğin yani resim basılmasının farkedilmeyecek kadar hızlı olması çok zor hatta imkansız. Yüksek hız lazım. Bu yüzden paralel haberleşmen lazım. Videoda paralel habeştiği kablo yoğunluğuna bakılarak anlaşılabilir.

homer380

hocam bende parelel haberleşiyorum lcd ile . ben ilk önce sd karttan veri okuyorum oda en fazla 512 byte bir seferde .sanırım sd kartta veri okumak vakit alıyor o yüzden donımsal spi düşünüyorum. sadece donımsal spi hızı yeterince artırmayak. pic18f4550 en fazla 48 mhz çalışıyor.  Benim aklıma gelen çözümler şunlar:

1 - sd kart haberleşmesi sd card bus protokolu (kart ile 4 bit parelel haberleşme)
2 - daha yüksek hızlarda çalışan mcu

bunların dışında neler olabilir.

SERRO EFE

Sadece işlemci hızı değil. FSMC yada benzeri lcd çalıştırabilecek arabirimleri olan işlemciler ile çalışman lazım.

https://www.youtube.com/watch?v=wyuJ-dqS2to
https://www.youtube.com/watch?v=7TZ0zIe6WRo