PGR21.com
- 모두가 건전하게 즐길 수 있는 유머글을 올려주세요.
- 유게에서는 정치/종교 관련 등 논란성 글 및 개인 비방은 금지되어 있습니다.
Date 2010/07/01 10:43:34
Name Je ne sais quoi
Subject [유머] 농사는 아무나 짓는게 아닙니다
출처: http://cpu.kongju.ac.kr/ezboard/ezboard.cgi?db=qa_avr&action=read&dbf=200903120001

----------------------------------------------------------------------------------------------------------------------------------------------------
교수님 안녕하십니까?
저는 강원도 태백에서 농사를 짖고 있는 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;
}

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
그림자군
10/07/01 10:45
수정 아이콘
외계언어인가?

저는 문과인입니다.

이과인 화이팅~!

메시 화이팅~!
아르 헨 티나~!
검은창트롤
10/07/01 10:46
수정 아이콘
이게 뭔 외계어여...
10/07/01 10:46
수정 아이콘
헐... 전산학과생들이 코딩 막히면 인근 치킨집 사장님께 여쭤본다는 것 이후로 제일 심한 충공깽이군요. 덜덜
10/07/01 10:46
수정 아이콘
프로그래머분이 회사 그만두고 낙향하신건가요T_T
웨인루구니
10/07/01 11:03
수정 아이콘
전자 공학도 이시군요..
난다천사
10/07/01 11:05
수정 아이콘
링크가 안열려서 궁금한데..

교수님이 답변주셨나요???
10/07/01 11:08
수정 아이콘
정작 어셈 소스는 빠져있군요. 인터럽트 거는거 이런게 어셈쪽에 있을건데..
shadowtaki
10/07/01 11:33
수정 아이콘
ATmega128은 인터럽트의 우선순위가 하드웨어 기본값으로 정해져 있습니다.
프로그램의 구조가 인터럽트 서비스루틴에서만 동작하도록 되어 있는 구조인데 이렇게 프로그래밍을 할 경우 인터럽트가 동시에 존재할 때
프로그램의 동작이 어떻게 될지 아무도 알 수 없습니다. 더군다나 현재의 프로그램은 인터럽트 서비스루틴 안에서 대기를 하는 구조로
되어 있는데 이러한 구조 보다는 인터럽트 서비스 루틴에서의 동작을 최소화 시키고 main()에서 루프를 도는 구조로 만드는 것이 프로그램의
동작을 예측하는데 편합니다. 아마도 최초의 프로그래밍 의도는 PC1의 상태를 관리하고 INT0의 신호로 토글을 하려 했던 것 같은데..
이런 경우 인터럽트 내 인터럽트 호출이 되어 스택이 넘치거나 의도한 대로 프로그램이 돌아가더라도 마지막의 EIFR = 1; 에 의해서
곧바로 이전 상태값으로 돌아가 버리는 동작을 할 것 같습니다.
좀 더 편하게 디버깅을 하기위해서라면 PC1을 관리하기로 결정하셨으면 PC1에 LED를 붙여서 디버깅 용도로 사용하시면 좋을 것 같습니다.

어라 적고 보니 여기가 유게네..??
10/07/01 12:21
수정 아이콘
프로그래머의 끝은 치킨집 사장이 아니라 한단계가 더 있었네요..;;
10/07/01 12:31
수정 아이콘
interrupt routine에 sleep이 들어가있군요.
interrupt routine에서는 기본적으로 interrupt disable입니다. sleep으로 들어간 상태에서 깨워줄 인터럽트가 발생하지 않죠.
그러니까 asm("sleep");은 main()안에 들어가야하고 int0에서 특정 Variable을 바꾸어주고 거기에 따라 sleep을 하던지 다른 action을 해야합니다. sleep으로 들어가기 전에 int0를 disable하고 int4는 enable하는 것도 잊으면 안되겠네요.
서늘한바다
10/07/01 12:58
수정 아이콘
농사짓는게 참.. 힘들죠?
레드나이
10/07/01 13:05
수정 아이콘
학교다닐때 DSP가 비싸 AVR로 하곤 했었는데..간만에 보니 새롭네요..^^
머릿돌
10/07/01 13:13
수정 아이콘
이과에도 종류가 있는 법.. 프로그래밍은...........

문과라고 영문학이나 타 외국어에 능하지 않지 않습니까..
Zakk Wylde
10/07/01 14:36
수정 아이콘
그래도 영어 보다 쉬운 듯?
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
92672 [유머] [펌] 어느 익뮤 유저의 익뮤 사용기 [12] 케이윌9162 11/01/22 9162
85494 [유머] 이 게임은 무엇일까요? [28] Charles8133 10/08/07 8133
84293 [유머] [펌] PC 바이러스는 한의학으로 다스려라 [3] Shura7412 10/07/23 7412
82827 [유머] [이공계층] 3D게임은 컴퓨터의 사양을 타지 않습니다. (+유리) [14] DeathMage5997 10/07/07 5997
82398 [유머] 농사는 아무나 짓는게 아닙니다 [19] Je ne sais quoi9454 10/07/01 9454
80337 [유머] 이런 스마트폰 누가 좀 만들어줄 수 없나요? [21] 피아7707 10/06/10 7707
77622 [유머] [퀴즈]당신은 영어 약자를 얼마나 알고 있습니까? [32] 유유히8622 10/05/13 8622
67895 [유머] (cpu 계층)AMD cpu 제작과정 [18] 럭스9500 09/12/02 9500
66578 [유머] PC 초호화 세팅 방금해봤습니다. [26] z루크z7082 09/11/05 7082
63516 [유머] 자기 컴퓨터의 cpu계급을 알아보자!(2009년 8월ver.) [87] 미역국7595 09/08/18 7595
56619 [유머] [펌] 왜 이런 초고사양의 컴퓨터를 가지고.....;; [8] Alan_Baxter7241 09/02/13 7241
56564 [유머] 컴퓨터 조립 견적 문의 [31] 노려니7478 09/02/12 7478
56193 [유머] [wow] 이해의 선물 (오랫만에) [26] nuzang6381 09/02/03 6381
48258 [유머] 크라이시스를 풀옵에 플레이하기 위한 견적. [15] 화이트데이5926 08/05/01 5926
48222 [유머] [아주 쉬운 문제] 이 게임은 무엇일까요? [정답출시] [13] 화이트데이5204 08/04/30 5204
46379 [유머] 우리집 컴퓨터 램이 2MB입니다. [26] secretwish6532 08/02/14 6532
44585 [유머] 제 친구의 컴퓨터 사양... [22] ataraxia9744 07/12/16 9744
39568 [유머] cpu 5Ghz 프로젝트 극한의 오버 [19] 탄야9360 07/05/28 9360
33456 [유머] [WoW] 이해의 선물 [22] 예아나무7120 06/11/07 7120
31031 [유머] GS 홈쇼핑 노재욱 선수 출연 [14] BluSkai-2ndMoon7473 06/09/03 7473
21661 [유머] 노트북 도난 당하면서 겪은 일들.. [18] CrazyFanta7073 06/02/01 7073
12663 [유머] 뉴스기사 중 옥의 티를 찾아랏! [4] Timeless7948 05/04/27 7948
11673 [유머] [질문] 온게임넷 맵으로 컴퓨터와 1 대 1 할 수 있나요?... [13] 볼드모트8599 05/03/18 8599
목록 이전 다음
댓글

+ : 최근 1시간내에 달린 댓글
+ : 최근 2시간내에 달린 댓글
맨 위로