Application Note of 8-bit Atmel Microcontrollers.



Atmel AVR4027: Tips and Tricks to Optimize Your C Code for 8-bit AVR Microcontrollers.


Features

• Atmel® AVR® core and Atmel AVR GCC introduction

• Tips and tricks to reduce code size

• Tips and tricks to reduce execution time

• Examples application



Introduction

AVR core is an advanced RISC architecture tuned for C code. It ensures the

development of good products with more features at less cost.

When talking about optimization, we usually refer to two aspects: code size and

code speed. Nowadays, C compilers have different optimization options to help

developers get an efficient code on either size or speed.

However, good C coding gives more opportunities for compilers to optimize the

code as desired. And in some cases, optimizing for one of the two aspects affects

or even causes degradation in the other, so a developer has to balance the two

according to their specific needs. An understanding of some tips and tricks about C

coding for an 8-bit AVR helps the developers to know where to focus in improving

code efficiency.

In this application note, the tips are based on avr-gcc (C compiler). However these

tips could be implemented in other compilers or with similar compiler options, and

vice versa.





avr_optimize c code.pdf


ISR(INT0_vect){}

ISR(INT1_vect){}

ISR(INT2_vect){}

ISR(INT3_vect){}

ISR(INT4_vect){}

ISR(INT5_vect){}

ISR(INT6_vect){}

ISR(INT7_vect){}

 

ISR(TIMER0_OVF_vect){}

ISR(TIMER0_COMP_vect){}



ISR(TIMER1_OVF_vect){}

ISR(TIMER1_CAPT_vect){}

ISR(TIMER1_COMPA_vect){}

ISR(TIMER1_COMPB_vect){}

ISR(TIMER1_COMPC_vect){}



ISR(TIMER2_OVF_vect){}

ISR(TIMER2_COMP_vect){}



ISR(TIMER3_OVF_vect){}

ISR(TIMER3_CAPT_vect){}

ISR(TIMER3_COMPA_vect){}

ISR(TIMER3_COMPB_vect){}

ISR(TIMER3_COMPC_vect){}


ISR(USART0_RX_vect){}

ISR(USART0_UDRE_vect){}

ISR(USART0_TX_vect){}


ISR(USART1_RX_vect){}

ISR(USART1_UDRE_vect){}

ISR(USART1_TX_vect){}



ISR(ADC_vect){}

ISR(ANALOG_COMP_vect){}

ISR(EE_READY_vect){}

ISR(SPI_STC_vect){}

ISR(TWI_vect){}

ISR(SPM_READY_vect){}

초보시절 ATmega의 FUSE셋팅을 잘못입력하여 클럭을 죽여버리는경우가 종종 생깁니다.


이런경우 ATmega128에 외부클럭 1Mhz를 Xtal1핀(24)에 인가하면 AVR studio의  퓨즈세팅에 다시 진입할수 있습니다.


결론적으로 인공호흡적은 외부클럭 1Mhz를 어떻게 만들어 낼것인가라는 문제로 귀결됩니다.


1. 만약 펑션제너레이터가 있으시다면 문제는 간단합니다. 그냥 입력하십시요. (GND는 공통으로 물려주십시요) 

2. 다른 정상적인 ATmega128로 타이머/카운터로 1Mhz의 신호가 출력되도록 분주시켜서 클럭을 인가합니다.

3. OSC 1~4Mhz를 구매하여 Atmega128의 Xtal1핀에 인가합니다.



[구구절절설명하는 인공호흡개념..]


인공호흡이라는 개념을 이해하기 위해선 ATmega128과 같은 MCU는 일종의 심장을 가지고 있다고 생각하시면 쉽습니다. MCU의 모든 명령은 클럭과 함께 수행됩니다. 또한 ATmega는 초기 공장에서 출하될때 1Mhz의 내부클럭으로 설정되어 자체내에 가지고있는 오실레이터로 클럭을 만들어서 사용합니다. 문제는 내가 외부적으로 크리스탈/레조레이터나 오실레이터로 아트메가의 XTAL1~2핀에 클럭을 인가해주었때 발생합니다. 외부 클럭인가후 AVR Studio의 FUST셋팅으로 지금 ATmega가 사용할 클럭이 "외부클럭신호이며 어느정도의 속도를 지니고있다"라고 설정을 하게 됩니다만..이때 외부클럭회로가 틀렸거나 설정값과 다른 주파수의 클럭신호가 입력되고 있다면 ATmega는 클럭을 잃어버리고 ISP,JTAG등..프로그램주입 및 PC를 통해서 진입할수가 없게 됩니다. 당연히 진입할때 클럭신호를 사용하여 명령을 주고 받는데 이것이 꼬이게 됨으로 일어나게 되는 현상입니다.  

그래서 공장출하 당시의 클럭주파수인 1Mhz 신호를 XTAL1핀에만 인가하게되면 초기상태의 내부1Mhz OSC로 동작하도록 다시 설정할수가 있으며 이를 우리는 "인공호흡법"과 유사하여 그렇게 부르고 있습니다.


[순서]

1. AVR studio의 FUSE셋팅 설정화면으로 들어갑니다 (당연히 다른 컴파일러도 가능하겠죠?)

2. 죽어있는 ATmega에 외부클럭 1MHz를 인가합니다 (XTAL1핀에만, 입력클럭소소의 GND는 ATmega와 같아야겠죠?)

3. FUSE셋팅의 클럭설정을 내부 1MHz OSC로 동작하도록 설정(Program)하고 외부클럭을 제거합니다.

4. 끝났습니다. 이제 다시 ATmega는 내부클럭을 사용하고있습니다. 다음번에 실수하지 않으시면 됩니다~!


물론 이렇게 하여도..살아나지(?)않는 ATmega도 존재합니다...어쩔수없이..그런경우는..이미 운명하셨다고 생각하시면 됩니다.. 



아래의 자료는 뉴티씨사의 외부 오실레이터를 이용한 ATmega 인공호흡법 자료입니다. 참고하세요.




AVR 기초강좌-인공호흡편.pdf


본문스크랩 http://worynim.tistory.com/entry/Fuse-bit


처음에 퓨즈비트를 공부할때 혹시나 잘못건드리면 망가진다는 얘기에 두근두근 하면서 퓨즈비트를 건드린 기억이 있다.

퓨즈비트는 시스템의 설정을 하는 비트로 mega128 에서는 3바이트로  되어 있다.
클럭을 설정한다거나 워치독타이머를 허용한다거나. jtag 허용한다거나.. 부트로더 관련 설정을 한다거나.. 등등등의 역할 을 한다.

시중의 여러 책들을 보면 아주 잘 설명이 되어 있으므로 이번 글에서는 간단히 설정하는 법을 알아 보자.

우선.. mega128을 기준으로 한다.
퓨즈비트를 설정할때 가장 중요한 것은.. 클럭이다. 클럭설정을 잘 못하면..  아래와 같은 창이 뜨면서 인공호흡을 해야 하는 상황이 온다.

(연결이나 isp 에 아무 문제가 없는데 아래처럼 뜬다면 아주 귀찮다.)



퓨즈비트를 하나하나 보면.. 아래와 같다.
대부분 체크 해제 해 놓고 쓰면 된다.
단 클럭 설정은 꼭 제대로 해야 인식이 안되는 일을 피할 수 있다.


여기서 좀더 부연 설명을 하자면..
JTAG 을 사용한다면.. JTAGEN 을 체크 하면 된다.
단 한가지 알고 있어야 할것은 JTAGEN 을 체크 하면 JTAG 핀들은 io핀으로는 사용할 수 없다.
부트로더를 사용한다면 BOOTSZ와 BOOTRST 를 체크 해주자. 부트로더 안쓴다면 체크해제

CKOPT 는 발진회로의 증폭기 동작 모드를 정하는 것인데..
체크하게 되면 발진회로의 출력전압이 커져서 노이즈에 좀더 강해진다. 단 소비전력이 커진다. 잘 모르겠으면 체크해제 하자.

 BOD 설정은 (Brown Out Detector) 간단히 설명해서 리셋이 걸릴때의 전압을 설정 하는 것이다.
2.7V 와 4.0V 로 설정 가능하다
만약 2.7V로 설정하고 BODEN(BOD허용) 체크하면
시스템 전원이2.7V 이하로 떨어지면 리셋이 걸린다. 특별히 BOD 기능을 사용해야 하는 것이 아니면 체크해제 하자.

중요한 클럭 설정...
Int 로 시작하면 내부클럭
Ext 로 시작하면 외부클럭 이다.
초기값은 내부 1MHz 로 되어 있다.
외부에 크리스탈이나 오실레이터 등을 안달았다면..  빨간 박스 안의 부분에서 설정해 주자.
Start-up time 시스템 클럭이 안정되게 발생할 수 있도록 CPU 가 명령을 수행하기 전에 기다려주는 클럭이다. 그 다음에 시간은 리셋이 걸렸을때 추가되는 시간이다.
잘 모르겠으면 64ms 를 선택하자.


외부에 크리스탈을 달았다면.. Ext. Crystal/Resonator  에서 선택하면 되는데.. 

외부 클럭이
0.9Mhz 이하면 Low Freq 을
0.9Mhz~3Mhz 면 Medium 을 선택
3Mhz 이상이면 High 을 선택하고

레조네이터면 Start-up time: 1K CK 를 선택
크리스탈이면 Start-up time: 16K CK 를 선택
추가 지연 시간은 잘 모르겠으면 64ms 를 선택하자.

잘 모르겠으면 3Mhz 이상의 크리스탈을 달았다면 그냥 가장 아래에 있는 것을 고르시면 별 문제 없다.


참고로 아래와 같은 ISP 모드 에러창이 뜨는 상황과 해결책을 알아보자.  

1. ISP 핀 연결이 정확하게 되어 있지 않을때
선을 반대로 꼽았다던가.. 그러면 저런 에러가 뜬다. 
 >>선을 제대로 연결하자

2. AVR 의 ISP핀(SPI핀)들을 다른 디바이스와 공유할때  
ISP로 다운로드 해야 하는데.. 이 핀에 다른 디바이스(다른 IC 나 저항이나 등등등) 이 물려있다면.. 신호가 충돌해서 저런 에러가 뜰 수 있다. 
>> ISP 신호선은 다이렉트로 다른 디바이스로 가는 신호선들은 1K옴 정도의 직렬저항을 달아보자. 안되면 다른 포트로 옮기자.

3. ISP 주파수가  AVR의 시스템주파수(클럭)의 1/4 이상일때
>> 이상이라면 이하로 설정해 주면 됩니다. 컴파일러에서 설정해 주는 옵션이 있다. (230K 정도로 설정해서 해보자.)

4. 퓨즈비트가 잘못 설정 되어있을 때 
>> 인공호흡을 해서 퓨즈비트를 제대로 설정해 준다.

좋은자료가 보여서 프랑켄님의 블로그에서 담아왔습니다! 주소는 아래와 같습니다!

http://blog.naver.com/PostList.nhn?from=postList&blogId=ranken&categoryNo=43&currentPage=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 했다면 컴파일러 오류를 피한다.
 #define BAUD 38400
 #include <util/setbaud.h>
   UBRRH = UBRRH_VALUE;
   UBRRL = UBRRL_VALUE;
 #if USE_2X
   UCSRA |= _BV(U2X);
 #else
   UCSRA &= ~_BV(U2X);
 #endif

 

  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과

  연결하면 된다.

AVR Studio 5 installer
(390 MB, revision 5.0.1223, updated 11/11)
This installer contains AVR Studio 5 only and requires that you have already installed Visual Studio Shell (Isolated mode) 2010 and .NET 4.0.

Select this installer if you have installed AVR Studio 5 beta already and only need to upgrade.

NOTE:
AVR Studio 5.0 cannot be upgraded from its beta versions. Please uninstall any beta versions of AVR Studio 5.0 from Add/Remove programs and reinstall.

http://www.atmel.com/dyn/resources/prod_documents/as5installer-small-5.0.1223.exe

 

 

 

AVR Studio 5 installer (includes VSS and .NET)
(605 MB, revision 5.0.1223, updated 11/11)
This installer contains AVR Studio 5, Visual Studio Shell (Isolated mode) 2010 and .NET 4.0.

Select this installer if you need all three or are unsure of what installer to use.

NOTE:
AVR Studio 5.0 cannot be upgraded from its beta versions. Please uninstall any beta versions of AVR Studio 5.0 from Add/Remove programs and reinstall.

http://www.atmel.com/dyn/resources/prod_documents/as5installer-full-5.0.1223.exe

 

 

 

AVR Studio 5 - AVR Software Framework Update
(222 MB, revision 2.8.1, updated 10/11)
AVR Software Framework update for AVR Studio 5.
http://www.atmel.com/dyn/resources/prod_documents/AVRStudio5-ASF-Update-2.8.1.76.exe

 

 

 

AVR Studio 5 installer (includes VSS and .NET)
(602MB, revision 5.0, updated 5/11)
This installer contains AVR Studio 5, Visual Studio Shell (Isolated mode) 2010 and .NET 4.0.

Select this installer if you need all three or are unsure of what installer to use.

NOTE:
AVR Studio 5.0 cannot be upgraded from its beta versions.
Please uninstall any beta versions of AVR Studio 5.0 from Add/Remove programs and reistall.

http://www.atmel.com/dyn/resources/prod_documents/as5installer-5.0.1163-full.exe

 

 

 

AVR Studio 5 installer
(387 MB, revision 5.0, updated 5/11)
This installer contains AVR Studio 5 only and requires that you have already installed Visual Studio Shell (Isolated mode) 2010 and .NET 4.0.

Select this installer if you need all three or are unsure of what installer to use.

NOTE:
AVR Studio 5.0 cannot be upgraded from its beta versions.
Please uninstall any beta versions of AVR Studio 5.0 from Add/Remove programs and reistall.
http://www.atmel.com/dyn/resources/prod_documents/as5installer-5.0.1163-small.exe

 

 

 

AVR Studio 5 beta (522 MB, revision 5.0, updated 3/11)

See AVR Studio 5.0 Release Notes for more details. (Release Note, 12 pages, revision 5.0, updated 3/11)

http://www.atmel.com/dyn/resources/prod_documents/avrstudio5.0.beta.exe

 

 

 

AVR Studio 4.18 SP3 (b716) (31 MB, updated 9/10)

New device support since the release of AVR Studio 4.18:
See Release Notes 4.18 SP3 for more details.

http://www.atmel.com/dyn/resources/prod_documents/AVRStudio4.18SP3.exe

 

 

 

AVR Studio 4.18 SP2 (b700) (28 MB, updated 2/10)

New device support since the release of AVR Studio 4.18:
See Release Notes 4.18 SP2 for more details.

http://www.atmel.com/dyn/resources/prod_documents/AVRStudio4.18SP2.exe

 

 

 

AVR Studio 4.18 SP1 (build 692) (28 MB, updated 12/09)

New device support since the release of AVR Studio 4.18:
See Release Notes 4.18 SP1 for more details.

http://www.atmel.com/dyn/resources/prod_documents/AVRStudio4.18SP1.exe

 

 

 

AVR Studio 4.18 (build 684) (116 MB, updated 11/09)
AVR Studio 4.18 includes new device support and numerous overall enhancements;
QT600 support in programming dialog in AVR Studio, AVR Dragon support for all AVR 8-bit devices including XMEGA, Programming and debugging within AVR Studio, command line software support for ELF production file format, and button for starting AVR32 Studio.

http://www.atmel.com/dyn/resources/prod_documents/AvrStudio4Setup.exe

 

 

 

AVR Studio 4.17 (build 666) (112 MB, updated 7/09)

Full AVR ONE! 8-bit support - both programming and debugging, AVR Battery Studio version 1.02, JTAGICE mkII command line SW with support for ELF production file format, and STK500 command line SW with support for ELF production file format.

http://www.atmel.com/dyn/resources/prod_documents/AvrStudio417Setup.exe

 

 

 

AVR Studio 4.16 SP1 (build 638) (34 MB, updated 5/09)

New device support since the release of AVR Studio 4.16:
ATxmega16D4, ATxmega32D4, ATxmega64D3, ATxmega128D3, ATxmega256D3

New Features
AVR ISP mkII command line SW support for XMEGA device family.

http://www.atmel.com/dyn/resources/prod_documents/AVRStudio4.16SP1.exe

 

 

 

AVR Studio 4.16 (build 628) (126 MB, updated 2/09)
AVR Studio 4.16 includes new device support and numerous overall enhancements;
AVR QTouch Studio, STK600 support for multiple socket/routing card combinations, Windows Error Reporting (WER) system activated, and JTAGICE mkII command line SW support for XMEGA device family.

http://www.atmel.com/dyn/resources/prod_documents/AvrStudio416Setup.exe

 

 

 

AVR Studio 4.15 (build 623) (94 MB, updated 11/08)
AVR Studio 4.15 includes new device support and numerous overall enhancements;
Support for the new AVR ONE! on-chip debugging and programming tool. Introducing Live debug that enables you to attach/detach to running processes (AVR ONE! feature only). AVR Battery Studio v1.0. Front-end to the SB200/201 Single and dual cell Smart Battery kit.
 
AVR Studio 4.14 (build 589) (89 MB, updated 4/08)
AVR Studio 4.14 includes new device support and numerous overall enhancements;
Support for the new XMEGA device family, full support for 32-bit and 64 bit versions of Vista, AVR Wireless Services application supporting the AVR Raven Kit
See release notes for more details. 
 
AVR Studio 4.13 SP2 (build 571) (45 MB, updated 12/07)
http://www.atmel.com/dyn/resources/prod_documents/AVRStudio4.13SP2.exe

 

AVR Studio 4.13 SP1 (build 557) (37 MB, updated 9/07)
http://www.atmel.com/dyn/resources/prod_documents/aStudio413SP1b557.exe

 

AVR Studio 4.13 (build 528) (73 MB, updated 03/07)
AVR Studio 4.13 includes new device support and numerous overall enhancements;
Complete device support for AVR Dragon, 2 new I/O- and Processor views, WinAVR and 32- and 64-bit Windows(R) support!
See release notes for more details.

출처  : http://blog.naver.com/ryumr?Redirect=Log&logNo=110074109653

+ Recent posts