Sd kart pic16f628a ile ssd1289 da fotograf basma

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

homer380

Aslında konuyu daha önce acacaktım ama sd kart biraz uğraştırdı. Daha doğrusu ben 4gb sdhc ile uğraşıyodum. Onun komut dizilimi farklı imiş.(pat cat ingilizcem ve google translate ile anladığım kadarıyla.) Daha sonra 2gb SD kartta geçince rahatladım.yeterli hızlı olmadığım için yaklaşık 2 dakikada bir fotograf basabiliyom.  Neyse fazla yazmayım.
Youtube görüntüsü:
http://youtu.be/mL80vNwGEGE

buda kodlar:
Açıklamalarda eksik olabilir.

@ DEVICE pic16f628A                      'i?lemci 16F628                                
@ DEVICE pic16f628A, WDT_ON              'Watch Dog Timer aç?k
@ DEVICE pic16f628A, PWRT_ON             'Power on Timer aç?k
@ DEVICE pic16f628A, PROTECT_OFF         'Kod Protek kapal?
@ DEVICE pic16f628A, MCLR_ON             'MCLR pini kullan?l?yor. on kullanılıyor.OFF kullanılmaz.
@ DEVICE pic16f628A, HS_OSC              'Dahili osilatör kullan?lacak 
@ DEVICE pic16f628A, BOD_OFF
'---------------------------------------------------------------------------------------------------------------
CMCON=7    '16F628 de komparatör pinleri iptal hepsi giri? ç?k??
define osc 20
'---------------------------------------------------------------------------------------------------------------
trisb=%00000000         'irq 5. pine bağlı 
trisa=%00001010         'porta.1 den veri giriişi olacak
'###############################################################################
INCLUDE "modedefs.bas"  
 DEFINE SHIFT_PAUSEUS 5

'tft pin ayarları
symbol wr=portb.0
symbol rd=portb.1
symbol cs=portb.2               'cs=0 ise veri, cs=1 ise komut
symbol rs=portb.3
symbol reset=portb.4
'sd kart pin ayarları
symbol sd_cs= portb.5
symbol sd_clk=portb.6
symbol sd_d_in=porta.1             'spi data girisi
symbol sd_d_out= porta.3
'*******************************************************************************
'74hc595 pin ayarları 
symbol clk=portb.7
symbol d_out=porta.0            'spi data cıkısı
symbol ap=porta.2               '74hc595 enable(aktif-pasif) ucu aktif_pasif

'###############################################################################                
al_dusuk var word               ' spi gelen veriyi kaydetmek için ilk 8 bit
al_yuksek var word              ' spi gelen veriyi kaydetmek için ikinci 8 bit
t_komut var word                ' touch komutları
dongu var byte                  ' for next döngüsü için 
komut var word                  ' tft ekran komutları
veri var word                   ' tft ekrana veri göndermek için
yuksek_deger var byte           ' tft ekrana veri-komut göndermek için
dusuk_deger var byte            ' tft ekrana veri-komut göndermek için
okunan var byte[63]             'sd karttan gelen verileri okumak için 64 byte
okunan01 var byte[63]
okunan1 var word


arguman var word                'adreleme yaparken msb kısmı (32 bit)
arguman1 var word               'adreleme yaparken lsb kısmı (32 bit)
adres1 var byte[3]              'adreslemeleri byte larına ayırmak için (gerek yok ama ben yinede kullandım)

k var byte
i var byte                      ' for next döngüleri için 
j var word                      ' for next döngüleri için
sd_cs=1                 '
k=0
'******************sd kart kurulum kısmı****************************************   

sd_cs=1

cmd_0:

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
sd_cs=1:pause 50

GOTO CMD_1

cmd_1:
sd_cs=0
repeat 
shiftout sd_d_out,sd_clk,5,[$ff,$41,$00,$00,$00,$00,$ff,$ff]
shiftin sd_d_in,sd_clk,0,[okunan]
lcdout $fe,$c0,#okunan
until okunan=0

shiftout sd_d_out,sd_clk,5,[$ff,$50,$00,$00,$00,$40,$ff,$ff,$ff]    'cmd16 kaç byte veri okumak istendiği karta bildirilir.
                                                                    'ben 64 byte okuyacağım için bu kısımda bildiriyorum.
sd_cs=1:pause 1000                                                  'istenirse bu kısım başka yerdede bildirilebilir.

goto lcd_hazirla_1

'******************tft ekranı hazırlama***************************************** 
lcd_hazirla_1:   
rd = 1
reset = 1
pause 50
reset = 0
pause 50
reset = 1
pause 50
cs = 0
'################tft ekranı hazıralamak için gerekli komutlar###################        
    komut =$0007:gosub komut_gonder:pause 30
    veri=$0021:gosub veri_yazma:pause 30
'###############################################
    komut =$0000:gosub komut_gonder:pause 30
    veri=$0001:gosub veri_yazma:pause 30
'###############################################
    komut =$0007:gosub komut_gonder:pause 30
    veri=$0023:gosub veri_yazma:pause 30
'###############################################
    komut =$0010:gosub komut_gonder:pause 30
    veri=$0000:gosub veri_yazma:pause 30
    pause 50
'###############################################
    komut =$0007:gosub komut_gonder:pause 30
    veri=$0033:gosub veri_yazma:pause 30
'###############################################
    komut =$0011:gosub komut_gonder:pause 30 'tarama yöntemi soldan-sağdan-aşağıdan-yukarıdan
    veri=$6808:gosub veri_yazma:pause 30
'###############################################
    komut =$0002:gosub komut_gonder:pause 30
    veri=$1000:gosub veri_yazma:pause 30
'###############################################
    komut =$0001:gosub komut_gonder:pause 30
    veri=$2b3f:gosub veri_yazma:pause 30
'###############################################
    komut =$000b:gosub komut_gonder:pause 30
    veri=$5308:gosub veri_yazma:pause 30            
'###############################################
    komut =$0028:gosub komut_gonder:pause 30
    veri=$0006:gosub veri_yazma:pause 30
'###############################################
    komut =$0025:gosub komut_gonder:pause 30         'osilator hızı
    veri=$e000:gosub veri_yazma:pause 30               
'###############################################
    komut =$0022:gosub komut_gonder:pause 30        'tft ye yazma  yapılacağı bildiriliyor
cs=1                       
veri=2016             'renk kodu

goto ekrani_doldur
'*******************************************************************************
veri_yazma:
yuksek_deger=veri.highbyte
dusuk_deger=veri.lowbyte
cs=0      'veri yazma 
rs=1 
shiftout  d_out,clk,1,[dusuk_deger,yuksek_deger] 'data pini, clock pini
ap=1:ap=0:wr=0:wr=1:cs=1
return
'*******************************************************************************
komut_gonder:
yuksek_deger=komut.highbyte
dusuk_deger=komut.lowbyte
cs=0      'komut yazma 
rs=0 
shiftout d_out,clk,1,[dusuk_deger,yuksek_deger] 'data pini, clock pini
ap=1:ap=0:wr=0:cs=0:wr=1:cs=1
return
'*******************************************************************************
ekrani_doldur:
veri=$ffff:gosub veri_yazma 
cs=0
for j=0 to 319
    for i=0 to 239
     wr=0
     wr=1   
    next
next
cs=1:veri=$0000:gosub veri_yazma:pause 1500

arguman1=$0FC0              'adres kısmından okunacak byte kadarlık kısım cıkarılır.          
arguman=$0040
j=0

goto  oku
'$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$



'*******************************************************************************
'*******************************************************************************
'****************sd karttan veri okuma ve tft ekrana resim basma****************
oku:

        arguman1=arguman1+64            
        if arguman1=$0000 then          'adres kısmının lsb bölmü sıfırlanınca     
        arguman=arguman+1               'adres kısmının msb bölmü 1 artar.
        arguman1=$0000                  'arguman1 bir sıfır ama ben garanti olsun diye yazdım.
        endif
        
        adres1[0]=arguman.highbyte:adres1[1]=arguman.lowbyte
        adres1[2]=arguman1.highbyte:adres1[3]=arguman1.lowbyte
        sd_cs=0
        
        
           
        repeat                     'adresleme bilgileri karta gönderilir. 
        shiftout sd_d_out,sd_clk,5,[$ff,$51,adres1[0],adres1[1],adres1[2],adres1[3],$ff,$ff,$ff]
        shiftin sd_d_in,sd_clk,0,[okunan]
        until okunan=0             'kart hazır ise "0" gönderir onun dışındakiler hata demek.
        
        repeat         
        shiftin sd_d_in,sd_clk,0,[okunan]
        until okunan =$fe          'veri göndereceğini söylüyor kart.
        
        for i=0 to 63              ' veri okuma kısmı (64 byte )
            shiftin sd_d_in,sd_clk,0,[okunan[i]]
        next
       
        
       
         sd_cs=1
'okunan veriler burda işleniyor. çünkü her bir hex kodunu karta ascii olarak kodlanıyor.
'yani bizim AAAA şeklinde olan renk kodumuz kartta 65-65-65-65 olarak görünür.
'buda istediğimiz hex kodu değildir. bu yüzden burda ASCII kodu 65 olan "A" önce 16 ya bölünür.
'sonra 9 eklenir.(65//16 kalan 1.9 eklenirse sonuc 10 olur ve buda HEX'in ilk verisidir.
'bu işlem 4 kez tekrarlanırsa ve her seferinde 4 bit kayarsa 16 bit renk kodu elde edilir.
'0-9 arasındaki rakamların ASCII karşılığı 48-58 arasında
'A-F arasındaki harflerin  ASCII karşılığı 65 ile 71 arasında
'okunan[i]>40 olmasının nedeni 2 baytın (10 ve 14 kodlarının bizim için anlamsız olaması)        
        for i=0 to 63           

    
               if okunan[i]>40 then
                
                
                        if  okunan[i]<65 then
                        okunan[i]=okunan[i]//16
                        else 
                        okunan[i]=okunan[i]//16+9                           
                        endif                                               
                        okunan1=okunan1<<4+okunan[i] 
                j=j+1     
                if j=4 then 
                j=0     
                 veri=okunan1:GOSUB VERi_yazma 
                endif
                 

                 endif
            next
            
            
            
     pauseus 1         
goto oku

JKramer

Elinize sağlık. İzninizle videoyu izleyecek olanlar için bir hatırlatma yapayım; resmin yüklenmesi için iki dakika boyunca beklemenize gerek yok, doğrudan ikinci dakikaya gidebilirsiniz. "Bir arkadaşım" beklemiş de o yüzden şey ettim :).

camby


Murat Mert

mert07

yldzelektronik

Çok iyi çalışma.Tebrik ederim.Nereden esti acaba bu mcu ile :)?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

mustafa_cmbz

kısaca nasıl yapılıyor onlarında açıklaması olsa çok yerli yerinde ve fayadlı olacaktır...

Mesela makrolar haline getirerek kullanabiliriz.

Hani nasıl lcd de  print at 1,1,"mustafa" yazınca ekrana yazdırıyorsak o hale getirmek daha mantıklı olmaz mı ?

böyle bir çalışmanız olursa çok minnettar kalırız.Bizde elimizden geldiğince destekleriz..

homer380

Alıntı YapNereden esti acaba bu mcu ile :)?
Aslında elimde pic18f4550 var ama geçmeye erini yom.(tembellik)

Alıntı Yapkısaca nasıl yapılıyor onlarında açıklaması olsa çok yerli yerinde ve fayadlı olacaktır...

Mesela makrolar haline getirerek kullanabiliriz.

Hani nasıl lcd de  print at 1,1,"mustafa" yazınca ekrana yazdırıyorsak o hale getirmek daha mantıklı olmaz mı ?

böyle bir çalışmanız olursa çok minnettar kalırız.Bizde elimizden geldiğince destekleriz..

tft ekran için mi yoksa sd kart için mi?  Aslında böyle bir şey düşünüyorum şimdiki hal sadece çalışmasına bakıyorum.

frederic

MaşAllah sana kardeşim, çalışkanlıkta zirve yapmışsın.

mistek

Ben hazır kodları kullanamazken siz neler yapmışsınız. Helal olsun tebrikler.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

mustafa_cmbz

Alıntı yapılan: homer380 - 20 Temmuz 2013, 22:36:07
Aslında elimde pic18f4550 var ama geçmeye erini yom.(tembellik)

tft ekran için mi yoksa sd kart için mi?  Aslında böyle bir şey düşünüyorum şimdiki hal sadece çalışmasına bakıyorum.

hem sd kart için hem tft ekran için...Özellikle tft ekran için bence gerekli...

homer380

#10
Tft kurulum ile başlayalım. Ben picbasic göre yapacam diğer programlama dillerinede uyarlanabilir.
Bekleme süreleri değiştirilebilir.
lcdinit:
rd = 1                                    
reset = 1
pause 50
reset = 0
pause 50
reset = 1
pause 50
cs = 0
'*********tft ekranı hazırlamak için gerekli komutlar***********************
 komut =$0007:gosub komut_gonder:pause 30
    veri=$0021:gosub veri_yazma:pause 30
'###############################################
    komut =$0000:gosub komut_gonder:pause 30
    veri=$0001:gosub veri_yazma:pause 30
'###############################################
    komut =$0007:gosub komut_gonder:pause 30
    veri=$0023:gosub veri_yazma:pause 30
'###############################################
    komut =$0010:gosub komut_gonder:pause 30
    veri=$0000:gosub veri_yazma:pause 30
    pause 50
'###############################################
    komut =$0007:gosub komut_gonder:pause 30
    veri=$0033:gosub veri_yazma:pause 30
'###############################################
    komut =$0011:gosub komut_gonder:pause 30 'tarama yöntemi soldan-sağdan-aşağıdan-yukarıdan
    veri=$6808:gosub veri_yazma:pause 30
'###############################################
    komut =$0002:gosub komut_gonder:pause 30
    veri=$1000:gosub veri_yazma:pause 30
'###############################################
    komut =$0001:gosub komut_gonder:pause 30
    veri=$2b3f:gosub veri_yazma:pause 30
'###############################################
    komut =$000b:gosub komut_gonder:pause 30
    veri=$5308:gosub veri_yazma:pause 30            
'###############################################
    komut =$0028:gosub komut_gonder:pause 30
    veri=$0006:gosub veri_yazma:pause 30
'###############################################
    komut =$0025:gosub komut_gonder:pause 30         'osilator hızı
    veri=$e000:gosub veri_yazma:pause 30               
'###############################################
    komut =$0022:gosub komut_gonder:pause 30        'tft ye yazma  yapılacağı bildiriliyor
cs=1

tft ekran kurulumu tamamdır. Burda bizim için  önemli olan komutları elimden geldiği kadar buraya yazacam.

komut =$0011   veri=$6808

bu komut ile taramanın nasıl olacağı belirleniyor.


screenshot pc

burdaki bitler bizim için önemli taramanın dikey olacaksa AM biti "1", yatay ise AM biti "0" olmalı. daha detaylısı şekilde var.


image hosting 12mb

burdan istenilen tarama yöntemi seçilebilir. bunların dışındaki bitlere ben dokunmadım.

bizim için önemli diğer kodda osilatör hızını belirleyendir.
  komut =$0025 veri=$e000



screenshot tool

komut_gonder ve veri_gonder kısmıda yarına.

mustafa_cmbz

sen picbasic için yaz hocam ben protona çevirecem onları..

remzi


safaka123

elinize sağlık gerçekten güzel bir uygulama.
Ben de bir zamanlar SD kart için araştırma yaptım ama bir türlü sonunu getiremedim.
Yapmak istediğim sd karta yazılan mp3 formatlı küçük ses dosyalarının içinden seçeceğim birini sesli ikaz olarak kullanmak istemiştim.
SES entegreleri ISD kullanmak yerine daha fazla ses dosyasını kullanabilmek ve anında mesajı okutabilmek. Bunun için SD kartı okumam gerekiyor. Tıpkı sd kart kullanan aygıtlarda olduğu gibi . Her ses dosyası ekrana geliyor içlerinden birini seçebiliyoruz. Bunu mcu ile nasıl başarırız. Belki sizin fotoğraf kısmında okuma rutinleri buna ayarlanabilir ne dersiniz. ( Sadece okuma ve seçip çalma gerekir kayıt zaten herhangi bir bilgisayarda yapılabilir. )
İyi Çalışmalar

Kabil ATICI

Senin böyle aman aman lir LCD'ye ihtiyacın yok görünüyor. Senin işini karakter LCD'ler de görebilir. Onların ekranına bilgi göndermek bu LCD'den daha kolaydır. Seçme işimi göstermek sadece bir ok bile yeterli. Seni uğraştıracak olan SD kard okumasıdır. Daha doğrusu dosya adı ve yerini okumaktır. Bunun için FAT32 gibi konulara bakman lazım. Tabi kendi dosyalama sistemini oluşturmayacaksan!
ambar7