PIC单片机的应用设计技巧

发布者:轻松自在最新更新时间:2007-07-17 来源: 单片机及嵌入式系统应用关键字:接口  烧写  仿真  串行 手机看文章 扫描二维码
随时随地手机看文章
美国微芯公司(Microch{p Technology Inc.)开发的CM0S工艺PIC系列8位单片机(RISC微控制器),特别是采用内置第二代Flash存储器(40年存储寿命)的微控制器在快速应用方面具有独到之处。由于其易用性和高可靠性,该系列微控制器稳居8位单片机全球出货量之首。PIC系列单片机具有指令集简洁、简单易学、速度高、功能强、功耗低、价格低廉、体积小巧、适用性好及抗干扰能力强等特点,大量应用于汽车电气控制、电机控制、工业控制仪表和仪表、通信、家电、玩具、低功耗的测控应用等领域,在国内越来越受到广大设计者的欢迎,微芯公司的单片机已经成为目前单片机世界的主流产品。

PIC 8位单片机内已经包含运算器、存储器、A/D、PWM、输入和输出I/O(灌电流可达25mA)、通信等常用接口,自由灵活的定义功能可以适应不同的控制要求。而不必增加额外的IC芯片。这样电路结构很简单,开发周期将大为缩短。

PICl6系列单片机属于PIC8位单片机的中级型产品,采用14位的RISC指令系统。笔者使用PICl6F716单片机设计了一个电动机保护器,在设计过程中遇到很多问题,通过多方查找资料以及向Microchip公司技术人员寻求支持,问题一一得到解决。现将部分问题记录如下,与大家一起探讨。

1 ICD2作为程序烧写的使用

1.1 ICD2简介

MPLAB ICD2在线调试器是一款低价位的PIC开发工具。它利用Flash工艺芯片的程序区自读写功能来实现仿真器调试功能;使用的软件平台是Microchip的MPLAB IDE(集成开发环境软件包),兼容Windows NT、Windows 2000和Windlows XP等操作系统。其通信接口方式可以是USB(最高可达2Mb/s)或RS-232串行接口方式;工作电压范围为2.O~5.5V,可支持最低2.0V的低压调试。

MPLABICD2可以支持大部分Flash工艺的芯片。它不仅可以用作调试器,同时还可以作为开发型的烧写器使用。

1.2 ICD2作为烧写器时的配置

烧写芯片的方式有两种:普通烧写和在线烧写。在线烧写是适合大批量生产方式的烧写办法。使用在线烧写时通常用户都已经把芯片焊到了板上,此时就要求用户板上有预留的烧写接口。用户板上的接口是通过一条6芯的扁平电缆与ICD2主机上同样的接口一一对应连接的。图1显示了MPLAB ICD2与目标板上模块连接插座的互连状况。

 

ICD连接插座有6个引脚,但只使用了其中的5个引脚,分别是VDD(电源)、VSS(地)、VPP(编程电压)、PGC(同步时钟)和PGD(数据)。

1.3 ICD2作为烧写器时容易出现的问题及解决方法

尽管MPLAG ICD2与目标板的互连非常简单,但是一不小心就会出现问题,基本上每一个PIC的入门者都会碰到类似的问题。下面就一些常见问题作简要叙述。

如图l所示,在VPP与VDD之间通常要串接一个上拉电阻(通常约为lOkΩ),这样VPP线可置为低电平来手动复位PICmicro单片机。但是对一般设计者来说,都是采用上电自动复位。如果在这里采用集成器件DMP809,那么就会导致连接不上,程序没有办法烧入。

对于PGC、PGD两根线,由于在ICD2内部已经进行了上拉,所以在外围设计中,不要冉进行上拉,否则会造成分压。对于PGC、PGD和VPP三根线,不要对地接电容.因为电容会阻碍在数据和时钟线上电平的快速转换,从而影响ICD2与目标板的连接。同样对于PGC、PGD,由于数据或时钟都是双向传输的,这时如果在中间串一个二极管,则会影响ICD2与单片机的双向通信。

但是,对PGC和PGD来说,在单片机上同时复用为普通I/O口,而有些使用上必须要接对地电容或者是串接二极管。对于这种情况,唯一的处理方式就是在烧写时从芯片的PGC和PGD端口直接跳线到程序烧写口。

2 A/D转换通道切换问题

笔者所设计的电动机保护器需要进行很多A/D转换,比如三相电流转换、零序电流转换以及各种定位器等。但是笔者所采用的PIC16F716单片机只有5路A/D转换通道,因此附加了一个多位选择开关对一个A/D通道进行复用。而在调试中发现这样一个问题,就是A/D转换值不准确,甚至有点乱,但从程序流程以及代码角度均查不出任何问题。后查明PICl6F716单片机进行A/D转换通道切换时,需要一定的延时,延时时间是毫秒级。解决办法是:在通道问切换时,当第一个通道转换完成后,先转到另一个通道;然后延时1ms左右,再进行A/D转换。而对同一个通道信号切换时,要在第一个信号转换完成后,禁止信号输入,延时1ms左右;然后输人信号,再进行A/D转换。

这种做法比较麻烦,也很占用时间,并且从调试结果来看,问题并没有解决。在反复进行调试中,最后得到的优化解决办法是:对于通道间转换以及同一通道信号转换,要对每一个信号至少进行两次A/D转换;第一次的转换结果,舍弃不予处理,只取第二次A/D转换的结果。从调试结果来看,很好地解决了这一问题。

3 软件开发小技巧

PIC单片机采用精简指令集,例如对于PICl6F716单片机,只有35条单字节指令。要用这么少的指令实现复杂的控制或计算,显然要在软件设计上多下功夫,并且PIC的指令系统与51系列单片机有很大不同,这让PIC初学者很不适应。下面笔者就自己的体会,谈一些软件设计需要注意的问题。

3.1 指令的大小写问题

编写PIC单片机的源程序,除了源程序的开始处需要严格的列表指令外,还须注意源程序中字母符号的大小写规则,否则在PC机上汇编程序时不会成功。在源程序中都会使用伪指令INCLUDE。这条指令将列表中指定的单片机文件(在MPLAB中)读入源程序作为源程序的一部分,所以凡是MPLAB中有关该单片机已有的寄存器在源程序中无需再用赋值指令(EQU)赋值,这就使所建立的源程序大为简化。

此外,由于有了伪指令INCLUDE,所以根据MPLAB软件中的格式,在源程序中的操作数凡是涉及MPLAB已规定的寄存器名称的,其字母一律只能大写,不能小写。其余操作码、符号字母可任意大小写,但0x中的x应小写。否则汇编不会成功。鉴于上述原因,为了书写方便,在使用MPLAB软件时,PIC单片机的源程序均用大写字母为宜(0x例外)。

3.2 振荡器的配置以及时序的计算

PIC系列单片机可以工作于以下4种不同的振荡器方式:LP(低功耗晶体振荡器)、XT(晶体谐振器)、HS(高速晶体谐振器)和RC(阻容振荡器)。用户可以根据其系统设计的需要,通过对配置位(FOSC1和F0SC2)编程,选择其中一种工作模式。

而一旦振荡器配置完成,那么根据用户的配置,可以轻松地计算出程序运行的时间以及A/D转换所占用的时间,这样就会很轻松地安排好单片机的时序。例如,如果采用4 MHz的HS振荡模式,那么单片机的时钟频率为FOSC/4,也就是说执行一条指令需要1μs;对于需要两个指令周期的指令,需要2μs。而对于A/D转换,如果A/D转换时钟位选择为FOSC/8,那么A/D转换模块转换一个位的时间Tad就为2μs。对一个8位的转换来说,需要的时间为9.5Tad,也就是完成一次A/D转换的时间为19μs。这样只需要查看源程序的行数并作简要分析,就可以计算出程序运行的时间。

3.3 存储体的选择

PIC单片机的数据存储器通常分为两个存储体,即存储体O(Bank0)和存储体1(Bankl)。每个存储体都是由专用寄存器和通用寄存器两部分组成的。两个存储体中的一毡寄存器单元实际上是同一个寄存器单元,却又具有不同的地址。

不同型号的PIC单片机,其数据存储器的组成(即功能)是不完全相同的,所以设计人员一旦选用了某个PIC单片机的型号后,就要查找该单片机的数据存储器资料,以便编程使用。

笔者所采用的PICl6F716单片机的存储区,是通过STATUS寄存器的RPl位和RP0位来选择的。当配置为00时,表示选择存储区0;当配置为01时,表示选择存储区1。因为存储区的改变只须改变RP0位,所以通常在程序编写时,只改变RP0位来选择存储区。但是这样容易造成程序的混乱,因此,笔者建议在每次更换存储区时,要分别对RPO和RPl进行置位。在程序初始化时,最好将寄存器的初始化分为两部分:第一部分为存储区O;第二部分为存储区1。然后将每个需要初始化的寄存器分别在对应的存储区进行初始化即可。

3.4 GOTO和CALL指令的不同使用

在PIC的汇编程序中,CALL与GOT0指令使用的场台不同。CALL是用来调用子程序的,在调用完子程序后返回到调用前的程序;而GOTO是无条件转移,即由此状态进入另外一个状态而不需要返回。

为了使程序更加具有可读性,使流程更加清晰、合理,通常程序都采用模块化程序设计,即将程序按照功能分成不同的子程序,而主程序则相当简洁,只须采用CALL指令对子程序进行调用。

由于PIC单片机的堆栈有限,在程序中不能无止境地使用GOTO指令,否则会使堆栈溢出,程序无法正常运行。但是在有些时候,例如当程序出现分支时,则不得不使用GOTO指令。对于PICl6F7x系列单片机,程序出现分支时只能通过STATUS寄存器的Z位或C位进行判断。这时在两种情况的前一种情况下,必须使用GOTO指令进行转移;否则在执行完第一种情况后,紧接着又执行第二种情况。程序如下:

BTFSS STATUS,Z
GOTO A
GOTO B

在跳转到A时,必须使用GOTO指令;否则执行完这条语句以后,紧接着执行GOTO B。这样无论Z为何值,程序都将跳转到B。而对于GOT0 B,则可以不必使用GOTO指令。
在上面这种情况下,由于GOTO只在子程序内部进行跳转,小程序内部循环占用堆栈的级数不多,因此使用GOTO指令是可行的。但是在大的程序中使用GOTO指令,将有可能无法返回到调用前的下一条指令。

因此,笔者建议,在使用汇编语言进行程序设计时,应该将程序分解成一级级的子程序;然后在程序之间进行调用,尽量将GOTO指令跳转的范围缩小。

3.5 对芯片的重复烧写

对没有硬件仿真器的设计者来说,总是选用带有EPROM的芯片来调试程序,通过反复的修改来观看运行结果,以便对程序进行调试。每更改一次程序.都是将原来的内容先擦除,再编程,浪费了相当多的时间,又缩短了芯片的使用寿命。如果后一次编程较前一次,仅是对应的机器码字节的相同位由1变为0,那么就可在前一次编程芯片上再次写入数据,而不必擦除原片内容。

在程序调试过程中,经常遇到常数的调整。如果常数的改变能保证对应位由1变0,则都可在原片内容的基础上继续编程。另外,由于指令NOP对应的机器码为00,调试过程中指令的删除,可先用NOP指令替代,编译后也可在原片内容上继续编程。

结语

在采用PIC单片机进行设计过程中,注意到PIC单片机自身的特点,可尽量少走弯路,从而缩短开发周期。同样在软件设计上采用合适的方法,可以使整个程序运行稳定,而且程序空间的使用也将有所减少,避免了调试中的Bug。以上只是笔者在实际设计过程中一些小小的体会。希望与大家一起探讨,并在共同学习中为PIC单片机的普及和推广做出贡献。

关键字:接口  烧写  仿真  串行 引用地址:PIC单片机的应用设计技巧

上一篇:基于PIC单片机的低功耗键盘接口设计
下一篇:Microchip:不断拓展8位和16位MCU市场

推荐阅读最新更新时间:2024-03-16 12:22

C8051F020单片机的RS485串行通信设计
  l 引言   随着计算机技术和测控技术的不断发展,在以单片机为核心的数据采集系统中,需要实现单片机和计算机之间的数据交换,并以此来发挥单片机和计算机各自的长处,提升整个系统的性能价格比。   在计算机网络和工业控制系统中,经常需要采用串行通信来实现远程数据传输。目前,有多种接口标准可用于串行通信,包括RS232、RS422、RS485等。RS232是最早的串行接口标准,在短距离、较低波特率串行通信中得到了广泛应用。但是,RS232通信存在着传输速度慢、传输距离短、信号容易受到干扰等不足,其应用局限性已日益突出。而RS485通信采用差分方式来消除噪声,即信号在发送前会分解为正负2条线路,当到达接收端时将信号相减,使噪声相互抵消,
[电源管理]
C8051F020单片机的RS485<font color='red'>串行</font>通信设计
STM32仿真器运行正常,脱离仿真器后无法运行
调试STM32的程序时,发现程序在仿真器环境下运行一切OK,但是固化程序后,程序在完成初始化后就不运行了。 参照网上一些朋友说的检查复位电路、晶振电路、boot0和boot1管脚电平等等都是正常的。 最后发现是由于调试信息引起的:在程序仿真过程中,使用了printf对数据进行打印调试信息,程序运行到printf函数后就不运行了,将调试信息删除后,程序运行正常。 希望对大家能有帮助。
[单片机]
avr proteus仿真第一课:安装设置avr studio和winavr
avr的开发环境需要安装两个软件: WinAVR+AVR Studio 新手入门必读 1. 获得必须的软件 请从Atmel官方获得最新版本的AVR Studio 下载地址参见: http://www.cnblogs.com/proteus/archive/2011/11/09/2242583.html 请从WinAVR官方获得最新版本的WinAVR 下载地址: http://sourceforge.net/projects/winavr/files/WinAVR/ 注意:WinAVR和AVR Studio是2个不同的软件,前者是开源项目,不属于Atmel所有,后者是Atmel版权所有的。 2. 安装步骤 1)安装WinAVR 2
[单片机]
在STM32F103C8微控制器中使用RS-485串行通信
  通信协议是数字电子和嵌入式系统的组成部分。只要有多个微控制器和外围设备的接口,就必须使用通信协议来交换大量数据。有多种类型的串行通信协议可用。RS485 是串行通信协议之一,用于工业项目和重型机械。   本教程是关于在 STM32F103C8 微控制器中使用RS-485 串行通信。   在本教程中,Master STM32F103C8 具有三个按钮,用于通过使用 RS-485 串行通信来控制 Slave Arduino Uno 上的三个 LED 的状态。   RS-485 串行通讯   RS-485 是一种不需要时钟的异步串行通信协议。它使用一种称为差分信号的技术将二进制数据从一个设备传输到另一个设备。   那么这种差
[单片机]
在STM32F103C8微控制器中使用RS-485<font color='red'>串行</font>通信
80C51系列单片机仿真器选购指南
第一章 为什么要使用仿真器? 1.1 仿真的概念 仿真的概念其实使用非常广,最终的含义就是使用可控的手段来模仿真实的情况。 在嵌入式系统的设计中,仿真应用的范围主要集中在对程序的仿真上。例如,在单片机的开发过程中,程序的设计是最为重要的但也是难度最大的。一种最简单和原始的开发流程是:编写程序-烧写芯片-验证功能,这种方法对于简单的小系统是可以对付的,但在大系统中使用这种方法则是完全不可能的。 1.2 仿真的种类 软件仿真:这种方法主要是使用计算机软件来模拟运行实际的单片机运行,因此仿真与硬件无关的系统具有一定的优点。用户不需要搭建硬件电路就可以对程序进行验证,特别适合于偏重算法的
[单片机]
满足3G手机低成本低功耗要求,DigRF技术挑大梁
象多数技术形式一样,手机中的射频(RF)收发器也在不断进化,以满足市场对于低成本和高性能的不懈追求。为了满足这两种相互矛盾的需求,供应商采取的是一种减少元件数量和功耗的解决方案。 按照这个思路,手机市场现在开始采纳一种新的技术:DigRF。虽然2G手机也可以使用这种技术,但DigRF的主要优点是它能够降低3G手机的成本,同时保持或者改善其性能。 手机基带与RF集成电路(IC)之间的坚实接口,对于确保实现最佳性能非常关键。这个接口是基带配置RF IC和传送数据的主要手段。它还包括电源管理和睡眠功能,这对于降低功耗和延长电池工作时间非常重要。传统上,这个接口功能是通过模拟I/Q接口实现的。 由于这个原因,以及基带的数字特性,使用
[焦点新闻]
便携式应用中的音频接口
针对不同的数字音频子系统,催生出几种微处理器或DSP(数字信号处理器)与音频器件间用于数字转换的接口。受系统实际性能的限制,通常情况下接口的选择取决于音频通道数目、数据处理及采样率等参数。对便携式系统来说,功率耗散与物理器件的尺寸通常是同等重要的。本文将介绍目前市场中存在的几种音频接口规格。 PCM规格 最简单的音频接口之一是所谓的PCM(脉冲编码调制)接口。严格地说,所有数字信号进行传输都要经过PCM,并且需要仔细参照用于数字电话的单声道机制。PCM接口由时钟脉冲(BCLK)、帧同步信号(FS)及数据队列组成,每个PCM对应一个将要接收或将要发送的数据。 在FS信号的上升沿,数据传输从MSB(Most Significan
[手机便携]
数据采集LM12H458与80C51接口电路 —电路图天天读(153)
  LM12H458是高集成度的数据采集系统DAS芯片,它将采样保持、A/D转换集成在一块芯片内,从而大大减少了外围电路的设计。其8路模拟信号输入既可作为单端输入,又可两两组成差分输入。器件内部提供的一个2.5V参考电压、8×48bit指令RAM和32×16bit的FIFO大大减小了微处理器的负担。LM12H458的工作电压为3~5.5V,功耗小于34mW,待命模式下的功耗只有50μW。此外,LM12H458还有如下主要性能:   有三种工作模式:分别为带符号的13位模式、带符号的9位模式和看门狗模式;有8个模拟信号输入通道,模拟信号可单端输入,也可差分输入;内置采样保持和2.5V参考电压;内含32×16bit的FIFO;采样
[单片机]
数据采集LM12H458与80C51<font color='red'>接口</font>电路 —电路图天天读(153)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved