WAT-AVR128 (ATMEGA128 Module) HOMEPAGE: E-MAIL: whiteat@whiteat.com TEL: 070-4412 - 5754
1 부 - ATMEGA128A 1. ATMEGA128A 2 1.1 특징 2 1.2 블록도 3 1.3 핀정의 4 1.4 상태레지스터 (SREG) 6 1.5 범용레지스터 7 1.6 스택포인터 (Stack Pointer) 8 1.7 RAMP (RAM Page Z Select Register) 8 1.8 프로그램메모리 9 1.9 데이터메모리 10 2. General Digit I/O 11 2.1 PORTA 12 2.2 PORTB 14 2.3 PORTC 15 2.4 PORTD 16 2.5 PORTE 17 2.6 PORTF 18 2.7 PORTG 19 2 부 - ATMEGA128A 준비 1. 개발환경 21 1.1 컴파일툴 22 2. 프로그램라이팅 27 2.1 USB용 AVR ISP 27 2.2 프린터포트용 AVR ISP 34
3 부 - ATMEGA128A 연습 1. I/O 포트 41 1.1 I/O 관련레지스터 41 1.2 실습 41 2. LCD 제어 56 2.1 Character LCD 제어 56 2.2 사용자폰트출력 62 2.3 Graphics LCD 제어 65 3. 인터럽트 68 4. 외부인터럽트 70 2.1 외부인터럽트 70 2.2 외부인터럽트레지스터 71 5. PWM( 추가예정 ) 74 타이머 / 카운터 ( 추가예정 ) 0 COMPARE( 추가예정 ) 0 Serial Peripheral Interface( 추가예정 ) 0 USART( 추가예정 ) 0 ( 추가예정 ) 0 Analog to Digital Convertor - ADC( 추가예정 ) 0 교육용키트소개 ( 추가예정 ) 0
1 부 ATMEGA128A - 1 -
1. ATMEGA128A 1.1. 특징 고성능, 저전력, Atmel AVR 8 비트마이크로컨트롤러 향상된 RISC 아키텍처 - 133 개의강력한명령 - 대부분싱글사이클수행 - 32 개의범용레지스트리 + 패리패럴제어레지스트리 - 16Mhz 까지가능 - 2 사이클곱셈기 메모리 - 128Kbytes 프로그램가능한 Flash 프로그램메모리 - 4Kbytes EEPROM - 4Kbytes 내부 SRAM - 외부 64Kbytes 메모리확장가능 - 프로그램보안락제공 - SPI 인터페이스 JTAG 인터페이스 기능 - 2개의 8비트타이머 / 카운터 - 2개의 16비트타이머 / 카운터 - 2개의 8비트 PWM - 6개의 2 ~16 비트변경가능한 PWM - 출력비교기 - 8 채널 10비트아날로그디지털컨버터 - 2 채널 USARTS - Master/Slave SPI 시리얼인터페이스 - 와치도그타이머 53 개의 I/O Lines 2.7 ~ 5.5V, 16MHz - 2 -
1.2. 블록도 - 3 -
1.3. 핀정의 - 4 -
VCC : 전원용 GND : 그라운드 Port A (PA7:PA0) - 일반 I/O - 외부메모리주소 / 데이터 ( bit7 ~ bit0) Port B (PB7:PB0) - 일반 I/O - 특수 I/O Port C (PC7:PC0) - 일반 I/O - 외부메모리주소 / 데이터 ( bit15 ~ bit8) Port D (PD7:PD0) - 일반 I/O - 특수 I/O Port E (PE7:PE0) - 일반 I/O - 특수 I/O Port F (PF7:PF0) - 일반 I/O - A/D 용 Port G (PG4:PG0) - 특수 I/O /RESET : 리셋핀 XTTAL1 : 크리스탈연결용1 ( 또는오실레이터연결 ) XTTAL2 : 크리스탈연결용2 AVCC : AD용전원핀 AREF : 레퍼런스전압 PEN : AVR 프로그램가능하게설정핀 - 5 -
1.4. 상태레지스터 ( SREG ) 상태레지스터는연산의결과에대한정보를가지고있습니다. Status Register 주소 : 0x5F Bit 7 6 5 4 3 2 1 0 I T H S V N Z C Read/Write R/W R/W R/W R/W R/W R/W R/W R/W Initial Value 0 0 0 0 0 0 0 0-6 -
1.5. 범용레지스터 ATMEGA128A 에는범용레지스터가 32bytes 가존재하며 RISC 의연산을위해필요합니다. R0 ~ R31 까지의이름을가집니다. R26,R27 을 X 레지스터, R28, R29 를 Y레지스터, R30, R31 을 Z 레지스터라고하며 X,Y,Z 레지스터는 16비트로액세스할때사용됩니다. - 7 -
1.6. 스택포인터 ( Stack Pointer ) 스택은데이터를임시로저장할때매우중요하게사용됩니다. 주로함수호출에서사용되며함수호출시현재상태를스택에저장하고리턴될때저장된값으로복구하는데사용됩니다. Status Register 주소 : 0x5D ~ 0x5E 1.7. RAMPZ - RAM Page Z Select Register Z 포인터를다룰때 0x0000 ~ 0x7FFF (lower 64Kbytes) 를액세스할것인지, 0x8000 ~ 0xFFFF (higher 64Kbytes) 를액세스할것인지를결정합니다. - 8 -
1.8. 프로그램메모리 - 9 -
1.9. 데이터메모리 - 10 -
2. General Digital I/O I/O 는대부분내부풀업저항을옵션으로가지고있으며필요에따라 Tri-state 도만들수있습니다. < I/O Pin Equivalent Schematic > < Port Pin Configurations > - 11 -
2.1. PORT A PORTA 는외부메모리주소 / 데이터 (bit7 ~bit 0 ), 일반디지털입출력으로사용되며여기서는일반디지털입출력에대해설명하겠습니다. < 참고 : PORTA 의다른기능 > PORTA - Port A 데이터레지스터 Port A 의출력값이 HIGH, LOW 인지설정한다. ( 1 : HIGH, 0 : LOW ) DDRA - Port A 데이터방향레지스터 Port A 를입 / 출력방향을결정합니다. ( 1 : 출력, 0 : 입력 ) - 12 -
PINA - Port A 입력데이터 Port A 를입력으로사용시입력값이들어옵니다. PORTA 비트 0 를 HIGH, 로나머지는 LOW 로만드는예제 DDRA = 0xFF; PORTA = 0x01 // 포트 A 를출력으로설정 // 포트 A의비트0만 HIGH로만들기 PORTA 비트7를 HIGH, 로나머지는 LOW로만드는예제 DDRA = 0xFF; // 포트 A 를출력으로설정 PORTA = 0x80 // 포트 A의비트7만 HIGH로만들기 PORTA 를입력으로사용하여데이터읽는예제 DDRA = 0x00; // 포트 A 를입력으로설정 byte bytedata = PINA; // 포트 A의입력값을 bytedata 변수에입력 PORTA 비트 7 ~ 4 를입력으로비트 3 ~ 0 을출력으로설정하는예제 DDRA = 0x0F; // 포트 A 상위4비트를입력, 하위4비트를출력으로설정 PORTA = 0xFF; // 하위 4비트을 HIGH로출력, 상위 4비트는내부풀업사용 byte bytedata = PINA; // 포트 A의입력값을 bytedata 변수에입력 ( 상위 4비트만유효 ) - 13 -
2.2. PORT B PORTB 는특별한기능 ( 표참조 ), 일반디지털입출력으로사용되며여기서는일반디지털입출력에대해설명하겠습니다. < 참고 : PORTB 의다른기능 > PORTB - Port B 데이터레지스터 DDRB - Port B 데이터방향레지스터 PINB - Port B 입력데이터 PORTA 의레지스터설정방법과동일합니다. - 14 -
2.3. PORT C PORT C 는외부메모리주소 / 데이터 (bit15 ~bit 8), 일반디지털입출력으로사용되며여기서는일반디지털입출력에대해설명하겠습니다. < 참고 : PORTC 의다른기능 > PORTC - Port C 데이터레지스터 DDRC - Port C 데이터방향레지스터 PINC - Port C 입력데이터 PORTA 의레지스터설정방법과동일합니다. - 15 -
2.4. PORT D PORTD 는특별한기능 ( 표참조 ), 일반디지털입출력으로사용되며여기서는일반디지털입출력에대해설명하겠습니다. < 참고 : PORTD 의다른기능 > PORTD - Port D 데이터레지스터 DDRD - Port D 데이터방향레지스터 PIND - Port D 입력데이터 PORTA 의레지스터설정방법과동일합니다. - 16 -
2.5. PORT E PORTE 는특별한기능 ( 표참조 ), 일반디지털입출력으로사용되며여기서는일반디지털입출력에대해설명하겠습니다. < 참고 : PORTE 의다른기능 > PORTE - Port E 데이터레지스터 DDRE - Port E 데이터방향레지스터 PINE - Port E 입력데이터 PORTA 의레지스터설정방법과동일합니다. - 17 -
2.6. PORT F PORTF 는 Analog Digital Converter 기능 ( 표참조 ), 일반디지털입출력으로사용되며여기서는일반디지털입출력에대해설명하겠습니다. < 참고 : PORTF 의다른기능 > PORTF - Port F 데이터레지스터 DDRF - Port F 데이터방향레지스터 PINF - Port F 입력데이터 PORTA 의레지스터설정방법과동일합니다 - 18 -
2.7. PORT G PORTG 는특별한기능 ( 표참조 ) 으로사용되며일반디지털입출력으로사용이불가능합니다. < 참고 : PORTG 의다른기능 > 일반디지털포트로사용불가하여일반디지털 I/O 에관련된레지스터가없습니다. - 19 -
여기까지 ATMEGA128A 의많이사용되는기본적인기능을알아보았습니다. 좀더자세히또는정확한기능을알려면데이터시트를봐야합니다. - 20 -
2 부 ATMEGA128A 준비 - 21 -
1. 개별환경 ATMEGA128 컨트롤러의컴파일툴은 AVRStudio, Codevision, IAR 등이있습니다. AVR Studio는가장많이사용되는컴파일툴입니다. Codevision 은코드위저드가있어초기에코드생성할때편리합니다. IAR 은주로업체에서사용되는컴파일툴입니다. 1.1. 컴파일툴 AVRStudio 와 WinAVR 로컴파일할수있습니다. AVRStudio 는코딩하는데편리한환경을제공하고 WinAVR 은컴파일러를제공합니다. 프로그램다운로드 http://www.atmel.com 에가입후 AVRStudio 프로그램을다운받을수있습니다. http://winavr.sourceforge.net/ 에서가입없이 WinAVR 을다운받을수있습니다. 프로그램설치 먼저 WinAVR 을설치한후 AVRStudio 를설치합니다. AVRStudio 는컴파일을쉽게도와주는툴을제공하고 WinAVR 은여러헤더파일과라이브러리와컴파일러 (AVR-gcc) 를제공합니다. WinAVR 설치후에 AVRStudio 를설치해야하며, WinAVR 은항상최신버전을사용해야합니다. - 22 -
먼저새로운프로젝트를생성한다. 다음으로프로젝트명을결정한다 - 23 -
Finish를눌러종료하면, 이제소스를편집할수있는창이열린다. 이제코딩하면된다. - 24 -
간단하게소스를편집하고, #include <avr/io.h> int main() DDRB = 0xFF; // output PORTB = 0x00 return 0; // LED ON - 25 -
Build and Run 를실행하여 test1.hex 파일이생성되었는지확인합니다. 라이팅하는방법은다음장에있습니다. - 26 -
2. 프로그램라이팅 컴파일하여생성된결과파일 ( 헥사파일 ) 을다음과같은방법으로라이팅할수있습니다. - Ponyprog 프로그램과프린터포트를이용 - AVRStudio 프로그램과 WAT-AVR ISP ( USB 용 AVR ISP) 를이용 2.1. USB 용 AVR ISP 그림처럼 AVR 모듈과 USB ISP 케이블을연결하고 USB ISP 케이블을 PC의 USB 포트에연결합니다. - 27 -
2.1.1. 연결 AVRStudio 의 STK500 도구바에서 Display the Connect Dialog' 버튼을클릭하면 ISP 연결설정에관한다이어로그박스가나타납니다. Platform에서 AVRISP 를선택하고 Port에서연결된포트번호를선택한후 [Connect] 를클릭합니다. 연결을성공하면프로그램라이팅에관련된다이어로그박스가뜨게되고연결이실패하면다시선택하라고같은창이뜹니다. 지금까지는 ISP 케이블에 AVR 모듈을연결하지않아도상관없습니다. - 28 -
- 29 -
2.1.2. 디바이스설정 [Device and Signature Bytes] 에서사용할디바이스명을선택하고 [Settings] 에서적당한라이팅속도를결정합니다. - 30 -
2.1.3. 프로그램라이팅 [...] 으로헥사파일을선택한후 [Program] 으로라이팅을할수있습니다. - 31 -
2.1.4. FUSE( 퓨즈 ) 설정 아래와같이설정할수있습니다. 가장많이사용되는설정이며필요에따라변경할수있습니다. - 32 -
2.1.5. 에러발생시 만약다음과같은에러가발생한다면 AVR 모듈이연결되었는지확인하고연결되어있다면 SCK 속도를낮춰가며적당한라이팅속도를찾아야합니다. 현재 AVRStudio 에서는총 6 가지의 ISP 라이팅속도를제공합니다. - 33 -
2.2. 프린터포트용 AVR ISP 그림처럼 AVR 모듈과 ISP 케이블을연결하고 ISP 프로그램케이블을 PC의프린터포트에연결합니다. < AVR128 모듈과패러럴 ISP 연결 > - 34 -
PonyProg 프로그램을실행하면아래와같이프로그램이실행됩니다. Device Family 선택에서 ATMEGA128 일경우에는 AVR Micro 를선택합니다. Device Type 을선택에서 ATMEGA128 일경우에는 ATMEGA128 을선택합니다. - 35 -
다음으로프로그램을라이팅에사용할포트을설정합니다.. [Setup] => [Interface Setup] 메뉴를선택하여설정할수있습니다. PC 의프린터포트 (LPT1) 로 AVR-ISP 를사용할경우의셋팅은아래와같습니다. - 36 -
AVR 을사용하기전에 fuse 를설정해야합니다.. [Command] => [Security and Configuration Bits] 메뉴를선택하여 Configuration Bilts 창을열어하드웨어에맞게설정합니다. - 37 -
이제기본적인세팅은끝났으며이제헥사파일을라이팅하면됩니다. [File] => [Open Device File] 메뉴를선택하여헥사파일을선택합니다. < PONYPROG 프로그램라이팅 > - 38 -
헥사파일을선택한후에 [Command] => [Write All] 을실행하면라이팅이진행됩니다. - 39 -
3 부 ATMEGA128A 연습 - 40 -
1. I/O 포트 1.1. I/O 관련레지스터 I/O 는 OUTPUT 레지스터를통해서제어할수있습니다. 1.2. 실습 I/O 포트에대한실험을해보겠습니다. 실험에사용할회로와 WAT보드의연결방법은아래와같습니다. PORTA 에는 LED, PORTB 에는 FND에출력신호, PORTC 는 FND 선택신호, PORTE는딥스위치, PORTF 는 ADC 테스트신호에연결되어있습니다. 1) - 41 -
- 42 -
- 43 -
PORTA의 0 ~ 7 포트에 LED 8개가연결되어있고 LED에불이들어오게하려면해당되는포트에 0 을출력하면됩니다. D0(PORTA.0에연결된 LED) 부터 D7까지차례대로일정시간 ON된후 OFF 되게만들어보겠습니다. 단마지막 LED 가 ON/OFF 된후에는다시처음으로되돌아가서무한반복해야합니다. D0: D1: D2: D3: D4: D5: D6: D7: /* EX_01_01.c LED 순차적으로 ON 하기 AVRStudio 4.18 2011-08-15 */ #include <avr/io.h> // 일정시간딜레이 void Delay() register unsigned long i; for(i = 0; i < 300000; i++) asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); asm volatile(" PUSH R0 "); - 44 -
asm volatile(" POP R0 "); asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); int main() DDRA = 0xFF; // ALL OUTPUT PORTA = 0xFE; // PORTA.0 LED ON while(1) Delay(); if(porta == 0x7F) // 마지막 LED 가 ON 되었다면. // 처음 LED ON 되게 PORTA = 0xFE; // PORTA.0 LED ON else // 그렇지않다면 PORTA <<= 1; // 한칸이동한후 PORTA = 1; // 마지막 LED 는 OFF 되게 - 45 -
PORTA의 0 ~ 7 포트에 LED 8개가연결되어있고 LED에불이들어오게하려면해당되는포트에 0 을출력하면됩니다. PORTE 에연결된딥스위치 ON/OFF로 LED 를제어할수있습니다. 딥스위치 1번을 ON 하면 D0가 ON, 딥스위치 1번을 OFF 하면 D0가 OFF 되고, 나머지딥스위치 2 ~ 7번와 LED도마찬가지로 ON/OFF 하는예제입니다. DIP SWITCH 1 번 ON DIP SWITCH 1,2 번 ON DIP SWITCH 5 번 ON DIP SWITCH 모두 ON #include <avr/io.h> int main() DDRA = 0xFF; // PORTA ALL OUTPUT PORTA = 0xFF; // ALL LED ON DDRE = 0x00; // INPUT for DIP SWITCH while(1) PORTA = PINE; - 46 -
PORTA의 0 ~ 7 포트에 LED 8개가연결되어있고 LED에불이들어오게하려면해당되는포트에 0 을출력하면됩니다. 딥스위치 1번을 ON 하면 D0(PORTA.0에연결된 LED) 부터 D7까지차례대로 ON되고딥스위치 1번을 OFF 하면마지막켜진 LED부터 OFF 되는예제입니다. DIP SWITCH 1 번 ON D0: D1: D2: D3: D4: D5: DIP SWITCH 1 번 OFF D4: D3: D2: D1: D0: /* EX_01_03.c PORTA 의 0 ~ 7 포트에 LED 8 개가연결되어있고 LED 에불이들어오게하려면해당되는포트에 0 을출력하면됩니다. 딥스위치 1 번을 ON 하면 D0(PORTA.0 에연결된 LED) 부터 D7 까지차례대로 ON 되고딥스위치 1 번을 OFF 하면마지막켜진 LED 부터 OFF 되는예제입니다. LED: PORTA 에연결 DIP SWITCH: PORTE 에연결 AVRStudio 4.18 */ #include <avr/io.h> - 47 -
// 일정시간딜레이 void Delay() register unsigned long i; for(i = 0; i < 300000; i++) asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); asm volatile(" PUSH R0 "); asm volatile(" POP R0 "); int main() DDRA = 0xFF; // PORTA OUTPUT PORTA = 0xFF; // ALL LED OFF DDRE = 0x00; // DIP SWITCH 용으로입력 while(1) Delay(); if((pine & 0x01) == 0x00) // DIP 1 이 ON 이면 PORTA <<= 1; PORTA = 0; // 마지막 LED 는 ON 되게 else // DIP 1 이 OFF 이면 PORTA >>=1; - 48 -
PORTA =0x80; // 처음 LED 는 OFF 되게 - 49 -
로타리스위치값을 Anode Type의 FND 의첫번째자리에출력하며로터리스위치값이 0 일때잠깐동안 삑 소리를내고두번째자리의수를증가하는예제입니다. /********************************************** 로터리 (Rotary) 스위치값을 Anode FND(4401ASR) 1 자리에표시하는예제 WAT-AVR128 모듈의 PORTB => WAT-IO&ADC 보드의 FND DATA(J1) 에연결 WAT-AVR128 모듈의 PORTC => WAT-IO&ADC 보드의 FND CONTROL(J2) 에연결 WAT-AVR128 모듈의 PORTF => WAT-IO&ADC 보드의 ADC(J5) 에연결 PORTC.0 : 로터리 0 에연결 ( 입력 ) PORTC.1 : 로터리 1 에연결 ( 입력 ) PORTC.2 : 로터리 2 에연결 ( 입력 ) PORTC.3 : 로터리 3 에연결 ( 입력 ) PORTC.4 : FND 1 자리에 SEL 신호 ( 출력 ) PORTC.5 : FND 2 자리에 SEL 신호 ( 출력 ) PORTC.6 : FND 3 자리에 SEL 신호 ( 출력 ) PORTC.7 : FND 4 자리에 SEL 신호 ( 출력 ) PORTB : FND 데이터신호 ( 출력 ) Main Clock : 11.0592Mhz Tools : AVR Studio 4.16 실험보드 : WAT-AVR128 보드 + WAT-IO&ADC - 50 -
*********************************************/ #include <avr/io.h> #include "wat128.h" int main() BYTE bytelastfnd0 = 0; // FND4 초기화 InitFND4(); // 로터리스위치초기화 InitRotary(); g_fnd[0] = 0; g_fnd[1] = 0; g_fnd[2] = 3; g_fnd[3] = 4; BUZZER_INIT; while (1) // 로터리스위치값받기 g_fnd[0] = GetRotaryInt(); if(g_fnd[0]!= bytelastfnd0) bytelastfnd0 = g_fnd[0]; if(bytelastfnd0 ==0) // 비프음내기 BUZZER_ON; DelayMS(10); BUZZER_OFF; // 두번째자리수증가 if(++g_fnd[1]>=10) g_fnd[1] = 0; - 51 -
// FND 4 자리표시 DisplayFND4(g_FND[0],g_FND[1],g_FND[2],g_FND[3]); - 52 -
키매트릭스 (4x4) 제어예제입니다. 키값을실시간으로 PC 로전송하여 모니터에출력하는예제입니다. /* 필요한보드 1. WAT-AVR128 ( 모듈 ) 2. WAT-AVR128 EXT ( 확장보드 ) 3. WAT-KEY 4x4 ( 키패드 ) => WAT-KEY 4x4 보드를 PORTA 에연결한예 기능 4x4 배열의키상태를시리얼통신으로 PC 에서실시간으로감시한다. - C# (VS2008) */ #include <avr/io.h> #include "WAT128.h" void OperatingFromPC(); int main() // 시리얼통신으로 PC 에전송하기위한보레이트설정 OpenSCI0(57600); // 키패드초기화 InitKey4x4(); while(1) - 53 -
// 키패드의값을읽어서 PC 로전송 OperatingFromPC(); BOOL bpcheadcheckok = FALSE; INT16US g_uipcrecevingdatacount = 0; BYTE g_bytepcdata[rx_buffer_size]; //! RX 버퍼초기화 void RXClearFromPC() g_uipcrecevingdatacount = 0; bpcheadcheckok = FALSE; //! RX 처리루틴 void OperatingFromPC() BYTE bytecommand; INT16S irxdata; irxdata=getbyte0(); if( 0<= irxdata && irxdata<=255 ) if (TRUE == bpcheadcheckok) // STX 를통과했다면 ( 이미나왔다면 ) g_bytepcdata[g_uipcrecevingdatacount] = irxdata; if(++g_uipcrecevingdatacount>=rx_buffer_size ) g_uipcrecevingdatacount =0; if (COMM_ETX == irxdata ) bytecommand = g_bytepcdata[0]; switch(bytecommand) - 54 -
case 0x10: // key 4x4 if ( g_uipcrecevingdatacount>=7) if (COMM_ETX == g_bytepcdata[6] ) SendKey4x4( GetKey4x4()); RXClearFromPC(); break; else default: RXClearFromPC(); break; // STX 가나오지않았다면 STX 가나올때까지기다린다. if (COMM_STX == irxdata) bpcheadcheckok = TRUE; g_uipcrecevingdatacount = 0; else - 55 -
2. LCD 제어 2.1. Character LCD 제어 16x2 배열의 Character LCD ( 모델명 : AX07001) 를제어해보고버튼의눌림에따라화면에내용을변경해보겠습니다. - RS : PC1 VCC - R/W: PC3 - E : PC5 - D0 : PB0 - D1 : PB1 - D2 : PB2 - D3 : PB3 - D4 : PB4 - D5 : PB5 - D6 : PB6 VR1 103 VCC GND D1 1N4148 GND LCD_RS LCD_RW LCD_EA D0 D1 D2 D3 D4 D5 D6 D7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 U1 VSS VDD VL RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 A K LCD - D7 : PB7 GND - BUTTON1 : PC0 - BUTTON2 : PC2 - BUTTON3 : PC4 - BUTTON4 : PC6 - BUTTON5 : PC7-56 -
WAT128.h 에서기본적으로제공하는함수는아래와같습니다. 선언 #define CLCD_RS 1 #define CLCD_RW 3 #define CLCD_EA 5 #define CLCD_DATA_PORTPORTB #define CLCD_DATA_PORT_DIR DDRB #define CLCD_CONTROL_PORT PORTA #define CLCD_CONTROL_PORT_DIR DDRA void CLCD_XY(BYTE x1, BYTE y1); // 출력할좌표이동 void CLCD_Command(BYTE data); // CLCD 명령 void CLCD_On(); // CLCD 켜기 BYTE CLCD_BusyCheck(); // CLCD 대기상태인지체크 void CLCD_PutString(BYTE x, BYTE y, char *str); // x,y 좌표에문자열출력 void CLCD_PutChar(BYTE chr); // 한문자출력 void CLCD_Clear(); // CLCD 클리어 void CLCD_Init(); // CLCD 초기화 - 57 -
BYTE CLCD_BusyCheck() DelayUS(200); DelayUS(200); DelayUS(200); DelayUS(200); DelayUS(200); DelayUS(200); DelayUS(200); return (0); void CLCD_PutString(BYTE x, BYTE y, char *str) int len = 0; CLCD_XY(x,y); while(*str ) if(len>16) break; CLCD_PutChar(*str++); len++; void CLCD_PutChar(BYTE data) while(clcd_busycheck()); ClearBit(CLCD_CONTROL_PORT,CLCD_EA); SetBit(CLCD_CONTROL_PORT,CLCD_RS); DelayUS(2); CLCD_DATA_PORT= data; DelayUS(50); SetBit(CLCD_CONTROL_PORT,CLCD_EA); DelayUS(50); ClearBit(CLCD_CONTROL_PORT,CLCD_EA); - 58 -
void CLCD_Clear() CLCD_Command(1); DelayMS(1); CLCD_Command(2); DelayMS(1); void CLCD_XY(BYTE x, BYTE y) BYTE position = 0; if(x>16) x = 0; switch(y) case 0 : position = 0x80; break; case 1 : position = 0xC0; break; CLCD_Command(position + x); void CLCD_Command(BYTE data) while(clcd_busycheck()) ClearBit(CLCD_CONTROL_PORT,CLCD_RS); ClearBit(CLCD_CONTROL_PORT,CLCD_EA); DelayUS(1); CLCD_DATA_PORT= data; DelayUS(50); SetBit(CLCD_CONTROL_PORT,CLCD_EA); DelayUS(20); ClearBit(CLCD_CONTROL_PORT,CLCD_EA); DelayUS(50); - 59 -
void CLCD_On() CLCD_Command(0x01);// dummy CLCD_Command(0x38); CLCD_Command(0x0C ); CLCD_Command(0x01); CLCD_Command(0x06); CLCD_Command(0x01); DelayMS(2); void CLCD_Init() SetBit(CLCD_CONTROL_PORT_DIR,CLCD_EA); SetBit(CLCD_CONTROL_PORT_DIR,CLCD_RS); SetBit(CLCD_CONTROL_PORT_DIR,CLCD_RW); ClearBit(CLCD_CONTROL_PORT,CLCD_RW); CLCD_DATA_PORT_DIR = 0xFF; CLCD_On(); CLCD_Clear(); - 60 -
캐릭터 LCD 에우측처럼영문과숫자를표시하며 버튼이눌릴경우버튼번호를표시하는예제입니다. #include <avr/io.h> #include "WAT128.h" int main() CLCD_Init(); // LCD 초기화 CLCD_PutChar('a'); CLCD_PutString(1,0,"bcdefghijklmnop"); CLCD_PutString(0,1,"0123456789ABCDEF"); while(1) if((clcd_control_pin & 0x01) ==0) CLCD_PutString(0,1,"1111111111111111"); else if((clcd_control_pin & 0x04) ==0) CLCD_PutString(0,1,"2222222222222222"); else if((clcd_control_pin & 0x10) ==0) CLCD_PutString(0,1,"3333333333333333"); else if((clcd_control_pin & 0x40) ==0) CLCD_PutString(0,1,"4444444444444444"); else if((clcd_control_pin & 0x80) ==0) CLCD_PutString(0,1,"5555555555555555"); else CLCD_PutString(0,1,"0123456789ABCDEF"); - 61 -
2.2. 사용자지정폰트출력 LCD에서 'A'. B' 등의문자는 CGROM에저장되어있어서아스키코드값으로바로출력가능합니다.. 가나다 를출력해보겠습니다. 하지만 CGROM에없는폰트는어떻게출력할까요? CGRAM 을사용하면됩니다. CGRAM 은 5x7폰트를최대 8 문자가저장됩니다. CGRAM의상위 2바이트는 01으로고정 ( 즉, 0x40) 이며, 비트5,4,3은 8개의데이터공간이며, 하위 3비트는데이터주소입니다. - 62 -
하트. 출력을예로들어보겠습니다. 일단폰트를만들면다음처럼됩니다. 0x00 0x0A 0x1B 0x1F 0x1F 0x0E 0x04 0x00 폰트데이터를 CGRAM 에입력합니다. CLCD_Command(0x40); // CGRAM 의 0 번지부터저장하겠다. CLCD_Data(0x00); CLCD_Data(0x0A); CLCD_Data(0x1B); CLCD_Data(0x1F); CLCD_Data(0x1F); CLCD_Data(0x0E); CLCD_Data(0x04); CLCD_Data(0x00); 폰트데이터화면에출력합니다. - 63 -
캐릭터 LCD에우측처럼가나다 ( 사용자지정폰트 ) 를표시하는예제입니다. #include <avr/io.h> #include "WAT128.h" // 폰트지정 void SetFont() int i unsigned char font[] = 0x02, 0x1a, 0x0a, 0x0a, 0x0b, 0x0a, 0x0a, 0x02, // 가 0x02, 0x12, 0x12, 0x12, 0x1B, 0x02, 0x02, 0x02, // 나 0x02, 0x1A, 0x12, 0x12, 0x1B,0x02, 0x02, 0x02, // 다 0x00, 0x0a, 0x1b, 0x1f, 0x1f, 0x0e, 0x04, 0x00; // 하트 CLCD_Command(0x40); for(i=0; i<32; ++i) CLCD_Data( font[i]); return int main() CLCD_Init(); // LCD 초기화 SetFont(); CLCD_Command( 0x80); //set ddram CLCD_Data( 0x00); // 가 CLCD_Data( 0x01); // 나 CLCD_Data( 0x02); // 다 CLCD_Data( 0x03); // heart while(1) // 무한대기 - 64 -
2.3. Graphics LCD 연결 128x64 배열의 Graphics LCD ( 모델명 : GS-GB1286433YFYJ-C/R ) 를제어해보겠습니다. VCC VCC VR1 5K D1 GND 1N4148 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 PC0 PC1 PC2 PC3 PC4 PC5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 U1 VSS VDD VL D0 D1 D2 D3 D4 D5 D6 D7 H_LCD /CS1 /CS2 /RESET R/W D/I E VEE ANODE CATHO GND LCD 의데이터선은 ATMEGA128의 PORTB 에연결하고, 컨트롤선은 PORTC를사용합니다. VR1의 5K 가변저항은 Graphics LCD의백라이트밝기를조절할수있습니다. - 65 -
그래픽 LCD 에우측에있는그림처럼출력하고 3번째줄부터는영문 E' 를계속출력하는예제입니다. 단이때현재위치에커서를표시해야합니다. 화이트앳 WhiteAT.com - 66 -
그래픽 LCD 에사각형, 원, 선을그리는예제입니다. WhiteAT.com - 67 -
3. 인터럽트 인터럽트는프로그램이진행되는흐름을변경하는한방법입니다. 인터럽트가걸리면다음명령을실행하지않고인터럽트서비스루틴을먼저실행한후다음명령이실행됩니다. 인터럽트서비스루틴과관련된인터럽트벡터, 인터럽트우선순위, 관련레지스터등에대한설명을주로다룰것입니다. - 68 -
- 69 -
4. 외부인터럽트 4.1. 외부인터럽트 외부인터럽트는외부의상태가변했을때발생합니다. 신호가상승할때, 신호가하강할때, 신호가상승하거나하강할때선택적으로사용할수있습니다. 외부인터럽트를사용할수있는핀은 INT0 ~ INT7까지 8개의핀이며그림으로보면아래와같습니다. - 70 -
4.2. 외부인터럽트레지스터 외부인터럽트를사용하려면 EICRA, EICRB, EIMSK, EIFR 레지스터를설정해야합니다. EICRA - External Interrupt Control Register A EICRB - External Interrupt Control Register B EICRA, EICRB 는트리거방식을설정합니다. 설정값은 2 바이트씩묶이는데기능은다음과같습니다. ISCn1 ISCn0 기능 0 0 Low level에서인터럽트요청 0 1 없음 1 0 하강에지에서인터럽트요청 1 1 상승에지에서인터럽트요청 - 71 -
EIMSK - External Interrupt Mask Register EIMSK 는외부인터럽트를사용할것인지아닌지를설정하는레지스터입니다. EIFR - External Interrupt Flag Register EIFR 는외부인터럽트플래그레지스터로외부인터럽트발생여부를나타냅니다. SREG - Status Register SREG 의 bit7 로전체인터럽트를사용할것인지아닌지를결정합니다. - 72 -
WAT-CCLD 모듈을사용하여캐릭터 LCD 에 SW1, SW2 버튼의눌림횟수를카운터하는예제입니다. (falling edge 사용 ) Please push.. 0, 0-73 -
5. PWM - 74 -
6. 타이머 / 카운터 7. COMPARE - 75 -
8. Serial Peripheral Interface - SPI 8.1. SPI 통신 시리얼플래시읽고쓰는방법설명 - 76 -
9. USART 9.1. 시리얼통신 USART0 와 USART1 로시리얼통신하는실험입니다. 실험에 WAT 보드의연결방법은아래와같습니다. 위쪽의 9 핀 Female 커넥터에 RS-232C 케이블을연결하면됩니다. 시리얼연장케이블의 FEMALE 쪽을 PC 에 MALE 쪽을 WAT 보드에연결합니다. 계속 PC 로 A ~ Z 까지전송하는예제입니다. - 77 -
PC 로부터데이터를받아 LCD 에출력한후에코를보내는예제입니다. /* EX_09_02.c PC 에서 USART0 로받은데이터를 Character LCD 에출력 AVRStudio 4.18 2011-08-16 */ http://avr128.com #include <avr/io.h> #include "WAT128.h" int main() INT16S irxdata; - 78 -
OpenSCI0(57600); CLCD_Init(); // USART 0 열기 // LCD 초기화 while(1) irxdata=getbyte0(); if( 0<= irxdata && irxdata<=255 ) // CLCD 에출력 CLCD_PutChar(iRxData); PutChar0(iRxData); // echo 보내기 - 79 -
10. Two-wire Serial Interface - I2C - 80 -
11. Analog to Digital Convertor - ADC ATMEGA128 은 8 개의 10 비트 ADC 를제공한다. ADC 기능을사용해보자. 11.1. 연결하기 SHARP 사의 GP2Y0A21YK ( 거리측정센서 ) 를 ADC1 에연결하고, CLCD 를연결하자. J3 M8_GND M8_VCC ADC1 1 2 3 CON3 11.2. 거리측정센서사용하기 ADC 값을받아 LCD 에출력하고거리를계산해보자. while(1) ADMUX=ADC_VREF_TYPE; ADCSRA = 0xD7; // start conversion and clear ADIF while((adcsra & 0x10)!= 0X10); sum1 = ADCL + ADCH*256; Delay_ms(1); sprintf(g_chtemp,"adc0 Value:%5d ",sum1); LCD_PUTSTRINGS(0,0,g_chTemp); sprintf(g_chtemp,"adc0 Value:%5d ",sum1); LCD_PUTSTRINGS(0,1,g_chTemp); Delay_ms(50); - 81 -
12. 교육용키트소개 WAT-AVR128 Module은 Atmel 의 ATMEGA128A을장착한모듈로 ATMEGA128A 구동에필요한기본적인부품과회로를포함하고있으며, SP3232 RS-232C IC를장착하여 PC와의통신을쉽게할수있게도와주는제품입니다. 12.1. 특징 항목 내용 사용전압 3.3V ~ 5.0V AD 채널수 CLOCK 시리얼통신 ISP 8채널 10bit 11.0592 Mhz 2채널 2채널을 TTL LEVEL 레벨과 RS-232C 레벨의두가지로제공 ISP 커넥터제공 SIPEX3232EC IC를사용하여모든사용전압 ( 3.3V ~ 5.0V ) 에서 RS232-C 통신이가능합니다. ( 참고로일반적인 MAX232 IC 는 5.0V 에서만 RS-232C 통신이가능합니다.) - 82 -
12.2. 외형 보드의크기는 41mm(W) x 49.5mm(H) 이며, 양쪽에는 2줄짜리핀헤더 (Pitch : 2.54mm) 를제공하여사용하기편하게설계되었습니다. - 83 -
13. 외부장치연결 핀헤더소켓을사용하여외부장치와연결하여사용할수있습니다. 13.1. 핀정의 좌측 우측 1. VCC 2. VCC 41. VCC 42. VCC 3. ADC7/TDI 4. ADC6/TDO 43. AD0 44. AD1 5. ADC5/TMS 6. ADC4/TCK 45. AD2 46. AD3 7. ADC3 8. ADC2 47. AD4 48. AD5 9. ADC1 10. ADC0 49. AD6 50. AD7 11. AREF 12. AVCC 51. ALE 52. NC 13. PE0 14. PE1 53. A15 54. A14 15. PE2 16. PE3 55. A13 56. A12 17. PE4 18. PE5 57. A11 58. A10 19. PE6 20. PE7 59. A09 60. A08 21. GND 22. GND 61. GND 62. GND 23. PB0 24. PB1 63. /RD 64. /WR 25. PB2 26. PB3 65. PD7 66. PD6 27. PB4 28. PB5 67. PD5 68. PD4 29. PB6 30. PB7 69. PD3 70. PD2 31. NC 32. NC 71. PD1 72. PD0 33. PG3 34. PG4 73. TXD0_12V 74. RXD0_12V 35. nreset 36. NC 75. TXD1_12V 76. RXD1_12V 37. GND 38. GND 77.GND 78.GND ISP 핀 10핀 ISP용커넥터를제공하여 ISP로프로그램라이팅이가능합니다. RS-232C 통신용핀 RS-232C용통신에사용되는핀 3핀으로 PC와의통신을쉽게사용이가능합니다. - 84 -
- 85 - GND VCC VCC GND GND GND PE3 PE4 PE2 PE5 PE7 PE6 AD1 AD2 AD0 AD3 AD4 AD5 AD6 AD7 ALE PB3 PB0 PB2 SCK PB1 PB4 PB5 PB6 A15 PB7 A14 RXD1 PD2 TXD1 PD3 A13 ADC5/TMS A12 A11 A10 A09 A08 ADC1 ADC0 ADC2 ADC3 ADC4/TCK PD4 PD5 PD1 PD0 PD7 PD6 ADC6/TDO ADC7/TDI /WR AREF AVCC /RD /RESET PG4 PG3 GND DEBUG_TO_PC_232 MISO PE1 DEBUG_FROM_PC_232 MOSI PE0 C7 18pF/1608 C6 0.1uF/1608 R3 10K/1608 2006. 03. 02 WhiteAT U2 ATMEGA128 PE0/PDI/RXD0 2 PE1/PDO/TXD0 3 PE2/AIN0/XCK0 4 PE3/AN1/OC3A 5 PE4/INT4/OC3B 6 PE5/INT5/OC3C 7 PE6/INT6/T3 8 PE7/INT7/ICP3 9 PB0/SS 10 PB1/SCK 11 PB2/MOSI 12 PB3/MISO 13 PB4/OC0 14 PB5/OC1A 15 PB6/OC1B 16 GND 53 VCC 52 PEN 1 PA0/AD0 51 PA1/AD1 50 PA2/AD2 49 PA3/AD3 48 PA4/AD4 47 PA5/AD5 46 PA6/AD6 45 PA7/AD7 44 PG2/ALE 43 PC7/A15 42 PC6/A14 41 PC5/A13 40 PC4/A12 39 PC3/A11 38 PC2/A10 37 PC1/A9 36 PC0/A8 35 PG1/RD 34 PG0/WR 33 PF0/ADC0 61 PF1/ADC1 60 PF2/ADC2 59 PF3/ADC3 58 PF4/ADC4/TCK 57 PF5/ADC5/TMS 56 PF6/ADC6/TDO 55 PF7/ADC7/TDI 54 AVCC 64 GND 63 AREF 62 PB7/OC1C/OC2 17 PG3/TOSC2 18 PG4/TOSC1 19 RESET 20 VCC 21 GND 22 XTAL2 23 XTAL1 24 PD0/INT0/SCL 25 PD1/INT1/SDA 26 PD2/INT2/RXD1 27 PD3/INT3/TXD1 28 PD4/ICP1 29 PD5/XCK1 30 PD6/T1 31 PD7/T2 32 C8 18pF/1608 C5 0.1uF/1608 Y1 11.0592MHz/SMD
- 86 - PG3 PG4 GND AD0 AD2 AD4 AD6 U8 WAT AVR128 VCC 42 PA0/AD0 43 PA1/AD1 44 PA2/AD2 45 PF0/ADC0 10 PF1/ADC1 9 PF2/ADC2 8 PF3/ADC3 7 PF4/ADC4/TCK 6 PF5/ADC5/TMS 5 PF6/ADC6/TDO 4 PF7/ADC7/TDI 3 AVCC 12 AREF 11 VCC 41 VCC 1 VCC 2 PE0/PDI/RXD0 13 PE1/PDO/TXD0 14 PE2/AIN0/XCK0 15 PE3/AN1/OC3A 16 PE4/INT4/OC3B 17 PE5/INT5/OC3C 18 PE6/INT6/T3 19 PE7/INT7/ICP3 20 RESET 35 PB0/SS 23 PB1/SCK 24 PB2/MOSI 25 PB3/MISO 26 PB4/OC0 27 PB5/OC1A 28 PB6/OC1B 29 PB7/OC1C/OC2 30 PG3/TOSC2 33 PG4/TOSC1 34 PA3/AD3 46 PA4/AD4 47 PA5/AD5 48 PA6/AD6 49 PA7/AD7 50 PG2/ALE 51 PC7/A15 53 PC6/A14 54 PC5/A13 55 PC4/A12 56 PC3/A11 57 PC2/A10 58 PC1/A9 59 PC0/A8 60 PG1/RD 63 PG0/WR 64 PD7/T2 65 PD6/T1 66 PD5/XCK1 67 PD4/ICP1 68 PD3/INT3/TXD1 69 PD2/INT2/RXD1 70 PD1/INT1/SDA 71 PD0/INT0/SCL 72 GND 61 GND 62 GND 77 GND 78 GND 21 GND 22 GND 37 GND 38 TXD0_12V 73 RXD0_12V 74 TXD1_12V 75 RXD1_12V 76 TO_MAIN_232_TEMP FROM_MAIN_232_TEMP J2 5267-02 1 2 GND AD1 AD3 AD5 AD7 ALE A15 A13 A11 A09 /RESET A14 A12 A10 2x19 pin HEADERCONNECTOR GND A08 /RD /WR PD7 PD5 PD3 PD1 PD6 PD4 PD2 PD0 ADC7/TDI ADC5/TMS ADC3 ADC1 PB5 ADC6/TDO PB4 ADC4/TCK PB6 ADC2 PB7 ADC0 AREF AVCC PE0 TXD1_12V RXD1_12V PE1 PE2 VCC VCC PE3 PE4 PE5 PE6 PE7 PB0 PB1 PB2 PB3
MOSI /RESET SCK MISO J3 1 2 3 4 5 6 7 8 9 10 VCC RXD1_12V TXD1_12V 1 2 3 J1 5267-03 P-HEADER 5x2 GND GND ISP CONNECTOR RS-232C EXT VCC C14 0.1uF/1608 C9 0.1uF/1608 GND DEBUG_TO_PC_232 TXD1 DEBUG_FROM_PC_232 RXD1 C11 0.1uF/1608 C13 0.1uF/1608 11 10 12 9 4 5 6 U3 C2+ C1- C2- V- VCC 16 T1IN T2IN R1OUT R2OUT GND 15 2 V+ T1OUT T2OUT R1IN R2IN C1+ 14 7 13 8 1 3 SP3232EEY TO_MAIN_232_TEMP TXD1_12V FROM_MAIN_232_TEMP RXD1_12V C12 0.1uF/1608 GND SP3232 PART - 87 -
13.2. 다른보드에연결 WAT-AVR128_EXT 보드 ( 확장보드 ) 를사용하면다른보드와쉽게연결할수있습니다. 보드명 WAT-KEY 4x4 WAT-CLCD WAT-GLCD WAT-IO&ADC 보드설명 4x4 배열의매트릭스키보드보드 Character LCD 보드 Graphics LCD 보드 LED, FND 와가변저항테스트보드 < 확장보드와연결가능한보드 > - 88 -
WAT-KEY 4x4 보드 4x4 배열로스위치를장착하여 MCU의 8개의핀과 VCC 핀만으로 16개의스위치를제어하는예제를제공합니다. - 89 -
- 90 -