📄 from_hs.c
字号:
//***************************************************************************************************
// MSP430F149
// ______________________
// /|\| XT2IN|-
// | | | 4MHz
// --|RST XT2OUT|-
// | |
// sine_sig-->|P6.0/A0 XIN|-
// pulse_sig-->|P1.2/CCIA1 | 32768HZ
// | XOUT|-
// KEY1(>)-->|P1.5/TA0 |
// KEY1(F)-->|P1.6/TA1 P4.0/TB0|-->MCU_OUT
// KEY1(^)-->|P1.7/TA2 |
// | |
// DSP_nRST<-->|P2.0/ACLK P5.0 |<-->HD0
// nHINT<-->|P2.1/TAINCLK P5.1 |<-->HD1
// HCNTL0<-->|P3.0 P5.2 |<-->HD2
// HCNTL1<-->|P3.1 P5.3 |<-->HD3
// HR/~W <-->|P4.4 P5.4 |<-->HD4
// HDS<-->|P4.5 P5.5 |<-->HD5
// HBIL<-->|P3.2 P5.6 |<-->HD6
// HRDY<-->|P4.7 P5.7 |<-->HD7
// | |
// AVCC<--|VeREF+ P6.7/A7 |-->LCD_~CS
// | P6.6/A6 |-->LCD_~WR
// | P6.5/A5 |-->LCD_DATA
// | |
// | |
//******************************************************************************************************
/*******************************************************************************************************
Attention: The CPU is MSP430F149 [ACLK=32K, MCLK=XT/2=2MHz, SMCLK=XT/2=2MHz]
Function: When power-on, 430 calculate f through CAP(TA CCIA1). When f below 40Hz, FFT instead
of Pulse-in.
LCD display and pulse output.
Updated for IAR Embedded Workbench Version: 3.40
Author: XingJuan
latest changed: 2006.08.29
********************************************************************************************************/
#include <msp430x14x.h>
//#include "dspcode.h"
#include "Han_win.h"
#define VERSION 340
#define Delta_2M_32K 0x00FA /*Delta=250 2.048MHz*/
#define Rectangle_Windows 1 // Rectangle_Windows = 1
#define DSP_ENTRY 0x2000
#define DSP_MAXSIZE 0x5000 // max 0x6000(24k) bytes
char sysflag;//system flag
int delay;
// Pulse in-out
int cap_cnt = 0,number=50;
unsigned int Compare, newcapture,Oldcapture = 0,taflag=0;
float cap_n;
long int sum;
float cap[101];
float f = 0.0;
//lcd variable definition
int addr_buffer, buffer, count;
unsigned int view;
unsigned long int re2;
char asc[8];//整型数数对应的8位ASCII码数组
char dis_up[6];//上排显示寄存器
char dis_down[8];//下排显示寄存器
const char addr_up[6]={0x0F,0x11,0x13,0x15,0x17,0x19};
const char addr_down[8]={0x0A,0x08,0x06,0x04,0x02,0x00,0x1C,0x1E};
const char downseg[11]={0xEB,0x60,0xC7,0xE5,0x6C,0xAD,0xAF,0xE0,0xEF,0xED,0x00};
const char upseg[11]={0xD7,0x06,0xE3,0xA7,0x36,0xB5,0xF5,0x07,0xF7,0xB7,0x00};
//delay subprogram
void msdelay(int);//msdelay: 1ms * n
//initialization program
void MSP430Init(void);//系统初始化子程序
//display program
void Disp_Init(void);
void wrcommand(void); // 写命令
void wr_act(void); // 上升沿控制
void wrdata(void); // 写数据
void int_ascii(void); // 将整型数转化为用于显示的ASC
void updisp(void); // 液晶上排显示程序
void downdisp(void); // 下排液晶显示程序
//system subprogram
void Pulse_calculate(void);
void FFT_calculate(void);
void Output(float);
/*---------------------主程序启动-----------------------*/
void main(void)
{
WDTCTL=WDTPW+WDTHOLD; // STOP WDT
MSP430Init();
_EINT(); // 打开全局中断
while(1)
{
switch(sysflag)
{
case 1:
Pulse_calculate();
break;
case 2:
FFT_calculate();
break;
default:
break;
}
}
}
//---------------------system initialization----------------------------------
void MSP430Init(void)
{
int i;
/*-------------------------------Osc initialize-------------------------
Purpose:
ACLK <- XT1, DIVA =1
MCLK <- XT2, DIVM =2
SMCLK <- XT2, DIVS =2
Note: XT1=32768Hz, XT2 = 4MHz
----------------------------------------------------------------------------*/
IE1 =0x00; // disabel Oscillator fault interrupt
BCSCTL1=0x00; // set XT2ON
BCSCTL2=0x9A; // MCLK=SMCLK=4MHz/2=2MHz
// 等待时钟源转换完成
do{
IFG1 &= ~OFIFG;
for(i=0;i<100;i++); // delay 50uS
}while(IFG1&OFIFG); // 查OSCFault,为0时转换完成
/*---------------port initialize---------------*/
// P1IES &= 0x1F; // P1.5~P1.7 key input interrupt by L-H drop
// P1IE |= 0xE0; // enable interrupt
// P1IFG &= 0x1F; // clear interrupt flag
P2DIR = 0xFC; // P2.7:MCU_OUT output
// P2.0:DSPnRST, P2.1:nHINT(DSP向430申请中断) are input
P3DIR = 0xFF; // P3.0-3.7 unused
P3OUT = 0;
P4DIR = 0x7F; // P4.7 HRDY, P4.5 HDS, P4.4 HRnW
P4OUT = 0;
P5DIR = 0xFF; // HD0-HD7
P5OUT = 0;
P6DIR = 0xFE; // P6.5=DATA; P6.6=~WR; P6.7=~CS
// P6.0:vortex sine-signal input
/*---------------LCD initialize---------------*/
Disp_Init();
view=0;
int_ascii();
updisp();
downdisp();
/*---------------system variable initialize---------------*/
sysflag=1; // clear system flag
}
//************----------- Pulse_calculate-------------**********************
void Pulse_calculate(void)
{
P1SEL |= BIT2; // P1.2 option select
P1DIR = 0x1B; // P1.2 vortex pulse signal input
CCTL1 = CM_1 + CCIS_0 + CAP + CCIE; // Capture on rising edge, CCI1A, CAP
TACTL =TASSEL_2 + ID_2 + MC_2 + TACLR; // ACLK, Continuous mode, clear
while(1)
{
_BIS_SR(LPM0_bits); // Enter LPM0 w/ interrupt
while(taflag==1)
{
taflag=0;
cap_cnt=0;
sum=0;
for(int i=1;i<number+1;i++) // calculate average f
{
sum+=cap[i];
}
if(number>20)
{
sum=sum-cap[21]+cap[25];
}
cap_n=sum/number;
f = 500000/cap_n;
if(f>500)
{
number=100;
}
else if(f>300)
{
number=50;
}
else
{
number=20;
}
Output(f); // Pulse output
re2=(unsigned long int)(f * 1000);
view=re2; // LCD display frequency
int_ascii();
updisp();
CCTL1 = CM_1 + CCIS_0 + CAP + CCIE; // Capture on rising edge, CCI1A, CAP
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -