이 포스팅은 개인적인 학문 탐구 및 제어를 공부하기 위한 개인적인 페이지 입니다.
틀린 부분은 댓글을 통해 수정하겠습니다.
-----------------------------------------------------------------------------------------------------------------
코드비전의 경우 기본 문법은 다음과 같다.
#include <mega128.h>
void main(void)
{
while (1)
{
// Please write your application code here
}
}
mega128의 각종 레지스터의 경우 mega128.h에 정의되어 있으며 자세한 정보는 헤더 파일 및 데이터 시트를 참조하기 바란다.
대부분의 MCU 들은 메인 소스에 반복문이 들어가게 되는데 이러한 이유는 MCU의 동작은 전원이 공급 되는한 무한하게 동작 되어야 하기 때문이다. 컴파일러에 따라 무한반복문 while(1) 또는 for(;;;) 등 이러한 구문이 기본적으로 지원될 것이다.
만약 무한반복문이 없다면 정해진 소스 코드의 절차에 따라 동작을 한 후 MCU가 정지 혹은
스택 구조의 에러에 의한 순서에도 없던 동작이 무분별하게 일어날 수 있다.
그러므로 전체적인 MCU의 동작 절차는 반복문하에 소스코드를 기입하여야 정상적으로 작동하게 된다.
다음의 코드는 기본적인 포트 제어를 하기 위한 코드이다.
#include <mega128.h>
#include <delay.h>
void main(void)
{
DDRA = 0xff;
PORTA = 0x01;
while(1){
delay_ms(500);
PORTA = PORTA << 1;
}
}
기본 소스 코드에 delay.h를 추가해 주었다.
코드비전의 delay.h는 두가지 함수를 지원한다.
void delay_us(unsigned int n);
void delay_ms(unsigned int n);
두 함수의 인자는 unsigned int n 로서 Atmega128에서는 양의 정수 표현으로 0~65535의 범위를 갖는다.
사용법은 delay_ms(500); 이라는 코드를 기입한다면 MCU는 약 500ms 동안 정지한다.
추가적으로 더 설명하자면 딜레이 함수는 인터럽트 등 특별한 경우 그에 관한 처리 루틴이 실행된다 하여도 지정한 시간만큼 MCU가 정지하기 때문에 제 시간에 처리해야할 코드도 처리하기 힘들어지기 때문에 특별한 경우가 아니라면 사용을 자제하는 것이 좋다. 만약 주기적으로 처리해야할 코드가 있다면 타이머등을 이용하는것이 현명한 선택이다.
따라서 딜레이 함수들의 무분별한 사용은 권하지 않는다.
코드 설명을 계속하자면
레지스터 DDRx는 포트의 입력 혹은 출력을 결정한다 DDRA = 0x0f;의 뜻은 PORTA의 0~3핀은 출력 4~7핀은 입력으로 사용한다는 뜻이며 PORTA = 0xff;는 PORTA 모든 핀을 출력으로 사용한다는 것이다.
/*
Atmeag128의 모든 포트는 양방향 병렬 IO포트이며 선택에 따라 내부 풀업 저항의 사용 여부도 결정할 수 있다. (atmega128의 하드웨어 설명은 나중에 천천히 하기로 한다)
*/
여기서 중요한 점은 DDRx 레지스터는 포트의 입력 혹은 출력을 결정하는 레지스터이다.
PORTx 레지스터는 DDRx 설정에 따라 데이터를 출력하며 입력 설정인 경우 포트에 걸려있는 PIN들의 상태를 읽어들이기도 한다.
코드상 모든 PORTA의 모든 핀들은 출력으로 설정되었기 때문에 PORTA = 0x01;의 의미는
PINA.0의 논리만 1 나머지는 0으로 한다는 의미이다.
이제 반복문으로 들어가 PORTA의 레지스터는 500ms 마다 한번씩 1비트씩 왼쪽으로 쉬프트 하게된다.
즉 이 소스코드는 A포트의 핀의 논리를 500ms 마다 쉬프트 시켜주며 만약 PORTA에 LED를 부착시 정논리를 이용한다면 LED는 순차적으로 하나씩 켜지게 될 것이다.
기본적인 설명은 이것으로 끝이며 앞서 게시한 코드는 오류가 존재하는 코드이다. 문법적으론 오류가 존재하지 않지만 분명한 오류 코드이다. 이 코드에 대해 생각해보길 바란다.
끝으로 오류는 다음 연재를 통해서 알아 보도록 하자. .
댓글 없음:
댓글 쓰기