로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
  AVR Applications
AVR 자료실
작성자 leeky        
작성일 2006/03/07
첨부#1 mmc_m16_src.zip (0KB) (Down:85)
첨부#2 mmc_card_1g_shot.jpg (0KB) (Down:10)
Link#1 electronic-atmega-mmc.php (Down:10)
ㆍ추천: 1  ㆍ조회: 451   
  M16 MMC Flash Memory

이것은 SPI를 경유하여 ATmega16으로 MMC (Multi Media Card)를 쉽게 인터페이스 한다.
이것은 데이터 저장을 위해 많은 큰 메모리로, 데이터를 쉽게 관리하는 회로이다.
I2C RAM 혹은 EEPROM은 256Kb 보다 큰 사이즈가 거의 없다.
그러나 가격 효율과 저장 용량의 모두에서 이 방법은 64MB Flash MMC를 섞지 않는다.

● 하드웨어의 회로: (ATmega16은 DIP 패키지)
 

이 버전은 ATmega16이 사용된다. 그러나 이 회로와 소프트웨어는 다른 ATmega에 쉽게 이식된다.
MMC는 간단한 분압기로 5V의 전압을 MMC에 사용된 약 3.3V로 변환하여 ATmega16의 SPI핀에 연결된다.
MMC(2.7V - 3.6V)를 위한 공급전압은 LD1086V33 전압 안정기 혹은 동등품으로 부터 들어온다.
MMC의 데이터-출력 핀은 직접 ATmega16로 간다. ATmega16를 위해 3.3볼트는 충분히 높기 때문이다.
MMC 클럭은 0-20MHz 범위로 될 수 있다.

● 펌 웨어:
mmc.c (아래의 소스코드)와 uC를 프로그램하는 병렬포트 프로그래머의 번역기는
 avr-gcc 혹은 WinAVR을 사용한다.
http://www.captain.at/electronics/atmel-programmer/

PIC - MMC (Multi Media Card) 플래시 메모리 응용 페이지에서 찾을 수 있는
직렬포트로 넘기는 데이터 수신을 위한 리눅스 소프트 (serterm2)는 이 페이지에서,
http://www.captain.at/electronics/pic-mmc/

프로그램 "ser". 이것은 PC의 직렬 포트와 그들의 수신을 경유한 3개의 문자 ("ABC")를 송신한다.
이 3개의 문자들은 가로채기 지원루틴을 경유하여 MCU로 되돌아 간다.

● 시험:
만일 당신의 하드웨어가 준비되면, 전원을 끊고 "serterm2"를 시작한다.
이제 당신의 uC-기판에 전원을 연결하면, "serterm2"를 경유하여 당신의 PC에서
다음과 같은 출력을 볼 수 있다.
 

● 펌웨어는 내장 RAM에 512바이트의 데이터를 쓰고 MMC의 섹터에 쓴다.
그러면 그들 512 바이트는 직렬 포트를 경유하여 MMC로 부터 반대로 읽는다.
그후에 그 MCU는 loop로 들어가고 핀 19의 LED를 깜빡인다
(ATmega16 병렬포트 프로그래머와 비슷한 avrledtest.c)
http://www.captain.at/electronics/atmel-programmer/
더구나 ISR(가로채기 지원루틴)은 직렬포트로 어떤 문자라도 리턴한다.

● mmc.c 소스:
/*********************************************
* Chip type : ATmega16
* Clock frequency : 2457600Hz
*********************************************/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <inttypes.h>
#include <avr/iom16.h>

#define F_OSC 2457600 /* oscillator-frequency in Hz */
#define UART_BAUD_RATE 9600
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_OSC)/((UART_BAUD_RATE)*16l)-1)

#define SPIDI 6 // Port B bit 6 (pin7): data in (data from MMC)
#define SPIDO 5 // Port B bit 5 (pin6): data out (data to MMC)
#define SPICLK 7 // Port B bit 7 (pin8): clock
#define SPICS 4 // Port B bit 4 (pin5: chip select for MMC

char sector[512];

void delay_ms(unsigned short ms) {
unsigned short outer1, outer2;
outer1 = 200;
while (outer1) {
outer2 = 1000;
while (outer2) {
while ( ms ) ms--;
outer2--;
}
outer1--;
}
}

void usart_putc(unsigned char c) {
// wait until UDR ready
while(!(UCSRA & (1 << UDRE)));
UDR = c; // send character
}

void uart_puts (char *s) {
// loop until *s != NULL
while (*s) {
usart_putc(*s);
s++;
}
}

void init(void) {
// set baud rate
UBRRH = (uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)>>8);
UBRRL = (uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_OSC);
// Enable receiver and transmitter; enable RX interrupt
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
//asynchronous 8N1
UCSRC = (1<<URSEL)|(3<<UCSZ0);
}

// INTERRUPT can be interrupted
// SIGNAL can't be interrupted
SIGNAL (SIG_UART_RECV) { // USART RX interrupt
unsigned char c;
c = UDR;
usart_putc(c);
}

void serialterminate(void) { // terminate sent string!!!
while(!(UCSRA & (1 << UDRE)));
UDR = 0x0d;
while(!(UCSRA & (1 << UDRE)));
UDR = 0x0a;
}

void SPIinit(void) {
DDRB &= ~(1 << SPIDI); // set port B SPI data input to input
DDRB |= (1 << SPICLK); // set port B SPI clock to output
DDRB |= (1 << SPIDO); // set port B SPI data out to output
DDRB |= (1 << SPICS); // set port B SPI chip select to output
SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0);
PORTB &= ~(1 << SPICS); // set chip select to low (MMC is selected)
}

char SPI(char d) { // send character over SPI
char received = 0;
SPDR = d;
while(!(SPSR & (1<<SPIF)));
received = SPDR;
return (received);
}


char Command(char befF, uint16_t AdrH, uint16_t AdrL, char befH )
{ // sends a command to the MMC
SPI(0xFF);
SPI(befF);
SPI((uint8_t)(AdrH >> 8));
SPI((uint8_t)AdrH);
SPI((uint8_t)(AdrL >> 8));
SPI((uint8_t)AdrL);
SPI(befH);
SPI(0xFF);
return SPI(0xFF); // return the last received character
}

int MMC_Init(void) { // init SPI
char i;
PORTB |= (1 << SPICS); // disable MMC
// start MMC in SPI mode
for(i=0; i < 10; i++) SPI(0xFF); // send 10*8=80 clock pulses
PORTB &= ~(1 << SPICS); // enable MMC

if (Command(0x40,0,0,0x95) != 1) goto mmcerror; // reset MMC

st: // if there is no MMC, prg. loops here
if (Command(0x41,0,0,0xFF) !=0) goto st;
return 1;
mmcerror:
return 0;
}

void fillram(void) { // fill RAM sector with ASCII characters
int i,c;
char mystring[18] = "Captain was here! ";
c = 0;
for (i=0;i<=512;i++) {
sector[i] = mystring[c];
c++;
if (c > 17) { c = 0; }
}
}

int writeramtommc(void) { // write RAM sector to MMC
int i;
uint8_t c;
// 512 byte-write-mode
if (Command(0x58,0,512,0xFF) !=0) {
uart_puts("MMC: write error 1 ");
return 1;
}
SPI(0xFF);
SPI(0xFF);
SPI(0xFE);
// write ram sectors to MMC
for (i=0;i<512;i++) {
SPI(sector[i]);
}
// at the end, send 2 dummy bytes
SPI(0xFF);
SPI(0xFF);

c = SPI(0xFF);
c &= 0x1F; // 0x1F = 0b.0001.1111;
if (c != 0x05) { // 0x05 = 0b.0000.0101
uart_puts("MMC: write error 2 ");
return 1;
}
// wait until MMC is not busy anymore
while(SPI(0xFF) != (char)0xFF);
return 0;
}

int sendmmc(void) { // send 512 bytes from the MMC via the serial port
int i;
// 512 byte-read-mode
if (Command(0x51,0,512,0xFF) != 0) {
uart_puts("MMC: read error 1 ");
return 1;
}
// wait for 0xFE - start of any transmission
// ATT: typecast (char)0xFE is a must!
while(SPI(0xFF) != (char)0xFE);

for(i=0; i < 512; i++) {
while(!(UCSRA & (1 << UDRE))); // wait for serial port
UDR = SPI(0xFF); // send character
}
serialterminate();
// at the end, send 2 dummy bytes
SPI(0xFF); // actually this returns the CRC/checksum byte
SPI(0xFF);
return 0;
}

int main(void) {
init();
SPIinit();

uart_puts("MCU online");
serialterminate();

MMC_Init();

uart_puts("MMC online");
serialterminate();

sei(); // enable interrupts

fillram();
writeramtommc();
sendmmc();

uart_puts("512 bytes sent");
serialterminate();
uart_puts("blinking LED now");
serialterminate();

// enable PD5 as output
DDRD |= (1<<PD5);
while (1) {
// PIN5 PORTD clear -> LED off
PORTD &= ~(1<<PD5);
delay_ms(500);
// PIN5 PORTD set -> LED on
PORTD |= (1<<PD5);
delay_ms(500);
}
return 0;
}

● Makefile:
MCU=atmega16
CC=avr-gcc
OBJCOPY=avr-objcopy
# optimize for size:
CFLAGS=-g -mmcu=$(MCU) -Wall -Wstrict-prototypes -Os -mcall-prologues
#-------------------
all: mmc.hex
#-------------------

mmc.hex : mmc.out
$(OBJCOPY) -R .eeprom -O ihex mmc.out mmc.hex
mmc.out : mmc.o
$(CC) $(CFLAGS) -o mmc.out -Wl,-Map,mmc.map mmc.o
mmc.o : mmc.c
$(CC) $(CFLAGS) -Os -c mmc.c

# you need to erase first before loading the program.
# load (program) the software into the eeprom:
load: mmc.hex
uisp -dlpt=/dev/parport0 --erase -dprog=dapa
uisp -dlpt=/dev/parport0 --upload if=mmc.hex -dprog=dapa -v=3 --hash=32
#-------------------
clean: rm -f *.o *.map *.out
#-------------------

마지막 변경: 2005년 5월 29일

● MMC 카드의 규격
-용량 : 128MB, 256MB, 512MB, 1GB,
-전기 특성 : 공급 전압 RS-MMC: 2.7-3.6V 혹은 1.6-2.0V
-낮은 전력 소비 : 50mA 이하
-클럭 속도 : 20Mhz 최대.
-속도 성능 : 26M 비트/초 까지.

신뢰 규격
-신뢰 MTBF(고장예측 시간): 1,000,000 시간
-삽입 횟수: 최소 20,000
-데이터 보존 : 10 년
-내구: 100,000회 이상 (읽기/쓰기와 지우기)

내환경 규격
-방수: yes
-내 분진: yes
-내 정전기: yes
-작동 온도: 0 ~ 70 C
-보관 온도: -25 ~ 85 C
-습도: 8 - 95 % 무 결로에서
-내 진동: 최대 15G p-p
-내 충격: 2000G

물리적 규격
-연결 핀: 7 / Mobile 13 pins
-길이: 24mm 폭: 18mm 두께: 1.4mm
-무게: 0.8g 최대
-보증: 5 년 제한

원저자 http://www.captain.at/
AVRTOOLS™
   
윗글 Mega88 USB 버스 모니터
아래글 M163 SD,MMC Interface
    N         제목    글쓴이 작성일 조회 추천
AVR 자료실 안내 avrtools™ 2008/09/02 (화) 155 0
97 AVR Basic Compiler (4K Free) avrtools™ 2008/12/03 (수) 178 0
96 코드비젼 V2.05.0 평가판 avrtools™ 2011/07/17 (일) 119 0
95 8x8 LED Audio Spectrum Display avrtools™ 2009/10/18 (일) 241 0
94 AVR 펌웨어로 만드는 USB 드라이버 avrtools™ 2009/10/07 (수) 415 0
93 AVR-CDC and V-USB avrtools™ 2009/10/06 (화) 213 0
92 AVR USB-HID-Bootloader의 제작 avrtools™ 2009/10/01 (목) 248 0
91 AT91SAM7S256 개발환경과 컴파일러 [2] avrtools™ 2008/11/03 (월) 2165 0
90 SAM7S256 USB 드라이버와 AT91-ISP avrtools™ 2008/11/01 (토) 1148 0
89 AT91SAM7S256 공부를 시작합니다. avrtools™ 2008/11/01 (토) 574 1
88 ICCAVR V7.16A AVR 컴파일러 45일판 avrtools™ 2009/03/09 (월) 125 0
87 CodeVisionAVR1248b 最新版下载 leeky 2008/11/08 (토) 290 0
86 AVR UART 소스 (ICC AVR V6) avrtools™ 2008/12/03 (수) 165 0
85 cvAVR Soft Uart Source avrtools™ 2008/12/03 (수) 138 0
84 cvAVR 직렬포트와 LCD 시험용 소스 avrtools™ 2008/12/03 (수) 135 0
83 Free SmallC for AVR avrtools™ 2008/12/03 (수) 153 0
82 AVR910-ISP용 AVR-OSP2 Ver5.43 avrtools™ 2008/12/03 (수) 162 0
81 Code Vision AVR 컴파일러 2K 데모버전 avrtools™ 2008/12/02 (화) 92 0
80 AVR delay loop generator avrtools™ 2008/12/02 (화) 143 0
79 ICC tiny C컴파일러 V6 데모버전 (30일 제한판) avrtools™ 2008/12/02 (화) 61 0
78 ICC AVR C 컴파일러 V6 (4K 제한판) avrtools™ 2008/12/02 (화) 80 0
77 DasmAVR (Windows용 AVR 역어셈블러) avrtools™ 2008/12/02 (화) 126 0
76 AVR PROG KIT avrtools™ 2008/12/02 (화) 170 0
75 AVR JTAG ICE KIT avrtools™ 2008/12/02 (화) 240 0
74 AVR 부동소수점, 지연시간 계산기 avrtools™ 2008/12/02 (화) 142 0
73 ATtiny45 USB to RS232 인터페이스 avrtools™ 2008/09/26 (금) 188 0
72 MEGA32 128x64 GLCD Scope 제작 avrtools™ 2008/09/22 (월) 301 0
71 PC송신방식 Tiny2313 50x7 LED 전광판 avrtools™ 2008/09/10 (수) 252 0
70 mega8 적외선 거리측정 레이더 leeky 2006/05/07 (일) 1367 0
69 ATmega16 RFID #3 소프트웨어 leeky 2006/12/27 (수) 879 0
68 ATmega16 RFID #2 하드웨어 leeky 2006/12/27 (수) 1126 0
67 ATmega16 RFID #1 태그 leeky 2006/12/27 (수) 857 0
66 ISO 14443A RFID 카드의 읽기/쓰기 방법 [1] leeky 2007/02/25 (일) 1488 1
65 ATmega8 PSK31 RF Modem의 제작 leeky 2006/03/07 (화) 1376 21
64 T89C51SND1C 64M USB MP3 플레이어 avrtools 2006/03/04 (토) 968 8
63 AVR 13.56MHz RFID 읽기/쓰기 장치의 제작 [7] leeky 2007/02/19 (월) 994 4
62 WhereAVR for APRS GPS/Telemetry avrtools 2006/05/05 (금) 384 2
61 ATmega8 UI-TNC 무선모뎀의 제작 avrtools 2006/03/07 (화) 391 0
60 AVR APRS(GPS) Packet 무선모뎀 avrtools 2006/03/07 (화) 374 0
59 AT90PWM3 교류모터 속도제어 leeky 2006/04/07 (금) 921 1
58 M128 MMC LED 전광판 leeky 2006/03/07 (화) 911 0
57 Charon 2 이더넷 모듈의 소개 avrtools 2006/04/04 (화) 473 0
56 S2313 LED 회전계 (TACHO METER) avrtools 2006/03/28 (화) 597 0
55 Mega8 + 128x128 LCD 스코프 avrtools 2006/03/28 (화) 1184 0
54 Mega8 + OV6630 Treva 모바일용 카메라의 화상처리 leeky 2006/03/19 (일) 777 0
53 YUKI Mega8 MP3 Player #3 avrtools 2006/03/11 (토) 837 0
52 AVR JTAG 에뮬레이터의 제작 avrtools 2006/03/07 (화) 834 0
51 USB AVR 프로그래머 AvrUsb500 avrtools 2006/03/07 (화) 726 1
50 Mega88 USB 버스 모니터 avrtools 2006/03/07 (화) 384 0
49 M16 MMC Flash Memory leeky 2006/03/07 (화) 451 1
48 M163 SD,MMC Interface leeky 2006/03/07 (화) 435 0
47 S2313 MMC to Serial leeky 2006/03/07 (화) 315 0
46 ATmega48 UDP/IP 적외선 리모콘 수신장치 avrtools 2006/03/07 (화) 412 0
45 HDD MP3 플레이어 leeky 2006/03/07 (화) 596 0
44 MP3 yampp-3/USB leeky 2006/03/07 (화) 290 0
43 MP3 Player yampp-3 leeky 2006/03/07 (화) 254 0
42 YUKI MP3 플레이어2의 제작 (ATmega8 + SD Card) avrtools 2006/03/07 (화) 370 0
41 AVR CD 플레이어 leeky 2006/03/07 (화) 531 0
40 S2313 초음파 거리계 (미터, TV 스크린, LED 표시) avrtools 2006/03/07 (화) 544 0
39 RF Spectrum Monitor avrtools 2006/03/07 (화) 373 0
38 Easy Ethernet AVR 웹서버 leeky 2006/03/07 (화) 449 0
37 90S4433 LCD표시 100Mhz 주파수 카운터 leeky 2006/03/07 (화) 246 0
36 ELM Audio Spectrum Monitor avrtools 2006/03/07 (화) 352 0
35 Mega8 Door Bell leeky 2006/03/07 (화) 277 0
34 AVR 휴대용 DVM leeky 2006/03/07 (화) 482 0
33 Minimum Mass Waveform Capture and Display leeky 2006/03/07 (화) 260 0
32 AT90S2313 디지털 용량계 avrtools 2006/03/07 (화) 364 0
31 SLO2016 Alphanumeric Intelligent Display leeky 2006/03/07 (화) 174 0
30 AT90S2313 흔드는 LED 전광판 (POV) leeky 2006/03/07 (화) 426 0
29 ATtiny2313 Scrolling LED Sign avrtools 2006/03/07 (화) 363 0
28 Tiny22,S1200 나이트 라이더 avrtools 2006/03/07 (화) 308 0
27 ATtiny26L의 AD 변환과 PWM 출력제어 leeky 2006/03/07 (화) 474 0
26 S2313을 사용한 DS1820 온도계 leeky 2006/03/07 (화) 264 0
25 ATmega8535 온도센서 leeky 2006/03/07 (화) 294 0
24 AVR2313 100MHz RF연결 주파수 측정메터 avrtools 2006/03/07 (화) 193 0
23 VHF 무선 데이터 송신기 leeky 2006/03/07 (화) 502 0
22 90S2313 1MHz 파형 포착기 leeky 2006/03/07 (화) 227 0
21 VHF 무선 데이터 수신기 avrtools 2006/03/07 (화) 364 0
20 AVR 5x7 Dotmatrix LED leeky 2006/03/07 (화) 237 0
19 Mega163 웹 LCD leeky 2006/03/07 (화) 394 0
18 AVR 이더넷 시험소프트 avrtools 2006/03/07 (화) 296 0
17 AVR 넷트웍 시계 (타임 프로토콜) avrtools 2006/03/07 (화) 374 0
16 RS-232 to 100 MHz RF desktop avrtools 2006/03/07 (화) 235 0
15 AVR 6디지트 50MHz 주파수 카운터 leeky 2006/03/07 (화) 212 0
14 AVR DS1820 온도센서 avrtools 2006/03/07 (화) 251 0
13 AVR 직접주파수 발생기 (AT90S2313 DDS) avrtools 2006/03/07 (화) 371 0
12 프로그래머블 PLL 제어 avrtools 2006/03/07 (화) 219 0
11 AVR AT90S2313 7Segment LED Display leeky 2006/03/07 (화) 213 0
10 TINY15L 무전원 4채널 온도계 avrtools 2006/03/07 (화) 316 0
9 8PIN AVR을 사용한 풀컬러 LED leeky 2006/03/07 (화) 347 0
8 DS1820 고분해능 온도계 avrtools 2006/03/07 (화) 333 0
7 S2313 디지털 전압계 avrtools 2006/03/07 (화) 448 0
6 S2313 적외선 USB 모듈 avrtools 2006/03/07 (화) 317 0
5 S2313 주파수 카운터 avrtools 2006/03/07 (화) 253 0
4 AVR90S2313과 Treva 카메라의 연결 leeky 2006/03/07 (화) 294 0
3 Mega8 PID 온도제어 leeky 2006/02/24 (금) 530 1
2 90S2333 3채널 다이오드 온도계 avrtools 2006/02/24 (금) 236 0
1 AT89S8252로 만드는 1~40MHz DDS leeky 2006/02/14 (화) 309 0
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0