550 likes | 812 Views
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
E N D
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 • CPU 외부의 하드웨어적인 요구에 의해서 정상적인 프로그램의 실행 순서를 변경하여 보다 시급한 작업을 먼저 수행한 후에 다시 원래의 프로그램으로 복귀하는 것 • 비동기적으로 발생하는 주변장치의 서비스 요청에 CPU가 가장 빠르게 대응 할 수 있는 방법 • 비동기적으로 동작하는 CPU(고속)와 주변장치(저속) 사이에서 효율적으로 일을 수행
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)
AVR Interrupt • 인터럽트의 종류 • 인터럽트 발생원인에 따른 분류 • 하드웨어 인터럽트 • 내부 인터럽트 • 외부 인터럽트 • 소프트웨어 인터럽트 • 인터럽트 발생 시 마이크로 프로세서의 반응 방식에 따른 분류 • 차단 가능 인터럽트 • 차단 불가능 인터럽트 • 인터럽트를 요구한 입출력 기기를 확인하는 방법에 따른 분류 • 벡터형 인터럽트 (Vectored Interrupt) • 조사형 인터럽트 (Polled Interrupt)
AVR Interrupt • 내부 인터럽트 • CPU에 정의되어 있지 않은 명령의 실행 • Zero로 나눗셈을 시도 • 보호된 메모리 영역에 접근 등의 원인에 의해 마이크로 프로세서 내부적으로 발생하는 인터럽트 • ATmega128은 내부 인터럽트가 없음
AVR Interrupt • 외부 인터럽트 • 타이머에서 지정 된 시간 경과 • 입력 장치의 서비스 요구 • 출력 장치의 작업 종료 • A/D 변환의 완료 • DMA 동작의 종료 • 마이크로 프로세서와 독립되어 있는 외부장치에 의해 발생하는 순수한 의미에서의 인터럽트
AVR Interrupt • 차단 가능 / 불가능 인터럽트 • 차단 가능 인터럽트 • 프로그래머에 의해 인터럽트 요청을 받아들이지 않고 무시 할 수 있는 것 • 시간제약이 중요한 프로그램에서는 인터럽트 요청을 허용하지 않을 수 있음 • 차단 불가능 인터럽트 • 프로그래머에 의해 어떤 방법으로도 인터럽트 요청이 차단 될 수 없는 것 • 전원 이상, 비상 정지 스위치 등 돌발사태에 대비하기 위한 것 • 인터럽트 차단 및 허용 • 인터럽트 마스크 레지스터, 인터럽트 허용 레지스터를 사용하여 개별적으로 차단 및 허용 가능 • EIMSK : 개별적 인터럽트의 차단 / 허용 • SEI : Set Global Interrupt Flag, Global Interrupt Enable • CLI : Clear Global Interrupt Flag, Global Interrupt Disable Asm 명령
AVR Interrupt • 벡터형 인터럽트 • 인터럽트가 발생 할 때마다 인터럽트를 요청한 장치가 인터럽트 서비스 루틴의 시작 번지를 CPU에게 전송하거나, 또는 CPU가 각 인터럽트의 종류에 따라 미리 지정된 메모리 번지에서 인터럽트 벡터를 읽어서 이를 인터럽트 서비스 루틴의 시작번지로 사용하는 방식 • 인터럽트 시간이 빠름 • 주변 장치의 많고 적음에 영향이 없음 • ATmega128의 모든 인터럽트는 이 방식을 사용
AVR Interrupt • 조사(Polling)형 인터럽트 • 인터럽트가 발생하면 이 인터럽트를 요청한 장치를 찾기 위해 CPU가 각 주변장치를 소프트웨어적으로 차례로 조사(Polling)하는 방식 • 하드웨어 구조가 간단 • 주변 장치의 수에 따라 처리시간이 변함 • ATmega128은 사용하지 않음
AVR Interrupt • 인터럽트의 우선순위 제어 • 인터럽트 우선순위 제어가 필요한 경우 • 우연히 2개 이상의 주변장치가 동시에 CPU에 인터럽트를 요청하는 경우 • 하나의 인터럽트가 서비스되고 있는 동안에 또 다른 인터럽트가 요청되는 경우 • 벡터형 인터럽트의 경우 • 인터럽트 우선 순위 제어기의 우선 순위 레지스터의 초기화로 우선순위 제어방식 사용 • 조사형 인터럽트의 경우 • Polling의 순서에 의하여 소프트웨어적으로 우선 순위 선정
AVR Interrupt • Interrupt Vector 부트 사이즈의 선택 Reset 및 Interrupt Vector의 위치 설정 BOOTRST in Fuse High Byte
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에서 벗어 날 때 사용 가능)
AVR Interrupt • 외부 인터럽트의 동작 • 인터럽트 활성화 (SREG.I / EIMSK 해당 비트 활성화) • 외부 INT의 동작 Edge나 논리 신호에 인터럽트 요청 • INTFn = 1 상태로 Flag가 Set 됨 • 실행 중이던 메인 프로그램의 PC를 Stack에 저장 • 해당 인터럽트 벡터로 점프 • 해당 인터럽트 루틴 처리 • 처리가 끝나면 RETI 명령을 받음 • Stack으로부터 저장 된 PC값을 로드 • 동작 중이던 프로그램 위치로 복귀, 메인 프로그램을 계속해서 수행
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 바꿈 허용
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의 트리거 방식 설정
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의 트리거 방식 설정
AVR Interrupt • EIMSK (External Interrupt Mask Register) • Bit 7 – 0 : External Interrupt Mask Register • 1: 각각의 인터럽트 허용 • 0: 각각의 인터럽트 금지
AVR Interrupt • EIFR (External Interrupt Flag Register) • Bit 7 – 0 : External Interrupt Flag Register • 각각의 인터럽트 발생
AVR Timer /Counter • Timer / Counter Overview • 입력으로 들어오는 펄스를 셈하는 장치 • 입력으로 들어오는 펄스가 어디에 존재하느냐에 따라 Timer와 Counter로 나눔 • AVR ATmega128에는 범용 타이머 / 카운터가 4개 존재 • Timer/Counter0 (8bit) • Timer/Counter1 (16bit) • Timer/Counter2 (8bit) • Timer/Counter3 (16bit)
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)
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 핀)
AVR Timer /Counter • BOTTOM : ox00일 경우 카운터가 Bottom에 도달 • MAX : 0xFF일 경우 카운터가 MAX에 도달 • TOP : Max or OCR0 값에 도달
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])
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: 영향 없음
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에 새로운 값이 라이트되면 셋
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의 분주 비율 설정
AVR Timer /Counter Waveform Generation Mode Compare Output Mode, non PWM Mode
AVR Timer /Counter • TCNT0 (Timer / Counter0 Register) • Timer / Counter0의 8bit 카운터 값을 저장하고 있는 레지스터
AVR Timer /Counter • OCR0 (Timer / Counter0 Output Control Register) • TCNT0 값과 비교하여 OC0 핀에 출력신호를 발생하기 위한 8bit값을 저장하는 레지스터
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이 실행 됨
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로 설정 됨
AVR Timer /Counter • Timer • 각 타이머에서 사용하는 Clock에 대한 설정필요 • 프리스케일러(PreScaler) 값으로 조절 가능 • 프리스케일러 값은 각 타이머의 컨트롤 레지스터(TCCRn)에서 설정 • 각 타이머 레지스터 (TCNTn)에 얼마마다 한번 씩 인터럽트를 걸게 할 것인지와 관련된 값을 써주면 됨 • 타이머 인터럽트 관련 레지스터들을 설정 필요 • 타이머 인터럽트에서는 TIMSK 레지스터만 설정
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해도 됨)
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)
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
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
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
AVR Timer /Counter • 타이머 0, 2의 CTC모드 동작
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)
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)
AVR Timer /Counter • Match 된 다음 Cycle에 Set • OCIE0 bit와 SREG의 I 비트가 1이면 Output Compare Interrupt 발생 • Interrupt가 실행되고 나면 OCF는 자동으로 Clear 동작 모드 비트 Compare Output Mode
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 값에 도달
Timer / Counter • Timer / Counter 0과 2 • 공통점 • 8bit 구조 • Overflow • PWM과유사한 기능 • 제어방식 • 차이점 • Timer / Counter0은 32.768KHz의 크리스탈을 접속하는 TOSC1 및 TOSC2 단자를 가짐 • RTC 기능을 갖도록 할 수 있음 • 다른 Timer / Counter와는 다르게 내부 클럭을 사용하든 외부 클럭을 사용하든 모두 프리스케일러의 분주 기능 사용가능
AVR Timer /Counter • Timer / Counter Summary
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 개
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); } }
Source Code • Map File • 링크와 관련된 여러 가지 정보들을 텍스트로 표현한 파일 • 디버깅 시 결정적은 정보를 제공 • In Avr Studio • Project -> Configuration Options -> Generate Map File Check
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 파일의 목적코드
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