마이크로프로세서설계 - 3 ATmega128 마이크로컨트롤러의 특징 LED 실습 1
ATmega128 마이크로컨트롤러의 특징
ATmega128의 특징 고성능의 저전력 RISC 구조 133개 명령어 (대부분 한 사이클로 실행) 32*8 비트 범용 작업 레지스터 16MHz에서 16MIPS 명령 처리 속도, 곱셈기 2사이클 실행 데이터 및 비휘발성 메모리 128K 바이트 ISP 방식 프로그램용 플래시 메모리 4K 바이트 SRAM, 4K 바이트 EEPROM 64K 바이트 메모리 주변장치 ISP 기능을 갖는 SPI 인터페이스 JTAG 인터페이스 53개의 IO핀 리셋을 포함한 35개의 인터럽트 소스
프리스케일러를 갖는 2개의 8비트 타이머/카운터, 2개의 16비트 타이머/카운터 8채널 10비트 AD 컨버터와 아날로그 비교기 TWI, SPI 인터페이스, 2개의 USART 독립적인 내장 발진기에 의한 워치독 타이머 특수 기능 6개의 슬립 모드 내부 RC 오실레이터와 외부 크리스탈을 연결하기 위한 발진회로 내장 외부, 내부 인터럽트 소스 동작 전압 2.7-5.5V (128L), 4.5-5.5V (128) 동작 클럭 0-8MHz (128L), 0-16MHz (128)
ATmega128 마이크로컨트롤러의 특징 AVR 8비트 RISC Mega 시리즈 비교
명령 실행 타이밍의 특징 특징 하버드 아키텍처 : 데이터버스와 어드레스버스 분리 파이프라인 개념 : 병렬 방식의 명령 패치와 명령 실행 1MHZ에서 1MIPS 이상의 속도 가능 단일 클럭에 레지스터 오퍼랜드 패치, ALU 연산 실행, 결과 저장이 이루어짐
ATmega128의 메모리 구조 Flash program memory application flash section 64K * 16 bit instruction (명령어) – 16비트 또는 32비트 SPI 통신을 이용한 ISP, JTAG, 병렬 프로그래밍 방식 10,000번의 쓰기 및 삭제 가능 SRAM 32 registers 64 IO registers 160 Extended IO registers 4096 internal SRAM : 내부 데이터 메모리 64K external SRAM EEPROM data memory 4K byte data EEPROM
주요 레지스터 상태 레지스터(1개) I (global interrupt enable) H (half carry flag) V (2’s complement overflow flag) N (negative flag) Z (zero flag) C (carry flag) 범용 레지스터 (32개) R0 – R31 X, Y, Z 레지스터 (X:R26-27,Y:R28-29,Z:R30-31) 스택 포인터 (16비트) IO register 영역내에 존재
IO 레지스터 (p71 Table 3-1, Table 3-2) DDRB = 0b11111111; // PORTB 출력 설정 PORTB = 0b11111111; // PORTB high 출력
LED 출력 연습 1 - LED 부품 - sink 전류, source 전류 - LED 실습 회로 - PORT 관련 레지스터 - LED 실습
LED 부품 LED 데이터 시트 Vf (forward voltage) : 2.2V(Typ.) / 2.8V(Max.) at 20mA 순방향 전압강하 : LED를 지나면서 발생하는 전압강하 (LED 양단에 걸리는 전압) Vr (reverse voltage) : 5V LED를 켜기 위한 저항 계산 LED에 걸리는 전압 : 2.2V 저항에 걸리는 전압 : Vcc – 2.2 V I = VR/R = 2.8 / 470 = 6mA +5V 470Ω
sink 전류, source 전류 sink 전류 uC나 IC의 출력 단자의 능력을 평가할 때 사용되는 용어로, 들어갈 수 있는 전류량 전원(+5V)에서 부하를 거쳐 출력(low)으로 흐를 때, 출력은 외부 전류를 받아들이는 입장이 되는 데, 이 때를 싱크라 하고, 여기서 흘릴 수 있는 최대 전류가 싱크전류 source 전류 uC나 IC에서 꺼집어 낼 수 있는 전류량 출력이 +5V가 나와서 부하를 거쳐 GND로 전류가 흐를 때 출력에서 낼 수 있는 최대 전류값 AVR +5V AVR
sink/source 전류 회로의 선택 uC나 IC의 소스 전류가 작은 경우 74LS14 TTL IC : sink 8mA, source 0.4mA 10mA 또는 20mA를 요구하는 LED를 source 전류 회로로 구동하는 것은 불가능 LED를 sink 전류 회로로 연결 uC의 소스 전류가 충분한 경우 AVR : sink 40mA, source 40mA source 전류 회로를 이용하여 LED를 직접 구동하는 것이 가능 다만, 다수의 LED를 구동하는 경우, uC의 발열 등에 의하여 회로의 안전성을 해칠 우려가 있음 이에 따라, sink 전류 회로로 연결하는 것이 권장사항임
LED 실습 회로 PC0 +5V PC1 PC7 …..
ATmega128 IO Port 의 특징 Atmega128 IO port의 특징 6개의 8비트 양방향 병렬 IO 포트 (A, B, C, D, E, F) 1개의 5비트 양방향 병렬 IO 포트 (G) 각 핀은 보호용 다이오드와 20-100kΩ의 내부 풀업 저장을 가짐 LED를 직접 구동할 수 있는 40mA의 source, sink 출력 능력을 가짐 IO 포트의 다른 기능 Port A : ADx - 데이터버스와 어드레스 하위 바이트 Port B : 타이머/카운터, SPI 직렬 통신 Port C : Ax – 어드레스 상위 바이트 Port D : 시리얼 통신, 외부 인터럽트, 타이머/카운트, 외부 메모리 Port E : 타이머/카운터, 외부 인터럽트, USART0, 외부 메모리 Port F : A/D 컨버터, JTAG 인터페이스 Port G : 타이머/카운터, 외부 메모리
PORT 관련 레지스터 IO register PORTx (port x data register) : 포트 x 데이터 출력 레지스터 초기값 0 DDRx (port x data direction register) : 포트 x 데이터 방향 설정 레지스터 PINx (port x pin input address) : 포트 x 입력 레지스터 초기값 N/A 읽기만 가능 포트핀의 동작 상태 DDRx – 1, PORTx – 0 : 출력, low 출력 (sink 출력) DDRx – 1, PORTx – 1 : 출력, high 출력 (source 출력)
실습 1 // PORTB를 이용하여 LED 1개 점등 // 소스 전류 회로일 때, LED를 점등하려면 PORTB의 값은 ? #include <mega128.h> // mega128 마이크로콘트롤러 관련 헤더 파일 void main(void) { DDRB = 0xFF; // DDRB : 포트 방향 설정 레지스터 while(1){ // while(1) : 무한 루프 PORTB = 0b11111111; // PORTB : 포트 입출력 레지스터 // 소스 전류 회로일 때 켜지는가? // 싱크 전류 회로일 때 켜지는가? }
실습 2 // PORTD를 이용하여 LED 1개 0.8, 0.2초 간격으로 점멸 // 소스 전류 회로와 싱크 전류 회로로 바꾸어 가면서 실험해 볼 것 // PD0, PD3, PD5번으로 바꾸어 가면서 LED를 연결하고, 해당 비트만 변경해 볼 것 #include <mega128.h> // mega128 마이크로콘트롤러 관련 헤더 파일 #include <delay.h> // delay 함수 정의 헤더 파일 void main(void) { DDRD = 0xFF; // DDRD : 포트 방향 설정 레지스터 // DDRD = 0x00 일 때 결과는 ? while(1){ // while(1) : 무한 루프 PORTD = 0b00000001; // 해당 비트만 on/off 해 볼 것! delay_ms(800); // delay 함수 PORTD = 0b00000000; // 해당 비트만 on/off 해 볼 것! delay_ms(200); // delay 함수 }
실습 3 // PORTC를 이용하여 LED 8개 0.8, 0.2초 간격으로 점멸 #include <mega128.h> // mega128 마이크로콘트롤러 관련 헤더 파일 #include <delay.h> // delay 함수 정의 헤더 파일 void main(void) { DDRC = 0xFF; // DDRC : 포트 방향 설정 레지스터 while(1){ // while(1) : 무한 루프 PORTC = 0b11111111; // PORTC : 포트 입출력 레지스터 delay_ms(800); // delay 함수 PORTC = 0b00000000; // PORTC : 포트 입출력 레지스터 delay_ms(200); // delay 함수 }
실습 4 // PORTC를 이용하여 LED 8개 중 짝수/홀수 LED 0.5초 간격으로 점멸 #include <mega128.h> // mega128 마이크로콘트롤러 관련 헤더 파일 #include <delay.h> // delay 함수 정의 헤더 파일 void main(void) { DDRC = 0xFF; // DDRC : 포트 방향 설정 레지스터 while(1){ // while(1) : 무한 루프 PORTC = 0b01010101; // PORTC : 포트 입출력 레지스터 delay_ms(500); // delay 함수 PORTC = 0b10101010; // PORTC : 포트 입출력 레지스터 }