EDN首页   博客首页

最新日志

发表于:2008-9-4 9:53:48
标签:无标签

2

PIC第三方编译软件CCS PCWH使用心得(3)

  常量数组调用方法:CCS PCWH环境下对常量数组进行操作与其他C语言有所不同,对于单一数组操作也很简单不会遇到太多问题,但如果要作为参量来调用麻烦就来了,不注意还真不知道怎么使用。我的一个友人在用做CCS PCWHLCD显示程序时,便遇到了不小的麻烦。
  比如,定义一数组,通常定义为:
BYTE CONST TABLE[10]= {9,8,7,6,5,4,3,2,1,0};
对其直接可行的操作为x = TABLE[i]或者x = TABLE[5],但是想将TABLE作为参量方式在另一个函数中调用,一般思路为:定义函数
void disp_bmp(unsigned char *dptr)
{
 unsigned char TEMP;
 ...
  TEMP = *dptr;
  ...
}
调用时:disp_bmp(TABLE)。很不幸,行不通!
  随即很多.......
    disp_bmp(&TABLE[i]);
    disp_bmp(&TABLE[0]);
    .......
    或者是HELP文件描述的方法:
  The syntax is:
  const type id[cexpr] = {value}
    For example:
    Placing data into ROM
    const int table[16]={0,1,2...15}
    Placing a string into ROM
    const char cstring[6]={"hello"}
    Creating pointers to constants
    const char *cptr;
    cptr = string;

  或者改变数组定义方式:
  The syntax is:
  #rom address = {data, data, … , data}
  For example:
  Places 1,2,3,4 to ROM addresses starting at 0x1000
  #rom 0x1000 = {1, 2, 3, 4}
  Places null terminated string in ROM
  #rom 0x1000={"hello"}
  This method can only be used to initialize the program memory.

  这些方法都不能正确取得数据,原因在于无法建立一个正确的常量指针,最终取数都指向了RAM,而非ROM中。
  有一种方法,在HELP文件中有所描述:
  READ_PROGRAM_MEMORY (address, dataptr, count );
  Parameters:
   address is 32 bits . 
   dataptr is a pointer to one or more bytes.
   count is a 16 bit integer
  因此上述程序改为:
  void disp_bmp(unsigned int32 dptr)
    {
      unsigned char TEMP[2];
      ...
      READ_PROGRAM_MEMORY (dptr, TEMP, 1);
      ...
    }
    调用disp_bmp(TABLE)即可。但是对于下面几种情况仍将会产生错误调用:
  void disp_bmp(unsigned int32 dptr)
    {
      unsigned char TEMP;
      ...
      READ_PROGRAM_MEMORY (dptr, TEMP, 1);
      ...
    }
    或者是:
  void disp_bmp(unsigned int32 dptr)
    {
      unsigned char *TEMP;
      ...
      READ_PROGRAM_MEMORY (dptr, *TEMP, 1);
      ...
    }
  

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(125)
发表于:2008-9-2 14:42:36
标签:无标签

2

感恩

  做设计难免不碰到问题,以前碰到问题总是习惯性的在网上寻找答案,这对我帮助很大,感谢网络上那些无私的帮助者。如今自己做设计也有那么几年了,也应该为网络做点什么,逐步把自己做设计遇到的问题及解决方法写在BLOG上,给那些需要的朋友吧,也给自己留个底吧!虽然没有进行深入的原理分析,也希望对刚起步的朋友门一点启发吧!愿朋友在设计的道路上一起成长!!!!

系统分类: 自由话题   |    用户分类:    |    来源: 原创

评论(0) | 阅读(125)
发表于:2008-9-2 14:29:57
标签:无标签

2

PIC第三方编译软件CCS PCWH使用心得(2)

  CCS PCWH也是很好用的,在刚接触PIC的时候就一直使用它了,方便在于编译器把很多硬件的东西都写成了函数,便于调用,降低了开发者对硬件熟悉程度的要求,正是这样也给调试软件找BUG带来了一定的难度。  
  1)比如说用timer1定时方式产生占空比50%的方波吧,以前PIC16,PIC18系列对定时器配置程序简单的两句话就完成
 setup_timer1(T1_INTERNAL|T1_DIV_BY_8); //sets the internal clock as source
    set_timer1(0x8000);
    换成PIC30做开发了,认为移植程序起来很方便,没想却在定时器这儿出了问题,按上面的程序无论怎么改变set_timer1()函数调用的参数,都无法改变定时值,出来都是同一方波,得不到上述的结果。对PIC30的定时器硬件分析发现PIC30的定时器中断方式与PIC18等有所不同,PIC18是溢出中断,而PIC30是比较中断,这就是症结所在。继续研读CCS帮助手册,将程序改为以下后OK:
    setup_timer1(TMR_INTERNAL | TMR_DIV_BY_256 , 0x8000);
    set_timer1(0);
    看上去很相试的程序,意思却不一样。
  分析:
  setup_timer1(T1_INTERNAL|T1_DIV_BY_8)若用在PIC30使用,实质上只对定时器进行了配置,恰恰没有对定时器的RP1寄存器设置,默认为0xFFFF;而set_timer1(0x8000)前者是设定初始值,而后者在PIC30实质是复位定时器。
    2)比如说用timer2和timer3组成32BIT定时器使用,有了上述经验,做起来便容易了。
   // timer 2,3 initialization
   setup_timer2(TMR_INTERNAL | TMR_DIV_BY_256 | TMR_32_BIT, 0x00112233);
   set_timer23(0);
   心想这样配置应该没问题了,timer2也设置成32bit了,也对RP寄存器设置了值,但运行程序得到的结果并不是想要的。最终没法将LIST文件掉出来分析才发现setup_timer2(TMR_INTERNAL | TMR_DIV_BY_256 | TMR_32_BIT, 0x00112233)在配置时只针对timer2进行了设置,对于timer3什么也没做,而0x00112233的高16bit也就没有写入timer3的RP寄存器,我纳闷32BIT的数写到16BIT的寄存器,编译器怎么不报错呢。最终程序改为了:
   // timer 2,3 initialization
   setup_timer2(TMR_INTERNAL | TMR_DIV_BY_256 | TMR_32_BIT, 0x2233);
  setup_timer3(TMR_INTERNAL, 0x0011);
   set_timer23(0);

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(453)
发表于:2008-9-1 9:27:22
标签:无标签

1

PIC第三方编译软件CCS PCWH使用心得(1)

  对于PIC单片机的第三方编译软件CCS PCWH,估计在国内使用的很少吧!PIC的技术支持对这个编译软件也不熟悉吧,我一直在这个环境下做开发。做PIC的程序都不怎么用仿真了,这个编译器也可以嵌入到MPLAB IDE里面开发和使用ICD2仿真的。把我的一些小经验和大家分享一下吧!
  用PIC30系列的片子做了一个400HZ的中频电源,测试时发现输出的正弦波在抖动,频率倒是很稳,幅值在变化,导致了正弦波的抖动,而此时在软件里面是没有加入闭环调节这一流程的。由于没有仿真的原因,只能通过修改程序的方法来判断故障原因。最终我发现是运算出错,而导致给定PWM占空比的参数发生了错误,以至于发生正弦波的抖动。反复检查了程序,确认没有软件BUG后,我意识到是编译器在编译时未在中断处理程序对器件的状态寄存器保护。于是查阅了硬件资料,加入了保护,再测试,输出波形稳定了,一切OK。这个编译环境其实已经用了很久了,一直做开发都没遇到过这种问题。
  写了这么多其实就想说一点:CCS PCWH这个编译环境在编译中断程序时没有对器件的状态寄存器等进行保护。其实这个也不算什么经验吧,在一个编译环境做开发,对编译环境的熟悉程度是非常重要的。

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(199)
发表于:2008-8-28 9:12:14
标签:无标签

1

IAR C编译环境下数据转换的新方法

在进行C语言程序设计,常常需要进行数据转换,例如将4个8BIT的数据组合成1个32BIT,或者将32BIT的数据拆分成4个8BIT的数据。在汇编语言这些都很简单,在C语言中常用到的方法是移位,加,乘等方法。在IAR EW430编译环境下,用MSP430作低功耗设计,在数据转换时能否象汇编一样轻松呢,节省指令条数来提高系统运行效率进一步节省功耗,能否象汇编一样来完成数据转换,节省指令运行周期,我采取了如下的方法:
1)4个8BIT组合成32BIT:
  unsigned char temp0[4];
  unsigned long int temp;

  temp0[3] = varHigh;
  temp0[2] = varHighM;
  temp0[1] = varLowM;
  temp0[0] = varLow;
 
  temp = *(unsigned long int *)temp0;

2)32BIT拆分成4个8BIT:
   unsigned char mathData[4];
   unsigned long int var;
  
   *(unsigned long int *)mathData = var;  

但上面的方法有一定的局限性,当变量存放在RAM中,地址为奇数时会发生转换错误,
如:若mathData 存放地址为奇数
    mathData[0] = 0x11;
    mathData[1] = 0x22;
    mathData[2] = 0x33;
    mathData[3] = 0x44;
则转换结果 var = 0x33221100,当变量存放在RAM中地址为偶数,或变量存于寄存器中时操作正确。具体原因与MSP430中硬件有关。利用MSP430 IAR EW430 优化,局部变量是存放于寄存器中,所以是可以正确完成数据转换的。
若移植到其他单片机上,还要考虑到存储器结构等硬件因素。
各位网友,在这方面你们又有什么高招呢?

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(2) | 阅读(156)
发表于:2008-8-28 8:41:17
标签:无标签

2

DSP项目外包

现有一项目外包,请高手或团队参与(仅限成都):

数据采集处理板,项目简要描述:

  1)应用于电力方面

  2)DSP(TI6000系列):数据处理采集

  3)ARM(TI):以太网通讯,数据显示,涉及到嵌入式系统,unix2.6

        4)FPGA:数据处理采集

        5)合作方式:外包,兼职均可

 

系统分类: DSP   |    用户分类:    |    来源: 原创

评论(6) | 阅读(339)
发表于:2008-8-27 11:23:32
标签:无标签

1

航空蓄电池充放电及检测维护设备项目

航空蓄电池充放电及检测维护设备项目可行性报告

 

 

一.概述

.  产品线规划

. 产品开发过程分析

. 产品开发投资分析

. 产品投资回报分析

 

  

一.概述

航空蓄电池充放电及检测维护设备主要用于航空器所使用的蓄电池组在地面的维护和检测。而航空蓄电池按其用途的不同主要有以下三种:航空铅酸蓄电池(SY810A型航空电瓶起动车用)、 银锌蓄电池组(15XYG45-(3)G碱性蓄电池组)、镍镉蓄电池组(也称主蓄电池组)蓄电池的最重要的性能参数为蓄电池(电池)容量(单位AH)和蓄电池组单体电压(单位V)。容量决定了蓄电池组所能释放的到其额定终止条件(一般为电池组电压和电池单体电压)的最大能量。而单体电压决定了电池组单体性能的一致性(个体特性相差较大的电池组会导致容量下降快)。综上述:该设备主要可由三部分组成:充电模块(为蓄电池组充电以备使用)、放电模块(检测蓄电池组容量)、蓄电池巡检模块(在充放电过程中检测电池组电压和单体电压,防止过充过放)。由于其所使用领域的性能特殊性,蓄电池对其相应的检测维护设备要求严格。具体来说,就是对其充放电电量的精度要求。一般系统精度要求在0.5%--1%的范围类。为方便客户在使用设备时,操作安全、快捷、简单,该设备应具有远程遥控、遥测、遥调、遥信的四遥功能,在其系统中应加入工控机后台,远程控制设备的运行。航空蓄电池种类繁多、设备技术要求相对较高,当前国内专业的航空蓄电池检测设备的公司很少,而航空领域由于其特殊性,产品利润相对其他产品利润较高,故笔者认为此项目应该能够形成一个相当规模的产业,并其核心技术能延伸到其他领域。

 

二.产品线规划

·充电模块系列

由于充电模块功率相对不是很大,最大为2KW,在电网要求单相负荷4KW以内,故均采用单相AC/DC方案。

1) 铅酸电池充电模块 QS100200C

充电电压设置范围:20V---98V ,充电电流设置范围:2A ---20A

2) 银锌电池充电模块 YX40050C

充电电压设置范围:15V---38V ,充电电流设置范围:2A ---05A

3) 镍镉电池充电模块 GN40060C

充电电压设置范围:10V---38V ,充电电流设置范围:2A ---06A

·放电模块系列

1) 铅酸电池放电模块 QS100200

放电电压设置范围:28V---84V ,放电电流设置范围:8A ---20A

2) 银锌电池放电模块 YX40090F

放电电压设置范围:15V---31.5V ,放电电流设置范围:5A ---10A

3) 银锌电池放电模块 YX40045F

放电电压设置范围:15V---31.5V ,放电电流设置范围:40A ---50A

4) 镍镉电池放电模块 GN40050F

充电电压设置范围:10V---33V ,充电电流设置范围:2A ---06A

5) 镍镉电池放电模块 GN40025F

充电电压设置范围:10V---33V ,充电电流设置范围:20A ---30A

9                        3

蓄电池巡检模块系列

......

......

......

 

另有:

  综合蓄电池充放电系统设计方案

  综合蓄电池充放电系统设计规范

 

如有意向,请E-Mail:stylist_home@126.com

系统分类: 商务交流   |    用户分类:    |    来源: 原创

评论(0) | 阅读(137)
发表于:2008-8-27 8:48:19
标签:无标签

1

MSP430FG4619FLASH读写问题

在IAR C语言编译环境中,发现MSP430FG4619的FLASH的读写方法已不能象F449那样读写了,对于低于0XFFFF的地址空间的操作两者是一样的,但想对超过0XFFFF的FLASH空间该如何操作呢?如果象F449以前那样的读写程序直接把地址变量定义为32BIT的变量是行不通,如何用C语言来完成这个功能,IAR编译器里有这么一个功能。
    在IAR的HELP文件中有如下几个函数说明:
1) __data20_write_type
Syntax
void __data20_write_type(unsigned long address, unsigned type);

where:
 address  Specifies the address for the write operation 
type  Can be one of the types char, short, or long 

Description
Writes a value to the given 20-bit address. This intrinsic function is only useful on devices based on the MSP430X architecture and must be used when writing data that is located above the first 64 Kbytes of memory. The following functions are supported:

Function  Operation size  Alignment 
unsigned char __data20_write_char  8  1 
unsigned short __data20_write_short  16  2 
unsigned long __data20_write_long  2*16  2 

2)__data20_read_type
Syntax
unsigned type __data20_read_type(unsigned long address);
where:

 address  Specifies the address for the read operation 
type  Can be one of the types char, short, or long 

Description
Reads data from the given 20-bit address. This intrinsic function is only useful on devices based on the MSP430X architecture and must be used when reading data that is located above the first 64 Kbytes of memory. The following functions are supported:

Function  Operation size  Alignment 
unsigned char __data20_read_char  8  1 
unsigned short __data20_read_short  16  2 
unsigned long __data20_read_long  2*16  2 
 
  在需要写超过0XFFFF地址的FLASH空间时,用__data20_write_type或__data20_read_type 直接代替原有程序中的读写操作即可,但用于小于0XFFFF地址空间的操作将会出错。

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(76)
发表于:2008-8-26 9:18:45
标签:无标签

1

AD7794驱动程序设计

  用ADC转换芯片AD7794对电池电压进行检测,设计在一定时间间隔内对电池电压
进行采样,转换完毕后关闭AD7794进入power-down模式,节省功耗。
  程序结构如下
  .......
    // enable analog power supply  
  ADCActiveMode();  //AD7794初始化设置      
  CheckBattery();
  ......
  ADCLowPowerMode(); //设置AD7794寄存器进入低功耗模式    
  .......
  在常温下程序运行一切正常,AD7794的驱动程序经过几十万次测试无一读写错误,
电池电压检测也正确。将整个系统放入高低温老化箱作温度实验(0-60度)。随着温
度降低,故障出现了:在CheckBattery()这个函数中电池电压检测严重小于实际值,
而该函数中转换不止一次,怎么会连续几次都出错呢?温度升高后,检测一切又正常
了。于是怀疑是否是受电池内阻变化影响,或温度对器件影响所致。测量电池电压,
采样信号,系统晶体一切正常。又怀疑是否因温度降低,而导致了AD7794的通道切换
及建立时间的变化,将AD7794初始化设置后延长了时间,程序为:
  .......
    // enable analog power supply  
  ADCActiveMode();  //AD7794初始化设置   
  Delay_ms(20);  
  CheckBattery();
  ......
  ADCLowPowerMode(); //设置AD7794寄存器进入低功耗模式    
  .......
  但结果一样,无论怎样增加延时值,都无法根除故障。以前做过其他一些ADC的驱动
程序,又想到是否需要对ADC的DATA REGISTER进行一次读操作。程序又改为:
  .......
    // enable analog power supply  
  ADCActiveMode();  //AD7794初始化设置   
  AD7794Read(); //读AD7794 DATA REGISTER
  CheckBattery();
  ......
  ADCLowPowerMode(); //设置AD7794寄存器进入低功耗模式    
  .......
  再做温度试验,一切正常了!反复高低温试验都未在出现转换出错的故障!

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(1) | 阅读(113)
发表于:2008-8-25 14:59:15
标签:无标签

1

MAX6301调试笔记

  采用MAX6301作为单片机的外部看门狗,放在高低温箱中做(0-60度)老化实验。在常温下至高温下电路工作正常,看门狗溢出时间也在设计范围之类。随着老化箱温度的降低,单片机出现了连续规则的复位;将温度恢复至常温,系统恢复正常。再次降温故障再次出现,用示波器观察MAX6301的RESET脚,出现规则的脉冲复位信号,周期小于设定看门狗溢出时间。MAX6301电源VDD上并无明显的脉冲干扰,且也有0.1uF的旁路滤波电容,分析所知唯一的复位信号来源于MAX6301的1脚(reset in)。解决方法:在1脚上并联加入0.1uF电容,再次做低温实验,故障消失!

系统分类: 资源共享   |    用户分类:    |    来源: 原创

评论(0) | 阅读(106)
2下一页总共 , 当前 /