컴파일러 |
비트표현 |
코드비젼 |
bit a,b,c; // 비트변수 선언 PORTA.0=0; // 출력 PORTA.0=1; a=PORTA.0; // 입력 b=PORTA.1; PORTA.0= ~PORTA.0; //토글 if(PORTB.0)PORTA.0=0; if(!PORTB.0)PORTA.0=1; |
AVR EDIT & AVRSTUDIO ICC IAR |
비트 변수 선언 지원 안함 비트변수는 사용자가 구조체로 쓰기도 하지만, 불편 // bit 매크로 포트 비트 조작 지원 안함 PORTA&=0xFE; // 0 출력 PORTA|=0x01; // 1 출력 출력포트 체크 및 출력 if(PORTB&0x01) PORTA&=0xFE; if(!(PORTB&0x01)) PORTA|=0x01; 입력포트 체크 및 출력 if(PINB&0x01) PORTA&=0xFE; if(!(PINB&0x01)) PORTA|=0x01;
|
비트 입출력 비교 |
코드비젼 |
AVR EDIT & AVRSTUDIO ICC IAR |
if( 입력핀==0){} // PA.0==0? |
if(!PINA.0){}; |
if(!(PINA&0x01)){}; |
if( 입력핀==1){} // PA.0==1? |
if(PINA.0){}; |
if(PINA&0x01){}; |
출력핀=0; // PB.0=0 |
PORTB.0=0; |
PORTB&=0xFE; |
출력핀=1; // PB.0=1 |
PORTB.0=1; |
PORTB|=0x01; |
MCU에서 비트 제어를 제공 한다고 하면 컴파일러도 반드시 비트제어 표현이 가능 해야 합니다.
마스크 처리에 의한 비트제어 보다
직접 비트제어를 하는 것이 사용자 입장에서 편리합니다.
만약 포트 A.0을 읽어서 0이면 포트 B.0에 포트 A.0의 값을 반전 시켜서 넣는다고 하면
코드비젼 :
PORTB.0=~PINA.0
다른컴파일러 :
if(PINA&0x01){ PORTB&=0xFE; }
else PORTB|=0x01;
코드비젼 코드가 훨씬 간결 함을 알 수 있습니다.
컴파일러 |
volatile |
코드비젼 |
사용 안함 |
AVR EDIT & AVRSTUDIO ICC IAR |
인터럽트에서 사용하는 전역 변수는 volatile 형을 사용해야 합니다. 번거로우므로 전역변수는 모두 volatile 형으로 처리 하는 것이 편합니다. 예) volatile unsigned char i=0;
|
컴파일러 |
128 헤더파일 |
코드비젼 |
#include <mega128.h> |
AVR EDIT & AVRSTUDIO |
#include <avr/io.h> |
ICC |
#include <iom128v.h> |
IAR |
#include<iom128.h> #include <ina90.h> |
컴파일러 |
인터럽트 |
코드비젼 |
interrupt [EXT_INT0] void ext_int0_isr(void){} interrupt [EXT_INT1] void ext_int1_isr(void){} interrupt [EXT_INT2] void ext_int2_isr(void){} interrupt [EXT_INT3] void ext_int3_isr(void){} interrupt [EXT_INT4] void ext_int4_isr(void){} interrupt [EXT_INT5] void ext_int5_isr(void){} interrupt [EXT_INT6] void ext_int6_isr(void){} interrupt [EXT_INT7] void ext_int7_isr(void){} interrupt [TIM0_OVF] void timer0_ovf_isr(void){} interrupt [TIM0_COMP] void timer0_comp_isr(void){ } interrupt [TIM1_OVF] void timer1_ovf_isr(void){} interrupt [TIM1_CAPT] void timer1_capt_isr(void){ } interrupt [TIM1_COMPA] void timer1_compa_isr(void){ } interrupt [TIM1_COMPB] void timer1_compb_isr(void){ } interrupt [TIM1_COMPC] void timer1_compc_isr(void){ } interrupt [TIM2_OVF] void timer2_ovf_isr(void){} interrupt [TIM2_COMP] void timer2_comp_isr(void){ } interrupt [TIM3_OVF] void timer3_ovf_isr(void){} interrupt [TIM3_CAPT] void timer3_capt_isr(void){ } interrupt [TIM3_COMPA] void timer3_compa_isr(void){ } interrupt [TIM3_COMPB] void timer3_compb_isr(void){ } interrupt [TIM3_COMPC] void timer3_compc_isr(void){ } interrupt [USART0_RXC] void usart0_rx_isr(void){} interrupt [USART0_DRE] void usart0_dre_isr(void){} interrupt [USART0_TXC] void usart0_tx_isr(void){} interrupt [USART1_RXC] void usart1_rx_isr(void){} interrupt [USART1_DRE] void usart1_dre_isr(void){} i nterrupt [USART1_TXC] void usart1_tx_isr(void){} interrupt [ADC_INT] void adc_isr(void){} interrupt [ANA_COMP] void ana_comp_isr(void){} interrupt [EE_RDY] void ee_rdy_isr(void){} interrupt [SPI_STC] void spi_isr(void){} interrupt [TWI] void twi_isr(void){} interrupt [SPM_RDY] void spm_rdy_isr(void){} |
AVR EDIT & AVRSTUDIO #include <avr/interrupt.h> |
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(USART0_RX_vect){} ISR(USART1_RX_vect){} ISR(ADC_vect){} |
ICC |
#pragma interrupt_handler ext_int0_isr: iv_INT0 #pragma interrupt_handler timer0_ovf_isr: iv_TIMER0_OVF #pragma interrupt_handler timer1_ovf_isr: iv_TIMER1_OVF #pragma interrupt_handler timer2_ovf_isr: iv_TIMER2_OVF #pragma interrupt_handler timer3_ovf_isr: iv_TIMER3_OVF #pragma interrupt_handler usart0_rx_isr: iv_USART0_RX #pragma interrupt_handler usart1_rx_isr: iv_USART1_RX #pragma interrupt_handler adc_isr: iv_ADC |
IAR |
#pragma pack=INT0_vect __interrupt void INT0_interrupt(void){ } #pragma pack=TIMER3_CAPT_vect #pragma pack=USART1_RXC_vect #pragma pack=ADC_vect #pragma pack=ANA_COMP_vect #pragma pack=SPI_STC_vect #pragma pack=TWI_vect #pragma pack=EE_RDY_vect #pragma pack=SPM_RDY_vect |
|
컴파일러 |
인터럽트 허가/금지 |
코드비젼 |
#asm("sei") #asm("cli") |
AVR EDIT & AVRSTUDIO |
sei(); cli(); |
ICC |
SEI(); CLI(); |
IAR |
__enable_interrupt(); __disable_interrupt(); |
컴파일러 |
메인함수 |
코드비젼 |
void main(void){} |
AVR EDIT & AVRSTUDIO |
int main(void){} |
ICC |
void main(void){} |
IAR |
void main(void){} |
컴파일러 |
FLASH |
코드비젼 |
flash table[] = { 1, 2, 3 }; c= table[x]; i= table[x]; |
AVR EDIT & AVRSTUDIO |
prog_uchar table[] = { 1, 2, 3 }; c=pgm_read_byte(&table[x]); i=pgm_read_word(&table[x]); |
ICC |
__flash int table[] = { 1, 2, 3 }; |
IAR |
__flash char str[] = {"abcdefg"}; __flash char str1[]={"12345"}; __flash char str2[]={"23456"}; char __flash * __flash *strP; flash fdata[][100]={{0x02,0xf0,.......},{0x00,....}}; p = &fdata[0][0]; |
컴파일러 |
내부 EEPROM |
코드비젼 |
eeprom int foo = 0x1234; int i=3; foo=i; i-foo; |
AVR EDIT & AVRSTUDIO #include <avr/eeprom.h> |
eeprom_write_dword((uint32_t*)0, i); i= eeprom_read_dword((uint32_t*)0); eeprom_write_byte((uint8_t*)EE_ADD, c); |
ICC |
//Initializing EEPROM //Accessing EEPROM EEPROMWriteBytes(int location, void *ptr, int size) |
IAR |
__eeprom int i; |
컴파일러 |
delay |
코드비젼 #include <delay.h> |
delay_us(1000); // 1msec delay_ms(1000); // 1sec |
AVR EDIT & AVRSTUDIO # define F_CPU 16000000UL #include <util/delay.h> |
_delay_us(1000); // 1msec _delay_ms(1000); // 1sec |
ICC |
|
IAR |
|
mega128 위주로 작성된 자료이므로 다른 다비이스에서는 내용이 다를 수 있습니다.
디바이스 헤더 파일 참고해서 맞는 것을 사용하세요
컴파일러를 모두 사용하는 것이 아니므로 일부 틀린 내용이 있을 수 있습니다.
또, 컴파일러 버전에 따라서 계속 변경 되는 부분이 발생 합니다.
잘못된 부분 / 빠진 부분/ 버전에 따라서 달라진 부분
아래 댓글로 알려주시면 수정 하겠습니다. ^^
'Study > 8-bit MCUs' 카테고리의 다른 글
B/T LED Control circuit (0) | 2017.04.10 |
---|---|
led 제어 현재 상황 (0) | 2016.02.26 |
pwm duty (0) | 2015.06.11 |
Atmega128을 이용하여 Duty 50%, 10[Khz] Clock을 출력하는 방법 (0) | 2015.06.11 |
Atmega128 타이머 참고 (0) | 2015.06.09 |