wanpujame 发表于 2011-1-20 16:45:22

给大家发一个好玩的:MSP430 Launchpad(MSP430G2231)开发板控制 数显游标卡尺 ~*^_^*~

MSP430G2231控制数显游标卡尺,感兴趣的可以试一下哈~
这是原始出处:http://www.43oh.com/2010/12/interfacing-ti-launchpad-to-digital-caliper/

http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_612499BZ7KWW.jpg
(原文件名:1.jpg)

http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_612500OYGWAC.jpg
(原文件名:2.jpg)

http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_612501DTWHNG.png
(原文件名:3.png)

这是代码,供大家参考:
//*******************************************
// Running on Launchpad
//                MSP430G2231
//             ------------------
//         /|\|            XIN|-
//          | |               |
//          --|RST          XOUT|-
//            |               |
//    Vin+ -->|A1+ P1.2         |
//            |A1- = VSS    P1.0|-->LED
//            |             P1.1|-->TX RS232
//            |             P1.4|<--CLOCK CALIPER
//            |             P1.5|<--DATA CALIPER
//
// Maris Sprancisviltnieks@gmail.comhttp://robocombo.blogspot.com
//*******************************************
#include<msp430g2231.h>

int value = 0;                   // value received from caliper
unsigned char clock_active = 0;// any clock activity during last 32msec?
unsigned char ready_for_data = 0;// idle between clock burts, ready for next one
unsigned char bits_so_far = 0;   // current bit count during value "assembly"

// how many CPU cycles between bits
#define Bitime      104          //9600 Baud, SMCLK=1MHz (1MHz/9600)=104
unsigned char BitCnt;            // Bit count, used when transmitting byte
unsigned int TXByte;             // Value sent over UART when Transmit() is called

#define LED         BIT0         // LED on P1.0
#define TXPIN      BIT1          // RS232 TX on P1.1
#define CLOCK      BIT4          // Clock on P1.4
#define DATA      BIT5         // Data on P1.5

void Transmit(void);

void main(void)
{
   DCOCTL = 0x00;                // Safe Flow
   BCSCTL1 = CALBC1_1MHZ;      // run at 1Mhz
   DCOCTL = CALDCO_1MHZ;

   //WDT as 32 ms interval counter. If no action on clock withing 32msec,
   // we are ready to receive next "number"
   WDTCTL = WDT_MDLY_32;         // default timer 32 msec
   IE1 |= WDTIE;               // Enable WDT interrupt

   P1DIR |= LED;               // Set P1.0 to output direction
   P1OUT |= LED;               // LED ON, we'r ready
   P1SEL |= TXPIN;
   P1DIR |= TXPIN;               // Set P1.1 to output direction

   // Set up CLOCK input pin
   P1DIR &= ~CLOCK;      // sets input direction
   P1OUT |= CLOCK;         // pull-up is selected
   P1REN |= CLOCK;         // pull-up/pull-down enabled
   P1IES &= ~CLOCK;      // interupt triggered on low-to-high
   P1IFG &= ~CLOCK;      // reset interup flag to 0. needs to be reset on start
   P1IE |= CLOCK;          // interupt enabled for CLOCK

   // Set up DATA input pin
   P1DIR &= ~DATA;         // sets input direction
   P1OUT |= DATA;          // pull-up is selected
   P1REN |= DATA;          // pull-up/pull-down enabled
   P1IES &= ~DATA;         // interupt triggered on low-to-high
   P1IFG &= ~DATA;         // reset interup flag to 0. nneds to be reset on start
   P1IE &= ~DATA;          // interupt disabled for DATA

   // sending something over serial
   while (1)
   {
      __bis_SR_register(LPM0_bits + GIE);

      // after we went into low power mode, program counter is at this instruction
      // (next one after where you entered LPM), but it's not moving until you enable active mode
      // within main loop. That can be done with __bic_SR_register_on_exit(LPM0_bits) in ISR
      _NOP();

      // seding next value. value has been assambled by CLOCL interupt function
      // value is 16 bit, TXByte should be 8, sending in two parts
      TXByte = value >> 8;    // first byte (most significant bits)
      Transmit();
      TXByte = value & 0xFF;// second byte (least significant)
      Transmit();
      P1OUT ^= LED;         // blink LED
   }
}

// Function Transmits Character from TXByte
void Transmit()
{
   CCTL0 = OUT;               // TXD Idle as Mark
   TACTL = TASSEL_2 + MC_2;   // SMCLK, continuous mode

   BitCnt = 0xA;            // Load Bit counter, 8 bits + ST/SP
   CCR0 = TAR;

   CCR0 += Bitime;            // Set time till first bit
   TXByte |= 0x100;         // Add stop bit to TXByte (which is logical 1)
   TXByte = TXByte << 1;      // Add start bit (which is logical 0)

   CCTL0 =CCIS0 + OUTMOD0 + CCIE; // Set signal, intial value, enable interrupts
   while ( CCTL0 & CCIE );    // Wait for TX completion
   TACTL = TASSEL_2;          // SMCLK, timer off (for power consumption)
}

// Timer A0 interrupt service routine. Used to send bits over RS232
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
   CCR0 += Bitime;            // Add Offset to CCR0
   if ( BitCnt == 0)          // If all bits TXed, disable interrupt
      CCTL0 &= ~ CCIE;
   else
   {
      CCTL0 |=OUTMOD2;                  // TX Space
      if (TXByte & 0x01)
         CCTL0 &= ~ OUTMOD2;                // TX Mark
      TXByte = TXByte >> 1;
      BitCnt --;
   }
}

// Button is pressed
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
   static unsigned char port;

   port = P1IN; // read DATA port value as soon as possible (otherwise it might be gone)

   P1IFG &= ~CLOCK;         // Clear interrupt flag
   clock_active = 1;

   if (ready_for_data)
   {
      if (bits_so_far && bits_so_far <= 16){// first bit is start bit, ignore it. Total we have 24 bits. But we need only 16
         if (!(port & DATA))         // if 0 recived, invert = >1
            value |=0x8000;            // then set most significant bit
         value = value >> 1;         // and move it one right
      }else if (bits_so_far == 21){             // 21st bit indicates sighn (+/-)
         if (!(port & DATA))
            value = (~value)+1;               // make it negative
      }else   if (bits_so_far >= 23){         // we'r done, got all bits
         ready_for_data = 0;                  // warchdog timer will set it
         __bic_SR_register_on_exit(LPM0_bits);// wake up main from LPM sleep
      }
      bits_so_far++;
   }
}

// watchdog used as 30msec timer for detecting start of new bit burst on clock
#pragma vector=WDT_VECTOR
__interrupt void WDT_ISR(void)
{
   if (ready_for_data)
      return;

   if (clock_active){
      clock_active = 0;       // clear flag, will wait another 32msec to see if there have been any activity of clock
      ready_for_data = 0;   // not yet ready
   }else{
      ready_for_data = 1;   // nothing within last 32msec, ready for next clock burst
      value = 0;            // init of value
      bits_so_far = 0;      // init of bit counter
   }
}

Jigsaw 发表于 2011-1-20 17:18:05

这个板精密的部分应该不在测量电路吧

Tomas_Yung 发表于 2011-2-12 22:17:21

mark

DigiCat 发表于 2011-2-13 19:59:36

mark

GIKE 发表于 2011-4-21 00:47:42

好东西啊!

anxiangbo 发表于 2011-4-21 08:38:26

记号

qqqq_1111 发表于 2011-8-29 10:32:14

请问楼主,MSP430G2223这系列的单片机用什么软件烧写程序,在IAR编译软件里找不到MSP430G系列的芯片

xingkong911 发表于 2011-8-30 09:59:29

回复【6楼】qqqq_1111
请问楼主,msp430g2223这系列的单片机用什么软件烧写程序,在iar编译软件里找不到msp430g系列的芯片
-----------------------------------------------------------------------

楼上用的是什么版本的IAR,现在5.3版本里面能找到G系列的

fullsky 发表于 2011-8-31 13:59:46

不错不错,真是厉害!

skyskyfox 发表于 2011-9-7 09:10:08

很实用的东东,
   是不是要上拉一下

tuzihog520 发表于 2011-9-10 18:21:22

很好的东西啊!
但是原来的数显游标卡尺是什么器件来控制LCD显示的?
小弟菜鸟一个,弱弱问下~~

A627074365 发表于 2011-9-15 11:05:41

好厉害呀

zjcxsys 发表于 2011-9-15 20:02:05

good

Pioneermcu 发表于 2011-9-21 10:06:11

cool ,支持一下,NICE

DigiCat 发表于 2011-9-21 10:26:25

谁 有 一般数显卡尺的数据协议和规范呢

vtte 发表于 2011-9-21 10:27:01

没看明白,到时是做什么用?是卡尺的数据输入到单片机还是用单片机来控制游标卡尺的显示?

au_business 发表于 2011-9-25 20:17:47

mark

137703056 发表于 2011-9-25 22:09:00

mark

sensiiveplant 发表于 2011-9-25 22:39:31

有想法。

packer 发表于 2011-9-25 23:43:04

回复【15楼】vtte
-----------------------------------------------------------------------

数显卡尺带数据输出。
点击此处下载 ourdev_679665KSPPL0.pdf(文件大小:485K) (原文件名:数显卡尺接口.pdf)

w_wei0817 发表于 2011-9-28 10:49:17

mark

xymyan 发表于 2011-9-29 15:12:38

mark

lxb007 发表于 2011-11-11 12:35:24

回复【7楼】xingkong911
-----------------------------------------------------------------------
请问一下,我安装的是IAR 5.20,么哟找到MSP430G2203,头文件也没有这款单片机的,这几天要做一个相关的项目,怎么写程序和把程序烧进去啊?

wanpujame 发表于 2011-11-11 14:20:13

回复【23楼】lxb007
-----------------------------------------------------------------------

IAR 5.20不支持MSP430G2203,去IAR官网下载最新的IAR 5.30版本。

lianwaziq 发表于 2011-11-12 20:35:18

楼主厉害,谢谢!!!

mac8188 发表于 2011-12-3 16:05:36

这个是个好东西呀!

hnsfdxtanghao 发表于 2012-7-11 12:58:00

nice……

机器人天空 发表于 2014-3-9 22:02:24

mark......

流浪人 发表于 2014-3-9 22:08:15

好玩啊 ,楼主厉害

mydepc3721 发表于 2014-3-13 11:52:46

有没有硬件电路可以共享的啊,,非常需要啊

mydepc3721 发表于 2014-3-13 11:53:06

有没有硬件电路可以共享的啊,,非常需要啊

mydepc3721 发表于 2014-3-13 11:53:50

有没有硬件电路可以共享的啊,,非常需要啊

edkaifa 发表于 2014-3-22 15:21:09

数显用的什么传感器呢?
页: [1]
查看完整版本: 给大家发一个好玩的:MSP430 Launchpad(MSP430G2231)开发板控制 数显游标卡尺 ~*^_^*~