AVR의 특징 |
|
AVR은 Atmel사에서 만든 RISC 타입의 고속 8비트 마이크로 컨트롤러로 PIC보다 처리 속도가 빠르고 8051보다 자원이 풍부하여 중소 규모의 산업용 제어기 제작에 적합하며 몇 가지 특징을 살펴보자.
- ISP(In System Programming) 기능이 있어 AVR을 기판에 부착한 상태에서 내부 FLASH 롬과 EEPROM을 여러 번 프로그램 가능
- RISC 구조의 고속 처리 가능
동일 클럭으로 동작 시 PIC보다 4배 빠르고, 8051보다 10배 이상 빠름 1MHz에 1MIPS의 처리 능력이 있어 20MHz로 동작하는 경우 20MIPS의 처리 능력을 가짐
- C 언어 처리 강력 지원
CPU 설계 단계에서 레지스터/메모리/명령어가 C 언어에 적합하도록 설계되었음. C언어를 사용하면 개발 기간 단축 및 유지 보수 편리
- 다양한 AVR 제품군이 있어 저가의 적합한 소자의 선정 사용이 가능
- 풍부한 저가의 개발 환경 및 응용 기술 자료가 많음
- 풍부한 내부 자원(SRAM, 통신포트, A/D변환기, Watchdog, 타이머, PWM, I/O포트 등)을 구비하고 있어 외부에 별도로 주변장치를 부착하지 않아도 됨
AVR은 Atmel사의 고밀도 비휘발성 메모리 기술을 기반으로 제조된다. 칩내에 다운로딩 가능한 플래시 메모리는 비휘발성 메모리로서 SPI 직렬 인터페이스 방식이나 기존의 프로그래밍 장치를 이용해 반복 프로그램 할 수 있는 프로그램 메모리를 RISC 8비트 MCU내부에 구현함으로서 다양한 응용분야에 적용할 수 있는 매우 강력한 마이크로 콘트롤러이다. AVR은 어셈플러 및 C언어를 이용하여 프로그래밍 할 수 있으며, 프로그램 개발에 필요한 툴 등이 통합환경으로 제공되고 있다.
본 강좌에서는 C언어를 기반으로 설명되며, 다양한 주변장치와의 인터페이스를 예제로서 살펴보기로 한다. | |
|
AVR의 개발환경 |
|
AVR은 내부의 플래쉬 메모리와 EEPROM에 데이터를 써넣을 수 있도록 SPI 인터페이스를 제공한다. SPI는 오직 3라인을 이용한 통신 방법으로 MOSI(Master Out Slave In), MISO(Master In Slave Out), SCLK(SPI CLOCK) 시그널을 이용한다. Motolora에서 개발되었으며 Master와 Slave가 SCLK에 동기하여 데이터를 교환하는 방식이다. 플래쉬 메모리를 억세스 하기 위해서는 AVR의 Reset 핀을 low로 한 상태에서 앞의 세 시그널을 이용하여 데이터를 읽고 쓰기가 가능하다. 즉, AVR과의 SPI 인터페이스를 맞추어주기만 하면 내부 플래쉬 메모리의 억세스가 가능하다는 것이다. 이는 AVR의 프로그래머를 싼 값으로 구현하게 하는 동기가 된다.
본 강좌에서는 C 언어 사용을 중심으로 구성되어 있고, AVR Edit를 사용하여 생성된 실행 파일을 프린터 포트형 ISP POD(KANDA사)를 사용하여 다운 로드 한다.
AVR Edit (Editor, Compiler) AVR Edit는 avr-gcc를 내부에 가지고 있으면서 사용자가 쉽게 avr-gcc를 사용할 수 있게하는 IDE 환경을 제공하는 툴입니다. AvrEdit 3.5이 나와 있습니다. 이를 이용하면 윈도우 환경에서 avr를 위한 c소스들을 에디팅하고 컴파일 할 수 있습니다. 이에 대한 자세한 설명은 개발자이신 황해권씨 홈페이지를 참고하시기 바랍니다. 이 홈페이지 들어가면 AvrEdit 3.5 사용법에 대한 자세한 설명이 있습니다.
WinAVR (Editor, Compiler) WinAVR는 AVR Edit와 마찬가지 avr-gcc를 내부에 가지고 있으면서 사용자가 쉽게 avr-gcc를 사용할 수 있게하는 IDE 환경을 제공하는 툴입니다. WinAVR 20040404이 나와 있습니다. 이를 이용하면 윈도우 환경에서 avr를 위한 c소스들을 에디팅하고 컴파일 할 수 있습니다.
AVR Studio (Simulator/Emulator) Simulator/Emulator는 디버깅의 환경을 제공해 주는 툴을 일컫는 말이다. AVR Studio는 시뮬레이션/에뮬레이션 프로그램으로, ATMEL사의 AVR용 통합환경의 개발 프로그램이다. AVR Studio는 AVR 시뮬레이터나 AVR에뮬레이터로 설정될 수 있다. 사용자가 파일을 열 때, AVR Studio는 자동적으로 에뮬레이터가 현재 연결되어 있는지를 검색한다. 만일 에뮬레이터를 찾게 되면 디버그 플랫폼으로 선택된다. 만일 에뮬레이터를 찾지 못하면 시뮬레이터로 동작하게 된다. 프로그램은
PonyProg (Programmer) 이 프로그래머는 AVR 뿐만 아니라 PIC, 시리얼 EEPROM까지도 writing 할 수 가 있습니다. PonyProg 홈페이지에 가면 프로그램과 회로도가 공개되어 있습니다. 최근에 Ver 2.06c까지 발표가 되었습니다.
AVR ISP 회로도 AVR에 사용되는 ISP환경은 인터넷을 뒤져보면 넘칠 정도로 많다. 그러다 보니 처음 접하는 사람들은 오히려 헛갈리고, 어떤 회로로 하는 것이 좋은지 선택하기가 쉽지않은 부분이 있다. 여기에서는 여러 ISP중 KANDA사에서 발표한 STK300을 사용했다. 아래의 회로가 그것이다.
|
| |
| |
|
Atmega128 |
|
Timers / Counters Timer/Counters (8-bit): 2 Pulse Width Modulator: 6+2 ch(s) Timer/Counters (16-bit): 2 Real Time Counter Watchdog Timer with On-chip Oscillator Serial I/O 2-wire Serial Interface (I2C compatible) Full Duplex Serial Peripheral Interface (SPI) Full Duplex USART: 2 Programming Modes In-System Programming via JTAG port High Voltage Parallel Programming (12V) Self-Programming via on-chip Boot Program In-System Programming via SPI Port Memory External data memory interface (64kB) General Purpose Registers (Accumulators): 32 MCU Specific Brown-out Detection IEEE 1149.1 (JTAG) Boundary Scan Sleep Modes: 6 Interrupts, External pins: 8 On-Chip Debug support via JTAG port Interrupts: 29 On Chip Oscillator I/O Pins: 53 Hardware Multiplier Fully Static Operation Power-on Reset Analog I/O Analog Comparator Analog-to-Digital Converter (10-bit): 8 ch(s) Analog Gain Stage: 2 ch(s)
|
|
|
Availability |
|
Flash |
EEPROM |
SRAM |
Speed |
Volts |
128kB |
4096B |
4096B |
0 - 16MHz |
4.5 - 5.5V | |
|
Packages |
|
|
Documents |
|
| | |
개발환경: Ponyprog |
|
Ponyprog 프로그램의 사용에 있어 많은 분들이 실수를 하는 것이 많은 것 같습니다. 따라서 아래와 같이 저희 보드를 사용하기 위해 설정해야 할 사항들을 정리하여 드리오니 쉽게 실험할 수 있으면 좋겠습니다.
- 포트설정
- Setup 메뉴 선택
- LPT 포트 설정
- 사용할 Device 선택
- Device 메뉴 선택
- Device 선택확인: Device ToolBox의 변경확인
- 프로그램 테스트
| | |
|
|
기초강좌: 포트제어 |
|
AVR을 사용하여 할 수 있는 가장 기본적인 기능은 자체 내에 가진 입출력 포트에 신호를 제어하는 것이다. 포트를 제어하는 레지스터는 포트 방향 레지스터(DDRn), 포트 출력 레지스터(PORTn), 포트 입력핀 어드레스(PINn)로 세 개의 레지스터를 이용한다. 포트를 입력으로 이용할 때는 포트 방향 레지스터(DDRn)에 '0'을 넣어 입력으로 설정한 후, 포트 입력핀 어드레스(PINn)의 데이터를 읽어오면 된다.
포트를 출력으로 사용할 때는 포트 방향 레지스터에 '1'을 넣어 출력으로 설정한 후, 포트 출력 레지스터(PORTn)로 데이터를 써 넣으면 된다.
여기서 주의해야 할 부분은 데이터 입력시 조건이다. 포트 방향 레지스터를 입력으로 설정하고 데이터를 입력받을 때, 포트 출력 레지스터의 조건에 따라 포트 입력 레지스터의 상태가 달라지기 때문이다.
포트 출력 레지스터로 '1'을 출력하면, 포트 입력 레지스터가 내부 풀업이 연결된 형태로 구성되므로 외부에서 풀업저항을 추가할 필요가 없게 된다. 하지만, 다른 디바이스와 핀을 공유할 때는 해당핀을 입력이나 출력으로 사용하지 않을 때, 포트 출력 레지스터에 '0'을 출력시켜 해당핀을 하이 임피던스 상태로 만들어 주어야 한다.
Atmega128에서는 포트 A(8), B(8), C(8), D(8), E(8), F(8), G(5)에 해당되는 53개의 핀을 일반 입출력 핀으로 사용할 수 있다. 하지만, Atmega103 compatibility mode로 사용하게 되면, 포트 C는 입력전용, 포트 F는 출력전용, 포트 G는 입출력핀으로 사용할 수 없고, TOSC1, TOSC2, /WR, /RD, ALE의 기능으로만 사용가능하다.
관련 자료 회로도(pdf file)
프로그램 예제 포트 D로부터 외부 신호를 입력받아 포트 A로 카운트된 값을 출력하는 프로그램 portD.0의 입력은 내부 변수값을 1씩 증가시키며, portD.1의 입력은 내부 변수값을 1씩 감소시키는 역할을 한다.
#include #include
void Port_Init(void) { //Port_A setting up output outp(0xFF, DDRA); //Port_D setting up input outp(0x00, DDRD); outp(0xFF, PORTD); }
int main(void) { unsigned Tmp; int Count; // External Memory Disable outp(0x00, MCUCR); Port_Init(); Count = 0; while(1) { Tmp = inp(PIND); if (Tmp == ~0x01) { outp(Count, PORTA); Count++; if (Count >=256) Count=0; } else if (Tmp == ~0x02) { outp(Count, PORTA); Count--; if (Count < 0) Count=255; } } return 0; }
| | | |
기초강좌: 타이머/카운터 사용법 |
|
ATmega128은 4개의 범용 타이머/카운터가 있다.
Timer/Counter0(8비트), Timer/Counter1(16비트), Timer/Counter2(8비트), Timer/Counter3(16비트) 가 있다.
타이머/카운터의 제어에 필요한 레지스터는 타이머/카운터 제어 레지스터(TCCRn), 타이머/카운터 레지스터(TCNTn), 그리고 출력 비교 레지스터(OCRn)가 있으며, 인터럽트 관련하여 타이머/카운터 인터럽트 플래그 레지스터(TIFR), 타이머/카운터 인터럽트 마스크 레지스터(TIMSK)가 있다.
타이머를 사용하기 위해서는 타이머에서 사용하는 클럭에 대해서 설정을 해야 하는데 이는 프리스케일러(Prescaler) 값으로 조절할 수 있다.
프리스케일러 값은 각 타이머의 컨트롤 레지스터(TCCRn)에서 설정할 수가 있다. 타이머 인터럽트는 각 타이머 관련 컨트롤 레지스터에서 적절한 프리스케일러 값을 설정한 후 , 각 타이머 레지스터(TCNTn)에 얼마마다 한번씩 인터럽트를 걸게 할 것인지와 관련된 값을 써주면 된다.
그리고 인터럽트를 사용해야 하므로 타이머 인터럽트 관련 레지스터들을 설정해야 한다. 타이머 인터럽트에서는 TIMSK 레지스터만 설정하면 된다.
관련 자료 회로도(pdf file): 포트제어 회로를 그대로 사용함
프로그램 예제 1msec마다 발생하는 타이머 오버플로 인터럽트를 이용하여, 변수값이 1씩 증가하도록 설정하여 포트 A로 카운트된 값을 출력하는 프로그램
#include #include #include #include
// CLOCK (X-tal frequency) #define SYSTEM_CLOCK 16000000
volatile int Count = 0; SIGNAL(SIG_OVERFLOW0) { outp(0x83, TCNT0); outp(Count, PORTA); Count++; if (Count > 255) Count= 0; }
void Port_Init(void) { //Port_A setting up output outp(0xFF, DDRA); }
void Timer_Init(void) { // Timer0 setting, 1ms // system_clk/Presclae = divide_clk // 1/divide_clk = divide_time // 1ms/divide_time = n // 256 - n = TCNT0 // Clock Source = System clock/128 outp(0x05, TCCR0); // Timer 0 overflow enable outp(0x83, TCNT0); outp(0x01, TIMSK); } int main(void) { // External Memory Disable outp(0x00, MCUCR); Port_Init(); Timer_Init(); sei(); while(1); return 0; } | |
기초강좌: USART 사용법 |
|
USART는 외부 디바이스와 직렬로 인터페이스를 통해 데이터를
송수신할 수 있게 해준다. 외부 디바이스는 다른 마이컴이 될 수
있고 PC도 될 수 있다. PC의 COM포트와 연결하기 위해서는 9핀
케이블과 데이터 전송의 레벨을 조절해 주는 전용 통신 칩이 추가로 필요하다.
범용 동기 수신 송신기(USART)로 데이터를 수신하거나 송신하는
방법에 대해 알아보자. USART를 제어하기 위한 레지스터로는
USART를 통해 보낼 데이터나 받은 데이터를 두는 USART I/O
데이터 레지스터(UDRn), USART 상태를 알 수 있는 USART 제어
상태 레지스터(UCSRnA, UCSRnB, UCSRnC) 그리고 데이터 통신의 속도를 결정하는 보레이트(Baud Rate)를 설정하는 USART 보레이트 레지스터(UBRRnL, UBRRnH)가 있다.
통신 속도를 결정해 주는 보레이트가 얼마만큼 가능한지는 마이컴에 부착될 수 있는 크리스탈이나 오실레이터의 속도에 의해 좌우된다. 보레이트 설정하는 방법으로 사용 크리스탈의 주파수를 계산식에 넣어서 나온 값을 UBRR에 넣을 수도 있지만, 데이터 시트에 예로 나와있는 표를 참조할 수도 있다.
USART로 데이터 송수신을 위한 순서는 UCSR에 송수신 인터럽트 및 방식을 설정하고, USART 보레이트 레지스터(UBRRnL, UBRRnH)를 설정하여 데이터 송수신 통신 속도를 선택한다. 그리고, 전역 인터럽트 플래그를 '셋'하여 인터럽트를 활성한 후, 그에 따른 USART 송수신 인터럽트 처리 루틴을 구성한다.
관련 자료 회로도(pdf file), 테스트용 프로그램(exe file)
프로그램 예제 시리얼 통신(RS232, 38400bps)을 통해서 들어오는 입력을 분석하여, 업카운트일 때, LED를 1씩 증가하며 출력하고 다운카운트일 때는 1씩 감소시키면서 출력하는 프로그램 #include #include #include #include // CLOCK (X-tal frequency) #define SYSTEM_CLOCK 16000000 typedef unsigned char BYTE; volatile int Count = 0; volatile BYTE RS_Char=0x00; // USART 수신용 인터럽트 함수 SIGNAL(SIG_UART0_RECV) { RS_Char=inp(UDR0); } void UART_Init(unsigned long BaudRate) { // Not Double mode, Not multi_communication outp(0x00, UCSR0A); //0b 1001 1000 //RXCIE,TXCIE,UDRIE,RxEN,TxEN,xxx outp(0x98, UCSR0B); // Setting BaudRate outp(0x06, UCSR0C); outp(0x00, UBRR0H); outp((SYSTEM_CLOCK/BaudRate/16 - 1),UBRR0L); } void TxData(BYTE data) { while (!(inp(UCSR0A) & (1< outp(data, UDR0); } void Port_Init(void) { //Port_A setting up output outp(0xFF, DDRA); } int main(void) { // External Memory Disable outp(0x00, MCUCR); Port_Init(); UART_Init(38400); sei(); while(1) { if (RS_Char == 0x01) Count++; else if (RS_Char == 0x02) Count--; if (Count > 255) Count=0; else if (Count < 0) Count=255; outp(RS_Char, PORTA); } return 0; } | |
기초강좌: A/D 컨버터 사용법 |
|
아날로그 디지털 변환기(A/D 컨버터)는 센서와 같은 소자에서 들어오는 아날로그 값을 디지털 값으로 변경하는 기능을 가지고 있으며, 실제 제어기를 구성할 때 없어서는 안될 소자이다.
Atmega128의 경우 10비트 축차 근사형의 A/D 컨버터를 8개 내장하고 있다. 실질적으로 A/D 컨버터는 한개이며, 채널을 바꿔가며 아날로그 신호를 입력받을 수 있다.
A/D 컨버터를 제어하기 위한 레지스터로는 아날로그 디지털 멀티플렉서 선택 제지스터(ADMUX)와 아날로그 디지털 컨버터 제어 상태 레지스터(ADCSR)가 있다. ADMUX는 A/D 신호를 입력받을 채널을 0에서 7까지 선택한다. 그리고, 변환 채널이 선택되면 ADCSR을 설정하여 컨버전 프리스케일러 설정, 컨버터 완료 인터럽트를 설정한다. 모든 설정이 끝나면 전역 인터럽트 플래그를 '셋'하여 인터럽트를 활성화한다. 아날로그 디지털 변환 완료 인터럽트 처리 루틴을 구성한 후, ADCSR의 6번 비트를 셋시켜 A/D 변환을 시작하게 한다.
변환이 시작한 후 변환 완료 플래그를 주기적으로 점검하거나 아날로그 디지털 변환 완료 인터럽트를 이용하여 A/D 컨버전 이후의 데이터 처리 루틴을 구성할 수 있다. 변환이 종료되어 변환 데이터를 저장할 때, 반드시 하위 데이터를 먼저 읽어서 저장해야 한다. 왜냐하면, 상위 데이터를 먼저 읽으면, 하위 데이터에 쓰레기 값이 들어갈 수 있기 때문이다.
관련 자료 회로도(pdf file)
프로그램 예제 가변저항을 통해서 들어오는 전압의 변화(0~5V)를 측정하여, 포트A로 그 측정값을 출력하는 프로그램 #include #include #include #include // CLOCK (X-tal frequency) #define SYSTEM_CLOCK 16000000 #define ADSC 0x40 typedef unsigned char BYTE; BYTE ad_l, ad_h; // USART 수신용 인터럽트 함수 SIGNAL(SIG_ADC) { ad_l = inp(ADCL); ad_h = inp(ADCH); outp(ad_l, PORTA); outp(ADSC|inp(ADCSR), ADCSR); } void Port_Init(void) { //Port_A setting up output outp(0xFF, DDRA); } void ADC_Init(int channel) { // Setting ADMUX, ADCSR //Single Mode ADMUX = channel; // 0b11001001, Polling method ADCSR = 0xC9; } int main(void) { // External Memory Disable outp(0x00, MCUCR); Port_Init(); ADC_Init(0); sei(); while(1){}; return 0; } | |
기초강좌: 외부 메모리 인터페이스 |
|
외부 메모리 인터페이스는 데이터 메모리 추가 뿐만 아니라, 메모리 맵 I/O방식을 이용하여 외부 디바이스를 추가할 수 있다.
Atmega128의 ALE, RD, WR, 포트A와 C를 이용하여 외부에 데이터 메모리를 추가하는 방법에 대해 알아보자. MCU 제어 레지스터(MCUCR)의 SRE비트와 SRW비트의 제어에 따라 외부 메모리 인터페이스가 가능하다.
어드레스 라인/데이터 라인을 공통으로 연결하고 디코딩 회로를 구성하여 디바이스를 추가하면 부족한 I/O의 수를 늘릴 수 있다. 프로그램 예제 외부메모리를 사용하기 위한 예제 (레지스터 설정과 함수를 보도록 합니다.) #include #include #include #include // CLOCK (X-tal frequency) #define SYSTEM_CLOCK 16000000 typedef unsigned char BYTE; typedef unsigned int WORD; void Port_Init(void) { //Port_A setting up output outp(0xFF, DDRA); } void Init_ExtIF(void) { //SRW10 outp(0x80, MCUCR); //SRW11 outp(0x02, XMCRA); // bus keeper outp(0x80, XMCRB); } // R/W BYTE RAM_ReadData(WORD adr) { BYTE val; char *io; io = (char *) (adr); val = *io; return(val); } void RAM_WriteData(WORD adr, BYTE data) { char *io; io = (char *) (adr); *io = data; } void RAM_TEST(void) { WORD test_add = 0x5432; BYTE test_data = 0x22; USART_Transmit_String("RAM Test ... "); RAM_WriteData(test_add, test_data); if (RAM_ReadData(test_add) == test_data) //USART_String("Success!\r\n"); else { //USART_String("Failure!\r\n"); } } int main(void) { Port_Init(); Init_ExtIF(); sei(); RAM_TEST(); while(1){}; return 0; } | | |
|
|
인공호흡: 퓨즈비트가 잘못 설정된 AVR 칩 살리기 |
|
증상 : device missing or unknown device [-24]
대부분의 경우 외부 크리스탈로 내부 클럭으로 사용하도록 설정해서 사용하거나, EMI같은 원인으로 퓨즈비트 세팅이 바뀌어 장치인식을 못하게 되는 경우입니다.
이 경우 강제로 외부 클럭을 넣어주어 살릴 수가 있습니다. (일명 인공호흡) 아래 그림과 같이 오실레이터를 연결하면 OUTPUT 신호가 나오게 됩니다. 이 신호를 AVR칩의 XTAL1에 강제로 넣어주고 AVR칩에 전원을 넣으면 동작이 될 겁니다.
다시 퓨즈비트를 사용하고자 하는 것으로 write 하고 다시 읽어 확인한후 전원을 끄고 원래 크리스탈을 꼽아서 사용하시면 됩니다.
| |
응용예제: 캐릭터 LCD |
1 2 3 4 |
LCD(Liquid Crystal Display)란 디스플레이 액정으로 각종 전자제품 표시창, 공장 자동화 시스템의 상태 디스플레이 부품으로써 가장 흔하게 널리 쓰이는 장치로서, 액정을 이용하여 화소에 도달하는 빛을 선택적으로 투과시키거나 차단시켜 문자나 화상 등을 표시하는 시각적인 전달장치이다.
LCD는 사용하기에 편리하며 전력 소모가 매우 적은 장점이 있어 소규모 휴대용 마이크로 컴퓨터 시스템에서 가장 간편하며 강력한 기능을 갖는 표시장치로 사용되고 있다.
Atmega128을 비롯 여러 가지 MPU의 경우 만일 이들의 상태를 디스플레이 장치를 통해서 처리 과정이나 상태 등을 글로 나타내어 준다면 여러분이 디스플레이 상에 나타난 문장이나 단어들의 조합을 보고 상황 판단을 쉽게 내릴 수 있는 것이다.
LCD는 LCD 패널과 제어기가 하나로 되어 있는 모듈 형태로 되어 있어 제어기에서 데이터 버스를 통하여 데이터를 전송하기만 하면 원하는 표시를 얻을 수 있다.
이 강좌에서는 20*2 LCD 모듈과 UST-MPB-Atmega128의 인터페이스와 구동에 대해서 알아본다. | |
응용예제: 도트매트릭스 |
1 2 |
도트매트릭스란 LED를 매트릭스(행렬)의 형태로 나열한 것. 대표적으로 5×7, 8×8, 16×16 등의 매트릭스로 이루어진 것과 칼라 수에 따라 싱글(single, 단색)또는 멀티(multi, 다색)라고 불리고 있다.
이러한 LED를 사용한 디스플레이 장치는 고휘도에 수명이 길다는 장점이 있다.
본 강좌에서는 5×7 단색 도트 매트릭스 구조 및 점등 방법을 설명하기로 한다.
|
도트 매트릭스의 동작원리 |
매트릭스 LED를 구동시키는 방법에는 스태틱구동(static drive)과 다이나믹구동(dynamic drive)의 2가지 방법이 있다.
스태틱 구동의 경우는 시프트 레지스터의 비트를 LED 갯수만큼 준비하고 여기에 데이터를 보내어 점등하는 방식으로 한 번에 모든 LED를 ON/OFF 한다.
다이나믹 드라이브는 매트릭스 LED를 1행씩 스캔하면서 LED를 ON/OFF 하는 방식으로 CRT의 표시방법과 동일한 방법으로 구동하게 되는 것이다. 스캔라인과 데이터라인으로 구성되어 스캔라인에 의해 각 행 또는 열을 1행씩 스캔하면서 데이터라인에 의해 동기된 데이터를 출력하는 방식이다.
다이나믹 드라이브방식은 스태틱 드라이브에 비해 휘도가 낮고, 스캔주파수가 낮은 경우에 깜박거림이 일어난다는 점에서는 다소 떨어진다고 할 수 있으나 구동회로가 간단하기 때문에 저가격으로 대화면의 구성에 적합하다.
|
도트 매트릭스의 구조 |
| | |
|
|