BASIC4MCU | 질문게시판 | LED 동작
페이지 정보
작성자 나은 작성일2020-11-29 21:16 조회3,021회 댓글1건본문
#define F_CPU 16000000L
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
int dim = 0;
int direction = 1;
DDRB |= (1 << PB4);
TCCR0 |= (1 << WGM01) | (1 << WGM00);
TCCR0 |= (1 << COM01) | (1 << COM00);
TCCR0 |= (1 << CS02) | (1 << CS01) | (1 << CS00);
while(1){
OCR0 = dim;
_delay_ms(20);
dim += direction;
if(dim == 0) direction = 1;
if(dim == 255) dim = 0;
}
return 0;
}
밝기조절코드에서 LED동작이 어떻게 되는지 알려주세용ㅠㅠ
댓글 1
조회수 3,021master님의 댓글
master 작성일
https://cafe.naver.com/circuitsmanual/153892
타이머0 모드는 WGM0 이 3이므로 8비트 fastPWM이므로 (TOP:0xFF)
듀티는 OCR0에 0~0xFF 의 값을 넣어서 듀티를 조절합니다.
dim을 OCR0에 넣어서 듀티를 조절하고 있고
dim을 1씩 증가시키고 있습니다.
간단한 내용인데 코드를 복잡하게 작성하고 있는데요
밝기가 증가만 있고 감소가 없으므로 direction 변수는 없어도 되고요
int dim = 0; 변수를 int로 선언하지 않고 unsigned char로 선언하는 것이 더 좋습니다. (OCR0의 데이터 타입과 일치시킴)
unsigned char dim = 0; // 위쪽에서 변수 선언을 변경해준 후
while(1){ OCR0 = dim++; _delay_ms(20); }
무한루프의 코드는 위처럼 변경하면 질문 소스와 동일한 동작을 합니다.
//----------
물론 증가 후 감소를 반복 한다면 아래처럼 변경하면 됩니다.
변수 선언은 unsigned char로 하지않고 int로 선언합니다.
while(1){
OCR0 = dim;
dim += direction;
if(dim == 0)direction =+1; // 감소하다가 0이 되면 증가로 변경
if(dim == 255)direction=-1; // 증가하다가 255(0xFF)가 되면 감소로 변경
_delay_ms(20);
}
여기서도 디테일하게 본다면 OCR0에 출력한 후에 dim을 증가/감소 시키고 있으므로 0과 0xFF(255)는 출력되지 않습니다.
(제일 처음만 0 1회 출력됨)
while(1){
OCR0 = dim;
dim += direction;
if(dim<0)direction =+1; // 감소하다가 0이 되면 증가로 변경
if(dim>255)direction=-1; // 증가하다가 255(0xFF)가 되면 감소로 변경
_delay_ms(20);
}