“msp430을 이용하여 16mhz로 동작하도록 하고, 100000Hz로 타임 인트럽트가 발생되도록 프로그램을 작성해 줘”을 DeepSeek와 Gemini를 이용하여 작성해 보았다.

Gemini 답변
#include <msp430.h>
// 타이머 인터럽트 주기 계산 (16MHz / 100kHz = 160)
#define TIMER_PERIOD 160
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // 워치독 타이머 정지
// 클럭 설정 (16MHz)
BCSCTL1 = CALBC1_16MHZ;
DCOCTL = CALDCO_16MHZ;
// 타이머 설정
CCTL0 = CCIE; // CCR0 인터럽트 활성화
CCR0 = TIMER_PERIOD; // CCR0 값 설정
TACTL = TASSEL_2 | MC_1 | ID_0; // SMCLK, 연속 모드, 분주 없음
// 인터럽트 활성화
__bis_SR_register(LPM0_bits + GIE); // 저전력 모드 0, 전역 인터럽트 활성화
while (1) {
// 저전력 모드에서 대기 (인터럽트 발생 시 깨어남)
__low_power_mode();
}
}
// 타이머 인터럽트 핸들러
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0_ISR(void) {
// 100kHz 인터럽트 발생 시 실행되는 코드
// 예: P1.0 핀 토글
P1OUT ^= 0x01;
// 인터럽트 플래그 초기화 (선택 사항)
CCTL0 &= ~CCIFG;
}
다음은 DeepSeek 답변입니다.
#include <msp430.h>
void main(void)
{
// Watchdog 타이머 비활성화
WDTCTL = WDTPW | WDTHOLD;
// DCO(Digitally Controlled Oscillator)를 16MHz로 설정
BCSCTL1 = CALBC1_16MHZ; // 기본 설정 값 로드
DCOCTL = CALDCO_16MHZ; // DCO를 16MHz로 설정
// P1.0 핀을 출력으로 설정 (LED 등으로 사용 가능)
P1DIR |= BIT0;
P1OUT &= ~BIT0;
// Timer_A 설정
TA0CTL = TASSEL_2 + MC_1 + TACLR; // SMCLK(16MHz)를 클럭 소스로 사용, 업 모드, 타이머 클리어
TA0CCR0 = 160 - 1; // 100kHz 주기 설정 (16MHz / 100kHz = 160)
TA0CCTL0 = CCIE; // CCR0 인터럽트 활성화
// 글로벌 인터럽트 활성화
__enable_interrupt();
// 무한 루프
while (1)
{
// 메인 루프에서 할 일이 있다면 여기에 작성
}
}
// Timer_A0 인터럽트 서비스 루틴
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0_ISR(void)
{
// P1.0 핀 토글 (LED 깜빡임)
P1OUT ^= BIT0;
}
비교해 보자.
Gemini에는 포트 선언 부분이 빠졌다.
// P1.0 핀을 출력으로 설정 (LED 등으로 사용 가능)
P1DIR |= BIT0;
P1OUT &= ~BIT0;
그리고 두 프로그램은 타이머 인트럽트 선언이 다르다.
TACTL = TASSEL_2 | MC_1 | ID_0; // Gemini
와
TA0CTL = TASSEL_2 + MC_1 + TACLR; // DeepSeek
ID_0은 의미가 없다고 볼 수 없다고 할 수 있다. 하지만, TACLR은 선언하는 것이 좋다.
매번 인트럽터를 처리하는 부분에 “CCTL0 &= ~CCIFG;” 를 넣어야 한다.
이로 인하여 느려지기 때문이다.
인터럽터 활성화도 함수와 함수의 내부 코드 차이라고 할 수 있다.
__bis_SR_register(LPM0_bits + GIE); // Gemini
와
__enable_interrupt(); // DeepSeek
Gemini 코드에서 “__low_power_mode();”는 의미가 없는 코드이다.
DeepSeek가 조금 나은 코드를 작성한 것 같다.
윤영기 (YOON, Young-Ki)
KOREA
Main mail: newton@eqboard.com
Backup mail: neoy2g@hotmail.com
@beowulfkr.bsky.social