工具/软件:Code Composer Studio
您好!
这是我下面的代码、我有一个问题、我不知道如何解决、plz 帮我解决。
问题是系统将更改我的变量。
如何解决? 我可以声明 RAM 区域吗? 我能不能使用 MSP430的寄存器、例如 R15、R14……
代码尚未完成。
我的代码:
//
//*用于控制 Panasonic Minas、获取 loadcell 值和位置信息*
//*模式1通过 UART (BR=9600)、*与 PC 一起工作
//* PC control FSA325和 FSA325 control Minas *
//*
///*-------------------------------------------------------- *
//*|<模式1 >------------------------------------------ |*
//*||<模式1 >-------- ||*
//*|--- |--- 正弦脉冲--- |--- ||||*
//*||||| |=========== >|驱动程序|=>||Panasonic ||||*
//*||||| |--- || Minas ||||*
//*||| UART |||||| ||||*
//*|||模式/信息||||---- ||||*
//*|| PC |=== || FSA325 |位置信息||计数器|||||*
//*|||运行/停止||||================================ |||||| |*
//*||||| | loadcell value |-------- ||||*
//*||| loadcell ||||================================ || loadcell ||||*
//*|||<==== |||||| ||||*
//*|--- 位置|--- |--- ||||*
//*||--- ||*
//*|---------------------------------- |*
///*-------------------------------------------------------- *
//
#include "msp430f4152.h"
#include "interface.h"
#define kP1 1.
define kP2 2.
#define kP3 3.
#define kP4 4.
#define kP5 5.
#define kP6 6.
#define EE2464Address 0x50
#define Command_UP 0x10
#define Command_DOWN 0x11
#define Command_Zero 0x12
#define Command_ORIGINAL 0x15
#define Command_Jog 0x18
#define Command_SET_POSITION 0x19
#define Command_UP_DOWN 0x1A
#define Command_Stop 0x00
#define TXD_OK 0x00
//typedef unsigned char u8t;
//typedef unsigned short u16t;
unsigned int Loadcell_value;//测量 loadcell 的计数
unsigned int flash_state;//检查闪存中的数据是否可用
unsigned int lcd_page;//1=PC master
unsigned int TX_LOOP;
unsigned int RX_LOOP;
无符号短整型 TX_DATA[100];
无符号短整型 RX_DATA[100];
unsigned short operation_command;
无符号短整型 RX_FLAG;
无符号短整型 PULSE_STAT;
签署的长期立场;
空蜂鸣音(int beep time_time);
空延迟(int time);//10ms
//*******
//*计时器*
//*******
void Timer_set (void);
//*****
//* UART *
//*****
void TX_DATA_Transform (void);
void RX_DATA_OPERATION (void);
void SET_UART (void);
//********
//*电机*
//********
void Minas 操作(无符号短接模式);//0=stop 1=up 2=down
//********
//* loadcell *
//********
void value_Loadcell (void);//get value loadcell
//*******
//* FLASH *
//*******
void Check_initialize (void);
void get_flash_value (void);
void Save_flash_value (void);
/*****
//* LCD *
/*****
void inited_lcd (void);
void LCD_POS (unsigned char LCD_X、unsigned char LCD_Y);
void Write_Command (unsigned char 命令);
空忙(空);
void databus (unsigned char Data);
void Write_Data (无符号字符数据);
void LCD_Page_choose (unsigned int Page);
void LCD_Page1 (void);//PC 主设备
//********
//*键盘操作*
//********
void KeyOP (void);
无符号字符键盘(void);
void main (void)
{
WDTCTL = WDTPW + WDTHOLD;//停止 WDT
//********
//*初始化*
//********
check_initialize();//get flash data and check if loadin default value (检查是否以默认值加载)
inition_lcd();
//================================
蜂鸣音(1);
//*********
//*主循环*
//*********
while (1)
{
KeyOP();
value_Loadcell();
LCD_Page_Choose (LCD_Page);
开关(LCD_Page)
{
案例1://PC 主设备
if (RX_FLAG = 0)
RX_DATA_OPERAT();
中断;
}
}
}
空 Timer_set (空)
{
//设置定时器0
TA0CCTL0 = CCIE;// CCR0中断被启用
TA0CCR0 = 300;
TA0CTL = MC_0;// SMCLK、停止、清除 TAR
_bis_SR_register (GIE);
//设置定时器1
TA1CTL = tassel_0 + MC_2 + TACLR;//TACLK、向上计数模式、清除 TAR
}
void RX_DATA_OPERATION (void)
{
无符号短循环;
operation_command=RX_data[1];
switch (operation_command)//command
{
案例 Command_Stop:
Minas 操作(0);
中断;
案例 Command_Up:
Minas 操作(1);
中断;
案例 Command_Down:
Minas 操作(2);
中断;
案例 Command_Zero:
中断;
案例 Command_Original:
中断;
案例 Command_Jog:
中断;
案例 Command_SET_POSITION:
中断;
案例 Command_UP_DOWN:
中断;
}
//*******
//*重置标志和数据*
//*******
RX_LOOP=0;
RX_FLAG=1;
for (loop=0;loop<100;loop++)
{
RX_DATA[LOOP]=0;
}
TX_DATA_Transform ();
}
void TX_DATA_Transform (void)
{
switch (operation_command)
{
案例 Command_Up:
案例 Command_Down:
TX_DATA[0]= 0x03;
TX_DATA[1]= OPERATION_COMMAND;
TX_DATA[2]= TXD_OK;
中断;
案例 Command_Zero:
中断;
案例 Command_Original:
中断;
案例 Command_Jog:
中断;
案例 Command_SET_POSITION:
中断;
案例 Command_UP_DOWN:
中断;
}
//*********
//* TX 操作*
//*********
TX_LOOP = 0;
IE2 |= UCA0TXIE;//启用 USCI_A0 TX 中断
//UCA0TXBUF = TX_DATA[0];
}
void Minas 操作(无符号短接模式)//0=stop 1=up 2=down
{
开关(模式)
{
情况0://stop
TA0CTL = tassel_2 + MC_0 + TACLR;//停止
中断;
案例1://up
P2OUT &=~符号;
TA0CTL = tassel_2 + MC_1 + TACLR;// SMCLK、停止、清除 TAR
中断;
案例2://down
P2OUT |=符号;
TA0CTL = tassel_2 + MC_1 + TACLR;// SMCLK、停止、清除 TAR
中断;
}
}
//***键盘***
//------ SNAP KP1 -> O <-自动 KP2
//| LCD |向上 KP3 -> O <-向下 KP4
//------ FUNC KP5 -> O <- Memo KP6
空键盘(空)
{
unsigned char temp;
temp=keypad();
如果(temp=kP1)//snap
{
蜂鸣音(1);
Minas 操作(0);
}
//==========================================================================================
if (temp=kP2)//auto
{
蜂鸣音(1);
Minas 操作(1);
}
//==========================================================================================
if ((temp=kP3)&&(LCD_Page=1))//up
{
蜂鸣音(1);
Minas 操作(2);
}
//==========================================================================================
if ((temp=kP4)&&(LCD_Page=1))//down
{
//蜂鸣音(1);
}
//==========================================================================================
if ((temp=kP5)&&(LCD_Page=1)//func
{
//蜂鸣音(1);
}
//==========================================================================================
if (temp=kP6)//备注
{
//蜂鸣音(1);
}
}
无符号字符键盘(void)
{
unsigned char keycode、temp;
volatile unsigned i、j;
对于(i=0;i<250;i++);
keycode=0;//重置键码
TEMP=~(P4IN)& 0x07;
如果(temp!=0)
{
开关(温度)
{
案例 PG1:
对于(i=0;i<130;i++);
TEMP=~(P4IN)& 0x07;
if (temp==PG1)
键码=kP1;
中断;
PG3案例:
对于(i=0;i<130;i++);
TEMP=~(P4IN)& 0x07;
if (temp==PG3)
keycode=kP3;
中断;
案例 PG2:
对于(i=0;i<130;i++);
TEMP=~(P4IN)& 0x07;
if (temp==PG2)
键码=kP2;
中断;
}
}
TEMP=~(P2IN)& 0XE0;
如果(temp!=0)
{
开关(温度)
{
PG4案例:
对于(i=0;i<130;i++);
TEMP=~(P2IN)& 0XE0;
if (temp==PG4)
keycode=kP4;
中断;
PG5案例:
对于(i=0;i<130;i++);
TEMP=~(P2IN)& 0XE0;
if (temp==PG5)
keycode=kp5;
中断;
PG6案例:
对于(i=0;i<130;i++);
TEMP=~(P2IN)& 0XE0;
if (temp==PG6)
键码=kP6;
中断;
}
}
返回密钥代码;
}
void LCD_Page_choose (无符号整页)
{
switch (页面)
{
案例1:
LCD_Page1 ();
中断;
}
}
void inited_lcd (void)
{
延迟(1);//10ms
WRITE_COMMAND (0x38);
延迟(1);//10ms
WRITE_COMMAND (0x01);//CLEAR
延迟(1);//10ms
WRITE_Command (0x0C);//显示打开,禁用光标
延迟(1);//10ms
WRITE_COMMAND (0x06);
WRITE_COMMAND (0x02);
P4DIR |= BL_EN;
P4OUT &=~BL_EN;//背光打开
}
void LCD_Page1 (void)//PC 主设备
{
无符号短循环0、循环1;//用于显示循环
无符号短环3、环4;
无符号短整型数据[10];
unsigned char table[4][16]={
//0 1
//0123456789012345
{"FVE MTR+Loadcell"}、
{" Loadcell:1024"}、
{"模式:PC 主机"}、
{""}
};
//*********
//*更改数据*
//*********
DATA[0]= Loadcell_value;
//loadcell
DATA[1]=DATA[0]%10;//1.
DATA[0]/=10;
DATA[2]=DATA[0]%10;//10
DATA[0]/=10;
data[3]=data[0]%10;//100
DATA[4]=DATA[0]/10;//1000
loop4=14;//字符数组
for (loop3=1;loop3<5;loop3++)// value 数组
{
开关(DATA[loop3])
{
情况0:
表[1][loop4]='0';
中断;
案例1:
表[1][loop4]='1';
中断;
案例2:
表[1][loop4]='2';
中断;
案例3:
表[1][loop4]='3';
中断;
案例4:
表[1][loop4]='4';
中断;
情况5:
表[1][loop4]='5';
中断;
案例6:
表[1][loop4]='6';
中断;
案例7:
表[1][loop4]='7';
中断;
案例8:
表[1][loop4]='8';
中断;
案例9:
表[1][loop4]='9';
中断;
默认值:
表[1][loop4]='-';
中断;
}
环4-;
}
//*******
//*清除无意义的0 *
//*******
if (table[1][11]='0')
{
表[1][11]=';
if (table[1][12]='0')
{
表[1][12]=';
if (table[1][13]='0')
表[1][13]=';
}
}
//========================================================================================
//Write_Command (0x01);//clear
//========================================================================================
for (loop0=0;loop0<4;loop0++)
{
LCD_POS ((loop0+1)、0);
for (loop1=0;loop1<16;loop1++)
{
WRITE_Data (table[loop0][loop1]);
}
}
}
空 Write_Data (无符号字符数据)
{
BUSY();
P1DIR |= RS+RW;
P7DIR |=启用;
P1OUT |= RS;
P1OUT &=~RW;
_NOP();
数据库(数据);
_NOP();
P7OUT |=启用;
_NOP();
_NOP();
_NOP();
P7OUT &=~使能;
P1OUT |= RW;
}
void LCD_POS (unsigned char LCD_X、unsigned char LCD_Y)
{
unsigned char pos;
如果(LCD_X=1)
LCD_X=0x80;
否则、如果(LCD_X==2)
LCD_X=0x90;
否则(LCD_X==3)
LCD_X=0x88;
如果(LCD_X==4)则为其他值
LCD_X=0x98;
POS=LCD_X+LCD_Y;
Write_Command (pos);
}
void Write_Command (无符号字符命令)
{
BUSY();
P1DIR |= RS+RW;
P7DIR |=启用;
P1OUT &=~Ω(RS+RW);
databus(命令);
_NOP();
_NOP();
P7OUT |=启用;
_NOP();
_NOP();
_NOP();
P7OUT &=~使能;
P1OUT |= RW;
}
空忙(空)
{
P5DIR &=~DB7;
P1DIR |= RS+RW;
P7DIR |=启用;
P1OUT &=~RS;
P1OUT |= RW;
P7OUT |=启用;
while (P5IN&DB7);//忙
P7OUT &=~使能;
}
空数据库(无符号字符数据)
{
unsigned char i;
unsigned char temp;
I=0;
对于(i=0;i<8;i++)
{
开关(I)
{
情况0:
P5DIR |=DB0;
TEME=0;
临时+=Data&0x01;
如果(temp&0x01)
P5OUT |= DB0;
其他
P5OUT &=~DB0;
中断;
案例1:
P5DIR |=DB1;
TEME=0;
临时+=Data&0x02;
如果(temp&0x02)
P5OUT |= DB1;
其他
P5OUT &=~DB1;
中断;
案例2:
P5DIR |=DB2;
TEME=0;
温度+=Data&0x04;
如果(temp&0x04)
P5OUT |= DB2;
其他
P5OUT &=~DB2;
中断;
案例3:
P5DIR |=DB3;
TEME=0;
温度+=Data&0x08;
IF (temp&0x08)
P5OUT |= DB3;
其他
P5OUT &=~DB3;
中断;
案例4:
P5DIR |=DB4;
TEME=0;
临时+=Data&0x10;
如果(temp&0x10)
P5OUT |= DB4;
其他
P5OUT &=~DB4;
中断;
情况5:
P5DIR |=DB5;
TEME=0;
临时+=Data&0x20;
如果(temp&0x20)
P5OUT |= DB5;
其他
P5OUT &=~DB5;
中断;
案例6:
P5DIR |=DB6;
TEME=0;
温度+=Data&0x40;
如果(temp&0x40)
P5OUT |= DB6;
其他
P5OUT &=~DB6;
中断;
案例7:
P5DIR |=DB7;
TEME=0;
临时+=Data&0x80;
如果(temp&0x80)
P5OUT |= DB7;
其他
P5OUT &=~DB7;
中断;
}
}
}
空蜂鸣音(int beep time_time)
{
volatile unsigned int i、j;
开关(哔声时间)
{
案例0://long beep
对于(j=0;j<600;j++)
{
P1OUT |= BZ;//蜂鸣器打开
for (i=0;i<15;i++);
P1OUT &=~BZ;//缓冲器关闭
for (i=0;i<15;i++);
}
中断;
默认值://beep 表示"beep time"时间
for (;beep_tim>0;beep_time--)
{
对于(j=0;j<200;j++)
{
P1OUT |= BZ;//蜂鸣器打开
for (i=0;i<15;i++);
P1OUT &=~BZ;//缓冲器关闭
for (i=0;i<15;i++);
}
对于(j=0;j<100;j++)
{
对于(i=0;i<48;i++);
对于(i=0;i<48;i++);
}
}
中断;
}
}
空延迟(int time)//10ms
{
int i、j;
int delay_time;
for (delay_time=0;delay_<time;Delay_time++)
{
for (i=0;i<50;i++)
{
for (j=0;j<30;j++)
{
_NOP();
}
}
}
}
空 Check_initialize (空)
{
unsigned short clear_loop;
//********
//*初始化*
//********
RX_FLAG=1;
RX_LOOP=0;
TX_LOOP=0;
Loadcell_value=0;
operation_command=0;
PULSE_STAT=0;
位置= 0;
for (clear_loop=0;clear_loop<100;clear_loop++)
{
RX_DATA[CLEAR_LOOP]=0;
TX_DATA[CLEAR_LOOP]=0;
}
get_flash_value ();
如果(flash_state!= 0xF0)//默认情况下、如果闪存中没有数据
{
LCD_Page=1;
save_flash_value();
}
Set_UART();
timer_set();
//***
//*设置 I/O *
//***
P1DIR |= BZ;//输出
P2DIR |=符号;
P3DIR |=脉冲;
P3SEL |=计数;
P6SEL |= RXD + TXD;//P6.5、6 = USCI_A0 RXD/TXD
}
void SET_UART (void)
{
volatile unsigned int i;
//********
//*设置 UART *
//********
FLL_CTL0 |= XCAP11PF;//配置负载电容
操作
{
IFG1 &=~OFIFG;//清除 OSCFault 标志
对于(I = 0x47FF;I > 0;I-);//设置标志的时间
}
while ((IFG1 & OFIFG));// OSCFault 标志仍然置1?
UCA0CTL1 |= UCSSEL_1;// CLK = ACLK
UCA0BR0 = 0x03;// 32k/9600 - 3.41
UCA0BR1 = 0x00;
UCA0MCTL = 0x06;//调制
UCA0CTL1 &=~UCSWRST;//**初始化 USCI 状态机**
IE2 |= UCA0RXIE;//启用 USCI_A0 RX 中断
_bis_SR_register (GIE);
}
void value_Loadcell (void)
{
int i;
unsigned long Temp_value;
TEMP_VALUE = 0;
for (i=0;i<1000;i++)
{
ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE;//ref 1.5v
//ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE + REF2_5V;//ref 2.5V
ADC10CTL1 = INCH_4;//设置 ADC 端口 A4。
ADC10CTL0 |= ENC + ADC10SC;//采样和转换开始
temp_value += ADC10MEM;//get value from loadcell
ADC10CTL0 &=~ENC;
}
TEMP_VALUE /= 1000;
Loadcell_value = Temp_value;//获取 loadcell 的平均值
}
void get_flash_value (void)
{
unsigned int * Flash_ptr1;//check 初始化
unsigned int * Flash_ptr2;//系统
flash_ptr1=(unsigned int *) 0x1000;
flash_ptr2=(unsigned int *) 0x1001;
flash_state=*Flash_ptr1++;
LCD_Page=*Flash_ptr2++;
}
void Save_flash_value (void)
{
unsigned int * Flash_ptr1;//check 初始化
unsigned int * Flash_ptr2;//系统
flash_ptr1=(unsigned int *) 0x1000;
flash_ptr2=(unsigned int *) 0x1001;
FCTL1 = FWKEY + ERASE;//启用闪存中的擦除数据
FCTL3 = FWKEY;//解锁闪存
*Flash_ptr1=0;//擦除闪存数据
*Flash_ptr2=0;
FCTL1=FWKEY + WRT;//使能写入闪存中的数据
//********
//*将数据写入地址集的闪存*
//********
*Flash_ptr2+=LCD_Page;
*闪存_ptr1+=0xF0;
FCTL1=FWKEY;
FCTL3=FWKEY + LOCK;//锁定闪存
}
//*********
//* ADC10中断服务例程*
//*********
#pragma vector=ADC10_vector
_interrupt void ADC10_ISR (void)
{
_BIC_SR_REGISTER_ON_EXIT (CPUOFF);//从0 (SR)清除 CPUOFF 位
}
//
//* TXD 中断服务例程和 I2C 中断服务例程*
//
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=USCIAB0TX_vector
_interrupt void USCI0TX_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCIAB0TX_vector)) USCI0TX_ISR (void)
其他
错误编译器不受支持!
#endif
{
UCA0TXBUF = TX_DATA[TX_LOOP++];// TX 下一个字符
如果(TX_LOOP = TX_DATA[0])// TX over?
IE2 &=~UCA0TXIE;//禁用 USCI_A0 TX 中断
}
//*********
//* RXD 中断服务例程*
//*********
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=USCIAB0RX_vector
_interrupt void USCI0RX_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCIAB0RX_vector)) USCI0RX_ISR (void)
其他
错误编译器不受支持!
#endif
{
无符号短循环;
//*********
//* RXD 数据模式:length+command+data+...+0x00 *
//*********
//********
//*获取长度*
//********
if (RX_LOOP=0)
RX_DATA[0]= UCA0RXBUF;
//********
//*获取数据*
//********
if (RX_LOOP>=(RX_DATA[0]-1))//RXD
{
RX_FLAG=0;
}
RX_DATA[RX_LOOP]=UCA0RXBUF;
RX_LOOP++;
//*********
//*错误检查*
//*避免挤压*
//*或卡在 RXD 中断例程中*
//*********
如果(RX_FLAG=0)//当 RXD 翻转时、检查数据是否正确
{
if ((RX_DATA[RX_DATA[0]-1]!=0x00)||(LCD_Page!=1))//检查数据和模式
{//如果错误、清除数据和复位标志
RX_FLAG=1;
RX_LOOP=0;
for (loop=0;loop<100;loop++)
RX_DATA[LOOP]=0;
}
}
}
//计时器 A0中断服务例程
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=TIMER0_A0_VECTOR
_interrupt void Timer_A (void)
#Elif defined (_GNU_)
void __attribute__((interrupt (TIMER0_A0_vector)) Timer_A (void)
其他
错误编译器不受支持!
#endif
{
if (pulpulate_stat=0)
{
P3OUT &=~μ s 脉冲;
PULSE_STAT=1;
}
其他
{
P3OUT |=脉冲;
PULSE_STAT=0;
}
}
我的标题:
#ifndef interface_h_
#define interface_h_
//端口1
//#define P1_0 0x01
//#define P1_1 0x02
//#define P1_2 0x04
#define BZ 0x08
#define CS1 0x10 //LCD CS1
#define CS2 0x20 //LCD CS2
#define RS 0x40 //LCD DI
#define RW 0x80 //LCD RW
//端口2
#define 符号0x01
#define Ex4 0x02
#define EX3 0x04
#define Ex2 0x08
#define Ex1 0x10
#define PG6 0x20
#define PG5 0x40
#define PG4 0x80
//端口3
#define 复位0x01
#define SEL 0x02
#define P3_2 0x04
#define Count 0x08
#define Ex9 0x10
#define EX8 0x20
#define EX7 0x40
#define PULSE 0x80
//端口4
#define PG3 0x01
#define PG2 0x02
#define PG1 0x04
#define BL_EN 0x08
//#define P4_4 0x10
#define 踏板0x20
#define AC 0x40
#define DIRECTION 0x80
//端口5
#define DB0 0x01
#define DB1 0x02
#define DB2 0x04
#define DB3 0x08
#define DB4 0x10
#define DB5 0x20
#define DB6 0x40
#define DB7 0x80
//端口6
#define OV 0x01
#define SCL 0x02
#define SDA 0x04
#define OP_EN 0x08
#define Loadcell 0x10
#define RXD 0x20
#define TXD 0x40
//#define P6_7 0x80
#define I2C_PORT_SEL P6SEL
#define I2C_PORT_OUT P6OUT
#define I2C_PORT_REN P6REN
#define I2C_PORT_DIR P6DIR
#define SDA_PIN BIT2 // UCB0SDA 引脚
#define SCL_PIN BIT1 // UCB.S 引脚
#define SCL_CLOCK _DIV 0x12 // SCL 时钟偏差
//端口7
//#define P7_0 0x01
//#define P7_1 0x02
//#define P7_2 0x04
//#define P7_3 0x08
#define OC 0x10
//#define P7_5 0x20
#define 启用0x40
//#define P7_7 0x80
#endif /* interface_h_*/