2011.01.18 21:42
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2010.11.28 02:01

#include  <msp430x44x.h>

static volatile unsigned int ADCresult;
static volatile unsigned long int DegC, DegF;

void main(void)
{
  volatile unsigned int i;
  WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer
  ADC12CTL0 = ADC12ON+REFON+REF2_5V+SHT0_6; // Setup ADC12, ref., sampling time
  ADC12CTL1 = SHP;                          // Use sampling timer
  ADC12MCTL0 = INCH_10+SREF_1;              // Select channel A10, Vref+
  ADC12IE = 0x01;                           // Enable ADC12IFG.0

  for (i=0; i<0x3600; i++)                  // Delay for reference start-up
  {
  }

  ADC12CTL0 |= ENC;                         // Enable conversions

  while(1)
  {
    ADC12CTL0 |= ADC12SC;                   // Start conversion
    _BIS_SR(LPM0_bits+GIE);                 // Enter LPM0, enable interrupts

    //  DegC = (Vsensor - 986mV)/3.55mV
    //  Vsensor = (Vref)(ADCresult)/4095)
    //  DegC -> ((ADCresult - 1615)*704)/4095
    DegC = ((((long)ADCresult-1615)*704)/4095);
    DegF = ((DegC * 9/5)+32);               // Calculate DegF
    _NOP();                                 // SET BREAKPOINT HERE
  }
}

__interrupt void ADC_ISR (void);
ADC12_ISR(ADC_ISR)
__interrupt void ADC_ISR (void)
{
  ADCresult = ADC12MEM0;                    // Move results, IFG is cleared
  _BIC_SR_IRQ(LPM0_bits);                   // Clear LPM0
}

MSP430F449에 TI에서 제공하는 위의 내용을 그대로 적용하였다.
물론 LCD에 적용해서 정상적인 동작하는 지 확인하였다.
정상 동작..
안정성 부분을 조금 더 확인 한 후에 기존 NTC104를 사용했던 부분을 제거 해도 될 듯 싶다.
잘못 사용하는 지 몰라도 104의 온도 오차 범위도 ± 2℃나 되니...

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2010.11.27 16:24

#include "MSP430X44X.H"      // Chip definitions for msp430F449.
#include <STRING.H>       // for some string functions.
#include <STDLIB.H>       // srand(), rand().

#define Pitch_do 125
#define Pitch_re 111
#define Pitch_mi 99
#define Pitch_fa 93
#define Pitch_sol 83
#define Pitch_ra 74
#define Pitch_si 66
#define Pitch_h_do 63

void Beep( unsigned int Pitch );
void DelayLoop( unsigned int awDelay );
void WordWriteDataToFlash( unsigned int* awpAddress, unsigned int awData );
void EraseDataFromFlash( unsigned int* awpAddress );
void CheckBusyFlash( void );

void main( void )
{
 _DINT();                                         // Diseable INT
 WDTCTL = WDTPW + WDTHOLD;   // Stop watchdog timer(better stop this fellow!)  
       
 P1SEL = 0x7C;       // Set I/O P1.0, P1.1, P1.7. 0111 1100
 P1DIR = 0x03;       // Set P1.0, P1.1 output and P1.7 input.

 P2SEL = 0x30;       // P2.4, P2.5는 UART로 P2.0 - P2.3까지 키스캔으로 사용.
 P2DIR = 0x10;       // P2.4 TX로 output사용 나머지는 input으로 사용.

 P3SEL = 0x00;       // P3 All port I/O.+
 P3DIR = 0xFF;       // P3 All port output.

 P4SEL = 0xFC;                                                   //1111 1100
 P4DIR = 0x03;                                                   //0000 0011

 P6SEL = 0x1F;          
       
 P3OUT = 0xFF;
 P1OUT = 0x00;


WordWriteDataToFlash( (unsigned int*) 0xB200, 0x01 );

if( 0x01 == *((unsigned int*) 0xB200))
{
    Beep(Pitch_do);
}
DelayLoop(10000);
}

if( 0x02 == *((unsigned int*) 0xB200))
{
    Beep(Pitch_sol);
}
DelayLoop(10000);
}

EraseDataFromFlash( (unsigned int*) 0xB200 );
if( 0x01 == *((unsigned int*) 0xB200))
{
    Beep(Pitch_si);
}

DelayLoop(10000);
}


void WordWriteDataToFlash( unsigned int* awpAddress, unsigned int awData )
{
// AllIntDisable();
  CheckBusyFlash();// while( FCTL3 == BUSY );   // Check Busy.
// BUSY                (0x0001)   Flash busy: 1  0000 0000 0000 0001
// FWKEY               (0xA500)   Flash key for write 1010 0101 0000 0000
// FSSEL1              (0x0080)   Flash clock select 1 0000 0000 1000 0000
// FN1                 (0x0002)    32*FN5 + 16*FN4 + 8*FN3 + 4*FN2 + 2*FN1 + FN0 + 1  0000 0000 0000 0010
// WRT                 (0x0040)   Enable bit for Flash write 0000 0000 0100 0000
  FCTL2 = FWKEY | FSSEL1 | FN1; // FN0일때SMCLK / 2.   FN1이면 SMCLK /3
  FCTL3 = FWKEY;     // Clear LOCK.
  FCTL1 = FWKEY | WRT;   // Enable Write.
 
  *awpAddress = awData;

// LOCK                (0x0010)   Lock bit: 1 - Flash is locked (read only) 0000 0000 0001 0000
// ERASE               (0x0002)   Enable bit for Flash segment erase 0000 0000 0000 0010

  CheckBusyFlash();
  FCTL1 = FWKEY;     // Clear WRT;
  FCTL3 = FWKEY | LOCK;   // Set LOCK.

// AllIntEnable();
}


void EraseDataFromFlash( unsigned int* awpAddress )
{
// AllIntDisable();
 CheckBusyFlash();
  FCTL2 = FWKEY | FSSEL1 | FN1; // FN0일때SMCLK / 2.   FN1이면 SMCLK /3
  FCTL3 = FWKEY;     // Clear LOCK.
  FCTL1 = FWKEY | ERASE;   // Enable Erase.
 
  *awpAddress = 0;
 
  CheckBusyFlash();
  FCTL3 = FWKEY | LOCK;   // Set LOCK.

// AllIntEnable();
}

void CheckBusyFlash( void )
{
 while( FCTL3 == BUSY );   // Check Busy.
}


void Beep( unsigned int Pitch )//P1.0 Buzzer, P1.1 OPAMP_EN
{
 volatile int viDummyCnt = 0;
 int iIndexIn, iIndexOut;

//        음높이 [pitch, 音高]  도 125, 레 111, 미 99, 파 93, 솔 83, 라 74, 시 66, 도 63
        for( iIndexOut = 0; iIndexOut < 500; iIndexOut++ )// 부저를 울리고 OpAmp Enable 비트를 같이 사용한다.//500은 음계 길이
 {
  P1OUT = 0x01;//BUZZER_OUT P1OUT #define BUZZER_PLAY 0x01, BUZZER_STOP 0x00, OPAMP_ENABLE 0x02
  for( iIndexIn = 0; iIndexIn < Pitch; iIndexIn++ )// BEEP_DELAY_NORMAL 22, BEEP_DELAY_SETUP 15
  {
   viDummyCnt++;
  }
  P1OUT = 0x00;
  for( iIndexIn = 0; iIndexIn < Pitch; iIndexIn++ )
  {
   viDummyCnt++;
  }
 }
}

void DelayLoop( unsigned int awDelay )
{
 volatile int viDelay;
 volatile int viDummy;
 
 for( viDelay = 0; viDelay < awDelay; viDelay++ )
 {
  viDummy = viDelay;
 }
}


 

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2010.11.06 22:31

#include "MSP430X44X.H"      // Chip definitions for msp430F449.
#include <STRING.H>       // for some string functions.
#include <STDLIB.H>       // srand(), rand().


#define Pitch_do 125
#define Pitch_re 111
#define Pitch_mi 99
#define Pitch_fa 93
#define Pitch_sol 83
#define Pitch_ra 74
#define Pitch_si 66
#define Pitch_h_do 63
//A3 옥타브 기준
/*
#define Pitch_do 63
#define Pitch_re 55
#define Pitch_mi 49
#define Pitch_fa 46
#define Pitch_sol 41
#define Pitch_ra 37
#define Pitch_si 33
#define Pitch_h_do 31
*/ //A4 옥타브 기준

//음높이 [pitch, 音高]  도 125, 레 111, 미 99, 파 93, 솔 83, 라 74, 시 66, 도 63

void Beep( unsigned int Pitch );
void DelayLoop( unsigned int awDelay );

void main( void )
{
 _DINT();                                         // Diseable INT
 WDTCTL = WDTPW + WDTHOLD;   // Stop watchdog timer(better stop this fellow!)  
       
 P1SEL = 0x7C;       // Set I/O P1.0, P1.1, P1.7. 0111 1100
 P1DIR = 0x03;       // Set P1.0, P1.1 output and P1.7 input.

 P1OUT = 0x00;
       
        for( ; ; )
        {
            Beep(Pitch_sol);
            DelayLoop(600);
            Beep(Pitch_sol);
            DelayLoop(600);
            Beep(Pitch_ra);
            DelayLoop(600);
            Beep(Pitch_ra);
            DelayLoop(600);
            Beep(Pitch_sol);
            DelayLoop(600);
            Beep(Pitch_sol);
            DelayLoop(600);
            Beep(Pitch_mi);
            DelayLoop(1000);
           
            Beep(Pitch_sol);
            DelayLoop(600);
            Beep(Pitch_mi);
            DelayLoop(600);
            Beep(Pitch_re);
            DelayLoop(600);
            Beep(Pitch_mi);
            DelayLoop(600);
            Beep(Pitch_do);
            DelayLoop(1000);

            Beep(Pitch_sol);
            DelayLoop(600);
            Beep(Pitch_sol);
            DelayLoop(600);
            Beep(Pitch_ra);
            DelayLoop(600);
            Beep(Pitch_ra);
            DelayLoop(600);
            Beep(Pitch_sol);
            DelayLoop(600);
            Beep(Pitch_sol);
            DelayLoop(600);
            Beep(Pitch_mi);
            DelayLoop(1000);
           
            Beep(Pitch_sol);
            DelayLoop(600);
            Beep(Pitch_sol);
            DelayLoop(600);
            Beep(Pitch_mi);
            DelayLoop(600);
            Beep(Pitch_mi);
            DelayLoop(600);
            Beep(Pitch_re);
            DelayLoop(1000);
          

            DelayLoop(10000);
        }

       
}


void Beep( unsigned int Pitch )//P1.0 Buzzer, P1.1 OPAMP_EN
{
 volatile int viDummyCnt = 0;
 int iIndexIn, iIndexOut;

//        음높이 [pitch, 音高]  도 125, 레 111, 미 99, 파 93, 솔 83, 라 74, 시 66, 도 63
        for( iIndexOut = 0; iIndexOut < 500; iIndexOut++ )//500은 음계 길이
 {
  P1OUT = 0x01;
  for( iIndexIn = 0; iIndexIn < Pitch; iIndexIn++ )// BEEP_DELAY_NORMAL 22, BEEP_DELAY_SETUP 15
  {
   viDummyCnt++;
  }
  P1OUT = 0x00;
  for( iIndexIn = 0; iIndexIn < Pitch; iIndexIn++ )
  {
   viDummyCnt++;
  }
 }
}

void DelayLoop( unsigned int awDelay )
{
 volatile int viDelay;
 volatile int viDummy;
 
 for( viDelay = 0; viDelay < awDelay; viDelay++ )
 {
  viDummy = viDelay;
 }
}

//X - tal32.768kHz
최적화나 프로그램 용량과 상관없이 대충의 시간만 계산하여 학교종이 땡땡땡을 만들었습니다.
음높이만 대충 맞추고 음 길이를 맞추지 않았기때문에 낮은음으로 갈수록 늘어지게 됩니다.
단음 중 부져가 낼 수 있는 최적화 주파수를 찾으려고 만들다 보니 하게 된 거라 실제 연주음으로 사용하려면 조금 더 다듬어야 합니다.

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

  1. 2011.11.14 19:27  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  2. 2011.11.14 19:28  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • 초보 HW 엔지니어 로망와니 2012.01.04 15:03 신고  댓글주소  수정/삭제

      PWM 같은 걸로 펄스폭 변조를 해서 구현할 수도 있지만 일단 IO 포트에 구현해서 부져를 동작 시켰습니다. 아마 동작을 하지 않았다면 그건 부져 회로 구현의 문제일 것으로 보입니다. 그리고 메일은 eroro@tistory.com 입니다.
      아니라면 MCU에 들어가는 클럭이 달라서 일 것으로 보입니다. 구동은 사실 PWM을 사용하는 게 편합니다.

  3. 2011.11.30 04:21  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • 초보 HW 엔지니어 로망와니 2012.01.04 15:02 신고  댓글주소  수정/삭제

      아마 네이버나 기타 검색사이트에서 보시면 아시겠지만 음의 높이는 주파수에 따라 달라집니다. 주파수가 높아지면 음이 높아지는 거죠. 그걸 MCU가 동작하는 클럭 주파수에 대입해서 주파수 계산을 하는거죠. 말씀하신대로 펄스 유지 딜레이와 연관이 있어서 그렇게 짜게 되었습니다.

2010.11.05 10:33
사용자 삽입 이미지

IAR Embeded Workbench IDE 사용중에 last line of file ends without a newline 에러가 발생했습니다.
S/W 엔지니어에게는 아주 초보적인 에러였겠지만, 저에게는 매우 치명적 에러.... 많은 시간을 허비후 맨 마지막 Line에 Blank Line을 넣어줌으로써 해결 할 수 있습니다. - _-;;
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요