뻔뻔한 AVR 프로그래밍 The 4 th Lecture 유명환 ( yoo@netplug.co.kr)
1 시간 (Time) 에대한정의 INDEX 2 왜타이머 (Timer) 와카운터 (Counter) 인가? 3 ATmega128 타이머 / 카운터동작구조 4 ATmega128 타이머 / 카운터관련레지스터 5 뻔뻔한노하우 : 레지스터비트설정방법 6 ATmega128 타이머 / 카운터실습
1 시간 (Time) 에대한정의 절대적인시간 시간 주변환경과상관없이독립적으로제어되는시간 예 ) RTC : Real-Time Clock 상대적인시간 주변환경과맞물려제어되어야하는시간 지금으로부터 ~ 후 예 ) 1초마다한번씩 LED가 On/Off
2 왜타이머 (Timer) 와카운터 (Counter) 인가? 1. 3 분뒤에라면을먹는것이목표다. 2. 3 분이란시간을측정해야한다. 3. 3 분이란약속된시간이지난후반드시이를알려줘야한다. 4 3 분이란시간을누군가 ( 타이머 ) 알려주 4. 3 분이란시간을누군가 ( 타이머 ) 알려주면이제까지하던일을멈추고 1 번의목표를실행한다.
2 왜타이머 (Timer) 와카운터 (Counter) 인가? Situation 주기적인 action Definition ( 주파수의 ) 진동수 = (Hz) 1 ( 시간의 ) 주기 (second) clock - 원하는주기를설정 Timer - 클럭의입력횟수카운팅 Counter
2 왜타이머 (Timer) 와카운터 (Counter) 인가? 공식 (1) 1ms = 1 16M n 1 공식 (2) 1ms = Prescaler n 16M
2 왜타이머 (Timer) 와카운터 (Counter) 인가? 1/4 Prescaler 1 ( 초) 진동수 1 1 clock = 16MHz 16 MHz의경우1 clock 시간 1 ( 초) 진동수 1 1clock = prescaler 16 MHz 16 MHz의경우1 count 시간 (prescaler 사용 ) Prescaler Timer/Counter 1/4 Original Clock 16MHz (Oscillator) Timer/Counter 1/8
3 ATmega128 타이머 / 카운터동작구조 ATmega128 AVR Core Timer/Counter 1ms 마다알려달라고요청 n 값을계산 n 값만큼카운팅 인터럽트 서비스루틴실행 인터럽트 1ms 시간완료 n 값카운팅완료 No 1/64 1/1024 16MHz
3 ATmega128 타이머 / 카운터동작구조 Overflow Interrupt 0 0 0 0 0 0 0 0 0 으로초기화 1 1 1 1 1 1 1 1-8bit register 한개만필요 - Overflow 는 255 에서발생 - 0~255 256 counting 255 에서 overflow Interrupt 발생 (n = 256) 0 0 0 0 0 1 1 0 6 으로초기화 1 1 1 1 1 1 1 1 - n = 250 일때인터럽트발생 -0이아닌6으로초기화 - 6~255 250 counting 255 에서 overflow 발생 Interrupt 발생 (n = 250)
Output Compare Match Interrupt 3 ATmega128 타이머 / 카운터동작구조 0 0 0 0 0 0 0 0 0 으로초기화 1 1 1 1 1 0 0 1 249 (n 1) 로초기화 counter register compare register - 두개의register 필요 counter register ( 횟수기록 ) compare register (n 값기록 ) - counter register가증가되다 compare register와그값이서로같으면 interrupt발생 0 0 0 0 1 1 1 1 counter register counter register 값을증가시킨후 compare register 와비교 - counter register를증가하며 compare register와비교 1 1 1 1 1 0 0 1 compare register 1 1 1 1 1 0 0 1 (counter register == compare register) interrupt 발생 counter register 1 1 1 1 1 0 0 1 compare register - counter register와 compare register를비교하여값이서로같을때 interrupt 발생 - 250 counting
4 ATmega128 타이머 / 카운터관련레지스터 TCCR0 : Timer/Counter Control Register Register 설명실제구현예 Bit6, 3 WGM01:0 Waveform Generation Mode 출력할파형설정 Overflow interrupt 일때 Normal mode로설정 Interrupt가발생할때마다반드시 TCNT0 값을초기화해야함 Compare match interrupt 일때 CTC mode 로설정 TOP을 OCR0로사용-> OCR0 값에서인터럽트발생 Interrupt가발생하면자동적으로 TCNT0 값이 0 으로초기화됨 TCCR0 = (0 << WGM00) (1 << WGM01); // CTC mode TCCR0 = (0 << WGM00) (0 << WGM01); // Normal mode
4 ATmega128 타이머 / 카운터관련레지스터 Bit 2:0 CS02: Clock select Prescaler 설정 TCCR0 = (1<<CS02) (0<<CS01) (0<<CS00); // 1/64 Prescaler
4 ATmega128 타이머 / 카운터관련레지스터 TCNT0 : Timer/Counter Register Register 설명실제구현예 TCNT0 Prescaler가적용된클럭주기마다 1씩증가하는 8비트값 하드웨어 (= 카운터 ) 에의해증가됨 Overflow Interrupt 발생시점 = 256 n Output Compare Match Interrupt 발생시점 = 0 TCNT0 = 256 (CPU_CLOCK/TICKS_PER_SEC/64); // CPU_CLOCK : 16000000 // TICKS_PER_SEC : 1000 // 64 : 1/64 Prescaler // (CPU_CLOCK/TICKS_PER_SEC/64) == n
4 ATmega128 타이머 / 카운터관련레지스터 OCR0 : Output Compare Register Register 설명실제구현예 OCR0 TCNT0와비교가되는 8비트값 Output Compare Match Interrupt 에서사용 초기화값 = n - 1 OCR0 = (CPU_CLOCK/TICKS_PER_SEC/64) - 1;
4 ATmega128 타이머 / 카운터관련레지스터 TIMSK : Timer/Counter Interrupt Mask Register Register 설명실제구현예 Bit 1 OCIE0: Timer/Count er0 Output Compare Match Interrupt Enable Bit 0 TOIE0: Timer/Count er0 Overflow Interrupt Enable Output Compare Match Interrupt 활성화 OCIE0 와 SREG_I 비트가 1 로설정되어있어야만 Output Compare Match Interrupt가활성화됨 Overflow Interrupt 활성화 TOIE0와 SREG_I 비트가 1로설정되어있어야만 Overflow Interrupt가활성화됨 TIMSK = (1<<OCIE0) (0<<TOIE0); // Output Compare Match Interrupt TIMSK = (0<<OCIE0) (1<<TOIE0); // Overflow Interrupt
4 ATmega128 타이머 / 카운터관련레지스터 1 개의명령어의처리시간 : 0.0000000625sec Overflow Interrupt Example 1ms 가되기위해선? -> 250 (n) count 필요 16MHz clock 64 분주 4us (timer 값 ) TCNT0 초기화 250 counting 1ms Timer Overflow (TCNT0 증가 ) Interrupt 64*25,000=16MHz 0.0000000625sec 0000000625sec * 64 = 0.000004sec 000004sec = 4us 초기값부터 Max 값 255 까지 counting Max 값 (= 0xFF) 까지 TCNT0 값증가 TCCR0 Prescaler( 분주비 ) 설정 TCNT0 하드웨어에의해증가하는 8비트카운터값 (256 n) TIMSK Overflow interrupt 를활성화시키기위해 TIMSK 레지스터의 TOIE0 비트를 1 로설정
5 뻔뻔한노하우 : 레지스터비트설정방법 7 6 5 4 3 2 1 0 FUNFUN BOY GIRL FUNFUN = 0x80; FUNFUN = (1<<BOY); 7 6 5 4 3 2 1 0 FUNFUN BOY GIRL FUNFUN = 0x88; FUNFUN = (1<<BOY) (1<<GIRL);
6 ATmega128 타이머 / 카운터실습 물리적연결 DK128-MAIN 과 DK128-EXT 연결 초기화 & 설정루틴 Timer/Counter 관련레지스터설정 Overflow Interrupt 발생 초기화 : n 값계산설정 : TCCR0 설정 -> Normal mode, 1/64 Prescaler 활성화 : TIMSK 설정 -> Overflow Interrupt 활성화 서비스루틴 Timer/Counter 인터럽트서비스루틴 (Interrupt Vector Table사용 ) SIGNAL(SIG_OVERFLOW0)
6 ATmega128 타이머 / 카운터실습 ATmega128 Data Sheet C:\AvrEdit\WinAvr\avr\include\avr\iom128.h /* Interrupt vectors */ #define SIG_INTERRUPT0 _VECTOR(1) #define SIG_INTERRUPT1 INTERRUPT1 _VECTOR(2) #define SIG_INTERRUPT2 _VECTOR(3) #define SIG_INTERRUPT3 _VECTOR(4) #define SIG_INTERRUPT4 _VECTOR(5) #define SIG_INTERRUPT5 _VECTOR(6) #define SIG_INTERRUPT6 INTERRUPT6 _VECTOR(7) #define SIG_INTERRUPT7 _VECTOR(8) #define SIG_OUTPUT_COMPARE2 _VECTOR(9) #define SIG_OVERFLOW2 _VECTOR(10) #define SIG_INPUT_CAPTURE1 _VECTOR(11) #define SIG_OUTPUT_COMPARE1A _VECTOR(12) #define SIG_OUTPUT_COMPARE1B _VECTOR(13) #define SIG_OVERFLOW1 _VECTOR(14) #define SIG_OUTPUT_COMPARE0 _VECTOR(15) #define SIG_OVERFLOW0 _VECTOR(16)