±³¼ö´Ô ¾È³çÇϽʴϱî?
Àú´Â °¿øµµ Ź鿡¼ ³ó»ç¸¦ ¢°í ÀÖ´Â 40´ë Áß¹ÝÀÇ ³ó»ç²ÛÀÔ´Ï´Ù.
»ç¶÷ÀÌ »ì´Ùº¸¸é ¶§·Î´Â º»ÀÎÀÇ ºÐ¼ö¿¡ ³ÑÄ¡´Â ´É·ÂÀÌ ÇÊ¿äÇÒ ¶§°¡ ÀÖ´Â°Í °°½À´Ï´Ù. Á¦°¡ Áö±Ý ¹Ù·Î ±×·± »óȲ¿¡
³õ¿© ÀÖ¾î ±³¼ö´Ô²² ½Ç·Ê¸¦ ¹«¸¨¾²°í Áú¹® µå¸®¿À´Ï ¼ÒÁßÇÑ °¡¸£Ä§À» ºÎʵ右´Ï´Ù.Á¦°¡ ATmega128LÀ» ÀÌ¿ëÇÏ¿© ¿Âµµ ¹× ½Àµµ¸¦ üũÇÏ¿© ÀúÀåÇÏ¿´´Ù°¡ ¸îÀÏ´ÜÀ§·Î PC¿¡ ¿¬°áÇÏ¿© Àü¼ÛÇÏ´Â Àåºñ¸¦
¸¸µé¾îº¸·Á Çϰí ÀÖ½À´Ï´Ù. Àåºñ°¡ ÀåÂøµÉ °÷ÀÇ È¯°æÀÌ Àü·Â¼±À» ÀÌ¿ëÇÑ Àü·ÂÀÇ °ø±ÞÀÌ ¾î·Á¿î »óȲÀÎÁö¶ó
¹èÅ͸®¸¦ ÀÌ¿ëÇÏ·Á Çϴµ¥ »ó±â Ç¥Á¦ÀÇ Sleep¸ðµå¿¡¼ ¾î·Á¿òÀ» °Þ°í ÀÖ½À´Ï´Ù.
Áú¹®À» ¿ä¾àÇϸé ÀÌ·¸½À´Ï´Ù.
* External Interrupt 0À» ÀÌ¿ëÇØ¼ Sleep¸ðµå¿¡ µé¾î°¡°í External Interrupt 4¿¡ ÀÇÇØ¼ Wake upµÇµµ·Ï ÇÏ·Á´Âµ¥
(»ç½ÇÀº INT0¿¡¼ Åä±ÛÀÌ µÇµµ·Ï ÇßÀ¸³ª(Sleep<-->Wake up), ÀßµÇÁö ¾Ê¾Æ ÇÁ·Î±×·¥ÀÇ È帧À» È®ÀÎÇØ º¸°íÀÚ
ÀÌ·¸°Ô ÇØ º» °ÍÀÔ´Ï´Ù.)
ÀÏ´Ü INT0¿¡ ÀÇÇØ¼ Sleep¸ðµå¿¡ ÁøÀÔÀº Àß µË´Ï´Ù.(È®ÀÎÀº ¸ÖƼÅ×½ºÆ®ÀÇ Àü·ù°è¸¦ ÀÌ¿ëÇß½À´Ï´Ù.)
ÁøÀÔ ÈÄ INT4¿¡ ÀÇÇØ¼ Wake upÀÌ µÇÁö ¾Ê¾Æ È®ÀÎÇØº» ¹Ù Àç±ÍÈ£Ãâ¿¡ ºüÁö´Â °Í °°½À´Ï´Ù.
±Ã±ÝÇÑ °ÍÀº Sleep¸ðµå¿¡ ÁøÀÔ ÈÄ INT4¿¡ ÀÇÇØ¼ Wakeup µÇ´Â °úÁ¤°ú ÀÌÈÄ ÇÁ·Î±×·¥ È帧¿¡ ´ëÇÏ¿© ¾Ë°í ½Í½À´Ï´Ù.
Á¦°¡ Áö±Ý±îÁö º¸¾Æ¿Â ¹Ù·Î´Â INT0¿¡ ÀÇÇØ¼ Sleep¸ðµå¿¡ ÁøÀÔ ÈÄ INT4°¡ ¹ß»ýÇϸé INT4¼ºñ½º ·çƾÀ» ½ÇÇàÇϱâ Àü
INT0 ¼ºñ½º·çƾÀÇ Sleep¸ðµå ÀÌÈÄ stepÀ» ÁøÇàÇÏ´Â °Í °°½À´Ï´Ù. ±×·¡¼ Àç±ÍÈ£ÃâÀ̶ó´Â Ç¥ÇöÀ» À§¿¡¼ ÇÑ °ÍÀε¥
À̰ÍÀÌ ¸Â´ÂÁö ±Ã±ÝÇϰí, ¸Â´Ù¸é ÇØ°áÃ¥ÀÌ ÀÖ´ÂÁöµµ ±Ã±ÝÇÕ´Ï´Ù.
ÇØ°á¹æ¹ýÀÌ Assembly ÇÁ·Î±×·¥À¸·Î °¡´ÉÇÏ´Ù¸é À̺κи¸ Assembly·Î ÄÚµùÇÏ°í ³ª¸ÓÁö´Â C·Î ÄÚµù ÈÄ ¾î¼Àºí ¹× ÄÄÆÄÀÏ
ÈÄ °¢°¢ÀÇ ¿ÀºêÁ§Æ® ÆÄÀÏ·Î LinkingÀÌ °¡´ÉÇÑÁöµµ ±Ã±ÝÇÕ´Ï´Ù.
¾Æ·¡´Â ÀÌ ¹®Á¦¿Í °ü·ÃÇÑ ¼ÒÆ®ÄÚµå ÀÔ´Ï´Ù.
°¨»çÇÕ´Ï´Ù.
/*****************************************************************************
File Name : 'main.c'
Title : AVR project ATmega128·Î PowerDown Mode ÁøÀÔÇÏ°í ºüÁö±â
Author : Lee JeongHoon
Created : 2/22/2009
Revised :
Version : 1.0
Target MCU : Atmel AVR series
Description : set_bit(PORTC, PC1);--> PORTCÀÇ PC1À» High·Î ¼³Á¤
clear_bit(PORTC, PC1); --> PORTCÀÇ PC1À» Low·Î ¼³Á¤
*****************************************************************************/
#include <avr/io.h>
#include <avr/interrupt.h>
#include "macro.h"
#include "delay.h"
void Set_ExtInt();
void Init_Port(void);
void POWER_SAVE(void);
/*--------------------------------------------------------------------
¿ÜºÎÀÎÅÍ·´Æ® ¼ºñ½º ·çƾ
--------------------------------------------------------------------*/
ISR(INT0_vect)
{
if(((~PORTC) & 0x02)){
set_bit(PORTC, PC1);
asm("sleep");
}
else
clear_bit(PORTC, PC1);
Loop:
while(!(PIND & 0x01));
Delay_ms(50);
if(!(PIND & 0x01)) goto Loop;
EIFR |= 0x01;
}
ISR(INT4_vect)
{
if(((~PORTC) & 0x02))
set_bit(PORTC, PC1);
else
clear_bit(PORTC, PC1);
Loop:
while(!(PINE & 0x10));
Delay_ms(50);
if(!(PINE & 0x10)) goto Loop;
EIFR |= 0x01;
}
/*--------------------------------------------------------------------
ÆÄ¿ö´Ù¿î¸ðµå ¼³Á¤
--------------------------------------------------------------------*/
void POWER_SAVE(void)
{
//PWRDN_MODE_1;
set_bit(MCUCR, SE);
clear_bit(MCUCR, SM2);
set_bit(MCUCR, SM1);
clear_bit(MCUCR, SM0);
}
/*--------------------------------------------------------------------
External Interrupt Setting
--------------------------------------------------------------------*/
void Set_ExtInt()
{
//The low level of INTn generates an interrupt request.
clear_bit(EICRA, ISC01); //Ext INT0
clear_bit(EICRA, ISC00);
clear_bit(EICRB, ISC41); //Ext INT4
clear_bit(EICRB, ISC40);
set_bit(EIMSK, INT0);
set_bit(EIMSK, INT4);
SREG = 0x80;
}
/*--------------------------------------------------------------------
PortÃʱâÈ
--------------------------------------------------------------------*/
void Init_Port(void)
{
DDRA = 0xFF;
PORTA = 0x00;
DDRB = 0xFF;
PORTB = 0x00;
DDRC = 0xFF;
set_bit(DDRC, PC1); //Ãâ·ÂÀ¸·Î ¼³Á¤
PORTC = 0x00;
DDRD = 0xFF;
clear_bit(DDRD, PD0); //Interrupt PE4 ÀÔ·Â
PORTD = 0x00;
DDRE = 0xFF;
clear_bit(DDRE, PE4); //Int4
PORTE = 0x00;
DDRG = 0xFF;
PORTG = 0x00;
}
/*--------------------------------------------------------------------
Main Program
--------------------------------------------------------------------*/
int main(void)
{
//PORT ÃʱâÈ
Init_Port();
POWER_SAVE();
Set_ExtInt();
while(1);
return 1;
}