|
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¡±À» ÂüÁ¶ ¹Ù¶÷.
|