임베디드시스템기초 (#514115 ) #4. BT1 Review & Real Time Clock 한림대학교전자공학과이선우
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
Basic Timer 1 Block diagram 2 개의별도카운터 (1&2) BTCNT1: incremented with ACLK, LCD controller 의다이나믹구동을위한주파수를제공함. BTCNT2: source ACLK,SMCLK, ACLK/256 ACLK: auxiliary clock 보드 :32768Hz 3
BT1 Registers 4
BTCNT1 operation: Signal F Lcd 적당한 LCD 용클럭신호생성방법 BTCNT1 제공가능클럭 : ACLK/256,128,64,32 4 종류 알맞은신호주파수 : f LCD = 2 x mux x f Frame 일례, 4-mux LCD 사용, frame freq. 가 30~100Hz 라면 : f LCD = 2*4*30 (100) = 240Hz(min), 800Hz(max) 따라서 f LCD = 32768/128(64)=256 (512)Hz LCD_A 모듈을내장하고있는모델의경우는별도 F LCD 내장회로를가지므로이기능이필요없음. 5
BTCNT2 operation 일반적인 8bit up counter 로작동 클럭소스가 CNT1 이 ACLK 에비해 3 종류 (ACLK, ACLK/256, SMCLK) 선택가능 ACLK/256 을선택하면 16bit counter 로사용가능 BTIPx bit 설정을통해 8 종류의시간간격지난후에인터럽트발생 (BT Timeout event: BTIFG) f CLK2 /(2,4,8,16,32,64,128,256) 6
기본적인이용방법 BT1 의경우일반적인이용방법 Ex. LCD 컨트롤러용클럭생성기본적인시간간격타이머로이용 평가보드 ACLK=32768Hz, SMCLK=ACLK*32=1048576Hz ( 1MHz) 긴간격생성은? ACLK/256=128Hz 128Hz/2,4,8,16,31,64,128,256 64Hz, 32Hz, 16Hz,8Hz,4Hz,2Hz,1Hz, 0.5Hz 시간간격마다인터럽트발생 ( 이를이용 ) 짧은시간간격은? ACLK을선택하면위보다 256배짧은간격생성가능 더짧은간격은? SMCLK 사용함! 7
C 언어이용설정방법 #pragma vector=basictimer_vector interrupt void bt1_handler(void) P2OUT ^= 0x02; //toggle LED1 void main(void) WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P2DIR = 0x06; P2OUT = 0x02; //setup Basic Timer1 // BTCNT1 <- f_lcd = 512Hz // BTCNT2 <- slow interval 2Hz BTCTL = 0x2d; //; // 001 01 101 -> 0x2D BTCNT1 = 0; BTCNT2 = 0; IE2 = 0x80; enable_interrupt(); //intrinsic ftn. while(1); BTCTL 설정 가장중요! 전체동작설정 BTSEL=0, BTHOLD=0, BTDIV=1 f LCD freq. = faclk/64 <= 0 1 BT Irq. Interval = /64 <= 101 CNT reg. 초기화 대개 RESET 되면 0 이되나초기화할필요가있다. Interrupt enable IE2.7 (BTIE bit) = 1 해야만 IRQ. 동작실행. 8
BT1 활용방법 기본기능 : 특정인터벌마다인터럽트발생시킴 활용 : 기본소프트웨어타이머로활용 모든 OS 에서필요한 system tick 을만드는데사용. 즉일정한인터 벌에서특정작업수행가능예1: 스위치입력기능 기존무한루프에딜레이사용방법 : 불필요한자원 ( 전력 ) 을낭비 BT1 이용일정간격마다스위치상태읽어반응하게함. Matrix keypad scanning 할때이용. 예 2: 디지털시계구현 1 초인터벌설정, 이를적절하게 count 하여시계구현함. 부가기능 : LPM3 이용저전력동작가능하게함 LPM3 는 ACLK 사용가능하므로타이머동작하고, BT1 에의해발생하는인터럽트는 sleep 상태의 MCU 를깨워 (awaking) 어떤작업을할수있다. 9
Example code #1: LPM & BT1 일정시간간격으로 BT1 이인터럽트를발생시키고이를이용하여 LED 를점멸시키는응용예 #define LED1 void main(void) //port and BT1 초기화 // BT1 irq. Enable BIT1 LP 모드 (LPM3) 로진입초기설정이후이명령을사용하여 LPM3 로설정 ACLK 이외다른클럭신호 OFF, CPU 는현재상태에서멈춤 (sleep 상태 ) *IRQ. 발생하면깨어남. low_power_mode_3(); //LPM3; ACLK만유효 #pragma vector=basictimer_vector interrupt void BT1_ISR(void) P2OUT ^= LED1; 정해진시간간격이지나 BT1 이 IRQ. 를발생시키면 sleep 상태에서깨어나 ISR 을실행함. 즉, LED 토글하고 main 루틴으로돌아감. * 되돌아갈때스택에저장했던 SR 값을복원 LPM 모드세팅이적용 ( 즉 LMP3 상태유지 ) 10
Example code #3: LPM & BT1 & SW1 저전력상태에서일정시간마다 SW1 상태읽어 (debouncing 적용 ) 이값이변할때마다 LED 를 toggle 시키는프로그램 unsigned char firstread, swpush; void main(void) // GPIO port 설정 : SW1 입력, LED 출력설정 // BT1 설정 : 약 20~40msec 정도인터벌 // BT1 irq. Enable 설정 firstread = 0; low_power_mode_3(); //LPM3; ACLK 만유효 #pragma vector=basictimer_vector interrupt void BT1_ISR(void) //SW1 읽음 swpush = PxIN & SW1BIT; if(!swpush) //SW1 눌렸나? if(firstread) // 이번이두번째누름? P2OUT ^= LED1; //Toggling firstread = 0; else firstread = 1; // 첫번째눌림 11
Real Time Clock 시계란? 1Hz clock 을분 (60)/ 시 (60)/ 날 (24) 단위로개수를세어표시하는장치 RTC module Calendar Mode: 캘린터 / 시계기능 자동적인시 / 분 / 초및날짜 ( 년 / 월 / 일 / 요일 ) 계산기능 BCD format 가능 Counter Mode: 일반적인 32-bit 타이머 / 카운터기능 3 개클럭소스 (ACLK, SMCLK, BTCNT2.Q6) 선택가능 4 개 8-bit 카운터레지스터 (RTCNT1~4) 의개별 R/W 가능, 연속연결하여 32-bit 카운터로도동작 8/16/24/32-bit overflow 발생시인터럽트발생 12
RTC block diagram 13
RTC 동작 : calendar mode 일반적인시계정보 ( 년, 달, 일, 요일, 시, 분초제공 ) 윤년계산알고리즘내장 (1901~2099) BCD (Binary Coded Decimal) format 제공 10 진수의각자리를 4bit 의 2 진수로별도로표시하는방법. Ex) 10 0x0A (X), 0x10(O), 32 0x10(X), 0x32(O) 10 진수숫자의디스플레이장치 (7 세그먼트등 ) 를이용한표시에사용됨. BT1 과의관계 Calendar 모드설정되면자동으로 ACLK 이 BT1 의소스로, 2 개 8-bit counter 가연결 (cascaded) 되어 1Hz 클럭생성하도록함 ( 전제조건 :ACLK=32768Hz) 14
RTC 동작 : calendar mode Interrupts 관련사항 RTC 의여러사건들은 BT1 인터럽트관련하드웨어를공통으로사용함. ( 별도인터럽트벡터가없음 ) RTIE=1 이면 RTC Event 발생에의해 BTIFG(BT1 irq. Flag) set ( 블럭다이어그램참조!) RTCEVx bit 에의해카운터 / 캘린터모드에따라각각 4 개씩이벤트정의되어있음. 따라서코드상에서는 BT1 에대한 ISR 을만드는것과동일하게 ISR 작성해야함! 즉, #pragma vector=basictimer_vector 사용 15
RTC registers 16
RTC module Coding 방법 #pragma vector=basictimer_vector interrupt void rtc_handler(void) P2OUT ^= 0x02; //toggle LED1 void main(void) P2DIR = 0x06; P2OUT = 0x02; //setup Real-Time Clcok RTCCTL = 0xF2; // 0b 1 1 11 00 10 -> 0xF2 //init time RTCSEC = 0x00; // Set Seconds RTCMIN = 0x59; // Set Minutes RTCHOUR = 0x12; // Set Hours // Init date RTCDOW = 0x01; // Set DOW RTCDAY = 0x21; // Set Day RTCMON = 0x09; // Set Month RTCYEAR = 0x2009; // Set Year RTCCTL &= ~RTCHOLD; // Enable RTC enable_interrupt(); //GIE=1 while(1); RTCCTL 설정 가장중요! 전체동작설정 RTCBCD=1 (BCD format 사용 ) RTCHOLD =1 (stop) RTCMODEx = 11 (calendar mode) RTCTEVx= 00 ( 분변화시인터럽트발생 ) RTCIE = 1 Irq. enable 시간 / 날짜레지스터초기화 대개 RESET 되면 0(or 1) 이되나시작날짜 / 시간초기화할필요가있다. 17
C Programming TIP #1 거의모든응용프로그램들은복수개의소스파일들로구성 이유 : 각기능별로구분하여프로그래밍하는것이작성 / 디버깅에편리하기때문. 방법 : 기능별로별도파일로작성하고 main() 함수에서사용. 예 : LCD_A, GPIO, BT 모듈별로별도파일작성 작성순서 lcd.c : 관련된함수에대한코드작성. lcd_init(), lcd_num_dis() 등의함수를만듬. lcd.h: 다른파일에서 lcd 관련함수를 call 할수있도록정의된함수를선언 (declaration) 함. main_clock.c: main() 함수가있는파일 #include lcd.h 를이용 lcd 관련함수가무엇이있는지안다. 코드중에 lcd 관련함수를 CALL 18
C Programming TIP #1 /* lcd.c file: LCD_A 제어기관련함수들 */ #include lcd.h void lcd_init(void) //port setup //LCDA setup void lcd_nu_dis(int digit, int num) //digit: 7 개숫자판중하나지정 //num: 표시하는숫자 /* main_clock.c file */ #include lcd.h void main(void) // 초기화관련.. led1_init(); lcd_init(); //LCD 2 번숫자판에 2 표시 lcd_num_dis(2,2); lcd_num_dis(3,3); /* lcd.h file*/ void lcd_init(void); void lcd_nu_dis(int digit, int num); 19