Professional Documents
Culture Documents
프로그래밍 실전
제작 : 네 로 테 크
강의 : 김 종 형
Embedded AVR Programming
ATMEGA128의 실전Ⅰ
1. Dotmatrix 구동원리
2. Heart 실습
3. Bitman 실습
2006-
2006-04-
04-07 -2-
Embedded AVR Programming
1-1 Dotmatrix 구동 원리
⊙ 도트 매트릭스를 구동시키는 방법
- 스태틱구동(static drive)
: 시프트 레지스터의 비트를 LED 갯 수 만큼 준비하고 여기에 데이터를 보내어 점등하는
방식으로 한 번에 모든 LED를 ON/OFF함
- 다이나믹구동(dynamic drive)
: 스캔라인과 데이터라인으로 구성되어 스캔라인에 의해 각 행 또는 열을 1행씩 스캔하면서
데이터라인에 의해 동기된 데이터를 출력하는 방식
2006-
2006-04-
04-07 -3-
Embedded AVR Programming
1-2 Dotmatrix 구조
2006-
2006-04-
04-07 -4-
Embedded AVR Programming
2006-
2006-04-
04-07 -5-
Embedded AVR Programming
1-4 Heart 실습 1
☞ 하트 모양을 아래로 쉬프트한 후 다시 원상태로 복귀하는 장면 등을 반복하는 프로그램
#include <mega128.h> flash unsigned char M[1][25]={
#include <delay.h> {1,2,3,4,5,6,8,9,7,6,5,4,3,2,1,12,10,11,10,12,13,1,9,1,0}
};
typedef unsigned char u08;
typedef unsigned int u16; flash unsigned char P[14][8]={
2006-
2006-04-
04-07 -6-
Embedded AVR Programming
1-4 Heart 실습 2
☞ 하트 모양을 아래로 쉬프트한 후 다시 원상태로 복귀하는 장면 등을 반복하는 프로그램
interrupt [TIM0_OVF] void timer0_int(void) void main(void)
{ {
TCNT0 = 0xe3; // reload for 448us ticks(측정값 : 460us) DDRB = 0xff;
DDRC = 0xff;
switch (dir){ //dir에 따라 표시되는 방향을 결정한다. DDRD = 0xff;
case 0: temp_led=1<<(7-line);
temp_line=P[patt][line]; TCCR0 = 0x06; // clk/256
break; TCNT0 = 0xe3;
case 2: temp_led=P[patt][line]; TIMSK = 0x01; // enable TOIE0
temp_line=1<<line; #asm("sei")
break;
case 1: temp_led=P[patt][7-line]; while(1)
temp_line=1<<line; {
break; if(M[mod][num_mod] == 0)
case 3: temp_led=1<<line; {
// temp_led = 0x01 << line; line=0~7까지 행선택 num_mod=0;
temp_line=P[patt][line]; }
break; else{
} patt= M[mod][num_mod]; //움직임 상태 변경
PORTB = ~temp_line; num_mod++;
PORTC = temp_led; //빨강색 출력 }
if(line==7) line=0; delay_ms(200);
else line++; };
} }
2006-
2006-04-
04-07 -7-
Embedded AVR Programming
1-5 BITMAN 실습 1
☞ BITMAN으로 사람의 움직임을 랜덤하게 표시하는 프로그램
#include <mega128.h> /*
#include <delay.h> 배열 P는 각 동작들이 도트 매트릭스에 표시되는 데이터이고(하나하나의
정지모습)
typedef unsigned char u08; 배열 M은 그 동작들을 순서대로 나열하여 하나의 움직임이 되도록 한다.
typedef unsigned int u16; */
2006-
2006-04-
04-07 -8-
Embedded AVR Programming
1-5 BITMAN 실습 2
☞ BITMAN으로 사람의 움직임을 랜덤하게 표시하는 프로그램
{0x4C,0x4C,0x3C,0x1A,0x1A,0x24,0x27,0x60}, {0x18,0x18,0x3C,0x5A,0x5A,0x24,0x24,0x66},
{0x2C,0x4C,0x3C,0x1A,0x1A,0x24,0x27,0x60}, {0x18,0x18,0x3E,0x59,0x58,0x24,0x26,0x60},
{0x18,0x18,0x3C,0x5B,0x58,0x24,0x24,0x66}, {0x0C,0x0C,0x18,0x3C,0x38,0x14,0x36,0x20},
{0x30,0x33,0x3C,0x58,0x58,0x24,0x24,0x66}, {0x0C,0x0C,0x38,0x5E,0x58,0x14,0x74,0x46},
{0x31,0x32,0x3C,0x58,0x58,0x24,0xE4,0x06}, {0x0C,0x0C,0x38,0x3E,0x18,0x78,0x50,0x18},
{0x32,0x32,0x3C,0x58,0x58,0x24,0xE4,0x06}, {0x00,0x0C,0x3C,0x58,0x5C,0x16,0x30,0x20},
{0x34,0x32,0x3C,0x58,0x58,0x24,0xE4,0x06}, {0x0C,0x0C,0x78,0x9E,0x1C,0x14,0x76,0x40},
{0x18,0x18,0x3C,0x5A,0x5A,0x24,0x24,0x66}, {0x0C,0x0C,0x3F,0x58,0x18,0x34,0x24,0x06},
{0x00,0x18,0x7E,0x99,0x18,0x3C,0x24,0x66}, {0x18,0x18,0x3C,0x5A,0x5A,0x24,0x24,0x66},
{0x00,0x00,0xDB,0x3C,0x18,0x3C,0x3C,0x66}, {0x18,0x18,0x7C,0x9A,0x1A,0x24,0x64,0x06},
{0x18,0x18,0x3C,0x5A,0x5A,0x24,0x24,0x66}, {0x30,0x30,0x18,0x3C,0x1C,0x28,0x6C,0x04},
{0x18,0x18,0x3C,0xDA,0x1A,0x24,0x64,0x06}, {0x30,0x30,0x1C,0x7A,0x1A,0x28,0x2E,0x62},
{0x30,0x30,0x9C,0x7A,0x19,0x24,0x64,0x06}, {0x30,0x30,0x7C,0x1A,0x18,0x16,0x12,0x30},
{0x18,0x18,0x3C,0x5B,0x58,0x24,0x26,0x60}, {0x30,0x30,0x1C,0x7C,0x18,0x1E,0x0A,0x18},
{0x0C,0x0C,0x39,0x5E,0x98,0x24,0x26,0x60}, {0x00,0x30,0x3C,0x1A,0x3A,0x68,0x0C,0x04},
{0x18,0x18,0x3C,0x5A,0x5A,0x24,0x24,0x66}, {0x30,0x30,0x1E,0x79,0x38,0x28,0x6E,0x02},
{0x0C,0x0C,0x7C,0x9A,0x1A,0x24,0x26,0x60}, {0x30,0x30,0xFC,0x1A,0x18,0x2C,0x24,0x60},
{0x00,0x06,0xFE,0x1C,0x1A,0x2A,0x28,0x6C}, {0x30,0x30,0x3E,0x58,0x1C,0x24,0x26,0x60}
{0x30,0x30,0x3E,0x59,0x58,0x24,0x64,0x06},
{0x00,0x60,0x7F,0x38,0x58,0x54,0x14,0x36}, };
2006-
2006-04-
04-07 -9-
Embedded AVR Programming
1-5 BITMAN 실습 3
☞ BITMAN으로 사람의 움직임을 랜덤하게 표시하는 프로그램
interrupt [TIM0_OVF] void timer0_int(void) interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{ //움직임을 바꾸기 위한 타이머 사용(랜덤함수와 유사)
TCNT0 = 0xe3; // reload for 448us ticks(측정값 : 460us) {
TCNT2 = 0xdf; // reload for 2.048ms ticks(측정값 : 2.12ms)
switch (dir){ //dir에 따라 표시되는 방향을 결정한다. time++;
case 0: temp_led=1<<(7-line); if(mov_chk_sw==1 && time >= delay ) //(측정값 : 214ms)
temp_line=P[patt][line]; {
break; time=0;
case 2: temp_led=P[patt][line];
temp_line=1<<line; if(M[mod][num_mod] == 0) { //움직임 종류 변경
break; mod= TCNT0%6;
case 1: temp_led=P[patt][7-line]; num_mod=0;
temp_line=1<<line; mov_chk_cnt++;
break;
case 3: temp_led=1<<line; if(mov_chk_cnt == 10) {
temp_line=P[patt][line]; mov_chk_sw=0;
break; mov_chk_cnt=0;
} }
}
PORTB = ~temp_line; else {
PORTC = temp_led; //빨강색 출력 patt= M[mod][num_mod]; //움직임 상태 변경
num_mod++;
if(line==7) line=0; if(delay<= DELAY) delay++;
else line++; }
} }
}
2006-
2006-04-
04-07 -10-
10-
Embedded AVR Programming
1-5 BITMAN 실습 4
☞ BITMAN으로 사람의 움직임을 랜덤하게 표시하는 프로그램
void main(void)
{
DDRA = 0x00;
PORTA = 0xff;
DDRB = 0xff;
DDRC = 0xff;
DDRD = 0xff;
#asm("sei")
while(1)
{ };
}
2006-
2006-04-
04-07 -11-
11-