undefined

今年,是数字信号处理器 (DSP) 诞生 40 周年,如果找出 TI MCU 的一个代表作,那势必离不开 C2000™。该产品作为 TI 乃至业界最为悠久的 MCU 产品线之一,至今已有 25 年历史,从高铁到电动汽车、从数控机床到机械臂、从逆变器到服务器,哪里都有 C2000 的身影。

在摩尔定律不断演进,架构不断变化,竞争白热化的数十年中,C2000 的发展确实也并不是一帆风顺的。但时至今日,C2000 依然活跃在 MCU 市场,屡发新品的同时,也在不断得到新老客户的认可与青睐,这背后的原因是什么?

带着这一疑问,电子工程世界采访了德州仪器 C2000 产品线分别负责工业和汽车电子的两位产品线经理 Paul Ng 和 Na Kong,请二位结合 C2000 的产品特性与市场需求,详细阐述了在电源与控制技术日新月异的当前,高实时性的 C2000 是如何焕发青春的。

由于访谈的篇幅问题,本文将主要聚焦 TI C2000 未来在中国发展的挑战和愿景。如想了解 TI C2000 过去 25 年的发展进程以及现在所取得的成就,请访问上周我们发布的访谈上篇:DSP诞生40周年,25岁的TI C2000™ MCU如何持续演绎经典(过去 & 现在篇)

“Paul
Paul Ng:C2000™ 工业产品线经理

Paul Ng 在半导体行业拥有超过 25 年的工作经验。他于 2010 年加入 TI,曾担任 TI 中国业务拓展总监。他于 2020 年加入 C2000 事业部,担任 C2000 工业产品线经理,负责其全球业务。

“Na
Na Kong:C2000™ 汽车产品线经理

Na Kong 于 2011 年加入 TI,先后在 TI 模拟电源产品和马达驱动部门从事应用,系统,和市场相关的工作。她于 2020 年加入 C2000 事业部,担任 C2000 汽车产品线经理,负责其全球业务。

以下是访谈下篇的正文:

Q:在 C2000 的开发过程中遇到了哪些困难?未来的重大开发挑战是什么?

我们过去面临的重大挑战之一是中国市场的动态。在 DSP 解决方案成为先进的高性能产品后,我们处于非常有利的位置,每个人都知道 C2000 是优选产品。但在过去几年中,许多竞争对手提供越来越有竞争力的产品,再加上 ARM 生态系统攻击,我们开始在一些关键市场失利。在过去两年里,我们重新审视了我们的战略,并仔细地重新定位了我们的产品,现在我们在性能和价格上更具竞争力,同时仍保持我们的高质量标准。我们在新推出的第三代产品中作出了重大改变,现在我们比以前更有能力应对中国市场。对于近期未使用我们产品的工程师,我建议他们重新审视我们的产品组合,并了解我们的新产品。

如今,另一个面临挑战的领域是产能紧张。C2000 面临着与其他 MCU 公司类似的挑战。除了持续扩建 TI 在美国德州的多处工厂外,即使我们 10 年前就在日本的会津建造了额外的生产线,来满足我们的增长需求,我们的业务也需要额外的产能支持。几个月前,TI 宣布从Micron 收购了其位于美国犹他州的一所 300 毫米晶圆厂。此次收购有助于解决我们的产能问题。我们坚信,当新工厂开始投产时,我们的产能将大幅增加,可以满足未来 5-10 年的业务需求。

Q:C2000 自推出以来就面临众多竞争对手,在 25 年里才刚刚升级到第三代,所以与其他处理器相比,它的升级速度会不会过于缓慢?它如何与其他快速更新的竞争对手进行竞争?

在工业和汽车领域,像 C2000 这样的核心平台组件几年不更新是很常见的。然而,考虑到中国市场的动态情况,我们需要继续推出新产品。TI 在 C2000 研发方面进行了大量投资,以前我们每隔几年推出一次新产品,如今,我们每年推出多款新产品。例如,在 2020 年,我们推出一款新的入门级产品 F280025,来应对大批量市场的需求,但与此同时,我们也推出了 F28388 产品,这是我们现有的最高性能 925MIPS 多核和 Ethercat 产品。当我们看到竞争对手积极推出有竞争力的产品时,TI C2000 并没有落后,而是继续推出有竞争力的产品。我自己和 Na Kong 很荣幸能参与这次旅程,凭借我们对中国市场的了解,我们非常有信心 C2000 在未来几年里仍将是中国市场上的先进实时产品。

Q:除了 MCU,C2000 还将在许多领域与 ASIC 竞争,如何才能做得更好?

有趣的是,我们最近在欧洲遇到了一个情况。有一家卓越的公司开发了具有高性价比的 ASIC 解决方案,并将许多产品解决方案转移到了 ASIC。但最近,这个客户的解决方案面临着挑战。首先,他们的 ASIC 不够灵活,以至于当市场需求发生变化时,他们必须投资开发新的 ASIC。其次,现今的 ASIC 制造产能谈判并不容易。由于这些原因,这个客户现在回来与 TI 谈判,并认真考虑再次使用我们的 C2000 产品组合,我们的产品能为他们提供灵活性、竞争力,并且我们能提供高产能和高质量的产品。

我们还面临着来自 MCU 和 FPGA 的挑战。有些应用利用 FPGA 来实现时序关键型功能或特殊功能,例如电机应用中的编码器。为了满足这种需求,TI 开发了可配置逻辑块 (CLB) 解决方案。我们使用 CLB 实现不同的编码器,例如绝对编码器、T-format 等。C2000 在 CLB 中提供了许多编码器示例,同时允许客户创建自己的解决方案。我们还使用 CLB 实现有源 EMI 滤波器等创新解决方案,从而减少数字电源应用中的 EMI。

Q:请介绍下 C2000 在中国的发展情况,以及在中国的未来愿景是什么?

中国仍然是 C2000 的重要市场。我们与中国的许多实时控制客户建立了长期的合作关系,并将继续关注中国市场动态,据此调整我们的市场策略。除了许多传统市场,目前还有像电机驱动、数字电源应用这样的市场,我们还会持续发现越来越多令人兴奋的增长机会。许多C2000 应用与中国新基建和碳中和相关,也非常符合中国最新的五年规划。我们为中国的新能源汽车提供先进的解决方案,支持牵引电机、车载充电器 (OBC)、直流/直流电源等应用,并已经制定了一项计划,致力于开发符合中国汽车功能安全与安防要求的新系列产品。而在工业领域,我们将继续投资完整的产品组合,无论是适合HVAC 的价格性能平衡解决方案、GaN 控制方面的先进解决方案、基于高功率密度 GaN 的数字电源解决方案,还是高端电机驱动伺服或大功率光伏中央逆变器,我们目前都有合适的产品,以及涵盖未来5 至 10 年增长的出色路线图。我们继续投资产品、易于采用的解决方案和本地支持,帮助客户采用我们卓越的 C2000 实时控制产品和解决方案。

Q:C2000 的未来蓝图是什么?面对新技术、产品和市场变化,您有什么想法?

在过去 25 年里,C2000 在实时控制产品和解决方案方面已经打下了坚实的基础,我们与客户携手合作,致力于使工厂生产线实现完全自动化和联网,将电机解决方案从传感器梯形控制转向无传感器FOC 控制,使采用变频技术的空调达到更高的能效水平,车辆电动化从化石燃料转向纯电动和混合动力以实现零排放,发电从化石发电转向清洁太阳能和风能。未来 25 年,C2000将继续在实时控制技术、下一代高性能 DSP 内核架构等领域进行投资,将我们的市场覆盖范围扩大到更多的应用领域。

可能你会认为,对于一个芯片系列来说,25 年也太长了。但其实通过采访,你也可以看到如今的 C2000,已经和当年不可同日而语。但 C2000 始终秉承着高实时处理性能的特色,并逐步添加更多创新功能,以更快速的市场响应,来面对不断变化的现在和未来。

相关阅读:

DSP诞生40周年,25岁的TI C2000™ MCU如何持续演绎经典(过去 & 现在篇)

来源:德州仪器
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com

围观 655

在上一节我们介绍了MM32 MCU的CDC功能,CDC简单而且常用。

本节我们来讲解如何在MM32 MCU实现U盘功能。USB大容量存储设备(英语:USB mass storage device class,也称为USB MSC或UMS)是一个协议,允许一个USB接口的设备与主计算设备相连接,以便在两者之间传输文件。对于主计算设备来说,USB设备看起来就像一个移动硬盘,允许拖放型文件传送,用 USB 线连接 PC 机与开发板,在电脑上就可以像操作普通 U 盘那样来操作开发板中的 MicroSD 卡或者SPI FLASH。它实际上是由USB实施者论坛所通过许多通讯协议的汇总,这一标准提供了许多设备的界面,包括移动硬盘、闪存盘、移动光学驱动器、读卡器、数码相机、数码音乐播放器、Pad以及手机等等。

本次我们采用MM32L373 miniboard作为测试开发板。为了方便大家使用MM32 MCU的MSC功能,我们已经封装好全部代码,用户不需要自己配置以上的那些描述符等参数,只需要知道如何处理MSC的数据接收和发送即可。

软件资源如下:

对于MM32 MCU的MSC功能来说,在使用MSC功能之前先调用USB初始化函数来初始化USB协议栈。

int main(void)
{
// USB Device Initialization and connect
usbd_init();
usbd_connect(__TRUE);
while (!usbd_configured())   // Wait for USB Device to configure
{
}
while (1)
{      
……
if (flags & FLAGS_MAIN_90MS)
{
vfs_mngr_periodic(90); // FLAGS_MAIN_90MS
}
……
}
}

在MM32 MCU 的MSC功能里面,增加了一个虚拟FAT,用户不需要了解,只需要了解MSC数据收发处理函数,USB数据处理函数如下:

//MSC初始化函数
void usbd_msc_init(void)
{
sync_init();
build_filesystem();
vfs_state = VFS_MNGR_STATE_DISCONNECTED;
vfs_state_next = VFS_MNGR_STATE_DISCONNECTED;
time_usb_idle = 0;
USBD_MSC_MediaReady = 0;
}
//MSC读函数
void usbd_msc_read_sect(uint32_t sector, uint8_t *buf, uint32_t num_of_sectors)
{
sync_assert_usb_thread();
// dont proceed if we're not ready
if (!USBD_MSC_MediaReady) {
return;
}
vfs_read(sector, buf, num_of_sectors);
}
//虚拟文件读函数
void vfs_read(uint32_t requested_sector, uint8_t *buf, uint32_t num_sectors)
{
uint8_t i = 0;
uint32_t current_sector;
// Zero out the buffer
memset(buf, 0, num_sectors * VFS_SECTOR_SIZE);
current_sector = 0;
for (i = 0; i < ELEMENTS_IN_ARRAY(virtual_media); i++) {
uint32_t vm_sectors = virtual_media[i].length / VFS_SECTOR_SIZE;
uint32_t vm_start = current_sector;
uint32_t vm_end = current_sector + vm_sectors;
// Data can be used in this sector
if ((requested_sector >= vm_start) && (requested_sector < vm_end)) {
uint32_t sector_offset;
uint32_t sectors_to_write = vm_end - requested_sector;
sectors_to_write = MIN(sectors_to_write, num_sectors);
sector_offset = requested_sector - current_sector;
virtual_media[i].read_cb(sector_offset, buf, sectors_to_write);
// Update requested sector
requested_sector += sectors_to_write;
num_sectors -= sectors_to_write;
}
// If there is no more data to be read then break
if (num_sectors == 0) {
break;
}
// Move to the next virtual media entry
current_sector += vm_sectors;
}
}
//MSC写函数
void usbd_msc_write_sect(uint32_t sector, uint8_t *buf, uint32_t num_of_sectors)
{
sync_assert_usb_thread();
if (!USBD_MSC_MediaReady) {
return;
}
// Restart the disconnect counter on every packet
// so the device does not detach in the middle of a
// transfer.
time_usb_idle = 0;
if (TRASNFER_FINISHED == file_transfer_state.transfer_state) {
return;
}
// indicate msc activity
vfs_write(sector, buf, num_of_sectors);
if (TRASNFER_FINISHED == file_transfer_state.transfer_state) {
return;
}
file_data_handler(sector, buf, num_of_sectors);
}
//虚拟文件写函数
void vfs_write(uint32_t requested_sector, const uint8_t *buf, uint32_t num_sectors)
{
uint8_t i = 0;
uint32_t current_sector;
current_sector = 0;
for (i = 0; i < virtual_media_idx; i++) {
uint32_t vm_sectors = virtual_media[i].length / VFS_SECTOR_SIZE;
uint32_t vm_start = current_sector;
uint32_t vm_end = current_sector + vm_sectors;
// Data can be used in this sector
if ((requested_sector >= vm_start) && (requested_sector < vm_end)) {
uint32_t sector_offset;
uint32_t sectors_to_read = vm_end - requested_sector;
sectors_to_read = MIN(sectors_to_read, num_sectors);
sector_offset = requested_sector - current_sector;
virtual_media[i].write_cb(sector_offset, buf, sectors_to_read);
// Update requested sector
requested_sector += sectors_to_read;
num_sectors -= sectors_to_read;
}
// If there is no more data to be read then break
if (num_sectors == 0) {
break;
}
// Move to the next virtual media entry
current_sector += vm_sectors;
}
}

如上,我们就完成MM32 MCU的MSC功能,将程序下载到板子中,USB插上电脑,电脑上会枚举出U盘,如下显示:


图1 MM32 MCU模拟U盘属性

U盘容量可以用户自定义,在本次程序中定义U盘64M,实际容量小于MCU flash容量,用户可以选择外扩SDRAM、MicroSD 卡或者SPI FLASH等其他存储单元,可以实现大容量数据存储功能,需要用户根据实际存储外设将USB通信和存储单元进行关联操作。


图2 电脑U盘盘符

打开 U 盘,可以进行新建、复制、粘贴、格式化等操作。与操作我们的普通 U 盘没什么区别,以上就是MM32 MCU USB的MSC功能。

来源:灵动MM32MCU

围观 391

在提高硬件系统抗干扰能力的同时,软件抗干扰以其设计灵活、节省硬件资源、可靠性好越来越受到重视。下面以MCS-51单片机系统为例,对微机系统软件抗干扰方法进行研究。

1、软件抗干扰方法的研究
在工程实践中,软件抗干扰研究的内容主要是:一、消除模拟输入信号的噪声(如数字滤波技术);二、程序运行混乱时使程序重入正轨的方法。本文针对后者提出了几种有效的软件抗干扰方法。

(1) 指令冗余
CPU取指令过程是先取操作码,再取操作数。当PC受干扰出现错误,程序便脱离正常轨道“乱飞”,当乱飞到某双字节指令,若取指令时刻落在操作数上,误将操作数当作操作码,程序将出错。若“飞”到了三字节指令,出错机率更大。

在关键地方人为插入一些单字节指令,或将有效单字节指令重写称为指令冗余。通常是在双字节指令和三字节指令后插入两个字节以上的NOP。这样即使乱飞程序飞到操作数上,由于空操作指令NOP的存在,避免了后面的指令被当作操作数执行,程序自动纳入正轨。

此外,对系统流向起重要作用的指令如RET、RETI、LCALL、LJMP、JC等指令之前插入两条NOP,也可将乱飞程序纳入正轨,确保这些重要指令的执行。

(2) 拦截技术

所谓拦截,是指将乱飞的程序引向指定位置,再进行出错处理。通常用软件陷阱来拦截乱飞的程序。因此先要合理设计陷阱,其次要将陷阱安排在适当的位置。

软件陷阱的设计
当乱飞程序进入非程序区,冗余指令便无法起作用。通过软件陷阱,拦截乱飞程序,将其引向指定位置,再进行出错处理。软件陷阱是指用来将捕获的乱飞程序引向复位入口地址0000H的指令。通常在EPROM中非程序区填入以下指令作为软件陷阱:

NOPNOPLJMP 0000H其机器码为0000020000。

陷阱的安排
通常在程序中未使用的EPROM空间填0000020000。最后一条应填入020000,当乱飞程序落到此区,即可自动入轨。在用户程序区各模块之间的空余单元也可填入陷阱指令。当使用的中断因干扰而开放时,在对应的中断服务程序中设置软件陷阱,能及时捕获错误的中断。如某应用系统虽未用到外部中断 1,外部中断1的中断服务程序可为如下形式:

NOPNOPRETI返回指令可用“RETI”,也可用“LJMP0000H”。如果故障诊断程序与系统自恢复程序的设计可靠、完善,用“LJMP0000H”作返回指令可直接进入故障诊断程序,尽早地处理故障并恢复程序的运行。考虑到程序存贮器的容量,软件陷阱一般1K空间有2-3个就可以进行有效拦截。

(3)软件“看门狗”技术
若失控的程序进入“死循环”,通常采用“看门狗”技术使程序脱离“死循环”。通过不断检测程序循环运行时间,若发现程序循环时间超过最大循环运行时间,则认为系统陷入“死循环”,需进行出错处理。

“看门狗”技术可由硬件实现,也可由软件实现。在工业应用中,严重的干扰有时会破坏中断方式控制字,关闭中断。则系统无法定时“喂狗”,硬件看门狗电路失效。而软件看门狗可有效地解决这类问题。

笔者在实际应用中,采用环形中断监视系统。用定时器T0监视定时器T1,用定时器T1监视主程序,主程序监视定时器T0。采用这种环形结构的软件“看门狗”具有良好的抗干扰性能,大大提高了系统可靠性。

对于需经常使用T1定时器进行串口通讯的测控系统,则定时器T1不能进行中断,可改由串口中断进行监控(如果用的是MCS-52系列单片机,也可用T2代替T1进行监视)。这种软件“看门狗”监视原理是:在主程序、T0中断服务程序、T1中断服务程序中各设一运行观测变量,假设为MWatch、T0Watch、T1Watch,主程序每循环一次,MWatch加1,同样T0、T1中断服务程序执行一次,T0Watch、

T1Watch加1。在T0中断服务程序中通过检测T1Watch的变化情况判定T1运行是否正常,在T1中断服务程序中检测 MWatch的变化情况判定主程序是否正常运行,在主程序中通过检测T0Watch的变化情况判别T0是否正常工作。若检测到某观测变量变化不正常,比如应当加1而未加1,则转到出错处理程序作排除故障处理。当然,对主程序最大循环周期、定时器T0和T1定时周期应予以全盘合理考虑。限于篇幅不赘述。

2、系统故障处理、自恢复程序的设计
单片机系统因干扰复位或掉电后复位均属非正常复位,应进行故障诊断并能自动恢复非正常复位前的状态。

(1)非正常复位的识别
程序的执行总是从0000H开始,导致程序从0000H开始执行有四种可能:一、系统开机上电复位;二、软件故障复位;三、看门狗超时未喂狗硬件复位;四、任务正在执行中掉电后来电复位。四种情况中除第一种情况外均属非正常复位,需加以识别。

硬件复位与软件复位的识别
此处硬件复位指开机复位与看门狗复位,硬件复位对寄存器有影响,如复位后PC=0000H,SP=07H,PSW=00H等。而软件复位则对SP、 SPW无影响。故对于微机测控系统,当程序正常运行时,将SP设置地址大于07H,或者将PSW的第5位用户标志位在系统正常运行时设为1,那么系统复位时只需检测PSW.5标志位或SP值便可判此是否硬件复位。

由于硬件复位时片内RAM状态是随机的,而软件复位片内RAM则可保持复位前状态,因此可选取片内某一个或两个单元作为上电标志。设40H用来做上电标志,上电标志字为78H,若系统复位后40H单元内容不等于78H,则认为是硬件复位,否则认为是软件复位,转向出错处理。若用两个单元作上电标志,则这种判别方法的可靠性更高。

开机复位与看门狗故障复位的识别
开机复位与看门狗故障复位因同属硬件复位,所以要想予以正确识别,一般要借助非易失性RAM或者EEROM。当系统正常运行时,设置一可掉电保护的观测单元。当系统正常运行时,在定时喂狗的中断服务程序中使该观测单元保持正常值(设为AAH),而在主程中将该单元清零,因观测单元掉电可保护,则开机时通过检测该单元是否为正常值可判断是否看门狗复位。

正常开机复位与非正常开机复位的识别
识别测控系统中因意外情况如系统掉电等情况引起的开机复位与正常开机复位,对于过程控制系统尤为重要。如某以时间为控制标准的测控系统,完成一次测控任务需1小时。在已执行测控50分钟的情况下,系统电压异常引起复位,此时若系统复位后又从头开始进行测控则会造成不必要的时间消耗。

因此可通过一监测单元对当前系统的运行状态、系统时间予以监控,将控制过程分解为若干步或若干时间段,每执行完一步或每运行一个时间段则对监测单元置为关机允许值,不同的任务或任务的不同阶段有不同的值,若系统正在进行测控任务或正在执某时间段,则将监测单元置为非正常关机值。那么系统复位后可据此单元判系统原来的运行状态,并跳到出错处理程序中恢复系统原运行状态。

(2)非正常复位后系统自恢复运行的程序设计
对顺序要求严格的一些过程控制系统,系统非正常复位否,一般都要求从失控的那一个模块或任务恢复运行。所以测控系统要作好重要数据单元、参数的备份,如系统运行状态、系统的进程值、当前输入、输出的值,当前时钟值、观测单元值等,这些数据既要定时备份,同时若有修改也应立即予以备份。

当在已判别出系统非正常复位的情况下,先要恢复一些必要的系统数据,如显示模块的初始化、片外扩展芯片的初始化等。其次再对测控系统的系统状态、运行参数等予以恢复,包括显示界面等的恢复。之后再把复位前的任务、参数、运行时间等恢复,再进入系统运行状态。

应当说明的是,真实地恢复系统的运行状态需要极为细致地对系统的重要数据予以备份,并加以数据可靠性检查,以保证恢复的数据的可靠性。其次,对多任务、多进程测控系统,数据的恢复需考虑恢复的次序问题。

系统基本初始化是指对芯片、显示、输入输出方式等进行初始化,要注意输入输出的初始化不应造成误动作。而复位前任务的初始化是指任务的执行状态、运行时间等。

对于软件抗干扰的还有一些其它常用方法,如数字滤波、RAM数据保护与纠错等。在工程实践中通常都是几种抗干扰方法并用,互相补充完善,才能取得较好的抗干扰效果。从根本上来说,硬件抗干扰是主动的,而软件抗干扰是被动的。细致周到地分析干扰源,硬件与软件抗干扰相结合,完善系统监控程序,设计一稳定可靠的单片机系统是完全可行的。

来源:电子发烧友网

围观 31

看到这篇文章的朋友,想必大家对pic单片机均具备一定兴趣,或对pic单片机具备一定使用需求。前文中,小编曾对pic单片机汇编语言进行过部分讲解。本文中,将对pic单片机的清零等指令加以讲解,以帮助大家更好掌握pic单片机编程。

一、清零指令

1.寄存器清零指令

实例:CLRW;寄存器W被清零

说明:该条指令很简单,其中W为PIC单片机的工作寄存器,相当于MCS-51系列单片机中的累加器A,CLR是英语Clear的缩写字母。

2.看门狗定时器清零指令。

实例:CLRWDT;看门狗定时器清零(若已赋值,同时清预分频器)说明:WDT是英语Watchdog Timer的缩写字母。CLR见上述说明。注意该两条指令无操作数。

3.寄存器f清零指令。指令格式:CLRF f

实例:CLRF TMRO;对TMRO清零

说明:在PIC系列8位单片机中,常用符号F(或f)代表片内的各种寄程器和F的序号地址。F取值按PIC系列不同型号而不同,一般为Ox00~Ox1F/7F/FF。TMRO代表定时器/计数器TMRO,所以CLRF对寄程器清零,采用了直接寻址方式直接给出要访问的寄存器TMRO。

4.位清零指令。指令格式 BCF f,b

实例:BCF REG1,2;把寄存器REG1的D2位清零

说明:BCF是英语Bit Clear F的缩写。指令格式中的F,同上说明;符号b是表示PIC片内某个8位数据寄存器F的位号(或位地址),所以b的取值为0~7或D0~D7。实例中REG是Register的缩写。实例中的2代表指令格式中的b=2即寄存器REG1的D2位。

通过上述四条清零指令格式和实例,可以说明,学习PIC系列8位单片机的指令时应首先了解指令的助记符意义(功能),再有就是它的表达方式。初学者没有必要死记指令,重要是理解和实践。

PIC单片机的清零指令详解

二、面向字节、常数与控制操作的指令

1.传送立即数至工作寄存器W指令

指令格式:MOVLW k;k表示常数、立即数和标号说明:MOVLW是Move Literal to w的缩写

实例:MOVL 0x1E;常数30送W

2.I/O口控制寄存器TRIS设置指令

指令格式;TRISf

说明;TRIS f是Load TRIS Register的缩写。其功能是把工作寄存器W的内容送入I/O口控制寄存器f。当W=0时,置对应I/O口为输出;W=1,置I/O口为输入。

实例:MOVLW 0x00 ;把00H送入W

TRIS RA ;置PIC RA口为输出

MOVLW 0xFF ;把FFH送入W

TRIS RB ;置PIC RB口为输入

说明:这是PIC汇编语言中常用的几条指令,即设置某个I/O口(这里是RA口和RB口)为输入或输出的语句。可见,识读指令时,一应充分理解语句格式的功能,二应前后联系阅读。

PIC单片机的清零指令详解

3.W寄存器内容送寄存器f(W内容保持不变)指令指令格式:MOVWF f

说明:MOVWF是Move W to f的缩写

实例:MOVLW 0x0B;送0BH送W

MOVWF 6 ;送W内容到RB口

说明:第一条指令0x0B(常数11)送工作寄存器W,第二条指令,把W内容常数11送到寄存器F6中,查表F6即为RB口,所以PORT_B(B口)=0BH=D114.寄存器f传送指令

指令格式:MOVF f,d

说明:MOVF是Move f的缩写。F代表PIC中的某个寄存器。指令中的d规定:d=0时,f内容送W;d=1时,f内容送寄存器。

实例:MOVF 6,0 ;RB口内容送W

MOVWF 8 ;RB口内容送f8

说明:第一条指令中的6代表寄存器f=6,查寄存器表f=6为RB口;0代表d=0,代表选择的目标为寄存器W。第二条指令中的8代表寄存器f=8。所以两条指令结果是把RB口的内容送f8。至于f8内容是多少?还应在汇编语言开始时附加指令,这里从略。

5.空操作指令

指令格式:NOP

说明:NOP是英语No OperaTIon的缩写。NOP无操作数,所以称为空操作。执行NOP指令只使程序计数器PC加1,所以占用一个机器周期。

实例:MOVLW 0xOF;送OFH到W

MOVWF PORT_B ;W内容写入B口

NOP ;空操作

MOVF PORT_B,W ;读操作

说明:该三条指令是一种对I/O口的B口连续操作的实例,其目的达到写入B口的内容要读出时,应保证写、读之间有个稳定时间,因此加入了空操作指令NOP。

6.无条件跳转指令

指令格式:GOTO k

说明:执行该条指令时,将指令转移到指定的地址(跳转)。指令中的k,常与程序中的标号联系起来。

实例:见第9条指令中

7.寄存器内容减1,结果为零的间跳指令

指令格式:DECFSZ f,d

说明:DECFSZ是英语Decrement f,Skip of not 0的缩写。符号f,d代表的意义,前述已作说明。该条指令是指寄存器的内容减1存入W(d=0)或f(d=1)中。若指令执行结果减1不为零,指令顺序执行;为零时,就间跳下一条指令后再执行(等效顺序执行一条空指令NOP),实际指令中,当d=1时,该项常被略去。

8.寄存器内容加1,结果为零间跳指令

指令格式:INCFSZ f,d

说明:INCFSZ是英语Increment f,Skip of 0的缩写。该条指令与上一条(7)指令差别仅在于“1”上,即执行这条指令时,寄存器f内容加1,若结果不为零,则指令顺序执行;为零则指令间跳执行。执行这条指令的其它逻辑关系与上条相同。

9.子程序返回指令

指令格式:RETLW k

说明:RETLW是Return Literal to W的缩写。该指令代表子程序返回,返回前先把8位立即数送W。

来源:畅学单片机

围观 142
订阅 RSS - undefined