搜索
bottom↓
回复: 33

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

[复制链接]

出0入0汤圆

发表于 2011-1-20 16:45:22 | 显示全部楼层 |阅读模式
MSP430G2231控制数显游标卡尺,感兴趣的可以试一下哈~
这是原始出处:http://www.43oh.com/2010/12/interfacing-ti-launchpad-to-digital-caliper/


(原文件名:1.jpg)


(原文件名:2.jpg)


(原文件名: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 Sprancis  viltnieks@gmail.com  http://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
   }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入0汤圆

发表于 2011-1-20 17:18:05 | 显示全部楼层
这个板精密的部分应该不在测量电路吧

出0入0汤圆

发表于 2011-2-12 22:17:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-13 19:59:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-21 00:47:42 | 显示全部楼层
好东西啊!

出0入0汤圆

发表于 2011-4-21 08:38:26 | 显示全部楼层
记号

出0入0汤圆

发表于 2011-8-29 10:32:14 | 显示全部楼层
请问楼主,MSP430G2223这系列的单片机用什么软件烧写程序,在IAR编译软件里找不到MSP430G系列的芯片

出0入0汤圆

发表于 2011-8-30 09:59:29 | 显示全部楼层
回复【6楼】qqqq_1111
请问楼主,msp430g2223这系列的单片机用什么软件烧写程序,在iar编译软件里找不到msp430g系列的芯片
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-8-31 13:59:46 | 显示全部楼层
不错不错,真是厉害!

出0入0汤圆

发表于 2011-9-7 09:10:08 | 显示全部楼层
很实用的东东,
   是不是要上拉一下

出0入0汤圆

发表于 2011-9-10 18:21:22 | 显示全部楼层
很好的东西啊!
但是原来的数显游标卡尺是什么器件来控制LCD显示的?
小弟菜鸟一个,弱弱问下~~

出0入0汤圆

发表于 2011-9-15 11:05:41 | 显示全部楼层
好厉害呀

出0入0汤圆

发表于 2011-9-15 20:02:05 | 显示全部楼层
good

出0入0汤圆

发表于 2011-9-21 10:06:11 | 显示全部楼层
cool ,支持一下,NICE

出0入0汤圆

发表于 2011-9-21 10:26:25 | 显示全部楼层
谁 有 一般数显卡尺的数据协议和规范呢

出0入33汤圆

发表于 2011-9-21 10:27:01 | 显示全部楼层
没看明白,到时是做什么用?是卡尺的数据输入到单片机还是用单片机来控制游标卡尺的显示?

出0入0汤圆

发表于 2011-9-25 20:17:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-25 22:09:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-25 22:39:31 | 显示全部楼层
有想法。

出0入0汤圆

发表于 2011-9-25 23:43:04 | 显示全部楼层
回复【15楼】vtte
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-9-28 10:49:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-29 15:12:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-11 12:35:24 | 显示全部楼层
回复【7楼】xingkong911
-----------------------------------------------------------------------
请问一下,我安装的是IAR 5.20,么哟找到MSP430G2203,头文件也没有这款单片机的,这几天要做一个相关的项目,怎么写程序和把程序烧进去啊?

出0入0汤圆

 楼主| 发表于 2011-11-11 14:20:13 | 显示全部楼层
回复【23楼】lxb007
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-11-12 20:35:18 | 显示全部楼层
楼主厉害,谢谢!!!

出0入0汤圆

发表于 2011-12-3 16:05:36 | 显示全部楼层
这个是个好东西呀!

出0入0汤圆

发表于 2012-7-11 12:58:00 | 显示全部楼层
nice……

出0入0汤圆

发表于 2014-3-9 22:02:24 | 显示全部楼层
mark......

出0入0汤圆

发表于 2014-3-9 22:08:15 | 显示全部楼层
好玩啊 ,楼主厉害

出0入0汤圆

发表于 2014-3-13 11:52:46 | 显示全部楼层
有没有硬件电路可以共享的啊,,非常需要啊

出0入0汤圆

发表于 2014-3-13 11:53:06 | 显示全部楼层
有没有硬件电路可以共享的啊,,非常需要啊

出0入0汤圆

发表于 2014-3-13 11:53:50 | 显示全部楼层
有没有硬件电路可以共享的啊,,非常需要啊

出0入0汤圆

发表于 2014-3-22 15:21:09 | 显示全部楼层
数显用的什么传感器呢?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-19 15:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表