글 혹은 그림의 출처가 문제있다면 수정 및 삭제하겠습니다. 우측의 Tags 와 검색기능을 이용하여 편하게 찾을 수 있습니다.
Please check buttons on the right like Tags and language options if can't read this blog (*mobile not support)
12/18/2015
12/14/2015
AVR Timer
1. ATmega128A Timer
Timer를 사용하는 이유는 다양하겠지만, 기본 Timer 와 추가 Timer를 사용하고 있으며,
기본 Timer는 일정 간격으로 Main 함수의 여러 기능의 함수를 Poling 방식 호출하는 데 사용하고 있다.
Linux의 일종의 HZ 설정 , 즉 jiffies 기능이다
기본구성을 처음 Timer 없이 Polling으로 Main 함수를 구현 했으며, 필요한 부분은
Delay를 사용을 했으나, 각 interrupt의 성능저하의 문제를 일으켜 delay대신 Timer로 변경하게되었다.
http://www.elecrom.com/2008/02/12/avr-tutorial-2-avr-input-output/
2. TIMER의 기본구성
AVR128은 Timer는 4개의 Timer로 구성이 되어있으며, 8bit와 16bit 각각 2개씩 구성이 되어있다.
그리고, 이 Timer는 많은 기능을 가지고 있어 나의 경우는 Timer로 밖에 사용하지 않았기에 다른 기능은 별로 중요하지 않았다.
그러므로, 만약 PWM기능이 필요없다면, 사용할 필요가 없을 거 같다.
Timer는 기본적은 PWM과 동작이 가능하며, 여러가지 모드를 제공을 한다.
현재 정확히 모든기능을 모두 사용을 해보지 못하고 테스트를 해보지도 못했다.
하지만, 내가하는 일은 PWM을 사용하는 일이 아니기에 필요가 없지만, PWM Motor 제어라든지 이때 사용하면 적합할껏 같다.
TOP은 고정값 0XFF이외에도 OCR2에 저장된 값에 의해서도 사용이 가능하다. (유저셋팅)
TOP은 고정값, 0xFF, 0x1FF,0x3FF 혹은 OCRnA의 ICRn에 저장된 값에 의해 변경이 가능
cbi(TCCR1A,WGM10);
sbi(TCCR1A,WGM11);
sbi(TCCR1B,WGM12);
sbi(TCCR1B,WGM13);
위 도표를 보면,
예를 들면, Mode 14 , Fast PWM 일 경우, TOP에 ICRn로 유저가 설정하고
그 TOP이 TOV에 적용이 된다. 그래서, User Timer로 사용이 가능하다.
15도 동일 할 것이다.
아래와 같이 library를 사용해서 간단히 Timer를 쉽게 구현했다.
Timer를 사용하는 이유는 다양하겠지만, 기본 Timer 와 추가 Timer를 사용하고 있으며,
기본 Timer는 일정 간격으로 Main 함수의 여러 기능의 함수를 Poling 방식 호출하는 데 사용하고 있다.
Linux의 일종의 HZ 설정 , 즉 jiffies 기능이다
기본구성을 처음 Timer 없이 Polling으로 Main 함수를 구현 했으며, 필요한 부분은
Delay를 사용을 했으나, 각 interrupt의 성능저하의 문제를 일으켜 delay대신 Timer로 변경하게되었다.
http://www.elecrom.com/2008/02/12/avr-tutorial-2-avr-input-output/
2. TIMER의 기본구성
AVR128은 Timer는 4개의 Timer로 구성이 되어있으며, 8bit와 16bit 각각 2개씩 구성이 되어있다.
그리고, 이 Timer는 많은 기능을 가지고 있어 나의 경우는 Timer로 밖에 사용하지 않았기에 다른 기능은 별로 중요하지 않았다.
- 아래와 같이, Timer 관련핀들
- T1,T2,T3 : 외부의 별도의 Crystal를 사용하여 이를 Timer로 이용.
- ICP1,3 : 외부의 신호 이용하여 Timer로 이용하는 것 같다.
- OC0,OC1A 등 : 내가 설정한 값에 도달하면 이를 알려준다(비교기)
그러므로, 만약 PWM기능이 필요없다면, 사용할 필요가 없을 거 같다.
Timer는 기본적은 PWM과 동작이 가능하며, 여러가지 모드를 제공을 한다.
현재 정확히 모든기능을 모두 사용을 해보지 못하고 테스트를 해보지도 못했다.
- 제공모드
- Normal Mode
- Clear Timer on Compare Match (CTC) Mode
- Fast PWM Mode
- Phase Correct PWM Mode
- Phase and Frequency Correct PWM Mode
하지만, 내가하는 일은 PWM을 사용하는 일이 아니기에 필요가 없지만, PWM Motor 제어라든지 이때 사용하면 적합할껏 같다.
- 확인 Register
- TIFR/ETIFR : Flag 설정
- TIMSK/ETIMSK : Interrupt 설정
- 16bit timer의 구성
- 8bit timer 기본정의
TOP은 고정값 0XFF이외에도 OCR2에 저장된 값에 의해서도 사용이 가능하다. (유저셋팅)
- 16bit timer 기본정의
TOP은 고정값, 0xFF, 0x1FF,0x3FF 혹은 OCRnA의 ICRn에 저장된 값에 의해 변경이 가능
cbi(TCCR1A,WGM10);
sbi(TCCR1A,WGM11);
sbi(TCCR1B,WGM12);
sbi(TCCR1B,WGM13);
- TOVn Flag Set on (Timer/Counter Overflow Flag) : Timer interrupt 발생 시점
- Update of OCRnx at : OCRnX Register를 Update 해주는 시점
- TOP : 위 의 정의 참조
- BOTTOM: 위 정의 참조
- MAX: 위 정의 참조
위 도표를 보면,
예를 들면, Mode 14 , Fast PWM 일 경우, TOP에 ICRn로 유저가 설정하고
그 TOP이 TOV에 적용이 된다. 그래서, User Timer로 사용이 가능하다.
15도 동일 할 것이다.
- 8bit timer
- 16bit Counter , 8bit는 유사함
- ICP
- OCP
아래와 같이 library를 사용해서 간단히 Timer를 쉽게 구현했다.
timer1Init(); timer1SetPrescaler(TIMER_CLK_DIV1024); // 11059200/1024 = 10800 HZ Tick . timer1PWMInitICR(TIMER_DIV_VAL); // 10800/1080 = 10Hz , 100ms this timer is 16bit and (timer 1) timerAttach(TIMER1OVERFLOW_INT,setHandler); // timer handler, timer3Init(); timer3SetPrescaler(TIMER_CLK_DIV1024); // 11059200/1024 = 10800 HZ Tick . timer3PWMInitICR(TIMER_DIV_VAL); // 10800/1080 = 10Hz , 100ms this timer is 16bit and (timer 3) timerAttach(TIMER3OVERFLOW_INT,Timer2Handler); // Timer2Handler
피드 구독하기:
글
(
Atom
)