스마트 컨트롤러 - 발광다이오드에 불 켜기

 

#1. ATmega128A Datasheet(Memory & Register Summary)

 

학습목표 - 메모리의 Register의 구조를 이해한다.

 

ATmega128A Datasheet를 본다.

 

지난 시간에 배웠던 메모리 부분을 복습.

 

메모리 관련 알아두어야 할 주소는 $0020 - $00FF까지이다.(I/O Reg.)

 

 

 

GPR(General Purpose Register)은 사용자(C언어)가 조작하는 것이 아니라 CPU에서 작업 수행 시 작동한다.

 

I/O Register는 기능을 수행하는 레지스터이다.

 

29. Register Summary

 

표에서 나온 내용 중 괄호 안에 있는 주소가 Configuration A임으로 괄호안의 주소를 참조하여야 한다.

 


#2 - #4. ATmega128A 실습 - 다이오드에 불켜기

 

학습목표 - 발광다이오드에 교대로 불이 들어오게 프로그램밍 할 수 있다.

 

// 다리가 긴 쪽, 다이오드 안에 역삼각형 덩어리가 들은 것이 +

 

//DDR - Data Direction Register

 

CPU 공간은 최적화를 시키면 안된다. 최적화는 2개 이상의 명령어가 있을 시 CPU에서 효율성을 따져 명령어를 수행하는 것인데 CPU는 휘발성 메모리이기 때문에 최적화에 적합하지 않다.

 

실습 - 간단한 입출력 코딩)

 

발광 다이오드에 불이 들어오도록 코딩을 해보자!


 

#define으로 주소값을 문자화 시켜서 다시 코딩해보자!


 

반복적으로 불을 켜고 끄는 명령어를 입력하게 되면 CPU의 처리 속도가 빠르기 때문에 불이 깜빡거리는 효과를 볼 수 없다. 이 때 for문을 넣어서 CPU가 일을 하게 만들어 준다.

 

하지만! CPU의 최적화기능 때문에 반복문을 다 해내지 않고 결과 값만 도출시키기 때문에 깜빡거리는 현상을 볼 수 없게 된다. 이 때 volatile을 선언하여 최적화 기능을 없애버린다.

 

이에 발광다이오드에 유휴시간이 생겨나 불이 깜빡거리는 현상을 보게 된다.

 

 

//“무궁화 꽃이 피었습니다코드 for(uiCnt=0;uiCnt<60000;++uiCnt);


















반응형
Posted by newind2000