“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

By neoy2g