EDN首页   博客首页

最新日志

发表于:2008-8-18 17:02:57
标签:AVR  DW  

2

Mega168外部复位和单线调试共用时的管脚处理

目前很多单片机都具有调试、在线下载的功能。如AVR系列微控制器的DW接口,容许调试器(仿真器)通过VCCGNDRESET三个口与微控制器通信,完成调试和程序下载。而这些功能所用到的数据接口中一般包括RESET复位引脚。为了上电可靠,我们一般都设计了上电复位电路。上电复位电路最多的是使用阻容复位电路。

我在一次设计中用到了ATmega168,当复位引脚直接上拉一个电阻的时候,能够进入ISPDW模式。而当增加了阻容组成的上电复位后,单片机却进入不到调试模式了。点击看大图

 

上图是不能正常进入DW模式的电路图,RST管脚的电平变化受到了阻容复位电路的影响。

解决的办法是在微控制器的复位引脚和阻容复位电路之间增加一个电阻。如下图所示。

这样,当DW通过RST通信的时候,可以通过新增加的10K电阻来消弱复位电路对其的影响,从而能够实现正常的通信。

点击此处查看原文 >>

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

评论(0) | 阅读(307)
发表于:2008-7-22 17:38:41
标签:无标签

1

编程规则

1,函数变量定义

数据的传递尽量通过函数的参数来实现,函数前面的函数返回值类型最好是表示函数执行的状态。

比如:我们通过串口接收一个字节数据,我们可以定义函数如下:

BOOL
xSmsPortSerialGetByte( CHAR * pucByte )
{
    *pucByte = UDR;
    return TRUE;
}

还可以定义如下:

Char xSmsPortSerialGetByte( void)

{
    return UDR;
}
第一种方法,调用函数后需要传递出一个接收到的数据,这个是通过函数的参数来传递的。第二种方法,是通过函数的返回值来传递的。

2,编译

代码编译后不能存在warning。

3, 文件名

软件项目的目录名和文件名都必须是英文字符。好多软件不认识汉字或者当有中文路径时会出错。比如,当AVR Studio4.14和WinAVR200(2008年9月能找到的两个软件的最新版本)配合使用时,如果项目文件存放目录存在中文时候,会出现不能找到makefile文件的错误。当目录都是中文的时候错误就消失了。

 

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 整理

评论(0) | 阅读(250)
发表于:2008-7-13 22:54:25
标签:编译警告  

1

以后一定注意不能忽略编译器的警告

1,为什么容易忽略编译器的警告信息?

    1)编程时处理各种error已经很让人恼火的了,error自然被放在次要位置;

    2)绝大多数下,程序在存在warnings的情况下,在短期内可以正常运行,我们根本看不到错误,导致warning近一步被轻视;

    3)没有养成好的工作习惯,带有warning的代码是不能交付的,而我们判断交付的标准中往往没有对代码提出更为细致的要求。

2,忽视编译警告往往会给我们造成重大损失

    最近的一个项目中,我的程序在实验室测试了1个星期没有出现问题。当设备部署到现场3天后,坏事情终于发生了:设备依次出现死机问题。

   再从头分析代码, 百思不得其解,痛不欲生的时候注意到了一个编译警告,说一个表达式一直为真。原来发生了下面的错误:

    unsigned char i;

    for( i = 0; i < 1000; i++)  {.....}

    变量类型的定义导致了表达式一直为真。为什么开始的测试中不会出现问题哪?原来,这段代码是必须程序运行一段时间后才会执行的一段代码,在短时间的测试中根本不会进入。

    看来编程真不能偷懒,偷懒必遭惩罚,你还要费比当时偷懒省的劲多好多倍的劲来弥补,并且这个弥补的过程中你还要承受巨大的压力。跟平时多流汗战时少流血的道理一样的。

    3)解决办法

    给自己的编程增加一个规则,带有编译警告的代码不能交付。

点击此处查看原文 >>

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

评论(1) | 阅读(342)
发表于:2008-6-17 17:56:05
标签:无标签

1

引用没有声明的外部函数可能会导致严重问题

using a function without a valid prototype is VERY dangeours.

    在一个函数中调用另外一个文件中定义的函数,但是这个函数没有进行声明,会出什么问题哪?

    大多数的情况下可能会出现问题,有些情况下,可能是幸运不会出现问题。

     看下面这段代码:

    unsigned long ulWater_Max_Value=0xABCDEFUL;

    Puthexbyte(ulWater_Max_Value>>24);
    Puthexbyte(ulWater_Max_Value>>16);
    Puthexbyte(ulWater_Max_Value>>8);
    Puthexbyte(ulWater_Max_Value);

    其中Puthexbyte函数在另外一个c文件中进行了定义,但是在该文件对应的.h文件中,我没有对这个函数进行声明。

    这样,当运行上面的代码的时候,会导致错误的结果,输出的数据全部为0。

    改正的方法是,为每个外部函数在.h文件做一个相应的声明。每个需要调用这个函数的文件都要包含这个.h头文件。

    仍然是上面的代码,如果把变量定义为unsigned int 形式,却可以输出正确结果。这有点奇怪,绝对是侥幸,但是,为什么会对哪?即:

    unsigned int ulWater_Max_Value=0xABCD;

    //Puthexbyte(ulWater_Max_Value>>24);
    //Puthexbyte(ulWater_Max_Value>>16);
    Puthexbyte(ulWater_Max_Value>>8);
    Puthexbyte(ulWater_Max_Value);

    在不声明Puthexbyte函数的情况下,仍然能正确输出,为什么哪?

点击此处查看原文 >>

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

评论(1) | 阅读(596)
发表于:2008-6-6 17:41:40
标签:无标签

1

一步一步写一个短信SMS协议栈FreeSmsStack(1)

一步一步写一个短消息收发协议栈(1

――基于TC35iATMega32的短消息协议栈FreeSmsStack

V1.0

bpesun@163.com

1.     目的

本项目的目的是完成一个建立在TC35i模块上的短消息协议栈。我给这个协议栈起的名字是FreeSmsStack。从名字上可以看出,这个协议栈是一个免费的开源协议栈。

短消息业务(SMS)作为GSM的一种增值服务,随着GSM网络覆盖范围的不断扩大,得到了迅速发展,它具有传输速度快,费用低,不占用语音通信通道等优点,因而在远程智能控制系统中得到了广泛的应用,如:基于GSMGPS的车辆跟踪监视系统,基于GSM的远程LED信息发布系统等。

2.     FreeSmsStack协议栈的功能

目前,这个协议栈能完成如下的功能:

ü         中、英文短信发送

ü         中、英文短信接收

ü         短信删除

ü         振铃后挂断来电并且反馈短信到来电号码

ü         普通AT命令发送

注意:目前,中文短信编码不能通过单片机实现,只能通过查表的方式将某些短信编码存储在单片机中。

3.     FreeSmsStack协议栈对硬件的需求

    下面列出的是本协议栈在所有功能使能的情况下对单片机的需求,可以看出普通的中档次的单片机都能满足要求。

ü         具有一个串口,具备发送寄存器空中断和接收到中断

ü         具有一个定时器

ü         RAM最好有1.5K以上(实现全部功能)

3.1. 项目硬件

项目的硬件结构如下图所示。主要由GSM模块TC35i、单片机ATmega32、电源等模块组成。单片机和TC35i模块之间通过TTL串口进行通信。

 

下面简单介绍一下项目中所用到的硬件。

3.2. TC35i

短消息模块采用西门子的TC35i该模块的特性如下。

信息传送内容

语音和数据

电源

单电源 3.3V 4.8V

频段

双频GSM900MHz DCS1800 MHz(Phase 2+)

发射功率

2W GSM900MHz Class 4 1W DCS1800MHz Class 1

SIM 卡连接方式

外接

天线

由天线连接器连接外部天线

温度范围

工作温度:-20°C to +55°C 储存温度:-30°C to +85°C

工作电流损耗

通话模式: 300mA (典型值.)

空闲模式: 3.0mA (最大值)

省电模式: 50μA (最大值)

短信息

MT, MO, CB PDU 模式

外型尺寸

54.5 x 36 x 3.6mm

通讯接口

RS232(指令和数据的双向传送)

SIM卡操作电压

3V/1.8V

电话薄功能

存储于SIM卡中

模块复位

采用AT指令或掉电复位

串口通讯波特率

300bps...115kbps

自动波特率范围

4.8kbps...115kbps

 

TC35i模块有40个引脚,通过一个ZIF(Zero Insertion Force,零阻力插座)连接器引出。这40个引脚可以划分为5类,即电源、数据输入/输出、SIM卡、音频接口和控制。

TC35i的第15引脚是正电源输入脚通常推荐值4.2V,第610引脚是电源地。1112为充电引脚,可以外接锂电池,13为对外输出电压(共外电路使用)14ACCU-TEMP接负温度系数的热敏电阻,用于锂电池充电保护控制。

15脚是启动脚IGT,系统加电后为使TC35i进入工作状态,必须给IGT加一个大于100ms的低脉冲,电平下降持续时间不可超过1ms

1623为数据输入/输出,分别为DSR0RING0RxD0TxD0CTS0RTS0DTR0 DCD0tc35i模块的数据输入/输出接口实际上是一个串行异步收发器,符合ITU-T RS232接口标准。它有固定的参数:8位数据位和1位停止位,无校验位,波特率在300bps~115kbps之间可选,默认9600。硬件握手信号用RTS0/CTS0,软件流量控制用XON/XOFFCMOS电平,支持标准的AT命令集。

其中18RXD19TXDTTL的串口通讯脚,需要和单片机或者PC通讯。

TC35i使用外接式SIM, 2429SIM卡引脚,SIM卡同TC35i是这样连接的:SIM上的CCRSTCCIOCCCLCCVCCCCGND通过SIM卡阅读器与TC35i的同名端直接相连,ZIF连接座的CCIN引脚用来检测SIM卡是否插好,如果连接正确,则CCIN引脚输出高电平,否则为低电平。

TC35i的第32SYNC引脚有两种工作模式,一种是指示发射状态时的功率增长情况,另一种是指示TC35i的工作状态,可用AT命令AT+SYNC进行切换,本模块使用的是后一种。当LED熄灭时,表明TC35i处于关闭或睡眠状态;当LED600 ms/600ms熄时,表明SIM卡没有插入或TC35i正在进行网络登录;当LED75 ms/3s熄时,表明TC35i已登录进网络,处于待机状态。

303132脚为控制脚,其中30RTC backup31Power down32 SYNC

    3538为语音接口,3536接扬声器放音。3738可以直接接驻极体话筒来采集声音(37是话筒正端,39是话筒负端)

  单片机通过两根I/O口控制TC35的开关机、复位等,通过串口与TC35进行数据通信。本项目通信速率为4800bps,采用8位异步通讯方式,1位起始位,8位数据位,1位停止位。

  TC35模块输入输出的TTL正电平逻辑不是+5V,而是+2.9V,因此必要时加端口保护。

3.3. 电源

模块的供电电压如果低于3.3V会自动关机。同时模块在在发射时,电流峰值可高达2A。同时在此电流峰值时,电源电压(送入模块的电压)下降值不能超过0.4V。所以该模块对电源的要求较高,理想工作电压是4.2V

我们这里只列出几种经过验证的开关电源方案,具体的实施原理可以参考数据手册或者网上的资料。第一,使用可调DC-DC电源芯片LM2941S。第二,使用DC-DC控制器,如R1224N102E

3.4. 具体连接示例

    下图是我在项目中使用的TC35i连接图。主要的连接包括:电源连接、SIM卡连接、SYNC信号灯、串口连接(TXDRXD分别接单片机的TXDRXD,以及一些辅助的电阻连接。IGT是点火控制信号,MVDD可以用来监测模块是否启动。图中未注明的管脚可以悬空。

点击开大图

3.5. 调试串口

为了方便调试,可以增加一个调试串口。如果选择的单片机是具有双串口的单片机,那么可以将第二个串口作为调试串口,通过MAX3232等电平转换芯片变成RS232电平,连接PC串口。如果你选择的单片机只有一个串口,也没有问题,只需要将串口复用(单片机的串口既连接TC35i又连接电平转换芯片),同样通过一个电平转换芯片进行转换并连接到PC。编程的过程中,我们可以将一些调试信息通过这个串口输出到我们的串口助手上,方便我们调试。

串口调试软件网上有好多,但是我推荐使用SSCOM32。大家可以在网上搜索并下载。

4.     熟悉AT命令

4.1. 先看AT命令的语法