Transcript LED 실습 1
마이크로프로세서설계 - 3
ATmega128 마이크로컨트롤러의 특징
LED 실습 1
시스템및센서네트워크연구실
1
ATmega128 마이크로컨트롤러의 특징
시스템및센서네트워크연구실
2
ATmega128의 특징
고성능의 저전력 RISC 구조
133개 명령어 (대부분 한 사이클로 실행)
32*8 비트 범용 작업 레지스터
16MHz에서 16MIPS 명령 처리 속도, 곱셈기 2사이클 실행
데이터 및 비휘발성 메모리
128K 바이트 ISP 방식 프로그램용 플래시 메모리
4K 바이트 SRAM, 4K 바이트 EEPROM
64K 바이트 메모리
주변장치
ISP 기능을 갖는 SPI 인터페이스
JTAG 인터페이스
53개의 IO핀
리셋을 포함한 35개의 인터럽트 소스
시스템및센서네트워크연구실
3
프리스케일러를 갖는 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)
시스템및센서네트워크연구실
4
ATmega128 마이크로컨트롤러의 특징
AVR 8비트 RISC Mega 시리즈 비교
시스템및센서네트워크연구실
5
명령 실행 타이밍의 특징
특징
하버드 아키텍처 : 데이터버스와 어드레스버스 분리
파이프라인 개념 : 병렬 방식의 명령 패치와 명령 실행
1MHZ에서 1MIPS 이상의 속도 가능
단일 클럭에 레지스터 오퍼랜드 패치, ALU 연산 실행, 결과 저장이 이루
어짐
시스템및센서네트워크연구실
6
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
시스템및센서네트워크연구실
7
주요 레지스터
상태 레지스터(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 영역내에 존재
시스템및센서네트워크연구실
8
IO 레지스터 (p71 Table 3-1, Table 3-2)
IO 레지스터를 이용하여 마이크로컨트롤러의 주변장치, 특수기능 등을
사용
IO 레지스터의 설정에 따라, 마이크로컨트롤러의 핀이 규정된 기능으로
동작함
• DDRB = 0b11111111;
// PORTB 출력 설정
• PORTB = 0b11111111; // PORTB high 출력
시스템및센서네트워크연구실
9
시스템및센서네트워크연구실
10
LED 출력 연습 1
- LED 부품
- sink 전류, source 전류
- LED 실습 회로
- PORT 관련 레지스터
- LED 실습
시스템및센서네트워크연구실
11
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Ω
시스템및센서네트워크연구실
12
sink 전류, source 전류
sink 전류
uC나 IC의 출력 단자의 능력을 평가할 때 사용되는 용어로, 들어갈 수 있
는 전류량
전원(+5V)에서 부하를 거쳐 출력(low)으로 흐를 때, 출력은 외부 전류를
받아들이는 입장이 되는 데, 이 때를 싱크라 하고, 여기서 흘릴 수 있는 최
대 전류가 싱크전류
AVR
+5V
source 전류
uC나 IC에서 꺼집어 낼 수 있는 전류량
출력이 +5V가 나와서 부하를 거쳐 GND로 전류가 흐를 때 출력에서 낼
수 있는 최대 전류값
AVR
시스템및센서네트워크연구실
13
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 전류 회로로 연결하는 것이 권장사항임
시스템및센서네트워크연구실
14
LED 실습 회로
+5V
PC0
PC1
…..
PC7
시스템및센서네트워크연구실
15
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 : 타이머/카운터, 외부 메모리
시스템및센서네트워크연구실
16
PORT 관련 레지스터
IO register
PORTx (port x data register) : 포트 x 데이터 출력 레지스터
• 초기값 0
DDRx (port x data direction register) : 포트 x 데이터 방향 설정 레지스터
• 초기값 0
PINx (port x pin input address) : 포트 x 입력 레지스터
• 초기값 N/A
• 읽기만 가능
포트핀의 동작 상태
DDRx – 1, PORTx – 0 : 출력, low 출력 (sink 출력)
DDRx – 1, PORTx – 1 : 출력, high 출력 (source 출력)
시스템및센서네트워크연구실
17
시스템및센서네트워크연구실
18
실습 1
// PORTB를 이용하여 LED 1개 점등
// 소스 전류 회로일 때, LED를 점등하려면 PORTB의 값은 ?
// 싱크 전류 회로일 때, LED를 점등하려면 PORTB의 값은 ?
#include <mega128.h>
// mega128 마이크로콘트롤러 관련 헤더 파일
void main(void)
{
DDRB = 0xFF;
// DDRB : 포트 방향 설정 레지스터
while(1){
PORTB = 0b11111111;
// while(1) : 무한 루프
// PORTB : 포트 입출력 레지스터
// 소스 전류 회로일 때 켜지는가?
// 싱크 전류 회로일 때 켜지는가?
}
}
시스템및센서네트워크연구실
19
실습 2
// PORTD를 이용하여 LED 1개 0.8, 0.2초 간격으로 점멸
// 소스 전류 회로와 싱크 전류 회로로 바꾸어 가면서 실험해 볼 것
// PD0, PD3, PD5번으로 바꾸어 가면서 LED를 연결하고, 해당 비트만 변경해 볼 것
#include <mega128.h>
#include <delay.h>
void main(void)
{
DDRD = 0xFF;
while(1){
PORTD = 0b00000001;
delay_ms(800);
PORTD = 0b00000000;
delay_ms(200);
}
// mega128 마이크로콘트롤러 관련 헤더 파일
// delay 함수 정의 헤더 파일
// DDRD : 포트 방향 설정 레지스터
// DDRD = 0x00 일 때 결과는 ?
// while(1) : 무한 루프
// 해당 비트만 on/off 해 볼 것!
// delay 함수
// 해당 비트만 on/off 해 볼 것!
// delay 함수
}
시스템및센서네트워크연구실
20
실습 3
// PORTC를 이용하여 LED 8개 0.8, 0.2초 간격으로 점멸
#include <mega128.h>
#include <delay.h>
void main(void)
{
DDRC = 0xFF;
// mega128 마이크로콘트롤러 관련 헤더 파일
// delay 함수 정의 헤더 파일
// DDRC : 포트 방향 설정 레지스터
while(1){
PORTC = 0b11111111;
delay_ms(800);
PORTC = 0b00000000;
delay_ms(200);
}
// while(1) : 무한 루프
// PORTC : 포트 입출력 레지스터
// delay 함수
// PORTC : 포트 입출력 레지스터
// delay 함수
}
시스템및센서네트워크연구실
21
실습 4
// PORTC를 이용하여 LED 8개 중 짝수/홀수 LED 0.5초 간격으로 점멸
#include <mega128.h>
#include <delay.h>
// mega128 마이크로콘트롤러 관련 헤더 파일
// delay 함수 정의 헤더 파일
void main(void)
{
DDRC = 0xFF;
// DDRC : 포트 방향 설정 레지스터
while(1){
PORTC = 0b01010101;
delay_ms(500);
PORTC = 0b10101010;
delay_ms(500);
}
// while(1) : 무한 루프
// PORTC : 포트 입출력 레지스터
// delay 함수
// PORTC : 포트 입출력 레지스터
// delay 함수
}
시스템및센서네트워크연구실
22