Kaskus

Hobby

ahocoolAvatar border
TS
ahocool
Hobby Elektronika Digital, MicroController & solder Menyolder gabung sini Yuks
DIGITAL ELECTRONICS HOBBY FORUM

Hobby Elektronika Digital, MicroController & solder Menyolder gabung sini Yuks


Spoiler for apa aja sih yang dibahas?:


Spoiler for "Hobby Microcontroller Itu Mahal ? Kreativitasmu Itu yg Mahal Gan !":




UPDATE 8/JUNI/2014

DUKUN FUSEBIT AKAN MENGHIDUPKAN IC MU YANG MATI !

Hobby Elektronika Digital, MicroController & solder Menyolder gabung sini Yuks

Selengkapnya dibahas di sini gan !!

CLINOMETER SEDERHANA MEMANFAATKAN ADC

Hobby Elektronika Digital, MicroController & solder Menyolder gabung sini Yuks

Selengkapnya dibahas di post berikut




Spoiler for Buka Jika Mau Paket Belajar:


Proyek2 micro yg sudah jadi
Quote:



I.N.D.E.X F.O.R.U.M

Quote:




Biar ngiler, ane kasih contoh hasil karya TS...






Spoiler for Contact TS lewat dimari yahh:



.
Diubah oleh ahocool 14-06-2025 11:27
0
1M
8.6K
GuestAvatar border
Komentar yang asik ya
Mari bergabung, dapatkan informasi dan teman baru!
Hobby & Community
Hobby & Community
KASKUS Official
10.5KThread7KAnggota
Tampilkan semua post
ahocoolAvatar border
TS
ahocool
#4712
BELAJAR ACCESS SD CARD CARA SIMPLE DENGAN ATTINY2313

==PART 2==




SPI via USI

kaskus-image

SPI merupakan serial peripheral interface yang dapat mengkomunikasikan antara master dan slave. Kecepatan transfer data bergantung dari pembagian clock yang diberikan . Sedangkan USI adalah SPI mode simple, dimana clock diberikan manual secara software atau input dari luar. Pin SS (slave select ) juga tidak disediakan tapi bisa di akali dengan PIN & software

kaskus-image

dari gambar diatas dapat dilihat mode 3 wire USCK, DO (MOSI) , DI (MISO)
USCK diberikan secara software (manual) dengan toogling register USICR pada USICLK dan USITC
ada 3 buah register yg perlu diperhatikan yaitu USIDR = Data register , USICR =Control register dan USISR = Status Register

Berikut script untuk inisialisasi dari USI sebagai SPI

Code:
[size="1"]//definisi port
#define SPI_DDR DDRB
#define MOSI (1<<PB6)
#define MISO (1<<PB5)
#define SCK (1<<PB7)

#define CS_DDR DDRD
#define CS (1<<PD6) // PD6 sebagai slave/chip select
#define CS_ENABLE() (PORTD &= ~CS)
#define CS_DISABLE() (PORTD |= CS)

//inisialisasi port SPI
void SPI_init() {
CS_DDR |= CS; // SD card circuit select as output
SPI_DDR |= MOSI + SCK; // MOSI and SCK as outputs
}

//Pembacaan SPI
unsigned char SPI_write(unsigned char ch) {
USIDR = ch; // data yang akan dikirim
USISR |= (1<<USIOIF); // aktifkan interrupt Overflow

do {
//Kirim USCK8 x
USICR |= (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC);
_delay_us(100);
} while((USISR & (1<<USIOIF)) == 0); // selesai jika overflow
return USIDR; // baca data reply yg masuk
}
[/size]



gampang bukan ? selanjutnya kita dapat mengirim perintah ke SD card melalui port USI dan kita siap untuk membaca data dari SD CARD.

Jika bahan-bahan sudah siap dan tersusun di breadboard (jangan lupa set fusebit memakai clock 8MHZ , clk_div jangan dipake, bisa meakai xtal atau internal RC) kita akan membaca file text yang telah dicopy ke dalam SD card

Pertama kita bahas cara read (CMD 51) dari isi file SDCARD , langkahnya seperti berikut:

1. Pull CS low (select)
2. Send 0×51
3. Send 0x00000000 (Sector x 512)
4. Send 0×FF
5. Baca data yg dikirim 520 kali (sambil kirim 0xFF ke kartu)
6. Pull CD low (deselect)

kenapa 520 kali ? karena format reply per sector seperti ini :

kaskus-image

yang garis merah diatas merupakan header awal (6 byte) yang menyatakan data ready, jadi di script nantinya kita akan mendeteksi 00 dan FE , sedangkan 2 terakhir merupakan CRC yang bisa di abaikan.

jadi kita susun script seperti berikut :

Code:


[size="1"]void SD_command(unsigned char cmd, unsigned long arg, unsigned char crc, unsigned char read) {
unsigned char i;
//berfungsi mengirim perintah ke SD card
CS_ENABLE();
SPI_write(cmd);
SPI_write(arg>>24); //geser byte
SPI_write(arg>>16);//karena format
SPI_write(arg>>8);//0x00000000
SPI_write(arg);//alias 4 bit argumen
SPI_write(crc);

for(i=0; i<read; i++) SPI_write(0xFF); //kirim & baca
CS_DISABLE();
}

char SD_init() {
char i;
//berfungsi inisialisasi SD card
CS_DISABLE();
for(i=0; i<10; i++) SPI_write(0xFF);
_delay_ms(500);
// langkah 1 0x40
SD_command(0x40, 0x00000000, 0x95, 8);
_delay_ms(500);
// langkah 2 0x41
SD_command(0x41, 0x00000000, 0xFF, 8);
_delay_ms(500);
// langkah 3 0x50
SD_command(0x50, 0x00000200, 0xFF, 8);
_delay_ms(500);

return 0;
}

void SD_begin(unsigned long sector) {
uint8_t i = 0;
//berfungsi untuk membaca data SD card
CS_ENABLE();
SPI_write(0x51); //perintah baca 0x51
//selanjutnya geser2 byte sector
SPI_write(sector>>15); // sector*512 >> 24
SPI_write(sector>>7); // sector*512 >> 16
SPI_write(sector<<1); // sector*512 >> 8
SPI_write(0); // sector*512
SPI_write(0xFF);

for(i=0; i<10 && SPI_write(0xFF) != 0x00; i++) {} // wait for 0
for(i=0; i<10 && SPI_write(0xFF) != 0xFE; i++) {} // wait for data start

// baca SD& kirim melalui serial
for(i=0; i<512; i++) USART_Tx(SPI_write(0xFF));
//2 kali checksum
SPI_write(0xFF);
SPI_write(0xFF);

CS_DISABLE();
}

[/size]



Yah..begitulah...ga terlalu susah ....hanya masalah creativitas, ntar munculnya di layar (jika dihubungkan dengan serial via putty/hyperterminal) seperti ini :

kaskus-image

atau jika data langsung dibaca, bisa langsung membaca text. Sesuai percobaan bahwa sector paling depan tempat file disimpan adalah sector 96,

kenapa ? karena SD CARD yang aku pake jadul , memakai system FAT12

kaskus-image


sedangkan jika memakai Format pc terbaru maka otomatis menjadi system FAT16 dan File pertama berada di sector 555. Jadi sesuaikan dengan jenis format yang dipakai

kaskus-image

semua source code dapat didownload dimari


SELAMAT MENCOBA
Diubah oleh ahocool 12-12-2012 08:16
0
Ikuti KASKUS di
© 2025 KASKUS, PT Darta Media Indonesia. All rights reserved.