임베디드시스템기초 (#514115 ) #5. Timer A 한림대학교전자공학과이선우
MSP430x4xx 타이머종류 MSP430x4xx series 는다음과같은 3 종의타이머내장 Basic Timer1 Two independent, cascadable 8-bit timers Selectable clock source Interrupt capability LCD control signal generation Timer A, Timer B 16-bit timer/counter with 3 or 5 capture/compare registers Multiple capture/compares, PWM outputs, interval timing 2
Features of Timer A 4 개의동작모드를가지는비동기 16-bit timer/counter 클럭소스선택 / 설정가능 칩에따라 3 개혹은 5 개의 capture/compare regs. 가짐 의미 : 변하는카운터값과비교하여동작하는제어장치가 3/5 개있음을뜻함. MSP430FG4618: Timer_A3 (3 개의 CCRs 이있음 ) PWM 기능을가지는설정가능한출력기능 Pin 을통해 H/L 출력가능 비동기입 / 출력레칭 (latching) Timer_A 관련인터럽트발생소스에대한빠른해석을위한 Interrupt vector reg.(taiv) 를가짐. 3
Block diagram MSP430xG461x 의경우 CCR0~CCR2 까지 3 개의제어장치만존재 TAR 값을이용하여별도 3 개의 TACCR0/1/2 를이용 4
Related control registers Timer block 을제어하는레지스터. 즉 TAR 동작제어 Rising edge clock signal 입력에따라값증가 / 감소 Compare/Capture 제어블록 #0 제어레지스터 Compare/Capture 관련데이터레지스터 (16bit). 동작설정에따라 TAR 과비교 /TAR 값캡쳐된결과저장 TACTL,TA0CTL 의차이점 : 일부장치 (430x415/417,xW42x) 는동일한 TimerA 를 2 개가짐. 430x461x 장치는 1 개의 TA 를가지므로 TA 만사용함. 2 개 Timer_A 를가지는장치는 TA0/1 을구별하기위해 TA0CTRL/TA1CTL 로다른이름의레지스터를가짐. ( 표 15-4 참조 ) 5
동작방식 Timer block 일반적인 16 비트 up/down 카운터로동작 클럭소스 : 3 개중하나 (ACLK, SMCLK, TACLK) TACLK: 외부에서공급하는클럭신호 (x461x 장치 :P1.5) Divider 제공 : /2,/4,/8 중하나선택가능 (Idx bits) Reset 기능 : TACLR bit=1 로 TAR, Idx, MCx clear. Automatic reset. 4 개 Mode MCx bit(in TACTL reg.) 로설정 00: Stop Timer_A 정지, 저전력위해사용하지않을때사용 MCx>0: Running 01:Up, 10:continuous, 11:Up/down 6
UP MODE 작동방식 : TAR 값이증가하다 CCR0 reg. 에써있는값 (>0) 이되면인터럽트를발생시킴 정확하게는다른종류의 2 개인터럽트 (CCIFG 7
Up mode 이용하여특정인터벌만들기 #include <msp430xg46x.h> #pragma vector=timera0_vector interrupt void timer_handler(void) { P1OUT ^= 0x01; //toggle P1.0 } void main(void) { WDTCTL = WDTPW + WDTHOLD P1DIR = 0x01; //setup Timer_A TACCTL0 = 0x0010; // 0000 0000 0001 0000 TACCR0 = 13180; //13180 usec TACTL = 0x0210 ; //0000 0010 0001 0000 enable_interrupt(); low_power_mode_0(); } 요구사항 : 13.18msec 의인터벌마다 P1.0 출력 toggle 시켜클럭신호발생 8
Timer_A3 관련 Interrupts 2 개의인터럽트소스 TACCR0 CCIFG0 (IAR C 에선 TIMERA0_VECTOR) CCIFG1, CCIFG2, TAIFG 는모두하나의인터럽트로처리됨. (P1/2 와동일 ) (TIMERA1_VECTOR) CCIFG1/2 및 TAIFG 는순서대로우선순위를가지며 ISR 에서어떤소스인가를보다빠르게파악할수있도록 TAIV reg. 를제공함. 9
Continuous Mode 의이용방법 하나의 TAR(free-running counter) 과여러개의 CCRx에저장된값과의비교를이용하여복수개의인터벌발생이가능 CCR0 ISR 에서어떤작업을해야동일한시간간격후에다시인터럽트가발생할까? 현재 TACCR0 += TAR+INTERVAL 10
복수인터벌만들기 ( 연속모드이용법 ) #include <msp430xg46x.h> #define CCR1INTVAL 8000 #define CCR2INTVAL 3000 #pragma vector=timera1_vector interrupt void ccr_handler(void) { switch (TAIV) { case 10: break; //TAIFG not used case 2: //use TACCR1 P1OUT ^= 0x01; //toggle P1.0 TACCR1 += CCR1INTVAL; break; } } case 4: //use TACCR2 P1OUT ^= 0x02; //toggle P1.1 TACCR2 += CCR2INTVAL; break; //8msec //3msec 현재의 CCR2 값에원하는인터벌의크기를더하여다음 CCR2 값을갱신함. Ex. 현재 TAR=3000 이상태에서 TACCR2=6000 이되어 3000usec 후에 CCR2 IRQ 발생! 요구사항 : CCR1 이용 8msec 인터벌마다 P1.0 출력 toggle, CCR2 이용 3msec 마다 P1.1 toggle 함 void main(void) { WDTCTL = WDTPW + WDTHOLD P1DIR = 0x03; //setup Timer_A TACCTL1 = 0x0010; // CCR1 Interrupt Enable TACCR1 = 8000; //8ms TACCTL2 = 0x0010; // CCR2 Interrupt Enable TACCR2 = 3000; //8ms TACTL = 0x0220 ; //SSEL=SMCLK, MCx=continuous enable_interrupt(); low_power_mode_0(); } 11
Up/down mode Square pulse 를만들고자할때이용 TAR 이증가후감소함 12
TA3 의입출력핀 & Output Mode MSP430FG461x 의 timer_a3 의입출력핀사양 입력 : P1.5(TACLK), P1.0(CCI0A), P1.2(CCI1A), P2.0(CCI2A) 출력 : P1.0(TA0), P1.2(TA1), P2.0(TA2) 각 CC block 은 Output Unit 이라는장치를가지며, 이를통해연결된핀의값을주어진설정에따라 set/clear 하여원하는신호를만들어낼수있다. 13
Output Unit 이용법 : UP Mode 7 개모드 Set Toggle/Reset Set/Reset Toggle Reset Toggle/Set Reset/Set 14
Output example: up/down mode 15
Example codes: Output unit 이용클럭신호발생 /* * Just use OUTPUT mode, even not use IRQ. * Use UP mode, CCR0 * * Result in P1.0/TA0 = 32768/200 Hz signal. */ void main(void) { WDTCTL = WDTPW + WDTHOLD P1DIR = 0x01; P1SEL = 0x01; //set P1.0 to TA0 //setup Timer_A TACCTL0 = 0x0080; // OUTMODE=4 (Toggle) TACCR0 = 100-1; //32768Hz/100 TACTL = 0x0110 ; //SSEL=ACLK, MCx=Up low_power_mode_3(); } /* * Just use OUTPUT mode, even not use IRQ. * Use UP/DOWN mode, CCR0 * * Result in P1.0/TA0 = SMCLK/1000 Hz signal. */ void main(void) { WDTCTL = WDTPW + WDTHOLD P1DIR = 0x01; P1SEL = 0x01; //set P1.0 to TA0 //setup Timer_A TACCTL0 = 0x0080; // OUTMODE=4 (Toggle) TACCR0 = 250; TACTL = 0x0230 ; //SSEL=SMCLK, MCx=Up/Down mode } 16
Pulse Width Modulation 이란? PWM: Pulse Width Modulation ON/OFF만을이용하여중간크기의에너지를전달할수있는효과적인방법 Duty cycle (duty ratio): ON 시간 / 주기의비율로 0~100%( 혹은 0~1) 로나타냄. D T PWM 에의한모터속도제어원리 모터구동에너지 펄스듀티비 17
Example code: PWM 신호발생 void main(void) { WDTCTL = WDTPW + WDTHOLD P1DIR = 0x04; /P1.2 Output P1SEL = 0x04; //set P1.2 to TA1 P2DIR = 0x01; /P2.0 Output P2SEL = 0x01; //set P2.0 to TA2 //setup Timer_A TACCR0 = 512-1; //PWM Period TACCTL1 = 0x00E0; // OUTMODE=7 (reset/set) TACCR1 = 384; //duty cycle=75% TACCTL2 = 0x00E0; // OUTMODE=7 (reset/set) TACCR2 = 128; //duty cycle =25% TACTL = 0x0110 ; //SSEL=ACLK, MCx=Up mode low_power_mode_3(); OUTMODE=reset/set 이용 -EQU1 에서 RESET: 주기시작 -CCR0 overflow 에서 SET: ON Timer End Duty cycle=384/512 = 75% 만약 set/reset OUTMODE 를이용한다면?? } 18
Capture mode Capture mode 는시간이벤트를기록하기위해이용됨. 즉, MCU 내 / 외부신호의변화시간간격을측정할수있다. How? 내부타이머의값을특정시간에일시저장하여.. 외부클럭신호의주기측정 rising edge 사이측정 외부신호의 ON/OFF time 측정 rising/falling edge 사이측정 19 TACCRx TAR time
Timer_A3 입력핀 MSP430FG461x 의 timer_a3 의입출력핀사양 입력 : P1.5(TACLK), P1.0(CCI0A), P1.1(CCI0B), P1.2(CCI1A), P2.0(CCI2A) CAP=1 CCISx: 측정대상선택 CMx: input signal 의 capture edge 선택 rising, falling, both 지정된신호입력되면 (Capture occurs! 캡쳐 ON) TAR 값이 TACCRx reg. 로 copy CCIFGx =1 (IRQ. 발생 ) 20
Capture mode timing diagram SCS: TACCTLx[11] Synchronize capture source 입력신호변화를타이머클럭과동기화시킴. Capture Overflow 문제 캡쳐발생후일시저장된값을읽지않은상태에서다시캡쳐 ON 되어기존값을잃어버리는경우 overflow 라고함. 이경우 HW 가자동적으로찾아 COV=1 로설정함. COV clearing 은반드시 SW 에서실행되야함. 21
Example code: 외부신호주기측정 Int prev_cnt, Period; int main( void ) { WDTCTL = WDTPW + WDTHOLD; //setup TA0 output P2SEL = 0x01; //P2.0 --> CCI2A P2DIR &= ~0x01; P2DIR = 0x08; //P2.3 ouput //setup TACTL0 for clock generation TACCTL0 = CCIE; TACCR0 = 3000; //3ms //setup TTACTL2 for capturing TACCTL2 =0x4910; TACCR2 = 0; TACTL = 0x0220 ; //continuous mode, SMCLK prev_cnt = 0; enable_interrupt(); low_power_mode_0(); return 0; } #pragma vector=timera0_vector interrupt void ta0_isr(void) { P2OUT ^= BIT3; TACCR0 += INTVL1; } #pragma vector=timera1_vector interrupt void ta_isr(void) { switch(taiv) { case 2: break; case 10: break; case 4: Period = TACCR2 -prev_cnt; prev_cnt = TACCR2; } } Capture mode 이용 IRQ 발생시점 : P2.3 clock rising edge TAR 은연속모드이므로클럭주기측정을위해서는사이값을계산해야함. 22
Timer_A3 관련 Interrupts 2 개의인터럽트소스 TACCR0 CCIFG0 (IAR C 에선 TIMERA0_VECTOR) CCIFG1, CCIFG2, TAIFG 는모두하나의인터럽트로처리됨. (P1/2 와동일 ) (TIMERA1_VECTOR) CCIFG1/2 및 TAIFG 는순서대로우선순위를가지며 ISR 에서어떤소스인가를보다빠르게파악할수있도록 TAIV reg. 를제공함. 23
지금까지배운 IRQ. sources FG4618 user s manual p.13 24