CodeVisionAVR
C ÄÄÆÄÀÏ·¯ ¿äÁ¡ Á¤¸®
¡ß
CodeVisionAVR Ư¡
-
Atmel AVR¿ë ÅëÇÕ È¯°æ C ÄÄÆÄÀÏ·¯.
ÅëÇÕ
ȯ°æ ³»¿¡ ¿©·¯ °¡Áö ISP ±â´É Æ÷ÇÔ.
ÅëÇÕ
ȯ°æ ³»¿¡ ºñµ¿±â Åë½Å Å͹̳Π±â´É
³»Àå.
-
À©µµ¿ì 95, 98, NT4.0, 2000 ȯ°æ¿¡¼
µ¿ÀÛ
-
»ý¼ºµÈ COFFÆÄÀÏÀº AVR Studio¸¦ »ç¿ëÇÏ¿©
¼Ò½º ·¹º§ µð¹ö±ë °¡´É.
-
Ç¥ÁØ ¶óÀ̺귯¸® ¿Ü¿¡ ¾Æ·¡ÀÇ ¿©·¯
°¡Áö ÁÖº¯ ¼ÒÀÚ ¶óÀ̺귯¸® Æ÷ÇÔ
--
¹®ÀÚÇü LCD ¸ðµâ
--
Philips I2C ¹ö½º
--
¿Âµµ ¼¾¼ ¼ÒÀÚ(LM75, DS1820)
--
Real Time Clock ¼ÒÀÚ Áö¿ø(PCF8563,PCF8583,
DS1302, DS1307)
--
Dallas 1 Wire ÇÁ·ÎÅäÄÝ
--
Thermometer/Thermostat (ds1621)
--
SPI
--
Delay ÇÔ¼ö
--
Power management
-
ÀÚµ¿ ¼Ò½º »ý¼º ±â´É ³»Àå
¡ß
º¯¼ö / ÇÔ¼ö / ·¹º§ÀÇ À̸§(Identifiers)
ÁöÁ¤
-
¾ËÆÄºª ¹®ÀÚ(A..Z, a..z)¿Í ¼ýÀÚ(0¡¦9)
±×¸®°í underscore(_)¹®ÀÚ »ç¿ë °¡´É.
-
½ÃÀÛÀº ¾ËÆÄºª ¹®ÀÚ³ª underscore·Î
»ç¿ë °¡´É.
-
´ë¼Ò¹®ÀÚ ±¸ºÐ ÀÖÀ½.
-
ÃÖ´ë 32¹®ÀÚ±îÁö »ç¿ë °¡´É.
¡ß
ÁÖ¼®(Comments) ó¸®
ÁÖ¼®
½ÃÀÛ ¡°/*¡±
ÁÖ¼®
³¡ ¡°*/¡±
¿¹:
/*
À̰ÍÀº ÁÖ¼® ÀÔ´Ï´Ù */
ÇÑ
ÁÙ ÁÖ¼® ó¸®: ¡°//¡±
¿¹:
//
À̰͵µ ÁÖ¼®ÀÔ´Ï´Ù.
¡ß
Àüó¸®(Preprocessor)
¤ýÆÄÀÏ
Æ÷ÇÔ Ã³¸®:
#include
<file name> /*
ÄÄÆÄÀÏ·¯ ¼³Ä¡ »ç¿ë µð·ºÅ͸®¿¡¼
ÂüÁ¶ */
#include
¡°file name¡± /*
ÇöÀç ÀÛ¾÷ µð·ºÅ͸®¿¡¼ ÂüÁ¶ */
¤ýmacro
define:
#define
ALFA 0xff /*
ALFA ½Éº¼À» 0xff·Î µ¿ÀÏ Ã³¸® */
/*
¼Ò½º ¹®¿¡¼ ALFA¸¦ ¸ðµÎ 0xff·Î ÄÄÆÄÀÏ
ó¸® ÇÔ */
¤ýÆÄ¶ó¹ÌÅ͸¦
°¡Áú ¼ö ÀÖÀ½:
#define
SUM(a,b) a+b
int
i=SUM(2,3);
/*
i=2+3;À¸·Î ġȯ ó¸® */
¤ý¸ÅÅ©·Î
ÆÄ¶ó¹ÌÅÍ¿¡ #À» »ç¿ëÇÏ¸é ¹®ÀÚ¿·Î
ġȯ:
#define
PRINT_MESSAGE(t) printf(#t)
PRINT_MESSAGE(Hello);
/*
printf(¡°Hello¡±)¿Í µ¿ÀÏ Ã³¸® */
¤ýµÎ°³ÀÇ
ÆÄ¶ó¹ÌÅͰ¡ ## ¿¬»êÀÚ·Î Çϳª·Î ÇÕÇØ
Áü:
#define
ALFA(a,b) a ## b
char
ALFA(x,y)=1;
/*
char xy=1; °ú µ¿ÀÏ Ã³¸® */
¤ý¿ª
½½·¡½Ã(\)¸¦ »ç¿ëÇÏ¿© ´ÙÀ½ ÁÙ±îÁö
¿¬Àå:
#define
MESSAGE ¡°This is a very \
long
text¡¦¡±
¤ýdefine
Ãë¼Ò: #undef »ç¿ë
#undef
ALFA
¤ýÁ¶°ÇºÎ
ÄÄÆÄÀÏ Ã³¸® : #ifdef, #ifndef, #else,
#endif
#ifdef
macro_name
[¹®
1 ±×·ì]
#else
/*
option */
[¹®
2 ±×·ì]
#endif
¼³¸í:
¸¸ÀÏ macro_nameÀÌ define µÇ¾î ÀÖÀ¸¸é
[¹® 1 ±×·ì]À» ÄÄÆÄÀÏ Çϰí, ±×·¸Áö
¾ÊÀ¸¸é
[¹®
2±×·ì]À» ÄÄÆÄÀÏ ÇÑ´Ù. ¶Ç ´Ù¸¥ Á¶°ÇºÎ
ÄÄÆÄÀÏ Ã³¸®: #if, #elif, #else,
#endif
#if
expression1
[¹®
1 ±×·ì]
#elif
expression2
[¹®
2 ±×·ì]
#else
[¹®
3 ±×·ì]
#endif
¼³¸í:
¸¸ÀÏ expression1ÀÌ trueÀ̸é [¹®
1 ±×·ì]À» ÄÄÆÄÀÏ Çϰí, ±×·¸Áö ¾Ê°í
¸¸ÀÏ expression2°¡ trueÀ̸é [¹®
2 ±×·ì]À» ÄÄÆÄÀÏ Çϰí, ±× ¿Ü¿¡´Â
[¹® 3 ±×·ì]À» ÄÄÆÄÀÏ ÇÑ´Ù.
¤ý#error
¹®: ÄÄÆÄÀÏÀ» ÁßÁöÇÏ°í ¿¡·¯ ¸Þ½ÃÁö¸¦
Ç¥½Ã.
¿¹:
#error
This is an error!
#pragma
¹®: ÄÄÆÄÀÏ·¯ Ư¼ö Áö½Ã ¹®
#pragma
warn- /*
warning µð½º¾îºí */
#pragma
warn+ /*
warning Àο¡À̺í */
#pragma
opt- /*
ÃÖÀûÈ ¾È ÇÔ */
#pragma
opt+ /*
ÃÖÀûÈ ÇÔ */
#pragma
savereg- /*
·¹Áö½ºÅÍ ÀúÀå ¾È ÇÔ */
#pragma
savereg+ /*
·¹Áö½ºÅÍ ÀúÀå ÇÔ */
#pragma
library mylib.lib /* ¸µÅ©
¶óÀ̺귯¸® ÁöÁ¤ */
¡ß
»ó¼ö(Constants)
2Áø¼ö
: 0b·Î ½ÃÀÛ(¿¹ 0b101001)
16Áø¼ö
: 0x·Î ½ÃÀÛ (¿¹. 0xff)
8Áø¼ö
: 0À¸·Î ½ÃÀÛ (¿¹. 0777)
Unsigned
integer »ó¼ö´Â µÚ¿¡ U»ç¿ë: (¿¹,
10000U)
Long
integer »ó¼ö´Â µÚ¿¡ L»ç¿ë: (¿¹,
99L)
Unsigned
Long integer »ó¼ö´Â µÚ¿¡ UL»ç¿ë:
(¿¹, 99UL)
Floating
point »ó¼ö´Â µÚ¿¡ F»ç¿ë: (¿¹, 1.234F)
¹®ÀÚ
»ó¼ö´Â 1Áß µû¿ÈÇ¥·Î ó¸®: (¿¹, ¡®a¡¯)
¹®ÀÚ¿
»ó¼ö´Â 2Áß µû¿ÈÇ¥·Î ó¸®: (¿¹,
¡°Hello world¡±)
(ÇÔ¼öÀÇ
ÆÄ¶ó¹ÌÅÍ ¾È¿¡ 2Áß µû¿ÈÇ¥ ¹®ÀÚ¿ÀÌ
ÀÖÀ¸¸é FLASH ¸Þ¸ð¸®¿¡ ³õÀÓ.)
Çà·ÄÀº
ÃÖ´ë 8Â÷±îÁö °¡´É
¡ß
º¯¼ö(Variables)
Àü¿ª(global)
º¯¼ö¿Í Áö¿ª(local) º¯¼ö°¡ ÀÖÀ½.
Àü¿ª(global)
º¯¼ö : ÇÔ¼ö ¿Ü°¢¿¡ ¼±¾ð, ÇÁ·Î±×·¥
³»ÀÇ ¸ðµç ÇÔ¼ö¿¡¼ »ç¿ë °¡´É.
Áö¿ª(local)
º¯¼ö : ÇÔ¼ö ³»ºÎ¿¡ ¼±¾ð, ÇØ´ç ÇÔ¼ö
³»¿¡¼¸¸ »ç¿ë °¡´É.
ÃʱâÈÇÏÁö
¾ÊÀº Àü¿ª º¯¼ö´Â ÇÁ·Î±×·¥ Ãʱ⿡
0À¸·Î ÃʱâÈ µÊ.
¿¹:
/*
Àü¿ª º¯¼ö ¼±¾ð */
char
a;
int
b;
long
c = 0x12345678; /*
ÃʱâÈ */
void
main(void){
/*
Áö¿ª º¯¼ö */
char
d;
int
e;
long
f=22222222; /* ÃʱâÈ */
¡¦
}
¡ß
Çà·Ä º¯¼ö: 8 Â÷±îÁö °¡´É, 0ºÎÅÍ
½ÃÀÛ, ÃʱâÈÇÏÁö ¾ÊÀº Àü¿ª Çà·Ä
º¯¼ö °ªÀº 0À¸·Î ÃʱâÈ.
/*
Àü¿ª Çà·Ä º¯¼ö */
int
global_array1[32]; /*
¸ðµç °ªÀÌ 0À¸·Î ÃʱâÈ */
int
global_array2[]={1,2,3};
int
global_array3[4]={1,2,3,4};
char
global_array4[]=¡±This is a string¡±;
int
multidim_array[2,3]={{1,2,3},{4,5,6}};
void
main(void){
/*
Áö¿ª Çà·Ä º¯¼ö */
int
local_array[3]={11,22,33};
¡¦
}
¡ß
static º¯¼ö: Áö¿ª º¯¼ö¶óµµ static
¼±¾ðÀ» ÇÏ¸é °ªÀ» º¸Á¸ÇÒ ¼ö ÀÖ´Ù.
¿¹:
int
alfa(void){
static
int n=1; /*
static º¯¼ö ¼±¾ð */
return
n++;
}
void
main(void){
int
i;
i
= alfa(); /*
return °ª = 1 */
i
= alfa(); /*
return °ª = 2 */
¡¦
}
¡ß
extern ¼±¾ð : ´Ù¸¥ ÆÄÀÏ¿¡ ¼±¾ðµÈ
º¯¼ö´Â extern ¼±¾ðÀ» ÇØ¾ßÇÑ´Ù.
extern
int xyz;
Àü¿ª
º¯¼ö´Â SRAMÀÇ Global Variables ¿µ¿ª¿¡
ÀúÀåµÇ°í, Áö¿ª º¯¼ö´Â SRAMÀÇ Data
Stack ¿µ¿ª¿¡ dynamicÇÏ°Ô ÇÒ´çµÈ´Ù.
¡ß
¿ÜºÎ SRAMÀÇ Æ¯Á¤ ¹øÁö¿¡ Àü¿ª º¯¼ö¸¦
ÁöÁ¤ÇÏ´Â ¹æ¹ý
¿¬»êÀÚ
»ç¿ëÇÏ¿© Àü¿ª º¯¼ö¸¦ ƯÁ¤ SRAM À§Ä¡¿¡
¹èÄ¡ÇÒ ¼ö ÀÖ´Ù.
int
a @0x80 /*
Á¤¼ö º¯¼ö a´Â ¿ÜºÎ SRAM 0x80¿¡ ÇÒ´ç
*/
struct
x {
int
a;
char
c;
}
alfa @0x90 /*
0x90 ¹øÁö¿¡ ±¸Á¶Ã¼ alfa ÇÒ´ç */
¡ß
ºñÆ®(bit) º¯¼ö
ºñÆ®
º¯¼ö´Â ·¹Áö½ºÅÍ R2¿¡¼ R15±îÁö »ç¿ë
°¡´É: ÃÖ´ë 112 ºñÆ®.
¿¹:
bit
alfa=1; /*
bit0 of R2 */
bit
beta; /*
bit1 of R2 */
void
main(void){
if(alfa)
beta != beta;
¡¦
}
ºñÆ®
º¯¼ö Å©±â ÁöÁ¤Àº Project|Configure|C
Compiler|Compilation|Bit Variable
Size¿¡¼ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. °¡´ÉÇÑ
ÀÛ°Ô ÁöÁ¤ÇÏ´Â °ÍÀÌ ÁÁÀ½ (Àü¿ª º¯¼ö¿¡¼
¸¹ÀÌ »ç¿ë °¡´É)
¡ß
I/O ·¹Áö½ºÅÍÀÇ ºñÆ® ´ÜÀ§ ¾×¼¼½º
I/O
·¹Áö½ºÅ͸¦ ºñÆ® ´ÜÀ§·Î ¾×¼¼½º ÇÒ
¼ö ÀÖ´Ù.
¿¹:
DDRA.0
= 1; /*
Port AÀÇ ºñÆ® 0À» Ãâ·Â Æ÷Æ®·Î ÇÔ
*/
DDRA.1
= 0; /*
Port AÀÇ ºñÆ® 1À» ÀÔ·Â Æ÷Æ®·Î ÇÔ
*/
PORTA.0
= 1; /*
Port AÀÇ ºñÆ® 0¿¡ 1 Ãâ·Â */
If(PINA.1){
/*
Port AÀÇ ºñÆ® 1¸¦ ÆÇº°ÇÏ¿© ó¸®
*/
/*
ÄÚµå Ãß°¡ */
}
ÇÁ·Î±×·¥ÀÇ
ÆÇµ¶À» ÁÁ°Ô ÇÏ·Á¸é #defineÀ» »ç¿ëÇÏ¿©
ÀÇ¹Ì ºÎ¿© »ç¿ë.
#define
alarm_input PINA.2
void
main(void){
if(alarm_input)
¡¦
}
¡ß
EEPROM ¾×¼¼½º
AVR
³»ºÎÀÇ EEPROM »ç¿ëÀº Àü¿ª º¯¼ö ¾Õ¿¡
eeprom Ű¿öµå¸¦ »ç¿ëÇÏ¿© °¡´ÉÇÏ´Ù.
¿¹:
eeprom
int alfa=1; /*
Chip ÇÁ·Î±×·¥ ½Ã¿¡ EEPEOM¿¡ 1°ª
ÀúÀå */
eeprom
char beta;
eeprom
long array1[5];
eeprom
char string[]=¡±Hello¡±; /*
Chip ÇÁ·Î±×·¥ ½Ã¿¡ EEPEOM¿¡ ¹®ÀÚ¿
ÀúÀå */
void
main(void){
int
i;
int
eeprom *ptr_to_eeprom; /
EEPROM Æ÷ÀÎÅÍ */
¡¦
alfa
= 0x55; /*
EEPROM¿¡ 0x55 °ª Á÷Á¢ ¾²±â */
ptr_to_eeprom=&alfa;
ptr_to_eeprom=0x55;
/
Æ÷ÀÎÅÍ »ç¿ëÇÏ¿© °£Á¢ÀûÀ¸·Î ¾²±â
*/
i=alfa;
/*
EEPROM¿¡¼ Á÷Á¢ÀûÀ¸·Î °ª Àбâ */
i=*ptr_to_eeprom;
/*
EEPROM¿¡¼ °£Á¢ÀûÀ¸·Î °ª Àбâ */
}
EEPROMÀÇ
Æ÷ÀÎÅÍ´Â Ç×»ó 16ºñÆ®¸¦ »ç¿ëÇÔ.
¡ß
ÀÎÅÍ·´Æ® »ç¿ë Çϱâ
¤ýinterrupt
Ű¿öµå¸¦ »ç¿ë.
¿¹:
¿©±â¼ º¤ÅÍ ¹øÈ£´Â AT90S8515¿¡ ´ëÇÑ
°Í ÀÓ.
interrupt
[2] void external int0(void){ /*
¿ÜºÎ ÀÎÅÍ·´Æ® */
/*
¿©±â¿¡ ó¸® Äڵ带 ³Ö´Â´Ù */
}
interrupt
[8] void timer0 overflow(void){
/* ŸÀ̸Ó0 Overflow
ÀÎÅÍ·´Æ® */
/*
¿©±â¿¡ ó¸® Äڵ带 ³Ö´Â´Ù */
}
ÀÎÅÍ·´Æ®
º¤ÅÍ ¹øÈ£´Â 1ºÎÅÍ ½ÃÀÛ.
ÀÎÅÍ·´Æ®
ó¸® ½ÃÀÛ ºÎºÐ¿¡¼ ÀÚµ¿ÀûÀ¸·Î ·¹Áö½ºÅ͸¦
½ºÅÿ¡ ÀúÀåÇϰí ÀÎÅÍ·´Æ® Á¾·á ½Ã
´Ù½Ã ½ºÅÿ¡¼ ·¹Áö½ºÅͷΠȸº¹ÇØ
³õ´Â´Ù. ÀÚµ¿ÀûÀ¸·Î ÀúÀåÇÏ´Â ·¹Áö½ºÅÍ´Â
R0, R1, R22 ~ R31, SREGÀÌ´Ù. ¸¸ÀÏ
·¹Áö½ºÅ͸¦ ´ëÇÇÇÏ´Â ÀÎÅÍ·´Æ® ó¸®
½Ã°£À» Á¶±ÝÀÌ¶óµµ ´ÜÃàÇϰíÀÚ ÇÏ´Â
°æ¿ì #pragma savereg Áö½ÃÀÚ¸¦ »ç¿ëÇÑ´Ù.
¿¹:
#pragma
savereg- /*
·¹Áö½ºÅÍ ÀúÀå ±â´É OFF */
interrupt
[1] void my_irq(void){
/*
»ç¿ëÇÏ´Â ·¹Áö½ºÅÍ ¸¸ ÀúÀå ¿¹: R30,
R31, SREG ¸¸ »ç¿ëÇÏ´Â °æ¿ì */
#asm
push
r30
push
r31
in
r30, SREG
push
r30
#endasm
/*
¿©±â¿¡ C Äڵ带 ³õÀ½ */
/*
·¹Áö½ºÅÍ SREG, R31, R30 ȸº¹ */
#asm
pop
r30
out
SREG,r30
pop
r31
pop
r30
#endasm
}
#pragma
savereg+ /*
·¹Áö½ºÅÍ ÀúÀå ±â´É ON */
¡ß
¾î¼Àºí¸® ¾ð¾î ÷°¡
#asm
°ú #endasm »ç¿ë
¿¹:
void
delay(unsigned char i){
while(i--){
#asm
nop
nop
#endasm
}
}
´ÙÀ½°ú
°°ÀÌ ÇÑ ÁٷΠǥÇö ÇÒ ¼öµµ ÀÖ´Ù.
#asm(¡°sei¡±)
/*
ÀÎÅÍ·´Æ® Àο¡À̺í */
¾î¼Àºí¸®
·çƾ¿¡¼ R0, R1, R22 ~ R31Àº ÀÚÀ¯·Ó°Ô
»ç¿ëÇÒ ¼ö ÀÖ´Ù. ´Ü ÀÎÅÍ·´Æ® ·çƾ
¾È¿¡¼ »ç¿ë ½Ã¿¡´Â ½ºÅÿ¡ ÀúÀå ¹×
ȸº¹À» ÇØ¾ß ÇÑ´Ù.
¡ß
µô·¹ÀÌ(delay) ÇÔ¼ö »ç¿ë
CodeVisionAVR¿¡¼´Â
ÀÏÁ¤ ½Ã°£ µ¿¾È Áö¿¬ÇÏ´Â 2°³ÀÇ µô·¹ÀÌ
ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.
void
delay_us(unsigned
int n); /*
micro(u) sec ´ÜÀ§ Áö¿¬ ÇÔ¼ö */
void
delay_ms(unsigned
int n); /*
milli(m) sec ´ÜÀ§ Áö¿¬ ÇÔ¼ö */
¿¹:
delay_us(100);
/* 100 usec Áö¿¬
*/
delay_ms(123);
/* 123 msec Áö¿¬ */
µô·¹ÀÌ
ÇÔ¼ö¸¦ »ç¿ëÇϱâ Àü¿¡ delay.h Çì´õ
ÆÄÀÏÀ» Æ÷ÇÔÇØ¾ß µÇ°í, Á¤È®ÇÑ ½Ã°£À»
À§Çؼ´Â Project|Configure|C Compiler
¸Þ´ºÀÇ AVR chip Ŭ·° Á֯ļö°¡ Á¤È®È÷
¼³Á¤µÇ¾î¾ß ÇÑ´Ù.
Áö¿¬
µ¿¾È ÀÎÅÍ·´Æ®°¡ ó¸®µÉ ¼ö ÀÖ°í ÀÎÅÍ·´Æ®°¡
󸮵Ǹé Áö¿¬ ½Ã°£ÀÌ ´Ã¾î ³¯ ¼ö
ÀÖ´Ù.Á»´õ Á¤È®ÇÑ ½Ã°£À» ¿øÇϸé Áö¿¬
½Ã°£µ¿¾È ÀÎÅÍ·´Æ®¸¦ ±ÝÁöÇÒ Çʿ䰡
ÀÖ´Ù.
¿¹:
¡¦
#asm
(¡°cli¡±) /*
ÀÎÅÍ·´Æ® µð½º¾îºí */
delay_us(100);
/* 100 usec Áö¿¬
*/
#asm(¡°sei¡±)
/*
ÀÎÅÍ·´Æ® Àο¡À̺í */
¡¦
¡ß
Ç¥ÁØ ÇÔ¼ö ¹× ÀÀ¿ë ÇÔ¼ö »ç¿ë
CodeVionAVR
C ÄÄÆÄÀÏ·¯¿¡¼´Â °ÅÀÇ ¸ðµç ANSI
Ç¥ÁØ ÇÔ¼ö¸¦ Á¦°øÇϰí ÀÖÀ¸¸ç, ±âŸ
LCD, ¿Âµµ ¼¾¼, ½Ã°è ¼ÒÀÚ µî ¿©·¯
°¡Áö ¶óÀ̺귯¸® ÇÔ¼ö¸¦ Á¦°øÇϰí
Àִµ¥ ÀÌ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ¡°CodeVisionAVR
User Manual¡±À» ÂüÁ¶ ¹Ù¶÷.
|