[MSP430]/MSP430_EVM2011. 10. 28. 12:11

[MSP430] WATCHDOG 사용하기

[MSP430] WATCHDOG 사용하기


MSP430에서 Watchdog 사용하기위해 WDTCTL레지스터를 설정하면된다. 디폴트로 와치독은 동작하도록 되어 있고 내 코드에서는 SystemInit() 함수에서 와치독 사용하지 않도록 설정하고 있다.

void SystemInit(void)
{
  int result,i;
  WDTCTL = WDTPW +WDTHOLD;                  // Stop Watchdog Timer


WDTCTL레지스터를 제어하기 위해서는 Passwoard를 상위 레지스터가 기입해야 하는데 0x69를 입력하면 된다.
아래는 WDTCTL레지스터 이다.




와치독 사용하기 위해서는 WDTHOLD, WDTTMSEL 비트를 0으로 설정하면된다.
와치독 타이머 초기화는 WDTCNTL비트를 셋하면 초기화되어 와치독 리셋을 방지한다.



MSP430 Watchdog 드라이버 코드

#define WDT_ENABLE()                WDTCTL = WDTPW;
#define WDT_DISABLE()                WDTCTL = WDTPW+WDTHOLD;

#define WDT_RESET()                 WDTCTL = WDTPW+WDTCNTCL;



MSP430 Watchdog 테스트 예제 코드
void main(void)
{
 unsigned int cnt = 0;
 
    SystemInit();

 Led1Init();
 Led1On();
   
    for(cnt=0;cnt<3;cnt++)
    {
  Led1Toggle();
  Delay(50);   
    }
    Led1On();
   
   
    //와치독 사용
    WDT_ENABLE();
   
 while(1)
 {
        //와치독 리셋
        WDT_RESET();
 }
}
Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430_EVM2011. 10. 26. 17:43

[MSP430] 외부 인터럽트

[MSP430] 외부 인터럽트

외부 인터럽트 초기화
    //외부 인터럽트 설정
    Sbi(P1IE, SCLK_BIT);         //interrupt enabled
    Cbi(P1IES, SCLK_BIT);        //edge 선택 0:라이징, 1:폴링
    Cbi(P1IFG, SCLK_BIT);        //IFG cleare



인터럽트 처리 핸들러
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
    if(P1IFG&SCLK_BIT)
    {
        Led1Toggle();      
        
        Cbi(P1IFG, SCLK_BIT);
    }
}



Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430F20132011. 10. 26. 17:27

[MSP430 PWM] MSP430F2013 PWM

[MSP430 PWM] MSP430F2013 PWM

MSP430의 PWM 출력은 TA0, TA1에서 가능한데 P1.1, P1.2 (P1.5, P1.6)에서 출력 가능하다.



PWM 초기화
void PwmInit2(void)
{
 Sbi(P1DIR, BIT2);                  // P1.2 output
 Bit(P1SEL, BIT2);                  // P1.2 TA1 options

 CCR0 = PWM_PERIOD;                 // PWM Period/2
 CCTL1 = OUTMOD_6;                  // CCR1 toggle/set
 CCR1 = PWM_PERIOD/2;               // CCR1 PWM duty cycle
 TACTL = TASSEL_2 + MC_3;           // SMCLK, up-down mode  
}


PWM출력
#define SetPWMp2(Percent)  CCR1 = (float)PWM_PERIOD/(100.0/(100.0-Percent))


Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430_EVM2010. 10. 6. 19:50

[MSP430] 풀업저항 설정 - 스위치 입력처리

[MSP430] 풀업저항 설정 - 스위치 입력처리

MSP430의 내부 풀업 저항 설정은 REN레지스터를  셋팅해 주면 된다.


내부 풀업을 사용할경우 저항이 고정되어 있어서 1.6uA정도가 소모된다.(MSP430자체는 nA단위로 소모한다.) 만약 저전류로 동작하기를 원한다면 외부에 더 큰저항으로 풀업 하는것이 좋다.


#define SW_BIT      (BIT0|BIT1|BIT2|BIT3)
#define SW_PORT         P1IN
#define SwInit()     Sbi(P1REN, SW_BIT);Cbi(P1DIR, SW_BIT);

#define GetSw()         ((~SW_PORT)&SW_BIT)


main()
{
    SwInit();     

    while(1)
    {
        sw_new = GetSw();
       
        if(sw_new != sw_old)
        {
         

        }
        sw_old = sw_new;
}










Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430_EVM2010. 6. 1. 22:00

MSP430 소비전류 측정 실험

MSP430 소비전류 측정 실험

MSP430F2013 기준으로 소비전류를 측정해 보았다.

 

우선 MSP430 데이터시트를 보면 아래와 같이 나타나 있다.

Low Supply Voltage Range 1.8 V to 3.6 V

Ultra-Low Power Consumption Programming Voltage Needed, Programmable
- Active Mode: 220uA at 1 MHz, 2.2V
- Standby Mode: 0.5uA
- Off Mode (RAM Retention): 0.1uA

 

우선 가장 기본 코드로 루프를 돌면서 3초에 한번씩 LED를 순간적으로 On/Off하는 코드를 돌려보았다.

기본코드는 1Mhz에서 동작한다.

측정 결과 340uA정도로 측정된다. 3.3V이므로 데이터시트와 크게 차이는 없는것 같다.

1Mhz에서 아무생각없이 동작시켜도 이정도라면 나쁘지 않은것 같다.

 

 WDTCTL = WDTPW + WDTHOLD;            // Stop watchdog
 
 Led1Init();
 Led1On();

 
 while(1)
 {
        Led1Off();
        Delay(10);
        Led1On();
       Delay(3000);
 }

 

 


16Mhz로 구동해 보니 2.7mA가 출력된다. 속도가 16배 빨라져서 그런가?

조금은 이상한데..

 


MSP430은 5단계의 저전력 모드가 있는데 그중에 LPM3 모드로 테스트 해 보았다.

평소 슬립모드에 있다가 와치독 타이머를 이용해 2~3초에 한번씩 깨어나 수행하는 코드이다.

MSP430 LPM3 모드에서 테스트 결과 0.4uA가 측정된다.

 

void main(void)
{
  BCSCTL1 |= DIVA_1;                        // ACLK/2
  BCSCTL3 |= LFXT1S_2;                      // ACLK = VLO
  WDTCTL = WDT_ADLY_1000;                   // Interval timer
  IE1 |= WDTIE;                             // Enable WDT interrupt
  P1DIR = 0xFF;                             // All P1.x outputs
  P1OUT = 0;                                // All P1.x reset
  P2DIR = 0xFF;                             // All P2.x outputs
  P2OUT = 0;                                // All P2.x reset

  while(1)
  {
    int i;
    Led1Off();
    Delay(10);
    Led1On();
    _BIS_SR(LPM3_bits + GIE);               // Enter LPM3
  }
}

 

#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer (void)
{
    _BIC_SR_IRQ(LPM3_bits);                 // Clear LPM3 bits from 0(SR)
}

 

 

MCU회사마다 저전력 측정 기준이 달라서 명확한 기준은 정하기 힘든것 같지만 어플리케이션에 따라 적절히 잘 선택해야 하지 않을까...

Posted by nexp

댓글을 달아 주세요