BASIC4MCU | 질문게시판 | 아두이노 2560 문제입니다. 부탁드려요ㅜㅜ
페이지 정보
작성자 전기17학번 작성일2020-11-13 18:24 조회4,063회 댓글1건본문
#define F_CPU 16000000L
#include <avr/io.h>
#include <avr/interrupt.h)
#define set_bit(value, bit) ( _SFR_BYTE(value) |= _BV(bit) )
#define clear_bit(value, bit) ( _SFR_BYTE(value) &= ~_BV(bit) )
volatile int count = 0;
uint8_t state = 0;
ISR(TIMER0_OVF_vect) {
count++;
}
int main(void) {
set_bit(DDRB, 7);
clear_bit(PORTB, 7);
TCCR0B |= (1 << CS02) | (1 << CS00);
TIMSK0 |= (1 << TOIE0);
sei();
while (1) {
if (count == 32) {
count = 0;
state = !state;
if (state) set_bit(PORTB, 7);
else clear_bit(PORTB, 7);
}
}
return 0;
}
이코드는 0번 타이머/카운터의 오버플로 인터럽트를 이용하여 0.5초 간격으로 LED를 점멸하는 코드이다. 이를 또 다른 8비트 타이머/카운터인 2번 타이머/카운터를 사용하도록 수정해보자. 2번 타이머/카운터의 사용법은 0번 타이머/카운터와 기본적으로 같으며 해당 레지스터에서 타이머/카운터 번호인 '0'을 '2'로 수정하면 된다. 또 한가지 다른점은 0번 타이머/카운터의 경우 1024 분주비를 설정하기 위해 CS0n 비트를 101로 설정해야한다면 2번 타이머/카운터는 CS2n비트를 111로 설정해야한다는 점이다.
댓글 1
조회수 4,063master님의 댓글
master 작성일
바뀌어야 하는 부분을 대충 찾아드리죠
ISR(TIMER2_OVF_vect) { // ISR(TIMER0_OVF_vect) {
//
TCCR2B |= (1 << CS22) | (1 << CS21) | (1 << CS20); // TCCR0B |= (1 << CS02) | (1 << CS00);
TIMSK2 |= (1 << TOIE2); // TIMSK0 |= (1 << TOIE0);
0을 단순히 2로 변경만 하면 되는 경우 위처럼 되지만
데이터시트를 반드시 찾아서 체크하셔야 합니다.