KTM 128 Peripheral Device Interrupt Timer Counter 0



































![AVR Timer /Counter • Timer / Counter 0의 동작 모드 – WGM[1: 0] (Waveform AVR Timer /Counter • Timer / Counter 0의 동작 모드 – WGM[1: 0] (Waveform](https://slidetodoc.com/presentation_image_h/037c7e72387988a3e8eae62a863f64e7/image-36.jpg)



















- Slides: 55
KT-M 128 Peripheral Device Interrupt Timer / Counter 0 2010. 8. 3 조 승훈 Reference: AVR ATmega 128 정복, ohm사 마이콤 기초와 응용 강의노트 (ATmega 128 시스템), 동국대 전기공학과 최한호
Index • AVR Interrupt • Timer / Counter 0 • Source Code 2
AVR Interrupt • Interrupt Vector 부트 사이즈의 선택 Reset 및 Interrupt Vector의 위치 설정 BOOTRST in Fuse High Byte 12
AVR Interrupt • Interrupt 관련 Register – MCUCR (MUC Control Register) – Bit 1 : Interrupt Vector Select • Interrupt Vector 설정 – Bit 0 : Interrupt Vector Change Enable • 0: Interrupt Vector 바꿈 차단 • 1: Interrupt Vector 바꿈 허용 15
AVR Interrupt • EICRA (External Interrupt Control Register A) – Bit 7 – 6 (External Interrupt 3 Sense Control) • 외부 인터럽트 INT 3의 트리거 방식 설정 – Bit 5 – 4 (External Interrupt 2 Sense Control) • 외부 인터럽트 INT 2의 트리거 방식 설정 – Bit 3 – 2 (External Interrupt 1 Sense Control) • 외부 인터럽트 INT 1의 트리거 방식 설정 – Bit 1 – 0 (External Interrupt 0 Sense Control) • 외부 인터럽트 INT 0의 트리거 방식 설정 ISOn 1 ISOn 0 인터럽트 트리거 방식 0 0 Intn 핀의 Low Level 신호 입력이 인터럽트를 트리거 0 1 - 1 0 Intn 핀의 Falling Edge 입력이 인터럽트를 트리거 1 1 Intn 핀의 Rising Edge 입력이 인터럽트를 트리거 16
AVR Interrupt • EICRB (External Interrupt Control Register B) – Bit 7 – 6 (External Interrupt 7 Sense Control) • 외부 인터럽트 INT 7의 트리거 방식 설정 – Bit 5 – 4 (External Interrupt 6 Sense Control) • 외부 인터럽트 INT 6의 트리거 방식 설정 – Bit 3 – 2 (External Interrupt 5 Sense Control) • 외부 인터럽트 INT 5의 트리거 방식 설정 – Bit 1 – 0 (External Interrupt 4 Sense Control) • 외부 인터럽트 INT 4의 트리거 방식 설정 ISOn 1 ISOn 0 인터럽트 트리거 방식 0 0 Intn 핀의 Low Level 신호 입력이 인터럽트를 트리거 0 1 Intn 핀의 Falling Edge 또는 Rising Edge 입력이 인터럽트를 트리거 1 0 Intn 핀의 Falling Edge 입력이 인터럽트를 트리거 1 1 Intn 핀의 Rising Edge 입력이 인터럽트를 트리거 17
AVR Interrupt • EIMSK (External Interrupt Mask Register) – Bit 7 – 0 : External Interrupt Mask Register • 1: 각각의 인터럽트 허용 • 0: 각각의 인터럽트 금지 18
AVR Interrupt • EIFR (External Interrupt Flag Register) – Bit 7 – 0 : External Interrupt Flag Register • 각각의 인터럽트 발생 19
AVR Timer /Counter • Timer / Counter Overview – 입력으로 들어오는 펄스를 셈하는 장치 – 입력으로 들어오는 펄스가 어디에 존재하느냐에 따라 Timer와 Counter로 나눔 – AVR ATmega 128에는 범용 타이머 / 카운터가 4개 존재 • • Timer/Counter 0 Timer/Counter 1 Timer/Counter 2 Timer/Counter 3 (8 bit) (16 bit) 20
AVR Timer /Counter – Timer와 Counter의 차이점 • Timer – 내부 Clock (빠름 / 분주 가능: 범위 내에서 Clock 선택 가능) – 동기모드 – 타이머는 MCU의 내부 Clock (Clk I/O -> 분주기 -> Clk. T)을 이용 – 일정시간 간격의 펄스를 만들어 내거나, 일정시간 경과 후에 인터럽트 발생 가능 • Counter – 외부 Clock (느림 / 분주 불가능: 외부 Clock 그대로 사용) – 비 동기모드 – Counter는 외부 핀 (TOSC 1, TOSC 2, T 1, T 2, T 3)을 통해 들어오는 펄스를 계수 (Edge Detector)하여 Event Counter로서 동작 (Pulse = Event, Counter = Number of Event) – Timer / Counter Register • • Timer / Counter Control Register (TCCRn) Timer / Counter Register (TCNTn) Output Compare Register (OCRn) Interrupt – Timer / Counter Interrupt Flag Register (TIFR) – Timer / Counter Interrupt Mask Register (TIMSK) 21
AVR Timer /Counter • 8 Bit Timer / Counter 0 – Timer / Counter 0의 특징 • • 싱글 채널 카운터 Clear Timer on Compare Match 기능 (Auto Reload 기능) 글리치가 없는 Phase Correct PWM 기능 주파수 발생 기능 10 bit 프리스케일러 기능 Timer 0 Overflow Interrupt와 Timer 0 Compare Match Interrupt I/O Clock과는 별도로 32. 768 k. Hz를 인가 가능한 핀 (TOSC 1, TOSC 2 핀) 22
AVR Timer /Counter • BOTTOM : ox 00일 경우 카운터가 Bottom에 도 달 • MAX • TOP : 0 x. FF일 경우 카운터가 MAX에 도달 : Max or OCR 0 값에 도달 23
AVR Timer /Counter • 프리스케일러 (Pre. Scaler) – 전치 분주기 – 총 8개의 스케일을 가지고 있음 – 분주비가 1: 8일 경우, 시스템 Clock이 8번 들어 올 때, 프리스케일러 를 통과한 Clock은 1번의 Clock이 발생 Prescaler for Timer / Counter 0 (ASSR[3 ]) (SFIOR[1 ]) (TCCR 0[2: 0]) CS 02 CS 01 CS 00 기능 설명 0 0 0 정지 0 0 1 CLK 0 1 0 CLK / 8 0 1 1 CLK / 32 1 0 0 CLK / 64 1 0 1 CLK / 128 1 1 0 CLK / 256 1 1 1 CLK / 1024 24
AVR Timer /Counter • Timer / Counter 관련 레지스터 (I/O Reg 영역에 Mapping) – SFIOR (Special Function I/O Register) – Bit 7 : TSM (Timer / Counter Synchronization Mode) • 1: Timer / Counter 0의 동기 모드, PSR 0와 PSR 321에 쓴 값은 유지 됨 • 0: PSR 0와 PSR 321에 쓴 값은 하드웨어에 의해 클리어 됨 – Bit 1 : PSR 0 (Prescaler Reset Timer / Counter 0) • 1: Timer / Counter 0의 Prescaler를 리셋 • 0: 영향 없음 25
AVR Timer /Counter – ASSR (Asynchronous Status Register) – Bit 3 : AS 0 (Asynchronous Timer / Counter 0) • 0: Clock 소스 = Clk. I/O (동기 모드) • 1: Clock 소스 = TOSC 1 (비동기 모드) – Bit 2 : TCN 0 UB (Timer /Counter (TCNT 0) Update Busy) • 비동기 모드일 때 TCNT 0에 새로운 값이 라이트되면 셋 – Bit 1 : OCR 0 UB (Output Compare Register (OCR 0) Update Busy) • 비동기 모드일 때 OCR 0에 새로운 값이 라이트되면 셋 – Bit 0 : TCR 0 UB (Control Register (TCCR 0) Update Busy) • 비동기 모드일 때 TCCR 0에 새로운 값이 라이트되면 셋 26
AVR Timer /Counter – TCCR 0 (Timer /Count 0 Control Register) – Bit 7 : FOC 0 (Force Output Compare) • 1: 강제로 OC 0 단자에 출력 비교가 매치된 신호 출력 (PWM 아닌 경우에 유효) – Bit 6 : WGM 00 (Waveform Generation Mode) • Counter의 카운팅 방향, MAX(TOP) 카운터 값의 소스 및 Mode 선택 – Bit 5 – 4 : Com 01 - Com 00 (Compare Match Output Mode) • OC 0 핀 기능 설정 – Bit 3 : WGM 01 (Waveform Generation Mode) • Counter의 카운팅 방향, MAX(TOP) 카운터 값의 소스 및 Mode 선택 – Bit 2 – 0 : CS 02 – CS 00 (Clock Select) • Clock의 분주 비율 설정 27
AVR Timer /Counter Waveform Generation Mode WGM 0 1 WGM 0 0 Mode of Operation TOP Update of OCR 0 TOV 0 Flag Set 0 0 0 Normal ox. FF Immediate MAX 1 0 1 PWM, Phase Correct ox. FF TOP BOTTOM 2 1 0 CTC OCR 0 Immediate MAX 3 1 1 Fast PWM ox. FF TOP MAX Compare Output Mode, non PWM Mode PWM모드가 아닌 경우 (Normal / CTC) Mode COM 01 COM 00 FAST PWM 0 범용 입출력포트 (OC 0 출력 차단) 0 1 Reserved 1 설명 0 0 범용 입출력포트 (OC 0 출력 차단) 0 1 비교매치 >> OC 0 Toggle 출력 1 0 비교매치 >> OC 0 = 0 출력 1 1 비교매치 >> OC 0 = 1 출력 설명 0 1 COM 00 0 비교매치 >> OC 0 = 0 출력 오버플로우 >> OC 0 = 1 출 력 1 비교매치 >> OC 0 = 1 출력 오버플로우 >> OC 0 = 0 출 력 Mode Phase Correct PWM COM 01 COM 00 설명 0 0 범용 입출력포트 (OC 0 출력 차단) 0 1 Reserved 1 0 상향카운터 비교매치>> OC 0 = 0 출력 하향카운터 비교매치>> OC 0 = 1 출력 1 1 상향카운터 비교매치>> OC 0 = 1 출력 하향카운터 비교매치>> OC 0 = 0 출력 28
AVR Timer /Counter – TCNT 0 (Timer / Counter 0 Register) – Timer / Counter 0의 8 bit 카운터 값을 저장하고 있는 레지스터 29
AVR Timer /Counter • OCR 0 (Timer / Counter 0 Output Control Register) – TCNT 0 값과 비교하여 OC 0 핀에 출력신호를 발생하기 위한 8 bit값 을 저장하는 레지스터 30
AVR Timer /Counter – TIMSK (Timer / Counter Interrupt Mask Register) – Timer / Countern에서 발생하는 Interrupt의 개별적으로 enable – Bit 1: OCIE 0 (Timer / Counter 0 Output Compare Match Interrupt Enable) • OCIE 0 bit가 1로 설정되고 SREG의 I비트가 1로 설정되어 있으면 Timer / Counter 0의 출력 비교 Interrupt가 enable • 이 때, Timer / Counter 0 출력비교 Interrupt가 발생하면 TIFR의 OCF 0 bit가 1 이 되면 이 Interrupt가 처리 됨 – Bit 0: TOIE 0 (Timer /Counter 0 Overflow Interrupt Enable) • TOIE 0 bit와 I bit가 1로 설정되어 있으면 Overflow Interrupt가 enable 됨 • 이 때, TIFR의 TOV 0 비트가 1이 되면 ISR이 실행 됨 31
AVR Timer /Counter – TIFR (Timer / Counter Interrupt Flag Register) – Timer / Counter에서 발생하는 Interrupt Flag를 저장 – Bit 1: OCF 0 (Timer / Counter 0 Output Compare Flag) • TCNT 0과 OCR 0의 값을 비교, 같으면 이 bit가 1로 설정되고, 출력비교 Interrupt가 발생, 이 Interrupt가 처리되면 자동으로 0으로 Clear 됨 – Bit 0: TOV 0 (Timer / Counter 0 Overflow Flag) • • Timer / Counter 0에서 Overflow가 발생하면 자동으로 1로 설정 됨 이 bit가 1이 되면 Overflow Interrupt 발생 Interrupt가 처리되면 자동으로 0으로 Clear 됨 Phase PWM Mode에서는 Timer / Counter 0이 0 x 00에서 카운트 방향을 바꿀 때 1로 설정 됨 32
AVR Timer /Counter • Timer / Counter 0의 Output Compare 장치 – 8 bit 비교기 : 연속해서 TCN 0 값과 OCR 0 값을 비교 – TCNT 0 값과 OCR 0 값이 같을 때마다 match 신호 발생 – match 신호는 Timer Clock의 다음 Cycle에서 OCF 0 (Output Compare Flag) 를 셋 – OCIE 0 bit와 SREG 레지스터의 I bit가 1로 Set되어 있으면 OCF 0는 Output Compare Interrupt 발생 시킴 – OCF 0 Flag는 Interrupt가 실행되고 나서 자동으로 Clear 됨 (OCF 0 bit에 1을 써서 Software적으로 Clear해도 됨) 34
AVR Timer /Counter • Timer / Count 0 관련 레지스터 – TCCR 0 (Timer / Counter Control Register) – Bit 7 : FOC 0 (Force Output Compare) • 1: 강제로 OC 0 단자에 출력 비교가 매치된 신호 출력 (PWM이 아닌 경우 유효) – Bit 6 : WGM 00 (Waveform Generation Mode) 35
AVR Timer /Counter • Timer / Counter 0의 동작 모드 – WGM[1: 0] (Waveform Generation Mode, TCCR 0 Reg)와 COM[1: 0] (Compare Output Mode, TCCR 0 Reg)에서 설정 – WGM : 카운터의 순서에 영향을 비침 – COM : PWM 모드에서 (Non)inverting mode를 결정 Non-PWM 모드에서 compare match 시점에서 출력이 1로 Set되는지, 0으로 Clear 되는지, Toggle인지를 결정 – 4가지 동작 모드 지원 • • Normal Mode CTC (Clear Timer on Compare Match) Mode Fast PWM Mode Phase Correct PWM Mode 36
AVR Timer /Counter • 타이머 0, 2의 CTC모드 동작 39
AVR Timer /Counter 1. Match 된 다음 Cycle에 Set 2. OCIE 0 bit와 SREG의 I 비트 가 1이면 Output Compare Interrupt 발생 3. Interrupt가 실행되고 나면 OCF는 자동으로 Clear 동작 모드 비트 Compare Output Mode 42
AVR Timer /Counter • Timer / Counter Summary Timer / Counter 0 1 2 3 기본 구조 8 bit 16 bit 타이머 입력 clk. I/O(=clk. CPU) 타이머 프리스케일러 1, 8, 32, 64, 128, 256, 1024 1, 8, 64, 256, 1024 카운터 입력 Timer / Counter Oscillator T 1 T 2 T 3 TOSC 1 관련 레지스터 TCCR 0 TCNT 0 OCR 0 ASSR SFIOR, TIMSK, TIFR 동작 모드 - TCCR 1 A, TCCR 1 B, TCCR 1 C TCCR 2 TCNT 1 H/L TCNT 2 OCR 1 AH/L, OCR 1 BH/L, OCR 1 CH/L OCR 2 ICR 1 H/L SFIOR, TIMSK, TIFR, SFIOR, TIMSK, TIFR ETIMSK, ETIFR Normal CTC Normal Fast PWM Phase Correct PWM Phase and Frequency Correct PWM TCCR 3 A, TCCR 3 B, TCCR 3 C TCNT 3 H/L OCR 3 AH/L, OCR 3 BH/L, OCR 3 CH/L ICR 3 H/L SFIOR, TIMSK, TIFR, ETIMSK, ETIFR - Phase and Frequency Correct PWM 입력 신호 TOSC 1, TOSC 2 T 1, ICP 1 T 2 T 3, ICP 3 출력 신호 OC 0 OC 1 A, OC 1 B, OC 1 C OC 2 OC 3 A, OC 3 B, OC 3 C 인터럽트 Output Compare Match A/B/C Input Capture Output Compare Match A/B/C 기타 RTC 기능 타이머 및 카운터 모두 프리스케일러 사용 Overflow Capture 기능 Input Capture 기능 45
Source Code #define F_CPU 16000000 //Clock Frequency : to use util/delay. h #define EX_SS_DATA (*(volatile unsigned char *)0 x 8002) //7 seg data #define EX_SS_SEL (*(volatile unsigned char *)0 x 8003) //7 seg digit #include <avr/io. h> #include <avr/interrupt. h> #include <util/delay. h> //TIMER 0 initialize - prescale: 64 // WGM: Normal // desired value: 1 KHz // actual value: 1. 000 KHz (0. 0%) void timer 0_init(void) { TCCR 0 = 0 x 00; //stop Timer / Counter 0 Control Register ASSR = 0 x 00; //set async mode TCNT 0 = 0 x 06; //set count OCR 0 = 0 x 00; //250 TCCR 0 = 0 x 04; //start timer prescale 64 } const char segment_data[10] = {63, 6, 91, 79, 102, 109, 125, 39, 127, 103}; //0 to 9 unsigned char display_num[4]={0, 0, 0, 0}; unsigned char digit_num=0; // Seven segment 4자리 숫자 출력 버퍼 (digit) void port_init(void) ISR(TIMER 0_OVF_vect) { { PORTA = 0 x 00; TCNT 0 = 0 x 00; //reload counter value 0 x 06 DDRA = 0 xff; //1출력 0입력 for 7 segment digit_num++; PORTB = 0 x 00; digit_num = digit_num%4; DDRB = 0 x 00; EX_SS_DATA = segment_data[display_num[digit_num]]; PORTC = 0 x 00; EX_SS_SEL = ~(0 x 01 << digit_num); DDRC = 0 x 0 f; //Low 8 bit output } PORTD = 0 x 00; DDRD = 0 x 00; 1 / 16000000 = 0. 0000000625 sec 1 ms를 만들기 위해 Count 해야 되는 TCNT 0 개수 PORTE = 0 x 00; prescalar 8 = 0. 001 / 0. 0000005 = 2000 개 DDRE = 0 x 00; 8 = 0. 0000000625 * 8 = 0. 0000005 = 0. 5 us 64 = 0. 001 / 0. 000004 = 250 개 PORTF = 0 x 00; 256 = 0. 001 / 0. 000016 = 62. 5 개 64 = 0. 0000000625 * 64 = 0. 000004 = 4 us DDRF = 0 x 00; 1024 = 0. 001 / 0. 000064 = 15. 625 개 256 = 0. 0000000625 * 256 = 0. 000016 = 16 us PORTG = 0 x 00; 1024 = 0. 0000000625 * 1024 = 0. 000064 = 64 us DDRG = 0 x 00; 46
Source Code //call this routine to initialize void init_devices(void) { //stop errant interrupts until asm("cli"); XDIV = 0 x 00; XMCRA = 0 x 00; port_init(); timer 0_init(); all peripherals set up //disable all interrupts //xtal divider //external memory MCUCR = 0 x 80; //ext mem access enable EICRA = 0 x 00; //ext ints control reg A EICRB = 0 x 00; //ext ints control reg B EIMSK = 0 x 00; //ext Int mask reg TIMSK = 0 x 01; //timer interrupt sources (MASK) T/C 0 Ovf flag ETIMSK = 0 x 00; //extended timer interrupt sources asm("sei"); //re-enable interrupts //all peripherals are now initialized } int main(void) { int i=0; init_devices(); while(1){ i++; display_num[0] = display_num[1] = display_num[2] = display_num[3] = _delay_ms(1000); } (i%10000)/1000; (i%1000)/100; (i%100)/10; (i%10); } 47
Source Code • Map File – 링크와 관련된 여러 가지 정보들을 텍스트로 표현한 파일 – 디버깅 시 결정적은 정보를 제공 – In Avr Studio • Project -> Configuration Options -> Generate Map File Check 48
Source Code – Map File의 구성 • • Archive member included because of file (symbol) Discarded input sections Memory Configuration Linker script and memory map – Archive member included because of file (symbol) • 이 프로젝트에서 사용된 라이브러리 (아카이브) 파일들에 대한 정보 – ex). . /src/gcc/libdriver. a(gpio. o) gcc/timer. o (GPIOPin. Read) – GPIOPin. Read : 프로젝트에서 사용 된 함수명 – libdriver. a : GPIOPin. Read가 정의되어 있는 라이브러리 – gpio. o. : libdriver. a의 구성 파일 중에 실제 GPIOPin. Read가 있는 gpio. c 파일의 목적코드 49
Source Code – Discarded input sections • 첫 번째 항목에서 언급된 라이브러리 중 사용되지 않은(링크되지 않은), 함수의 리스트 • 링커가 라이브러리를 링크 할 때 라이브러리 내의 모든 함수를 모두 링크하지 않 음 – Memory Configuration • • 프로젝트 바이너리의 전체 Memory Map을 볼 수 있음 ld파일 (link scriptor file)에서 지정한 내용을 간단히 요약 섹션 이름은 ld 파일에서 정하기 나름 EX) Memory Configuration – – – – Name text data eeprom fuse lock signature *default* Origin 0 x 0000 0 x 00800060 0 x 00810000 0 x 00820000 0 x 00830000 0 x 00840000 0 x 0000 Length Attributes 0 x 00020000 xr 0 x 0000 ffa 0 rw !x 0 x 00010000 rw !x 0 x 00000400 rw !x 0 xffff 50
Source Code – Linker script and memory map • 디버깅 시 아주 유용한 정보를 제공 Interrupt Vector 1 -34 (__vector_16 제외) 51
Port A (Octal D-type Latch with 3 -state outputs) from Port G 2 from Port G 0 Port C (3 X 8 Decoder) /E 1 = /E 2 = 0, E 3 = 1 일 때만 A 0 A 1 A 2 값을 가짐 (8 bit Equal to Comparator) (3 X 8 Decoder) /E 1 = /E 2 = 0, E 3 = 1 일 때만 A 0 A 1 A 2 값을 가짐 54
55























































