judul
Breaking News
Loading...
Sabtu, 21 Juni 2014

Simulasi ATmega dan MMC

Sabtu, Juni 21, 2014
Projek ini menjelaskan bagaimana membaca (read) dan menuliskan (write) data pada SD CARD menggunakan mikrokontroller AVR.  Very simply and easy, karena adanya sebuah software develomper yang membuat library untuk komunikasi SD CARD dengan mikrokontroller AVR.

Sebelum membaca artikel ini, saya pribadi mengucapkan terimakasih kepada  elm chan. Beliau yang telah membuat library untuk komunikasi SD Card dengan mikrokontroller AVR 8 bit.
SD card
Dibawah ini adalah pin out dari SD CARD, yaitu SPI yang dapat berkomunikasi dengan mikrokontroller.

Pin description of an SD card

Pin Name Function (SD Mode) Function (SPI Mode)
1 DAT3/CS Data Line 3 Chip Select/Slave (SS)
2 CMD/DI Command Line Mater Out Slave In (MOSI)
3 VSS1 Ground Ground
4 VDD Supply Voltage Supply Voltage
5 CLK Clock Clock (SCK)
6 VSS2 Ground Ground
7 DAT0/DO Data Line 0 Master In Slave Out (MISO)
8 DAT1/IRQ Data Line 1 Unused or IRQ
9 DAT2/NC Data Line 2 Unused

Important SD card commands

Command Argument Type Response Description
CMD0 None R1 Tell the card to reset and enter its idle state.
CMD16 32-bit Block Length R1 Select the block length.
CMD17 32-bit Block Address R1 Read a single block.
CMD24 32-bit Block Address R1 Write a single block.
CMD55 None R1 Next command will be application-specific (ACMDXX).
CMD58 None R3 Read OCR (Operating Conditions Register).
ACMD41 None R1 Initialize the card.

Initialize SD card

Inisialisasi dimulai dengan menetapkan kontrol SPI sinyal clock untuk 400kHz, yang diperlukan untuk kompatibilitas paling SD dan kartu memori PKS. Kemudian mengatur ulang urutan tab di CMD0 diaktifkan kartu masukan CS (CS pada tingkat L). CRC byte untuk CMD0 komando dan perintah argumen nol adalah 0x95. CMD55 mengikuti perintah dan ACMD41. Jika setelah bit menganggur di tingkat L handshake selesai dan mengantisipasi bahwa kerangka kerja manajemen lebih lanjut. Command CMD58 Sebagai contoh, kami memeriksa apakah kartu mendukung tegangan suplai sama dengan MCU, yang biasanya di kisaran 2,7 V menjadi 3,6 V. SPI sinyal clock untuk mengatur nilai maksimum yang diizinkan.

SOLUSI : Librray CodevisionAVR yang diadopsi dari elm chan
  
Dengan memasukan library   #include <sdcard.h> , proses komunikasi hardware antara uC dan SD CARD bisa diabaikan.

#include 
#include 
#include 
#include 
#include 
#include 

/* USART Baud rate */
#define BAUD_RATE 9600   //19200
#define BAUD_INIT (_MCU_CLOCK_FREQUENCY_/(BAUD_RATE*16L)-1)

#pragma used+
/* initialize the USART0 TX, 8N1, Baud rate: 19200 */
/* initialize the USART0 TX, 8N1, Baud rate: 9600 */
void init_usart0(){
UCSR0A=0;
UCSR0B=1<>8;
UBRR0L=BAUD_INIT&0xFF;
}
#pragma used-

//====================================================
/* Timer1 overflow interrupt frequency [Hz] = ms*/
#define T1_OVF_FREQ 100
/* Timer1 clock prescaler value */
#define T1_PRESC 1024L
/* Timer1 initialization value after overflow */
#define T1_INIT (0x10000L-(_MCU_CLOCK_FREQUENCY_/(T1_PRESC*T1_OVF_FREQ)))

//#pragma used+
/* FAT function result */
FRESULT res;
/* number of bytes written/read to the file */
unsigned int nbytes;
/* will hold the information for logical drive 0: */
FATFS fat;
/* will hold the file information */
FIL file;
/* will hold file attributes, time stamp information */
FILINFO finfo;

/* 100Hz timer interrupt generated by ATmega128 Timer1 overflow */


void start_timer_mmc()
{
/* initialize Timer1 overflow interrupts in Mode 0 (Normal) */
TCCR1A=0x00;
/* clkio/1024 */
TCCR1B=(1<>8;
TCNT1L=T1_INIT&0xFF;
/* enable Timer1 overflow interrupt */
TIMSK|=(1<>8;
TCNT1L=T1_INIT&0xFF;
/* card access low level timing function */
disk_timerproc();
}

flash char * flash error_msg[]=
{
"", 
"FR_DISK_ERR",
"FR_INT_ERR",
"FR_NOT_READY",
"FR_NO_FILE",
"FR_NO_PATH",
"FR_INVALID_NAME",
"FR_DENIED",
"FR_EXIST",
"FR_INVALID_OBJECT",
"FR_WRITE_PROTECTED",
"FR_INVALID_DRIVE",
"FR_NOT_ENABLED",
"FR_NO_FILESYSTEM",
"FR_MKFS_ABORTED",
"FR_TIMEOUT"
};

void error(FRESULT res)
{
if ((res>=FR_DISK_ERR) && (res<=FR_TIMEOUT))
   printf("ERROR: %p\r\n",error_msg[res]);
while(1);
}     

char data_simpan[]="I like CodeVisionAVR!\r\n";

/*global variable yang akan digunakan*/
/*tidak direkomendasikan menggunkan banyak Global Variabel*/ 

/*filename yang akan di ciptakan pada mmc */     
char file_patch[]="0:coba.txt";   
/* file buffer (penampung) yang akan dikirm ke mmc */
unsigned char status_tulis,status_create;

void file_name_txt(char *file_name)
{
if ((res=f_stat(file_name,&finfo))==FR_OK){printf("File %s opened OK\r\n",file_name);}
}

void file_baru(void)
{

status_create=0; 
start_timer_mmc();
//reset_filename();   
            
if ((res=f_open(&file,file_patch,FA_CREATE_ALWAYS | FA_WRITE))==FR_OK){status_create=1; printf("Disk -> create file = %s\r\n",file_patch);}
else {status_create=0; printf("error create\r\n");}

        
if(status_create==1)
    {    
    if ((res=f_close(&file))==FR_OK)status_create=1;
    else status_create=0;
    }                          
stop_timer_mmc();             
} 


void isi_file()
{ 
//reset_filename();           
start_timer_mmc(); 
status_tulis=0;
               
file_name_txt(file_patch);
            
if ((res=f_open(&file,file_patch,FA_CREATE_ALWAYS | FA_WRITE))==FR_OK){printf("Disk Open\r\n"); status_tulis=1;}else status_tulis=0; 
                                                     
if(status_tulis==1)
{
    if ((res=f_lseek(&file,finfo.fsize))==FR_OK)printf("Disk info\r\n"); 
    if ((res=f_write(&file,data_simpan,sizeof(data_simpan)-1,&nbytes))==FR_OK)
        printf("%u bytes written of %u\r\n",nbytes,sizeof(data_simpan)-1);
    if ((res=f_close(&file))==FR_OK)printf("Disk Closed\r\n");
    }       
stop_timer_mmc();                                  
}




// Declare your global variables here

void main(void)
{
unsigned char disk_status;
unsigned int sector_size;
unsigned long int sector_count;
//int i=0;


DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
PORTE=0x00;
DDRE=0x00;
PORTF=0x00;
DDRF=0x00;
PORTG=0x00;
DDRG=0x00;

ACSR=0x80;

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 16
lcd_init(16);
start_timer_mmc();
init_usart0();

#asm("sei")   

printf("SD card driver test\r\nInitializing drive ...\r\n");
/* initialize SPI interface and card driver */
disk_status=disk_initialize(0);
/* display disk initialization result */

if (disk_status & STA_NODISK) printf("Card not present\r\n");
else
if (disk_status & STA_NOINIT) printf("Disk init failed\r\n");
else
if (disk_status & STA_PROTECT) printf("Card write protected\r\n");
/* all status flags are 0, disk initialization OK */
else
    {
    printf("Init OK\r\n");
    /* get the sector size */
    if (disk_ioctl(0,GET_SECTOR_SIZE,&sector_size)==RES_OK)
       {
       /* sector size read OK, display it */
       printf("Sector size=%u\r\n",sector_size);
       /* get the sector count */
       if (disk_ioctl(0,GET_SECTOR_COUNT,&sector_count)==RES_OK)
          /* sector count read OK, display it */
          printf("Sector count=%lu\r\n",sector_count);
       else
          printf("Error reading\nsector count\r\n");
       }
    else printf("Error reading sector size\r\n");
    }
/* stop here */
if ((res=f_mount(0,&fat))==FR_OK)
   printf("Logical drive 0: mounted OK\r\n");
else
   /* an error occured, display it and stop */
   error(res);


stop_timer_mmc();
file_baru();

while (1)
      {
      // Place your code here 
       
      if(tombol_start==0){while(tombol_start==0);
      if (disk_status & STA_NODISK) printf("Card not present\r\n");
      else{ 
        isi_file();  
        printf("Simpan Data=%s\r\n",data_simpan);
        lcd_clear();
        lcd_gotoxy(0,0);
        lcd_puts(data_simpan);  }
               
        }

      }
}

 
Terimakasih telah membaca artikel ini, semoga bermanfaat. 

0 komentar:

Posting Komentar

 
Toggle Footer