LED 실습 2

Download Report

Transcript LED 실습 2

마이크로프로세서설계 – 4
LED 실습 2
시스템및센서네트워크연구실
1
ATmega128
시스템및센서네트워크연구실
2
LED sink 회로
PC0
+5V
PC1
…..
PC7
시스템및센서네트워크연구실
3
시스템및센서네트워크연구실
4
변수와 자료 유형
 변수
 프로그램에서 자료 값을 임시로 기억할 수 있는 저장 공간을 변수
(variables)라 함
 자료 유형
 이 변수에 저장되는 값의 종류를 자료 유형(data types) 또는 간단히 자료
형이라고도 함
시스템및센서네트워크연구실
5
변수 선언
 선언
 사용하기 전에 반드시 선언(declaration)을 먼저 하고 이용
 선언도 하나의 문장으로 반드시 세미콜론으로 종료
 변수 선언된 이후에 중요한 세 가지(자료 유형, 값, 이름) 의미를 가짐
자료유형 변수이름;
int money;
 변수의 초기 값
 변수를 선언하면서 바로 값을 저장하려면, 다음과 같이 변수이름에 이어서 대입
연산자 =와 원하는 값을 기술
int year = 12;
 메모리 공간의 확보
 변수 선언은 메모리에 자료 유형에 맞는 크기의 저장 공간을 확보하라는 중요한
의미의 문장
시스템및센서네트워크연구실
6
마이크로콘트롤러에서 주로 사용되는 자료형
 signed int
 -27에서부터 27-1까지 표현 가능
 unsigned int
 0에서 28까지 표현 가능
-27 <= signed int <= 27-1
0 <= unsigned int <= 28-1
 char
 문자 유형은 모두 1 바이트, 즉 8 비트로 구성
 문자의 내부 값
 메모리에는 문자가 저장되는 것이 아니라 문자에 대응되는 정수 저장
 따라서 문자형 자료형은 넓은 의미로 unsigned int로 고려
char c = ‘a’;
char b = 0xFF;
시스템및센서네트워크연구실
7
관계 연산자
 >, <, ==, !=, >=, <=
 관계 연산자는 2개의 피연산자 크기를 비교하기 위한 연산자
• 두 항의 값을 비교하는데 사용
 두 개의 문자로 구성되는 관계연산자 기호 사이에는 공백문자가 없이 연
결되어야 하며, 두 개의 문자 순서도 주의 해야 함
 관계 연산자가 포함된 수식의 결과는 1(참)이 아니면 0(거짓)
시스템및센서네트워크연구실
8
논리 연산자
 &&(and), ||(or), !(not)
 논리 연산자는 두 개 또는 하나의 논리값을 0(거짓)이나 1(참)의 논리값으
로 평가하기 위한 연산자
 평가의 결과는 반드시 0이거나 1
시스템및센서네트워크연구실
9
비트 논리 연산자
 &, |, ^, ~
 비트 논리 연산자는 피연산자 정수 값을 비트 단위로 논리 연산을 수행하는 연
산자
 연산 결과
value = 0b00001111;
value = value & 0b00000001; // value 값이 0b00000001로 변경
시스템및센서네트워크연구실
10
비트 마스킹(bit masking)
 bit masking
 원하는 비트만을 선택하거나 변경하기 위한 방법을 비트 마스킹이라 함
 마이크로컨트롤러의 경우, 비트 단위로 입출력이 이루어지므로, 비트 마
스킹 기능이 매우 중요함
 어떤 값에서 특정 비트의 값을 알려면
 해당 비트만 1, 그 외 모든 비트는 0을 갖는 마스크를 이용하여 비트 and
연산을 수행하면 결과를 얻음
value = 0b00001111;
value = value & 0b00000001; // 0번 비트값만 기존 값 유지
시스템및센서네트워크연구실
11
이동 연산자
 >>, <<
 이동연산자는 비트 단위로 왼쪽이나 오른쪽으로 이동시키는 연산자
 연산 결과
value = 0b00000001;
value = value << 1;
시스템및센서네트워크연구실
// value 값이 0b00000010 로 변경
12
실습 1
// PORTC를 이용하여 LED 1개 0.5초 간격으로 순차 점멸 -> 쉬프트 연산자 사용
#include <mega128.h>
#include <delay.h>
// mega128 마이크로콘트롤러 관련 헤더 파일
// delay 함수 정의 헤더 파일
void main(void)
{
char led = 0b11111110;
DDRC = 0xFF;
// char형 변수 선언
// DDRC : 포트 방향 설정 레지스터
while(1){
// while(1) : 무한 루프
PORTC = led;
// PORTC : 포트 입출력 레지스터
delay_ms(500);
// delay 함수
led = led << 1;
// PORTC : 포트 입출력 레지스터
led = led | 0b00000001; // 쉬프트 후에 0비트에는 ‘0’이 입력되므로, ‘1’로 셋 -> 생략하면 값은?
if(led == 0xFF) led = 0b11111110; // led 변수 초기화 -> 생략하면 값은?
}
}
시스템및센서네트워크연구실
13
축약 대입 연산자
 축약 대입 연산자
 대입 연산자인 =와 기타 연산자를 합쳐 놓은 듯한 연산자를 축약 대입 연산자라
함
 왼쪽 피연산자 부분에는 반드시 변수만이 올 수 있음
led = led << 1; // 일반적인 사용
led <<= 1;
// 축약대입연산자 사용
시스템및센서네트워크연구실
14
실습 2
// PORTC를 이용하여 LED 1개 0.5초 간격으로 왕복 순차 점멸
#include <mega128.h>
#include <delay.h>
// mega128 마이크로콘트롤러 관련 헤더 파일
// delay 함수 정의 헤더 파일
void main(void)
{
char led = 0b11111110;
DDRC = 0xFF;
// char형 변수 선언
// DDRC : 포트 방향 설정 레지스터
while(1){
while(led != 0b01111111) {
PORTC = led;
delay_ms(500);
led <<= 1;
led |= 0b00000001;
}
while(led != 0b11111110) {
PORTC = led;
delay_ms(500);
led >>= 1;
led |= 0b10000000;
}
} 시스템및센서네트워크연구실
// while(1) : 무한 루프
// PORTC : 포트 입출력 레지스터
// delay 함수
// PORTC : 포트 입출력 레지스터
// 쉬프트 후에 0비트에는 ‘0’이 입력되므로, ‘1’로 셋
// PORTC : 포트 입출력 레지스터
// delay 함수
// PORTC : 포트 입출력 레지스터
// 쉬프트 후에 7비트에는 ‘0’이 입력되므로, ‘1’로 셋
15
형 변환 연산자
 형 변환 연산자
 피연산자의 값을 앞 위치의 괄호 안에서 지정한 자료형으로 변환하는 연
산
 MCU에서는 8비트 체계를 사용하므로, 정수 연산의 경우 (char) 연산자를
사용하여 8비트로 변환해주어야 함
(자료형) 피연산자
(char) (rand() % 256)
시스템및센서네트워크연구실
16
난수 (랜덤숫자)
 Random number
 임의의 수를 난수(random number)라 하는데, 시스템 라이브러리에서 난수
를 만드는 함수를 제공
 함수 rand()를 이용하면 난수를 발생시킬 수 있는데, 이 함수를 사용하기 위해
서는 헤더 파일 stdlib.h 파일을 첨가
#include <stdlib.h>
rand()

함수 rand()에 의해 생성되는 정수는 [0, 32767] 사이의 임의의 정수
시스템및센서네트워크연구실
17
실습 3
// PORTC를 이용하여 LED의 불규칙적인 점등 패턴 – rand() 함수를 사용
// rand() 함수 : 0-32767 까지의 임의의 숫자를 만들어 냄
#include <mega128.h> // mega128 마이크로컨트롤러 관련 헤더 파일
#include <delay.h>
// delay 함수 정의 헤더 파일
#include <stdlib.h>
// rand 함수 정의 헤더 파일
void main(void)
{
DDRC = 0xFF;
// DDRC : 포트 방향 설정 레지스터
while(1){
// while(1) : 무한 루프
PORTC = (char) (rand() % 256) ^ 0xFF; // 랜덤 숫자를 256으로 나머지 연산을 수행. 결과는 0x00 – 0xFF
// ^ 0xFF :반전 연산, sink 회로로 연결해야 하므로 반전시켜야 함
delay_ms(500);
// delay 함수
}
}
시스템및센서네트워크연구실
18
수학함수
 수학 관련 함수
 수학에서 이용하는 여러 함수는 예약어로 정의되어 있음
 위의 함수를 이용하기 위해서는 위 함수의 함수 원형이 정의된 헤더파
일 math.h 파일을 추가
• #include <math.h>
 프로그램에서 사용되는 수학 함수
• 지수함수 : pow(x, y) -> xy
 주요 수학 함수
• 삼각 함수 : sin(x), cos(x), tan(x), asin(x), acos(x), atan(x),
• 지수함수 : exp(x) -> ex
• 로그함수 : log(x) -> ln x, log10(x) -> log10 x
• 제곱근함수 : sqrt(x) -> √ x
• 절대값 : abs(x) -> | x |
시스템및센서네트워크연구실
19
실습 4
// PORTC를 이용하여 LED 1개만 불규칙적으로 점등되도록 프로그래밍 – rand() 함수와 pow()를 사용
// rand() 함수 : 0-32767 까지의 임의의 숫자를 만들어 냄
#include <mega128.h> // mega128 마이크로컨트롤러 관련 헤더 파일
#include <delay.h>
// delay 함수 정의 헤더 파일
#include <stdlib.h>
// rand 함수 정의 헤더 파일
#include <math.h>
// pow(x, y) 함수 정의 헤더 파일
void main(void)
{
char position = 0;
// 자리수를 결정하는 변수
DDRC = 0xFF;
// DDRC : 포트 방향 설정 레지스터
while(1){
// while(1) : 무한 루프
position = (char) (rand() % 8);
// 랜덤 숫자를 8로 나머지 연산을 수행. 결과는 1 – 7
PORTC = (char) pow(2, position) ^ 0xFF; // pow(2, position) : position 위치에 있는 비트만 1로 설정
// ^ 0xFF : sink 회로이므로 반전 연산
delay_ms(500);
// delay 함수
}
}
시스템및센서네트워크연구실
20
증감 연산자
 ++, - 피연산자는 연산자의 앞이나 뒤에 위치
 사용형태 : 변수++, 변수--
 피연산자의 값을 1만큼 줄이거나 늘리는 데에 사용
시스템및센서네트워크연구실
21
실습 5
// PORTC를 이용하여 LED 1개에서 8개까지 차례대로 점등, 차례대로 소등
#include <mega128.h>
// mega128 마이크로컨트롤러 관련 헤더 파일
#include <delay.h>
// delay 함수 정의 헤더 파일
#include <math.h>
// pow(x, y) 함수 정의 헤더 파일
void main(void)
{
char position = 0;
DDRC = 0xFF;
// DDRB : 포트 방향 설정 레지스터
while(1){
// while(1) : 무한 루프
while (position < 9) {
position++;
// position 값이 0 에서 증가하여 8까지
// position의 값 1 증가
PORTC = (char) (pow(2, position) - 1) ^ 0xFF; // PORTC에 1, 3, 7, 15, 31,..가 차례대로 출력되도록 설정
delay_ms(500);
// ^ 0xFF : sink 회로이므로 반전 연산
}
while (position > 0) {
position--;
// position 값이 8에서 감소하여 1까지
// position의 값 1 감소
PORTC = (char) (pow(2, position) - 1) ^ 0xFF; // PORTC에 255, 127, 63, 31,..가 차례대로 출력되도록 설정
delay_ms(500);
// ^ 0xFF : sink 회로이므로 반전 연산
}
}
}}시스템및센서네트워크연구실
22