[MSP430]/MSP430_AFE2012. 10. 28. 12:30

[MSP430AFE EVM] UART테스트

[MSP430AFE EVM] UART테스트

 

24bit ADC디버깅 하기 위해 UART를 이용하면 편리하다.

기존 MSP430 UART 코드로 동작을 하지 않아 수정하면서 정리해 보았다.

MSP430시리즈마다 UART특성이 조금씩 다른데 MSP430AFE는 MSP430F2xx 를 기준으로 하고 있다.

 

 

MSP430AFE UART블록도

 

 

 

 

 

 

U0TCTL (USART Transmit Control Register)

기존 22xx 시리즈와 레지스트 명이 달라서 조금 수정이 필요하다.

 

 

 

1Byte 전송함수

void U0_PutByte(unsigned char Data)
{
    // USART0 TX buffer ready?
    while (!(U0TCTL & TXEPT));
    TXBUF0 = Data;
}

 

 

1Byte 수신함수

unsigned char U0_GetByte(void)
{
 while(!(IFG1 & URXIFG0));

    return RXBUF0;
}

 

 

 

MSP430AFE UART테스트 예제 코드

void main(void)
{
    unsigned int cnt = 0;

    SystemInit();

 Led1Init();
 Led1Off();
 U0_Init(BAUD_115200);
 
 DebugPrint("MSP430 Serial Test\r\n"); 
 
 while(1)
 {
  if(U0_IsGetByte())
  {
     switch(U0_GetByte())
     {
      case '+':
       DebugPrint("Cnt=%d\r\n", cnt++);
       break;
       
    case '-':
     DebugPrint("Cnt=%d\r\n", cnt--);
     break;      
     }
  }
  
  
  Led1Toggle();
  Delay(500);
 }   

 

Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430F5x2011. 11. 27. 21:00

[MSP430F5510 EVM] ADC 테스트

[MSP430F5510 EVM] ADC 테스트




MSP430F55x 으로 오면서 몇가지 페리들이 변경되었는데.. ADC도 약간의 레지스터 및 기능상 변화가 있었다.


MSP430F55xx ADC구조




MSP430F5510 ADC 초기화 코드
//ADC Initialize
void AdcInit(void)
{
  // Configure ADC10 - Pulse sample mode; ADC10SC trigger
  ADC10CTL0 = ADC10SHT_2 + ADC10ON;         // 16 ADC10CLKs; ADC ON
  ADC10CTL1 = ADC10SHP + ADC10CONSEQ_0;     // s/w trig, single ch/conv
  ADC10CTL2 = ADC10RES;                     // 10-bit conversion results
  ADC10MCTL0 = ADC10SREF_1 + ADC10INCH_0;  // AVcc/2 
 
  // Configure internal reference
  while(REFCTL0 & REFGENBUSY);              // If ref generator busy, WAIT
  REFCTL0 |= REFVSEL_0+REFON;               // Select internal ref = 1.5V
}



MSP430F5510 ADC Read함수
//Read ADC Value
unsigned int AdcRead(unsigned char port)
{
 unsigned int value = 0;
 
    ADC10MCTL0 = ADC10SREF_1 + (ADC10INCH_0 + port);  // AVcc/2 
 
 
    ADC10CTL0 |= ADC10ENC + ADC10SC;        // Sampling and conversion start
    while (ADC10CTL1 & ADC10BUSY);
   
    value = ADC10MEM0;

 return value;
}



MSP430F5510 ADC테스트 예제 소스코드
[EXP_DSP EVM] 확장 보드에 연결되어 있는 VR을 이용하여 MSP430의 10bit ADC출력 값을 시리얼 포트로 출력 하는 예제이다.
void main(void)
{
    unsigned int adc = 0;
    SystemInit();
   
    Led1Init();
    Led1On();

   //Serial Init
   DebugInit(BAUD_115200);
   DebugPrint("Serial Test Program.\r\n");
   
    //Init ADC
    AdcInit();
    
      while(1)
    {
        adc = AdcRead(0);
        DebugPrint("adc=%d\r\n", adc);

        Led1Toggle();
        Delay(300);
    }
}

Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430F5x2011. 11. 26. 17:30

[MSP430F5529 EVM] SPI테스트 - 3축 가속도 센서 출력

[MSP430F5529 EVM] SPI테스트 - 3축 가속도 센서 출력

[MSP430F5510 EVM] 및 [MSP430F5529 EVM] 의 SPI는 PORT4의 USB1에 할당 되어 있다.
핀맵을 보면 아래와 같다.

P4.3/PM_UCB1CLK/PM_UCA1STE
P4.2/PM_UCB1SOMI/PM_UCB1SCL
P4.1/PM_UCB1SIMO/PM_UCB1SDA
P4.0/PM_UCB1STE/PM_UCA1CLK




MSP430F5x의 SPI특징
SPI mode features include:
• 7-bit or 8-bit data length
• LSB-first or MSB-first data transmit and receive
• 3-pin and 4-pin SPI operation
• Master or slave modes
• Independent transmit and receive shift registers
• Separate transmit and receive buffer registers
• Continuous transmit and receive operation
• Selectable clock polarity and phase control
• Programmable clock frequency in master mode
• Independent interrupt capability for receive and transmit
• Slave operation in LPM4



MSP430F5x SPI블록도





MSP430F5x SPI 통신 초기화 함수
void SPI1_Init(void) // SPI 통신 초기화 함수
{
 // Select SPI functionality on DIO pins for MOSI, MISO, & CLK.
 P4SEL |= (BIT1|BIT2|BIT3);  
   
  UCB1CTL1 |= UCSWRST;                      // **Put state machine in reset**
  UCB1CTL0 |= UCMST+UCSYNC+UCMSB+UCCKPH;    // 3-pin, 8-bit SPI master
  UCB1CTL1 |= UCSSEL_2;                     // SMCLK
  UCB1CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
//  UCB1IE |= UCRXIE;     

   SPI1_SetSpeed(SPI_SPEED_1MHZ);
}



MSP430F5x SPI 전송 함수
#define SPI1_WRITE_BYTE(x)                 UCB1TXBUF = (x);
#define SPI1_READ_BYTE()     UCB1RXBUF
#define SPI1_WAIT_FOR_EN()     while (!(UCTXIFG&UCB1IFG));
#define SPI1_WAIT_FOR_SEND()              while (UCB1STAT & UCBUSY);
#define SPI1_WAIT_FOR_RX()     while (!(UCRXIFG&UCB1IFG))


unsigned char SPI1_WriteReadByte(unsigned char Data)
{
 SPI1_WAIT_FOR_EN();
 SPI1_WRITE_BYTE(Data);
 SPI1_WAIT_FOR_SEND();
 return SPI1_READ_BYTE();
}



MSP430F5510 SPI Accel 드라이버 함수
#define _SPI1_ENABLE    1

//-----------------------------------------------------------------------------
// myAccel3LV02 HAL
#define MY_ACCEL3LV02_SPI_MODE   1
#define MY_ACCEL3LV02_I2C_MODE   0

//AccelCS A8-P3.7
#define ACCEL_CS_BIT     BIT6
#define ACCEL_CS_PORT     PORT4

#define ACCEL_CS_INIT()     Sbi(P4DIR, ACCEL_CS_BIT);

#define ACCEL_CS_ASSERT()    Cbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_CS_DEASSERT()    Sbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_SPI_INIT()    SPI1_Init()
#define ACCEL_Read      SPI1_WriteReadByte
#define ACCEL_Write      SPI1_WriteReadByte
//-----------------------------------------------------------------------------



MSP430F5529 3축 가속도 센서 출력 테스트 예제 소스코드
#include "system.h"
#include "serial.h"
#include "spi.h"
#include "myAccel.h"

void main(void)
{
   short data = 0;
    SystemInit();

    Led1Init();
    Led1On();
   
 DebugInit(BAUD_115200);
 DebugPrint("MSP430F5529 EVM SPI Accel Test\r\n");

 myAccel3lvInit();
    myAccel3lvWrite(CTRL_REG1, 0xC7);  //1000.0111 Power on, enable all axis, self test off
   
    while(1)
    {
        Led1Toggle();
       GetAccelValue(AXIS_X, &data);
       DebugPrint("%d\r\n", data); 
 
        Delay(100);
    }
}


Posted by nexp

댓글을 달아 주세요

[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

댓글을 달아 주세요