BASIC4MCU | AVR | 타이머 | 스위치 8개 피아노 - 타이머모드 설명
페이지 정보
작성자 키트 작성일2017-08-29 09:42 조회4,801회 댓글0건본문
DDRB=0x20; //포트 B.5 펄스출력
OC1A에 출력을 하기 위해서 출력으로 지정 합니다.
//-----------
TCCR1A=0x40;
데이터시트 133페이지
TCCR1A 레지스터
COM1A1 COM1A0 COM1B1 COM1B0 COM1C1 COM1C0 WGM11 WGM10
0x40 이면 위에 적색 비트만 1입니다.
Table 58. Compare Output Mode, non-PWM
Toggle OCnA/OCnB/OCnC on compare match.
compare match 시 OC1A 핀이 토글 된다고 적혀있습니다.
데이터시트 135페이지
Table 61. Waveform Generation Mode Bit Description
Mode 4 - CTC 모드( WGM13 WGM12 WGM11 WGM10 )
TCCR1A의 최하위 두개의 비트 WGM11 WGM10는 00입니다.
TOP - OCR1A
TCNT는 0부터 OCR1A까지 증가를 반복합니다.
//-----------
TCCR1B=8;
데이터시트 136페이지
TCCR1B 레지스터
ICNC1 ICES1 – WGM13 WGM12 CS12 CS11 CS10
모드4 CTC모드를 설정 하기 위한 WGM12만 1입니다.
데이터시트 136페이지
Table 62. Clock Select Bit Description
위 표를 보고서 CS12 CS11 CS10를 설정 하세요
//------
TCCR1C=0x80;
TCCR1B 레지스터
FOC1A FOC1B FOC1C – – – – –
OC1A핀 출력을 결정하는 레지스터입니다.
//-------
OCR1A=0x??;
타이머 클럭과 연동해서 이 값으로 출력의 반주기를 결정 합니다.TCNT1이 OCR1A과 같아지면 OC1A핀이 출력토글(반전) 됩니다.
//-------
OCR1A 레지스터와 OC1A핀을 구분하지 못하는 분이 계시면
데이터시트 2페이지에서 OC1A핀이 어디에 있는지 찾아보세요 (포트 B.5 펄스출력)
//---------
//---------
//---------
카페의 많은 타이머 예제에서 비교매치 인터럽트를 사용 해서
카페 예제를 많이 돌려본 분은 비교매치가 뭔지 잘 이해 하실겁니다.
비교매치 인터럽트와 아주 유사합니다.
차이점은
1. DDRB=0x20; //포트에 출력을 해야 하니 당연히 출력 지정 해야겠죠
2. TCCR1C=0x80; // Force Output Compare for Channel A
위 두가지만 추가되면 되는 간단한 모드입니다.
//--------
사용은
예를들어서 50Hz 펄스를 출력 한다고 하면
주기가 50Hz이고 (20ms)
출력의 토글은 반주기마다 이뤄져야 하므로 10ms입니다.
비교매치 인터럽트의 10ms 타이머를 만드는 것은 간단합니다.
// 타이머1 A매치 인터럽트
TCCR1B=0x09; OCR1A=1474; TIMSK=0x10; //14745600/ 1/(1+ 1474)=9997.01695Hz=100.02984us
TCCR1B=0x09; OCR1A=1599; TIMSK=0x10; //16000000/ 1/(1+ 1999)=10KHz=100us
TCCR1B=0x09; OCR1A=15999; TIMSK=0x10; //16000000/ 1/(1+15999)=1000Hz=1ms
TCCR1B=0x09; OCR1A=31999; TIMSK=0x10; //16000000/ 1/(1+31999)= 500Hz=2ms
TCCR1B=0x0A; OCR1A= 1999; TIMSK=0x10; //16000000/ 8/(1+ 1999)=1000Hz=1ms
TCCR1B=0x0A; OCR1A= 3999; TIMSK=0x10; //16000000/ 8/(1+ 3999)= 500Hz=2ms
TCCR1B=0x0A; OCR1A= 9999; TIMSK=0x10; //16000000/ 8/(1+ 9999)= 200Hz=5ms
TCCR1B=0x0A; OCR1A=19999; TIMSK=0x10; //16000000/ 8/(1+19999)= 100Hz=10ms
TCCR1B=0x0C; OCR1A= 6249; TIMSK=0x10; //16000000/256/(1+ 6249)= 10Hz=100ms
TCCR1B=0x0C; OCR1A=31249; TIMSK=0x10; //16000000/256/(1+31249)= 2Hz=500ms
TCCR1B=0x0C; OCR1A=62499; TIMSK=0x10; //16000000/256/(1+62499)=1Hz=1sec
인터럽트를 사용할 것은 아니므로 TIMSK=0x10은 필요없고
TCCR1B=0x0A; OCR1A=19999;
이 두개의 레지스터는 위의 값으로 설정하면 됩니다.
댓글 0
조회수 4,801등록된 댓글이 없습니다.