http://blog.naver.com/PostList.nhn?from=postList&blogId=ranken&categoryNo=43¤tPage=5
○ 상 수 (추가 : 2010. 4. 5, 수정 : 2010. 5. 4)
RAMEND : 칩에 존재하는 RAM의 마지막 주소 (byte 주소)
XRAMEND : 지정 가능한 램의 마지막 주소 (외부램의 없다면 RAMEND와 동일)
E2END : EEPROM의 마지막 주소
FLASHEND : flash memory 끝 주소 (byte 주소)
SPM_PAGESIZE : flash memory page size (byte 단위)
E2PAGESIZE : EEPROM의 페이지 크기
SIGNATURE_0 : device signature (byte 0)
SIGNATURE_1 : device signature (byte 1)
SIGNATURE_2 : device signature (byte 2)
FUSE_MEMORY_SIZE : FuseBit bytes의 크기 (fusebit bytes는 low, high, extended로 구성)
F_CPU : 사용자가 제공하는 CPU 클럭 정보
* SIGRD가 정의되어 있지 않다는 컴파일러 에러가 발생하는 버그가 존재하므로
#ifndef SIGRD
#define SIGRD 5
#endif
위의 코드를 추가하여 컴파일.
○ 매크로(추가 : 2010. 4. 5, 수정 : 2011, 11. 17)
_BV() : bit value 특정 비트 플래그의 값을 검사하기 위한 비트마스크를 만드는 매크로
예) 1 << TXC =====> _BV(TXC)
while( !(UCSRA & (1<<TXC) ); ====> while( !(UCSRA & _BV(TXC) );
sei() : 전역 인터럽트 활성화, 어셈블리 명령어 sei와 동일함.
cli() : 전역 인터럽트 비활성화, 어셈블리 명령어 cli와 동일함.
bit_is_set(sfr, bit) : sfr레지스터의 bit가 set이면 참(0이아닌 값).
bit_is_clear(sfr, bit) : sfr레지스터의 bit가 clear면 참(0이아닌 값).
loop_until_bit_is_set(sfr, bit) : sfr레지스터의 bit가 set 될 때까지 대기. (while 루프)
loop_until_bit_is_clear(sfr, bit) : sfr레지스터의 bit가 clear 될 때까지 대기. (while 루프)
○ 헤더파일
avr/io.h : device에 관련된 기본적인 정의 (추가 : 2010. 4. 23)
컴파일러 옵션 '-mmc='으로 전달된 avr에 대한 적절한 입출력 관련된 정의들을 불러들인다.
<avr/ioXXXX.h>를 include함으로써 이 작업을 수행한다. 모든 AVR에 공통적인 레지스터는
<avr/common.h>에 정의 되어 있고, avr/io.h에서 읽어들인다.
읽어들이는 헤더파일
<avr/sfr_defs.h>
<avr/portpins.h>
<avr/common.h>
<avr/version.h>
avr/boot.h : 부트로더 지원 (추가 : 2010. 4. 16)
부트로더에서 제공하는 기능들에 대한 C 언어 지원 매크로, 함수, 상수
전역 인터럽트는 자동으로 disable 되지 않고 프로그래머가 결정하도록 한다.
페이지 기록하는 예제 코드도 포함되어 있다.
avr/pgmspace.h : flash memory에 접근 기능 제공 (추가 : 2010. 4. 16)
장치의 플래시 메모리 영역에 저장된 데이터에 접근하기 위한 인터페이스를 제공한다.
대상 장치는 LPM이나 ELPM 명령을 지원해야 한다.
IAR C의 헤더파일과의 호환성을 위해 제공되지만 100% 호환되지는 않는다.
ram에 기초한 문자열을 다루는 경우에는 avr_string에서 설명하는 표준 문자열 함수를 사용.
inttypes.h : 정확한 길이의 정수형 타입 정의 (추가 : 2010. 4. 16)
그 길이를 정확하게 사용할 필요가 있는 정수형 데이터를 정의하는 stdint.h를 확장한다.
"far" 포인터(64kbytes 초과하는 주소를 위한), printf/scanf에 사용하는 formatting options
avr/interrupt.h : 인터럽트 서비스 루틴 작성에 필요한 매크로 지원(추가 : 2010. 5. 4)
C언어는 하드웨어에 종속적이지 않은 추상화된 언어이기 때문에 하드웨어에 따라서 달라지
는 인터럽트 서비스 루틴을 직접 지원할 수가 없다. 따라서, AVR 컴파일러에 따라서 인터럽트
지원 방법을 나름대로의 방식으로 구현한다. avr-gcc에서는 인터럽트 벡터 테이블이 미리
정의된 특정 이름을 가지고 있다.
util/setbaud.h : 보오레이트 계산에 필요한 매크로 지원(추가 : 2010. 5. 11)
F_CPU(시스템 클럭), BAUD_TOL(허용 오차율%, 기본값은 2%), BAUD(보오레이트)의 3개의
상수를 제공 받아서 UBRRH_VALUE, UBRRL_VALUE, USE_2X(2배속 사용여부)를 전처리기에
서 계산해서 상수로 쓸 수 있도록 한다.
#undef BAUD // 이전에 BAUD를 define 했다면
컴파일러 오류를 피한다. |
avr/eeprom.h : EEPROM에 읽기/쓰기 위한 지원 매크로 및 함수 지원(추가 : 2010. 5. 13)
EEPROM이 사용 가능한가를 알아보는 eeprom_is_ready()와 사용 가능할 때까지를 기다리는
eeprom_busy_wait()를 제공하고, EEPROM에 읽고, 쓰는 eeprom_read_XXX, eeprom_write_XX
제공. 단, 모든 함수는 폴링을 위한 인터페이스로서 인터럽트 기반 처리를 위해서는 스스로
구현해야 한다.
stdio.h : C언어의 표준 입출력 함수를 제공 (추가 : 2010. 5. 14)
AVR과 MCU는 제한된 기능으로 인해서 모든 표준 IO 인터페이스가 구현될 수가 없다.
printf와 scanf를 AVR의 특정 IO로 연결 시키고 싶다면 입출력 함수를 작성해서 이 함수를
fdev_setup_stream()을 이용해서 stream을 생성/등록하고 이것을 stdin, stdout, stderr과
연결하면 된다.
'Nobody tells you about.. > ATmega128(IM)' 카테고리의 다른 글
Tips and Tricks to Optimize Your C Code for 8-bit AVR Microcontrollers (0) | 2012.12.14 |
---|---|
[ISR] 인터럽트 서비스 루틴 (0) | 2012.12.03 |
[인공호흡법] ATmega128 XTAL1 핀에 외부 클럭인가 (0) | 2012.11.26 |
[FUSE BIT] 퓨즈비트에 대한 이해 -퍼온글 (0) | 2012.11.24 |
AVR Studio 다운로드 링크. (0) | 2012.03.10 |