1 / 55

KT-M128 Peripheral Device

KT-M128 Peripheral Device. Interrupt Timer / Counter0 2010. 8. 3 조 승훈. Reference: AVR ATmega128 정복 , ohm 사 마이콤 기초와 응용 강의노트 (ATmega128 시스템 ), 동국대 전기공학과 최한호. Index. AVR Interrupt Timer / Counter0 Source Code. AVR Interrupt. Interrupt Overview

marek
Download Presentation

KT-M128 Peripheral Device

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. KT-M128 Peripheral Device Interrupt Timer / Counter0 2010. 8. 3 조 승훈 Reference: AVR ATmega128 정복, ohm사 마이콤 기초와 응용 강의노트 (ATmega128 시스템), 동국대 전기공학과 최한호

  2. Index • AVR Interrupt • Timer / Counter0 • Source Code

  3. AVR Interrupt • Interrupt Overview • CPU 외부의 하드웨어적인 요구에 의해서 정상적인 프로그램의 실행 순서를 변경하여 보다 시급한 작업을 먼저 수행한 후에 다시 원래의 프로그램으로 복귀하는 것 • 비동기적으로 발생하는 주변장치의 서비스 요청에 CPU가 가장 빠르게 대응 할 수 있는 방법 • 비동기적으로 동작하는 CPU(고속)와 주변장치(저속) 사이에서 효율적으로 일을 수행

  4. AVR Interrupt • 인터럽트의 3대 요소 • 발생원 : 누가 요청했는가? • 우선 순위 : 2개 이상의 요청 시 어떤 것을 먼저 서비스 할까? • 인터럽트 벡터 : 서비스 루틴의 시작 번지는 어디인가? • ATmega128의 인터럽트 처리 과정 • 매 사이클의 인터럽트 요청이 있는지 확인하고 해당 인터럽트 플래그에 기록 • 어느 인터럽트 요청이 있는지 인터럽트 플래그를 조사하고 우선 순위와 허용 여부를 결정 • 인터럽트 벡터 주소를 찾아가기 위한 CALL 명령을 수행, 다른 인터럽트 발생을 방지하기 위해 SREG의 I bit를 Clear, 복귀 주소(PC)를 Stack에 저장 • 인터럽트 벡터에 따라 인터럽트 서비스 루틴으로 점프하여 실행 • RETI를 만나면 Stack에 저장된 PC를 복구하여 원래 프로그램으로 복귀 • 응답 시간 • 인터럽트 벡터의 JMP명령 (3clk) + 1개 이상의 명령 (최소 1clk) = 최소 4clk (SREG의 I bit Clear, PC를 Stack에 저장, 인터럽트 벡터를 통해 ISR로 점프) • RETI는 4clk 소요 (PC를 Stack에서 POP, SP = SP + 2, SREG의 I bit 1로 Set)

  5. AVR Interrupt • 인터럽트의 종류 • 인터럽트 발생원인에 따른 분류 • 하드웨어 인터럽트 • 내부 인터럽트 • 외부 인터럽트 • 소프트웨어 인터럽트 • 인터럽트 발생 시 마이크로 프로세서의 반응 방식에 따른 분류 • 차단 가능 인터럽트 • 차단 불가능 인터럽트 • 인터럽트를 요구한 입출력 기기를 확인하는 방법에 따른 분류 • 벡터형 인터럽트 (Vectored Interrupt) • 조사형 인터럽트 (Polled Interrupt)

  6. AVR Interrupt • 내부 인터럽트 • CPU에 정의되어 있지 않은 명령의 실행 • Zero로 나눗셈을 시도 • 보호된 메모리 영역에 접근 등의 원인에 의해 마이크로 프로세서 내부적으로 발생하는 인터럽트 • ATmega128은 내부 인터럽트가 없음

  7. AVR Interrupt • 외부 인터럽트 • 타이머에서 지정 된 시간 경과 • 입력 장치의 서비스 요구 • 출력 장치의 작업 종료 • A/D 변환의 완료 • DMA 동작의 종료 • 마이크로 프로세서와 독립되어 있는 외부장치에 의해 발생하는 순수한 의미에서의 인터럽트

  8. AVR Interrupt • 차단 가능 / 불가능 인터럽트 • 차단 가능 인터럽트 • 프로그래머에 의해 인터럽트 요청을 받아들이지 않고 무시 할 수 있는 것 • 시간제약이 중요한 프로그램에서는 인터럽트 요청을 허용하지 않을 수 있음 • 차단 불가능 인터럽트 • 프로그래머에 의해 어떤 방법으로도 인터럽트 요청이 차단 될 수 없는 것 • 전원 이상, 비상 정지 스위치 등 돌발사태에 대비하기 위한 것 • 인터럽트 차단 및 허용 • 인터럽트 마스크 레지스터, 인터럽트 허용 레지스터를 사용하여 개별적으로 차단 및 허용 가능 • EIMSK : 개별적 인터럽트의 차단 / 허용 • SEI : Set Global Interrupt Flag, Global Interrupt Enable • CLI : Clear Global Interrupt Flag, Global Interrupt Disable Asm 명령

  9. AVR Interrupt • 벡터형 인터럽트 • 인터럽트가 발생 할 때마다 인터럽트를 요청한 장치가 인터럽트 서비스 루틴의 시작 번지를 CPU에게 전송하거나, 또는 CPU가 각 인터럽트의 종류에 따라 미리 지정된 메모리 번지에서 인터럽트 벡터를 읽어서 이를 인터럽트 서비스 루틴의 시작번지로 사용하는 방식 • 인터럽트 시간이 빠름 • 주변 장치의 많고 적음에 영향이 없음 • ATmega128의 모든 인터럽트는 이 방식을 사용

  10. AVR Interrupt • 조사(Polling)형 인터럽트 • 인터럽트가 발생하면 이 인터럽트를 요청한 장치를 찾기 위해 CPU가 각 주변장치를 소프트웨어적으로 차례로 조사(Polling)하는 방식 • 하드웨어 구조가 간단 • 주변 장치의 수에 따라 처리시간이 변함 • ATmega128은 사용하지 않음

  11. AVR Interrupt • 인터럽트의 우선순위 제어 • 인터럽트 우선순위 제어가 필요한 경우 • 우연히 2개 이상의 주변장치가 동시에 CPU에 인터럽트를 요청하는 경우 • 하나의 인터럽트가 서비스되고 있는 동안에 또 다른 인터럽트가 요청되는 경우 • 벡터형 인터럽트의 경우 • 인터럽트 우선 순위 제어기의 우선 순위 레지스터의 초기화로 우선순위 제어방식 사용 • 조사형 인터럽트의 경우 • Polling의 순서에 의하여 소프트웨어적으로 우선 순위 선정

  12. AVR Interrupt • Interrupt Vector 부트 사이즈의 선택 Reset 및 Interrupt Vector의 위치 설정 BOOTRST in Fuse High Byte

  13. AVR Interrupt • 외부 인터럽트 • 외부 핀 INT0-7에 직접 입력되는 신호 (HIGH & LOW)값을 입력 값으로 받아 인터럽트가 걸려 정해진 ISR을 실행하는 것 • 외부 인터럽트의 특징 • 외부 인터럽트는 INT0-7 핀의 트리거 동작으로 인터럽트 발생 • LOW / Rising-Edge / Falling-Edge의 방식으로 트리거 신호 선택 가능 • INT0-7 핀의 입/출력 방향에 관계없이 인터럽트 발생 (Software적으로 데이터를 출력하여 인터럽트 요구 가능) • INT 4-7 : I/O Clock이 있어야만 사용 가능 • INT 0-3 : 비동기적 검출 가능 (Sleep Mode에서 벗어 날 때 사용 가능)

  14. AVR Interrupt • 외부 인터럽트의 동작 • 인터럽트 활성화 (SREG.I / EIMSK 해당 비트 활성화) • 외부 INT의 동작 Edge나 논리 신호에 인터럽트 요청 • INTFn = 1 상태로 Flag가 Set 됨 • 실행 중이던 메인 프로그램의 PC를 Stack에 저장 • 해당 인터럽트 벡터로 점프 • 해당 인터럽트 루틴 처리 • 처리가 끝나면 RETI 명령을 받음 • Stack으로부터 저장 된 PC값을 로드 • 동작 중이던 프로그램 위치로 복귀, 메인 프로그램을 계속해서 수행

  15. 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 바꿈 허용

  16. AVR Interrupt • EICRA (External Interrupt Control Register A) • Bit 7 – 6 (External Interrupt 3 Sense Control) • 외부 인터럽트 INT3의 트리거 방식 설정 • Bit 5 – 4 (External Interrupt 2 Sense Control) • 외부 인터럽트 INT2의 트리거 방식 설정 • Bit 3 – 2 (External Interrupt 1 Sense Control) • 외부 인터럽트 INT1의 트리거 방식 설정 • Bit 1 – 0 (External Interrupt 0 Sense Control) • 외부 인터럽트 INT0의 트리거 방식 설정

  17. AVR Interrupt • EICRB (External Interrupt Control Register B) • Bit 7 – 6 (External Interrupt 7 Sense Control) • 외부 인터럽트 INT7의 트리거 방식 설정 • Bit 5 – 4 (External Interrupt 6 Sense Control) • 외부 인터럽트 INT6의 트리거 방식 설정 • Bit 3 – 2 (External Interrupt 5 Sense Control) • 외부 인터럽트 INT5의 트리거 방식 설정 • Bit 1 – 0 (External Interrupt 4 Sense Control) • 외부 인터럽트 INT4의 트리거 방식 설정

  18. AVR Interrupt • EIMSK (External Interrupt Mask Register) • Bit 7 – 0 : External Interrupt Mask Register • 1: 각각의 인터럽트 허용 • 0: 각각의 인터럽트 금지

  19. AVR Interrupt • EIFR (External Interrupt Flag Register) • Bit 7 – 0 : External Interrupt Flag Register • 각각의 인터럽트 발생

  20. AVR Timer /Counter • Timer / Counter Overview • 입력으로 들어오는 펄스를 셈하는 장치 • 입력으로 들어오는 펄스가 어디에 존재하느냐에 따라 Timer와 Counter로 나눔 • AVR ATmega128에는 범용 타이머 / 카운터가 4개 존재 • Timer/Counter0 (8bit) • Timer/Counter1 (16bit) • Timer/Counter2 (8bit) • Timer/Counter3 (16bit)

  21. AVR Timer /Counter • Timer와 Counter의 차이점 • Timer • 내부 Clock(빠름 / 분주 가능: 범위 내에서 Clock 선택 가능) – 동기모드 • 타이머는 MCU의 내부 Clock(Clk I/O -> 분주기 -> ClkT)을 이용 • 일정시간 간격의 펄스를 만들어 내거나, 일정시간 경과 후에 인터럽트 발생 가능 • Counter • 외부 Clock (느림 / 분주 불가능: 외부 Clock 그대로 사용) – 비 동기모드 • Counter는 외부 핀 (TOSC1, TOSC2, T1, T2, T3)을 통해 들어오는 펄스를 계수 (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)

  22. AVR Timer /Counter • 8Bit Timer / Counter 0 • Timer / Counter0의 특징 • 싱글 채널 카운터 • Clear Timer on Compare Match 기능 (Auto Reload 기능) • 글리치가 없는 Phase Correct PWM 기능 • 주파수 발생 기능 • 10bit 프리스케일러 기능 • Timer0 Overflow Interrupt와 Timer0 Compare Match Interrupt • I/O Clock과는 별도로 32.768kHz를 인가 가능한 핀 (TOSC1, TOSC2 핀)

  23. AVR Timer /Counter • BOTTOM : ox00일 경우 카운터가 Bottom에 도달 • MAX : 0xFF일 경우 카운터가 MAX에 도달 • TOP : Max or OCR0 값에 도달

  24. AVR Timer /Counter • 프리스케일러 (PreScaler) • 전치 분주기 • 총 8개의 스케일을 가지고 있음 • 분주비가 1:8일 경우, 시스템 Clock이 8번 들어 올 때, 프리스케일러를 통과한 Clock은 1번의 Clock이 발생 Prescaler for Timer / Counter0 Prescaler for Timer / Counter0 (ASSR[3]) (SFIOR[1]) (TCCR0[2:0])

  25. AVR Timer /Counter • Timer / Counter 관련 레지스터 (I/O Reg 영역에 Mapping) • SFIOR (Special Function I/O Register) • Bit 7 : TSM (Timer / Counter Synchronization Mode) • 1: Timer / Counter0의 동기 모드, PSR0와 PSR321에 쓴 값은 유지 됨 • 0: PSR0와 PSR321에 쓴 값은 하드웨어에 의해 클리어 됨 • Bit 1 : PSR0 (Prescaler Reset Timer / Counter0) • 1: Timer / Counter0의 Prescaler를 리셋 • 0: 영향 없음

  26. AVR Timer /Counter • ASSR (Asynchronous Status Register) • Bit 3 : AS0 (Asynchronous Timer / Counter0) • 0: Clock 소스 = ClkI/O (동기 모드) • 1: Clock 소스 = TOSC1 (비동기 모드) • Bit 2 : TCN0UB (Timer /Counter (TCNT0) Update Busy) • 비동기 모드일 때 TCNT0에 새로운 값이 라이트되면 셋 • Bit 1 : OCR0UB (Output Compare Register (OCR0) Update Busy) • 비동기 모드일 때 OCR0에 새로운 값이 라이트되면 셋 • Bit 0 : TCR0UB (Control Register (TCCR0) Update Busy) • 비동기 모드일 때 TCCR0에 새로운 값이 라이트되면 셋

  27. AVR Timer /Counter • TCCR0 (Timer /Count0 Control Register) • Bit 7 : FOC0 (Force Output Compare) • 1: 강제로 OC0 단자에 출력 비교가 매치된 신호 출력 (PWM 아닌 경우에 유효) • Bit 6 : WGM00 (Waveform Generation Mode) • Counter의 카운팅 방향, MAX(TOP) 카운터 값의 소스 및 Mode 선택 • Bit 5 – 4 : Com01 - Com00 (Compare Match Output Mode) • OC0 핀 기능 설정 • Bit 3 : WGM01 (Waveform Generation Mode) • Counter의 카운팅 방향, MAX(TOP) 카운터 값의 소스 및 Mode 선택 • Bit 2 – 0 : CS02 – CS00 (Clock Select) • Clock의 분주 비율 설정

  28. AVR Timer /Counter Waveform Generation Mode Compare Output Mode, non PWM Mode

  29. AVR Timer /Counter • TCNT0 (Timer / Counter0 Register) • Timer / Counter0의 8bit 카운터 값을 저장하고 있는 레지스터

  30. AVR Timer /Counter • OCR0 (Timer / Counter0 Output Control Register) • TCNT0 값과 비교하여 OC0 핀에 출력신호를 발생하기 위한 8bit값을 저장하는 레지스터

  31. AVR Timer /Counter • TIMSK (Timer / Counter Interrupt Mask Register) • Timer / Countern에서 발생하는 Interrupt의 개별적으로 enable • Bit 1: OCIE0 (Timer / Counter0 Output Compare Match Interrupt Enable) • OCIE0 bit가 1로 설정되고 SREG의 I비트가 1로 설정되어 있으면 Timer / Counter0의 출력 비교 Interrupt가 enable • 이 때, Timer / Counter0 출력비교 Interrupt가 발생하면 TIFR의 OCF0 bit가 1이 되면 이 Interrupt가 처리 됨 • Bit 0: TOIE0 (Timer /Counter0 Overflow Interrupt Enable) • TOIE0 bit와 I bit가 1로 설정되어 있으면 Overflow Interrupt가 enable 됨 • 이 때, TIFR의 TOV0 비트가 1이 되면 ISR이 실행 됨

  32. AVR Timer /Counter • TIFR (Timer / Counter Interrupt Flag Register) • Timer / Counter에서 발생하는 Interrupt Flag를 저장 • Bit 1: OCF0 (Timer / Counter0 Output Compare Flag) • TCNT0과 OCR0의 값을 비교, 같으면 이 bit가 1로 설정되고, 출력비교 Interrupt가 발생, 이 Interrupt가 처리되면 자동으로 0으로 Clear 됨 • Bit 0: TOV0 (Timer / Counter0 Overflow Flag) • Timer / Counter0에서 Overflow가 발생하면 자동으로 1로 설정 됨 • 이 bit가 1이 되면 Overflow Interrupt 발생 • Interrupt가 처리되면 자동으로 0으로 Clear 됨 • Phase PWM Mode에서는 Timer / Counter0이 0x00에서 카운트 방향을 바꿀 때 1로 설정 됨

  33. AVR Timer /Counter • Timer • 각 타이머에서 사용하는 Clock에 대한 설정필요 • 프리스케일러(PreScaler) 값으로 조절 가능 • 프리스케일러 값은 각 타이머의 컨트롤 레지스터(TCCRn)에서 설정 • 각 타이머 레지스터 (TCNTn)에 얼마마다 한번 씩 인터럽트를 걸게 할 것인지와 관련된 값을 써주면 됨 • 타이머 인터럽트 관련 레지스터들을 설정 필요 • 타이머 인터럽트에서는 TIMSK 레지스터만 설정

  34. AVR Timer /Counter • Timer / Counter0의 Output Compare 장치 • 8bit 비교기 : 연속해서 TCN0 값과 OCR0 값을 비교 • TCNT0 값과 OCR0 값이 같을 때마다 match 신호 발생 • match 신호는 Timer Clock의 다음 Cycle에서 OCF0 (Output Compare Flag) 를 셋 • OCIE0 bit와 SREG 레지스터의 I bit가 1로 Set되어 있으면 OCF0는 Output Compare Interrupt 발생 시킴 • OCF0 Flag는 Interrupt가 실행되고 나서 자동으로 Clear 됨 (OCF0 bit에 1을 써서 Software적으로 Clear해도 됨)

  35. AVR Timer /Counter • Timer / Count0 관련 레지스터 • TCCR0 (Timer / Counter Control Register) • Bit 7 : FOC0 (Force Output Compare) • 1: 강제로 OC0 단자에 출력 비교가 매치된 신호 출력 (PWM이 아닌 경우 유효) • Bit 6 : WGM00 (Waveform Generation Mode)

  36. AVR Timer /Counter • Timer / Counter0의 동작 모드 • WGM[1:0] (Waveform Generation Mode, TCCR0 Reg)와 COM[1:0] (Compare Output Mode, TCCR0 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

  37. AVR Timer /Counter • Normal Mode (WGM[1:0] = 0으로 설정) • 동작 모드 중 가장 간단한 모드 • 항상 상향 카운터 • 카운트 도중 Clear되지 않음 • TOP이 oxFF가 되면 다시 BOTTOM(0x00)에서 시작 (Overflow) • TOV0 (Timer /Counter Overflow Flag)는 TCNT0 값이 0이 되는 시점에서 1로 Set 됨 • 비교매치(Compare Match) 인터럽트 발생 • 파형을 예상하지 못하기 때문에 비 추천 T : 시간 간격 N : 프리스케일러 분주비 T0 : TCNT0 초기값 f : 분주되기 전 Clock

  38. AVR Timer /Counter • CTC Mode (Compare Timer on Compare Match Mode) • WGM[1:0] = 2로 설정 • 주파수 분주 기능으로 주로 사용 (PortB4 = OC0) • DDR 레지스터 값을 출력으로, COM[1:0]을 1로 설정 • 항상 상향 카운터 • 0x00 ~ OCR0 계수 동작 반복 • OCR0값과 TCNT0 값이 같으면 카운트 도중 Clear • MAX이거나 OCR0 값일 때, Overflow Interrupt 발생 • COMP 인터럽트와 동일하게 작동되기 때문에 비 추천 T : 시간 간격 N : 프리스케일러 분주비 T0 : TCNT0 초기값 f : 분주되기 전 Clock

  39. AVR Timer /Counter • 타이머 0, 2의 CTC모드 동작

  40. AVR Timer /Counter • FAST PWM (WGM[1:0] = 3) • 높은 주파수 PWM 파형발생이 필요할 때 사용 • 상향 카운터 (Single-Slope Operation) • 0x00 ~ 0xFF 계수 동작 반복 • TCNT0과 OCR0의 Compare Match되면 OC0에 LOW 출력, OC0은 0으로 Clear 됨 (COM0[1:0] = 2) • oxFF -> 0x00 Overflow되면 OC0에 HIGH 출력, OC0은 1로 Set 됨 (COM[1:0] = 2)

  41. AVR Timer /Counter • Phase Correct PWM • 높은 분해능의 PWM출력 파형을 발생하는데 사용 • 상향카운터 0x00 -> 0xFF • 하향카운터 0xFF -> ox00 • 0x00 ~ oxFF ~ ox00 계수 동작 반복 • 상향카운터 비교매치>> OC0 = 0 출력 (COM0 1 : 0 = 2) • 하향카운터 비교매치>> OC0 = 1 출력 (COM0 1 : 0 = 2)

  42. AVR Timer /Counter • Match 된 다음 Cycle에 Set • OCIE0 bit와 SREG의 I 비트가 1이면 Output Compare Interrupt 발생 • Interrupt가 실행되고 나면 OCF는 자동으로 Clear 동작 모드 비트 Compare Output Mode

  43. AVR Timer /Counter CS00~ CS02 AS0 • 모드의 동작에 따라 ClkTn에서 • 카운터가 클리어, 증가, 감소 • AS0를 이용하여 외부 또는 내부 Clock 소스 설정 • CS[2:0]를 설정하여 사용 주파수로 분주 가능 • TCCR0 레지스터의 TGM01~00으로 모드 설정 • TCNT0과 OCR0는 8bit로 구성 • BOTTOM : ox00일 경우 카운터가 Bottom에 도달 • MAX : 0xFF일 경우 카운터가 MAX에 도달 • TOP : Max or OCR0 값에 도달

  44. Timer / Counter • Timer / Counter 0과 2 • 공통점 • 8bit 구조 • Overflow • PWM과유사한 기능 • 제어방식 • 차이점 • Timer / Counter0은 32.768KHz의 크리스탈을 접속하는 TOSC1 및 TOSC2 단자를 가짐 • RTC 기능을 갖도록 할 수 있음 • 다른 Timer / Counter와는 다르게 내부 클럭을 사용하든 외부 클럭을 사용하든 모두 프리스케일러의 분주 기능 사용가능

  45. AVR Timer /Counter • Timer / Counter Summary

  46. Source Code #define F_CPU 16000000 //Clock Frequency : to use util/delay.h #define EX_SS_DATA (*(volatile unsigned char *)0x8002) //7seg data #define EX_SS_SEL (*(volatile unsigned char *)0x8003) //7seg digit #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> 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}; // Seven segment 4자리 숫자 출력 버퍼 (digit) void port_init(void) { PORTA = 0x00; DDRA = 0xff; //1출력 0입력 for 7segment PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0x0f;//Low 8bit output PORTD = 0x00; DDRD = 0x00; PORTE = 0x00; DDRE = 0x00; PORTF = 0x00; DDRF = 0x00; PORTG = 0x00; DDRG = 0x00; } //TIMER0 initialize - prescale:64 // WGM: Normal // desired value: 1KHz // actual value: 1.000KHz (0.0%) void timer0_init(void) { TCCR0 = 0x00; //stop Timer / Counter0 Control Register ASSR = 0x00; //set async mode TCNT0 = 0x06; //set count OCR0 = 0x00; //250 TCCR0 = 0x04; //start timer prescale 64 } unsigned char digit_num=0; ISR(TIMER0_OVF_vect) { TCNT0 = 0x00; //reload counter value 0x06 digit_num++; digit_num = digit_num%4; EX_SS_DATA = segment_data[display_num[digit_num]]; EX_SS_SEL = ~(0x01 << digit_num); } 1 / 16000000 = 0.0000000625sec prescalar 8 = 0.0000000625 * 8 = 0.0000005 = 0.5 us 64 = 0.0000000625 * 64 = 0.000004 = 4 us 256 = 0.0000000625 * 256 = 0.000016 = 16 us1024 = 0.0000000625 * 1024 = 0.000064 = 64 us 1ms를 만들기 위해 Count 해야 되는 TCNT0 개수 8   = 0.001 / 0.0000005 = 2000 개 64  = 0.001 / 0.000004 = 250 개256 = 0.001 / 0.000016 = 62.5 개1024 = 0.001 / 0.000064 = 15.625 개

  47. Source Code //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up asm("cli"); //disable all interrupts XDIV = 0x00; //xtal divider XMCRA = 0x00; //external memory port_init(); timer0_init(); MCUCR = 0x80; //ext mem access enable EICRA = 0x00; //ext ints control reg A EICRB = 0x00; //ext ints control reg B EIMSK = 0x00; //ext Int mask reg TIMSK = 0x01; //timer interrupt sources (MASK) T/C0 Ovf flag ETIMSK = 0x00; //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] = (i%10000)/1000; display_num[1] = (i%1000)/100; display_num[2] = (i%100)/10; display_num[3] = (i%10); _delay_ms(1000); } }

  48. Source Code • Map File • 링크와 관련된 여러 가지 정보들을 텍스트로 표현한 파일 • 디버깅 시 결정적은 정보를 제공 • In Avr Studio • Project -> Configuration Options -> Generate Map File Check

  49. 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 (GPIOPinRead) • GPIOPinRead : 프로젝트에서 사용 된 함수명 • libdriver.a : GPIOPinRead가 정의되어 있는 라이브러리 • gpio.o . : libdriver.a의 구성 파일 중에 실제 GPIOPinRead가 있는 gpio.c 파일의 목적코드

  50. Source Code • Discarded input sections • 첫 번째 항목에서 언급된 라이브러리 중 사용되지 않은(링크되지 않은), 함수의 리스트 • 링커가 라이브러리를 링크 할 때 라이브러리 내의 모든 함수를 모두 링크하지 않음 • Memory Configuration • 프로젝트 바이너리의 전체 Memory Map을 볼 수 있음 • ld파일 (link scriptor file)에서 지정한 내용을 간단히 요약 • 섹션 이름은 ld 파일에서 정하기 나름 • EX) Memory Configuration • Name Origin Length Attributes • text 0x00000000 0x00020000 xr • data 0x00800060 0x0000ffa0 rw !x • eeprom 0x00810000 0x00010000 rw !x • fuse 0x00820000 0x00000400 rw !x • lock 0x00830000 0x00000400 rw !x • signature 0x00840000 0x00000400 rw !x • *default* 0x00000000 0xffffffff

More Related