[MSP430]/MSP430_FRAM2013. 5. 18. 21:00

MSP430FR5739 EVM - ADC테스트 (전압값에 따라 게이지 그래프 표시 하기)

MSP430FR5739 EVM - ADC테스트 (전압값에 따라 게이지 그래프 표시 하기)

 


ADC10_B features include:

- Greater than 200-ksps maximum conversion rate

- Monotonic 10-bit converter with no missing codes

- REF Module 1.5V, 2V and 2.5V

- Sample-and-hold with programmable sampling periods controlled by software or timers

- Conversion initiation by software or different timers

- Software-selectable on chip reference using the REF module or external reference

- Twelve individually configurable external input channels

- Conversion channel for temperature sensor of the REF module

- Selectable conversion clock source

- Single-channel, repeat-single-channel, sequence, and repeat-sequence conversion modes

- Window comparator for low-power monitoring of input signals

- Interrupt vector register for fast decoding of six ADC interrupts (ADC10IFG0, ADC10TOVIFG,

ADC10OVIFG, ADC10LOIFG, ADC10INIFG, ADC10HIIFG)




MSP430FR5739 ADC 블록도




MSP430FR5739 ADC 초기화 함수

ADC에 사용할 포트를 설정하고 레퍼런스 및 해상도를 설정할 수 있다.

 // Sampling and conversion start

#define ADC_Start()               (ADC10CTL0 |= ADC10ENC + ADC10SC);       


void AdcInit()

{

    // Configure ADC

    P3SEL1 |= BIT0; 

    P3SEL0 |= BIT0; 

  

    ADC10CTL0 |= ADC10SHT_2 + ADC10ON;        // ADC10ON, S&H=16 ADC clks

    ADC10CTL1 |= ADC10SHP;                    // ADCCLK = MODOSC; sampling timer

    ADC10CTL2 |= ADC10RES;                    // 10-bit conversion results

    ADC10MCTL0 |= ADC10INCH_12;                // A1 ADC input select; Vref=AVCC

    ADC10IE |= ADC10IE0;                      // Enable ADC conv complete interrupt 

}


 

ADC 제어 레지스터 - 채널 설정


 

 

MSP430FR5739 ADC 테스트 동영상

 


MSP430FR5739 ADC 테스트 예제코드

unsigned int ADC_Result;


//-----------------------------------------------------------------------------

void main(void)

{

    unsigned int cnt = 0;


    SystemInit();

    

    Led1Init();

    Led1On();

//Serial Init

DebugInit(BAUD_115200);

DebugPrint("ADC Test Program.\r\n");


AdcInit();

    while(1)

    {

        __delay_cycles(5000);

        ADC_Start();        // Sampling and conversion start

        __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exit

        __no_operation();


        DebugPrint("adc=%d\r\n", ADC_Result);

    }

}

//-----------------------------------------------------------------------------





// ADC10 interrupt service routine

#pragma vector=ADC10_VECTOR

__interrupt void ADC10_ISR(void)

{

  switch(__even_in_range(ADC10IV,12))

  {

    case  0: break;                          // No interrupt

    case  2: break;                          // conversion result overflow

    case  4: break;                          // conversion time overflow

    case  6: break;                          // ADC10HI

    case  8: break;                          // ADC10LO

    case 10: break;                          // ADC10IN

    case 12: ADC_Result = ADC10MEM0;         

             __bic_SR_register_on_exit(CPUOFF);                                              

             break;                          // Clear CPUOFF bit from 0(SR)                         

    default: break; 

  }  

}



Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430_FRAM2013. 5. 17. 23:00

MSP430FR5739 EVM - eUSCI SPI 통신 테스트

MSP430FR5739 EVM - eUSCI SPI 통신 테스트

 

 

MSP430FR5739의 SPI역시 기존과 약간의 변화가 있는것 같다.

설계 할때 잘 해둘필요가 있는데... 아무튼 다시 한번 정리해 본다.

 

 

MSP430FR5739 SPI 블록도
 




MSP430FR5739 SPI 핀맵 설정

SEL 레지스터를 이용하여 SPI기능을 할당할 수 있다. 다른 MSP430시리즈와 달리 SEL0, SEL1으로 두개의 레지스터가 있다.

//USCIA1 for MSP430FR5739

#define _SPI1_PxSEL   P2SEL0

#define _SPI1_PxSEL1   P2SEL1

#define _SPI1_PxDIR   P2DIR

#define _SPI1_PxIN   P2IN


#define _SPI1_SIMO   BIT5

#define _SPI1_SOMI   BIT6

#define _SPI1_UCLK   BIT4



//SPI Port Init

Cbi(_SPI1_PxSEL, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));

Sbi(_SPI1_PxSEL1, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));


// SPI option select

Sbi(_SPI1_PxDIR, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));






MSP430FR5739 SPI 초기화 함수


void SPI1_Init(void) // SPI 통신 초기화 함수

{

    // Initialize USART state machine

UCB0CTL1 &= ~UCSWRST;

//SPI Port Init

Cbi(_SPI1_PxSEL, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));

Sbi(_SPI1_PxSEL1, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));


// SPI option select

Sbi(_SPI1_PxDIR, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));

UCA1CTLW0 |= UCSWRST;                     // **Put state machine in reset**

UCA1CTLW0 |= UCMST+UCSYNC+UCCKPL+UCMSB;   // 3-pin, 8-bit SPI master

// Clock polarity high, MSB

UCA1CTLW0 |= UCSSEL__SMCLK;                    // SMCLK


UCA1CTLW0 &= ~UCSWRST;                    // **Initialize USCI state machine**

//UCA1IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt

}





MSP430FR5739 송수신 함수

#define SPI1_WRITE_BYTE(x)                 UCA1TXBUF = (x);

#define SPI1_READ_BYTE() UCA1RXBUF

#define SPI1_WAIT_FOR_SEND()             while (!(UCA1IFG&UCTXIFG))

#define SPI1_WAIT_FOR_RX() while (!(UCA1IFG&UCRXIFG))



unsigned char SPI1_WriteReadByte(unsigned char Data)

{

//SPI TXBUF 데이터 있는가 확인

SPI1_WAIT_FOR_SEND();

//데이터 전송

SPI1_WRITE_BYTE(Data);


//SPI 데이터가 수신되면

SPI1_WAIT_FOR_RX();

return SPI0_READ_BYTE();

}






인터럽트로 처리할 경우

extern RINGBUFFER gUartBuffer;


#pragma vector=USCI_A0_VECTOR

__interrupt void USCI_A0_ISR(void)

{    

    switch(__even_in_range(UCA0IV,0x08))

    {

      case 0: break; // Vector 0 - no interrupt

      case 2:  // Vector 2 - RXIFG


SetRingBuffer(&gUartBuffer, UCA0RXBUF);

        break;

      default:

        break;

    }

}



Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430_FRAM2013. 5. 17. 22:30

MSP430FR5739 EVM - eUSCI UART테스트

MSP430FR5739 EVM - eUSCI UART테스트

MSP430F5739는 eUSCI(enhanced universal serial communication interface) 라고 하는 통신 인터페이스가 적용되었다고 한다.

새로운 기능으로 추가되는것은 좋지만 기존 코드를 좀 쓸수 있었으면 좋겠는데... 레지스터명이나 기능들이 또 바뀌어 있다.

설계 할때 잘 해둘필요가 있는데... 아무튼 다시 한번 정리해 본다.


 

 

MSP430FR5739 UART 블록도



 

MSP430FR5739 UART 초기화 함수

// Serial Prot0 Utility Fuction Routine
void U0_Init(unsigned char baud)

  U0_SetBaud(baud);
 //set Baudrate
 //---------------------------------------------------------

    UCA0CTL1 |= UCSWRST;    


    // Configure UART pins
    P2SEL1 |= BIT0 + BIT1;
    P2SEL0 &= ~(BIT0 + BIT1);

 


    UCA0CTL1 = UCSSEL__SMCLK;                 // UCSSEL__SMCLK = 32768 as UCBRCLK

 

   UCA0CTL1 &= ~UCSWRST;

}


 

MSP430FR5739 UART 송수신 함수

#define u0_WaitForReceive()     while((UCA0IFG&UCRXIFG) == 0)
#define u0_RxData()        (UCA0RXBUF)

#define u0_TxData(Data)      (UCA0TXBUF = (Data))
#define u0_WaitForSend()     while (!(UCA0IFG&UCTXIFG));

#define u0_IsReceiveData()     (UCA0IFG&UCRXIFG)
#define u0_RXINT_EN()      (IE2 |= UCA0RXIE)  

 

unsigned char U0_GetByte(void)
{
 u0_WaitForReceive();
 return u0_RxData();
}

 

void U0_PutByte(unsigned char Data)
{
 u0_WaitForSend();
 u0_TxData(Data);
}

 


 

Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430_EVM2012. 12. 11. 12:25

[MSP430] Falsh Write - EEPOM 처럼 사용하기

[MSP430] Falsh Write - EEPOM 처럼 사용하기

 

MSP430은 EEPROM이 없고 대신 Flash 영역에 데이터를 저장할 수 있다. 실행 중에 Flash 영역에  저장할 수 있기 때문에 변경 될수 있는 설정 파라미터를 저장하기에 좋을것 같다.

 

#define _SEG_C_ADDR                     0x1040

 


void falsh_wrte(unsigned char *pBuf, int Size)
{
  char *Flash_ptr;                          // Flash pointer
  unsigned int i;

  Flash_ptr = (char *)_SEG_C_ADDR;              // Initialize Flash pointer
  FCTL2 = FWKEY + FSSEL0 + FN1;             // MCLK/3 for Flash Timing Generator
    
  FCTL1 = FWKEY + ERASE;                    // Set Erase bit
  FCTL3 = FWKEY;                            // Clear Lock bit
  *Flash_ptr = 0;                           // Dummy write to erase Flash segment

  FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation

  for (i=0; i<Size; i++)
  {
    *Flash_ptr++ = pBuf[i];                   // Write value to flash
  }

  FCTL1 = FWKEY;                            // Clear WRT bit
  FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
}

 

void flash_read(unsigned char *pBuf, int Size)
{
  char *Flash_ptrC;                         // Segment C pointer
  unsigned int i;

  Flash_ptrC = (char *)_SEG_C_ADDR;             // Initialize Flash segment C pointer

  for (i=0; i<Size; i++)
  {
    pBuf[i] = *Flash_ptrC++;          // copy value segment C to segment D
  }

}

Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430_AFE2012. 10. 29. 18:26

[MSP430AFE EVM] 24bit ADC테스트 - LCD에 ADC24 데이터 그래프 표시하기

[MSP430AFE EVM] 24bit ADC테스트 - LCD에 ADC24 데이터 그래프 표시하기

 

 

MSP430AFE2xx 의 가장 큰 특징은 24bit ADC를 내장하고 저전력, 저가격의 MCU이다.

ADC특징을 보면 아래와 같다.

 

Features of the SD24_A include
-Up to three 24-bit second-order ΣΔ ADC
- Differential inputs o Simultaneous sampling
- Oversampling of up to 1024
- Integrated Programmable Gain amplifier of gains up to 32
- Integrated temperature and voltage sensor
- Integrated accurate 1.2V ADC reference with 18ppm/ ºC

 

 

MSP430AFE253은 DIFF 3채널의 24bit ADC가 있다.

 

 

 

 

MSP430AFE2xx ADC24블록도

 

 

 

 

MSP430 ADC24 출력 포멧

24bit ADC 이지만 출력레지스터 SD24MEMx는 16비트 레지스트 이고 24bit를 읽기 위해서는 SD24CCTLx의 SD24LSBACC비트를 설정해 주어야 한다.

SD24LSBACC = 0 -> 상위 16비트

SD24LSBACC = 1 -> 하위 16비트

 

 

 

MSP430 AFE ADC24 초기화

    SD24CTL = SD24REFON+SD24SSEL0;            // 1.2V ref, SMCLK
    SD24CCTL0 |= SD24IE + SD24DF;            // CH0, enable interrupt

 

    for (i = 0; i < 0x3600; i++);             // Delay for 1.2V ref startup

 

 

 

ADC 인터럽트 처리 코드

24bit로 데이터 받으면 값이 좀 이상하다.(아무래도 오버샘플링으로 비트수를 늘이는것 같은데, 이부분은 좀더 들여다 봐야 할것 같다.)

우선 상위 16비트만을 이용해 처리하도록 했다.

 #pragma vector=SD24_VECTOR
__interrupt void SD24AISR(void)
{
  switch (SD24IV)
  {
  case 2:                                   // SD24MEM Overflow
    break;

 

  case 4:                                   // SD24MEM0 IFG

      //하위 16비트 데이터
      Sbi(SD24CCTL0, SD24LSBACC);
      adc_value = SD24MEM0;

 

      //상위 16비트 데이터

      Cbi(SD24CCTL0, SD24LSBACC);
      //adc_value = (SD24MEM0<<16) | adc_value;

      adc_value = (SD24MEM0);
    break;


  case 6: 


    break;
  case 8:                                   // SD24MEM2 IFG
                       // Save CH2 results (clears IFG)
    break;
  }

   __bic_SR_register_on_exit(LPM0_bits);    // Exit LPM0
}

 

 

 

 

 

MSP430AEF ADC24 테스트 동영상

24bit ADC A0, A1에 연결되 VR값을 TFT LCD에 출력하는 예제를 테스트 했다.

 

Posted by nexp

댓글을 달아 주세요