PIC——MCC18中断写法

合集下载

使用MCC学习PIC单片机 – SMT 信号测量定时器

使用MCC学习PIC单片机 – SMT 信号测量定时器
// WPOL high/rising edge enabled; SMT1STProlls over to 24'h000000; SMT1SPOL high/rising edge enabled; SMT1EN enabled;SMT1PS 1:4 Prescal er; SMT1CPOL rising edge;
SMT 模块输出
输出有两种,2 种测量结果值,3 个中断 测量结果寄存器:SMTxCPR 周期测量结果,SMTxCPW 脉宽测量结果 中断:匹配中断,周期采集中断,脉宽采集中断
工作模式 为方便记忆理解,可分为计时类和计数类。计时(Timer)类,使用时钟信号做 时基,每时钟周期,24 位定时器数值加 1。
voidSMT1_ManualTimerReset(void) {
SMT1STATbits.SMT1RST = 1; } 窗口状态(打开 或者关闭?)
boolSMT1_IsWindowOpen(void) {
return (SMT1STATbits.SMT1WS); } 查询 SMT 采集是否正在进行 boolSMT1_IsSignalAcquisitionInProgress(void) {
return (SMT1CPW);
} 周期寄存器值 uint32_tSMT1_GetCapturedPeriod() {
return (SMT1CPR); } 得到 24 位定时器值 uint32_tSMT1_GetTimerValue() {
return (SMT1TMR); } 周期采集中断服务程序 voidSMT1_PR_ACQ_ISR(void) {
计数(Counter)类,使用 SMT 信号来驱动 24 位定时器,在每个 SMT 信号的上 升沿或下降沿,24 位定时器数值加 1.

PIC中档单片机的中断总结

PIC中档单片机的中断总结

PIC中档单片机的中断总结对于来说,一次中断的过程大致有下列阶段:为了使得解释形象和直观,本文采纳一些诙谐的语句来比方解释:中断哀求---------比方成申请买经济适用房的哀求中断标记-------一份申请书本中断使能xxIE-----本单位领导PEIE-------------户口办公室主任GIE--------------银行的管理信贷的科长中断哀求:房子太少,儿子要结婚了,得买房了,可资源和财力有限,不能卖商品房,只好按特别状况处理,写一份申请书(中断标记位IF 置1);本单位领导xxIE看了之后,假如给你盖了一个戳:(即该中断使能位IE=1),那么恭喜你,这份申请书可以提交到更高一级的部门;假如没盖(xxIE= 0),那么对不起,先放我这里吧,等我们讨论讨论好后再说。

假如你不愉快,要拿回申请书撕掉,呵呵,那么IF=0;你的购房哀求之梦破灭;xxIE领导将按照户口,将这些哀求书给分类,一类是外地迁来的户口,提交给户口办公室PEIE主任审查,PEIE主任假如给你盖了个戳(PEIE= 1),那么,他将会把申请书提交给银行的GIE科长批准,否则就是放在这里再讨论讨论或者你要回归撕毁;一类是本地户口,可挺直提交给银行的GIE科长批准,然后你将申请书带到GIE科长的办公室。

GIE科长盖了章之后(GIE=1),然后,你就可以拿着申请书去找房地产商要房子了(此时PC指针=0004H),由于GIE科长有无数事情要做,所以他每盖了一次戳之后(注重是一次不是一个,由于大概有多个中断同时发生,也就是说有其他地方的人来请GIE盖戳),就在办公室门外挂了个牌子:请勿打搅。

他自己则歇息去了,直到接到RETFIE的电话或者有人打他的手机。

房地产商预备给房子了,不过你最好得先把各项手续给填好,叫5w押第1页共4页。

MCC18使用随笔

MCC18使用随笔

修改时间:2010-08-02修改人 :张元南 修改说明:不作为系统入门的指导文档,仅作为初次接触MCC18的开发人员的辅助文档。

部分观点为一家之言,还请理解。

MCC18使用随笔一、为什么使用MCC18MCC18编译器是MICROCHIP自主开发的针对PIC18系列MCU的编译器。

在中国大陆,就笔者的多年FAE的经验,在用C语言开发PIC18的用户中,与PICC18各占半壁江山。

笔者比较系统使用MCC18开发不过是今年7月份以来的事情。

为什么选择MCC18?有一个主要理由:没有版权问题,省心。

有一个次要理由:支持的协议栈丰富,包括实时操作系统。

MCC18的标准评估版,60天内与正版无任何差异,60天后仅仅优化功能无法使用,而大多数PIC18F的项目,ROM和RAM空间并不紧张,不优化,也无所谓。

MCC18可以最快支持PIC18系列的芯片,尤其是廉价的PIC18J,PIC18K系列,支持可靠,稳定。

所谓可靠稳定是指编译结果可靠。

稳定则是指不会突然发生一些奇异的功能缺失。

此外,目前MICROCHIP自己开发的协议栈,PIC18系列,已经只提供对MCC18的支持,PICC18需要自己动手处理,而笔者钟爱的F*R*E*E*RTOS,以及其它OS,找到对MCC18的现成移植是很容易的。

二、MCC18的“缺点”1)格式死板,汇编痕迹多对比MCC18、PICC18对中断函数的声明,就可以发现此点。

MCC18有LKR文件,如果你定义一个超过256字节的全局变量,必须手动在RAM中为其指定固定地址,并修改LKR文件。

如果使用的局部变量超过256字节,也必须手动修改LKR文件,为其分配足够的堆栈区。

2)数学算法,整形提升,不够聪明笔者在开发PIC18的代码时,从PIC16F的PICC上移植了一些代码,结果一直得不到正确结果,经过DEBUG终于发现,编译器在进行数学运算,整形提升时,不够聪明。

比如以下代码:unsigned int OCVal,ICVal;OCVal = (PR2+1)*16 ;PIC8BIT芯片,PR2目前都是一个8位寄存器,尽管OCVal是16位整型,但由于算式右边都是8位整型,因此计算出的结果是将一个8位整型赋给OCVal,最后笔者被迫这么写代码:OCVal =(unsigned int) (PR2+1)*16 ;而采用PICC编译器,就不需要这么麻烦。

第5章 PIC单片机中断系统

第5章 PIC单片机中断系统

第5章中断系统•本章主要内容:•微机的输入微机的输入//输出方式•PIC18Fxx2中断系统结构及中断控制PIC18Fxx2中断系统结构及中断控制•中断响应及处理过程•外部中断扩展方法•中断程序举例读入状态信息准备好?启动外设设备延时NO查询方式程序流程图YES(a)(b)所有数据传送完毕?YESNOYES所有数据传送完毕?NO 传送一个字节数据传送一个字节数据5.2 PIC18Fxx2中断系统结构及中断控制•程序查询方式因为CPU要花大量的时间等待慢速的外设准备好,因此CPU的利用率大大降低。

•是否有一种方式,外设准备好之后能够自动通知CPU,让CPU来处理?这样,外设在准备的时间段中,CPU可以处理其他的事情。

而外设一旦有需求,CPU可及时响应它的需求。

•采用中断技术既能保证CPU的效率又能保证系统的实时性。

5.2.1中断的概念•当CPU CPU正在处理某事件的正在处理某事件的时候,外部发生的某一事件请求事件请求CPU CPU迅速去处理,迅速去处理,于是于是CPU CPU暂时中止当前的暂时中止当前的工作,转去处理所发生主程序中断服务程序的事件。

中断服务处理完该事件后,再返回到原来被中止的地方继续原来的工作,这样的过程称为中断。

•中断事件与调用事件的区别?务程序继续执行主程序断点中断流程图5.2.2 中断技术实现的功能2、实时处理•当计算机用于实时控制时,需要提供服务的请求是随当计算机用于实时控制时,需要CPUCPU提供服务的请求是随CPU就可以立即响应并加以处就可以立即响应并加以处机发生的。

有了中断系统,机发生的。

有了中断系统,CPU理。

3、故障处理•计算机在运行时往往会出现一些故障,如断电、存储器奇偶校验出错、运算溢出等。

•有了中断系统,当出现上述情况时,可及时转去执行CPU可及时转去执行有了中断系统,当出现上述情况时,CPU故障处理程序,自行处理故障而不必停机。

5.2.3 PIC18Fxx2中断源•产生中断的请求源称为中断源。

PIC单片机的中断程序

PIC单片机的中断程序

PIC单片机的中断程序PIC 单片机的中断程序中断是 PIC 高手必须掌握的武器,转贴一篇,还希望大家补充发表对中断应用的见解。

与 51 或者其他系列的单片机相比,PIC 单片机的中断机制有其特殊之处,针对我们一些初学者存在的一些问题和疑惑,我在此做一个个人总结,不当的地方,请站友们指正。

先摘引三个对 PIC 中断理解的回帖,然后我再对中断活动的过程、应该注意的事项、及一个疑惑进行较详细的总结和解释。

--------------- john frank :关于 pic 中断有些不明白的地方借用大虾的程序中断服务代码 btfss INTCONT0IE 判断是否为 T0 中断 goto other_int btfssINTCONT0IF it ?s the time of T0 int goto other_int bcf INTCONT0IF 是T0 中断清除中断标志 movlw 0x10 微秒的高位字节加上定时时间 256x16 分频40960x1000 的高位0x10addwf us1goto end_intother_int 可添加其他中断服务代码nop other isr code can be added end_int 恢复现场假如又有新的中断正好在这段程序中间产生 btfss INTCONT0IFgoto other_intbcf INTCONT0IF 程序岂不是要出错跑飞了 john frank:谢谢你的关注。

我讲一下自己的理解,权做回答,不当之处,还请站友们指点。

pic 中档单片机系列没有“硬件中断优先级别”(请允许我这样说),含义是指:当内核正在处理当前的中断服务 A 时,在这个期间里,其他任何中断的产生,只能使其标志位 xxIF 置 1,不能剥夺当前中断服务对CPU 的占用权(反应在 PC 指针不能被新的中断改变指向),必须等到当前中断服务处理 A 完毕,然后,根据 goto other_int 语句的转向,依次判断。

PICC18使用说明

PICC18使用说明

PICC18使用说明2007-5-18翻译人:张元南指导校对:翻译修改时间:2007-4-20地点:中国福州重要说明:仅就PICC18V9.50PL3安装目录下的使用手册的编程使用最紧密相关的部分做翻译。

本翻译纯粹为本人业余兴趣所致。

本人不承担因翻译错误、偏差带来的任何后果。

并且保留在不做通知的情况下升级本翻译文档的权利。

请查阅英文原始版本说明书,本文仅做入门参考。

另外,本文翻译的目的在于加深对PICC1 8的认识和理解,所以将大量采用意译而非逐字翻译。

故可能和英文原版有较大的篇幅差别。

版本说明:增加了对指针的翻译,中断处理部分的翻译。

3.1.1 与ANSI标准C的区别受PIC18 MCU的硬件限制,PICC18不支持函数的递归调用。

3.1.2同样的C代码可能在不同版本的编译器或者不同的编译器之间会编译成不同的汇编代码。

3.2.1编辑安装目录下的pic-18.ini文件,可以增加用户自定义的新的PIC18系列的MCU。

3.2.2 CONFIG的操作PICC18可以在源代码中配置CONFIG,由于PIC18 MCU的CONFIG有多个字节,所以采用如下语法:__CONFIG(2, BW8 & PWRTDIS & WDTPS1 & WDTEN);注意,前面是两个下划线,这是一个宏__CONFIG()。

该宏的定义在系统文件htc. h中,根据PICC18编译器特性,如果再每个源文件中都使用了#include <pic18.h>,使用该宏则可不必再写#include <stc.h>。

这个宏,必须在函数外使用。

3.2.3 ID区定义和CONFIG区操作类似,采用如下语法:__IDLOC(15F01);注意,前面是两个下划线,这是一个宏__CONFIG()。

该宏的定义在系统文件htc. h中,根据PICC18编译器特性,如果再每个源文件中都使用了#include <pic18.h>,使用该宏则可不必再写#include <stc.h>。

PCI-中断路由机制教学提纲

PCI-中断路由机制教学提纲

P C I-中断路由机制PCI中断路由机制PCI中断是可选的,中断是电平触发,低电平有效,集电极开路驱动。

中断信号与PCI CLK异步,设备一旦断言为低,则要维持低电平状态,直到驱动程序清除这个中断请求。

PCI中断可以为通过链的方式来共享。

下文会仔细分析。

1. PCI 中断的硬件组成如图1所示:在PCI 总线上中断请求信号引出脚有INTA# - INTD# 4个,单功能设备只能使用INTA#,而对于多功能设备,各功能设备可任意接至PCI 总线的四条中断申请线INTA# - INTD# 。

与中断密切相关的PCI配置寄存器是中断引脚寄存器(Interrupt Pin:0x3C) 和中断线寄存器(Interrupt Line:0x3B)。

图1中断的硬件结构中断引脚寄存器(Interrupt Pin:0x3C):它是一个8 位的寄存器,由接口设计者根据PCI设备使用的PCI 总线中断引脚(INTA# - INTD#)来设置:如果设备使用INTA#脚来申请中断,该寄存器应写入1;如果设备使用INTB#脚来申请中断,该寄存器应写入2;如果设备使用INTC#脚来申请中断,该寄存器应写入3 ;如果设备使用INTD#脚来申请中断,该寄存器应写入4;如果设备不使用中断,该寄存器应写入0,0x05 到0xFF为保留值。

中断线寄存器(Interrupt Line:0x3B):对于X86 系列的PC 机,各个插槽的INTA# - INTD#引脚由主板设计者通过可编程路由器接到由主从两个8259A 组成的系统中断控制器的IRQ0 - IRQ15 引脚共计16个引脚中的未使用引脚上。

中断线寄存器(Interrupt Line)用于保存中断路由信息的寄存器,在初始化和配置系统时,HOST把路由信息写入到该寄存器。

在PCI 接口卡配置空间中,该寄存器的值表明设备的中断引脚( INTA# - INTD#)被连接到系统中断控制器的哪一个引脚(1RQO - IRQ15中的哪一个)上了。

picc18中断

picc18中断

//1,选为定时器,分频 1:8,16 位定时器 //2,定时器装初值 //延时=8*(65536-3036)*1us=0.5s //3,清中断标志位,抗干扰 //4,设置高中断 //设置 T0 中断 //5,启动 T0。
//1,选为定时器,分频 1:8,16 位定时器 //2,定时器装入初值 //延时=8*(65536-3036)*1us=0.5s //3,清中断标志位,抗干扰 //4,设置 T1 为低中断 //设置 T1 中断 //4,启动 T1
void ISRRL (void) { _asm goto t1_deal //jump to interrupt routine, 没有在 文 件 头 声明一 次 中断函数,故 必须把中断代码放在此声明前,ISRH 并非保留字,语法上可以随便更换 _endasm } #pragma code start = 0x2A void main() { LED1=1; LED2=1; TLED1=0; TLED2=0; //主函数最低开始地址为 0X2A。
{ if(PIR1bits.TMR1IF&&PIE1bits.TMR1IE) { PIR1bits.TMR1IF=0; //1,清中断标志位 TMR1L=0xDC; TMR1H=0x0B; LED2=~LED2; 取反 } } //2,定时器重新装初值
//3 ,中断服务程序, 本例子为对 RB0
void ini_t0(void) { T0CON=0x02; TMR0L=0xDC; TMR0H=0x0B; INTCONbits.TMR0IF=0; INTCON2bits.TMR0IP=1; INTCONbits.TMR0IE=1; T0CONbits.TMR0ON=1; } void ini_t1(void) { T1CON=0xB0; TMR1L=0xDC; TMR1H=0x0B; PIR1bits.TMR1IF=0; IPR1bits.TMR1IP=0; PIE1bits.TMR1IE=1; T1CONbits.TMR1ON=1; }

PIC18F单片机的中断嵌套的C语言编程方法

PIC18F单片机的中断嵌套的C语言编程方法

PIC18F单片机的中断嵌套的C语言编程方法PIC18F4520单片机提供多个中断源及一个中断优先级功能,可以给大多数中断源分配高优先级或者低优先级.高优先级中断向量地址为0008H,低优先级中断向量地址为0018H。

高优先级中断事伯将中断所有可参正在进行的低优先级中断。

有10个寄存器用于控制中断的操作。

它们是:RCONINTCONINTCON2INTCON3PIR1和PIR2PIE1和PIE2IPR1和IPR2通常,用三个位控制中断源的操作。

它们是:标志位表明发生了中断事件使能位允许程序跳转转到中断向量地址处执行(当标志位置1时)优先级用于选择是高优先级还是低先级通过将IPEN位(RCON<7>)置1,可使能中断优先级功能。

当使能中断优先级时,有2位可使能全局中断。

将GIEH位(INTCON<7>)置1,可使能所有优先级位置1(高优先级)的中断。

将GIEL位(INTCON<6>)置1,可使能所有优先级位清零(低优先级)的中断。

当中断标志位、使能位以及相应的全局中断使能位均被置1时,程序将立即跳转到中断地址0008H或0018H,具体地址取决于优先级位的设置。

通过设置相应的使能位可以禁止单个中断。

注意:系统复位时IPEN位为零(默认状态)时,便会禁止中断优先级功能,此时中断与PIC16系统中档单片机相兼容。

在兼容模式下,所有中断均跳转到地址0008H执行。

下面是在SP9608-PIC增强型单片机开发板利用PIC18F4520单片机来实现的数字频率计数器功能,程序中使用了T0用为外部信号源输入,通TMR0来实现对信号源的频率计数。

TMR3作为定时器,来产生1mS数码管扫描时基和1S秒时基信号。

为了提高频率计数的准确度,采用中断嵌套技术来完成,将TMR3产生1mS的定时信号作为高优先级中断,TMR0作为频率计数溢出中断作为低先级中断。

源程序采用MCC18编译器和MPLAB7.50版本的集成开发环境,调试工具采用ICD2;具体源程序如下:系统时钟:采用外部的12MHz晶振经过内部PLL的4倍频到48MHz。

pic单片机串口中断写法

pic单片机串口中断写法

pic单片机串口中断写法在PIC单片机中,串口中断的写法通常涉及到以下几个步骤:1. 配置串口:首先,你需要配置PIC单片机的串口模块。

这包括设置波特率、数据位、停止位等参数。

2. 配置中断:接下来,你需要配置PIC单片机的中断模块。

你需要设置中断触发方式(上升沿、下降沿或电平变化),并启用串口中断。

3. 编写中断服务程序:最后,你需要编写串口中断服务程序。

当串口接收到数据或发送数据完成时,将触发中断。

在中断服务程序中,你可以执行相应的操作,例如读取接收到的数据或发送数据。

下面是一个简单的例子,展示了如何编写PIC单片机的串口中断服务程序:```cinclude <>define _XTAL_FREQ // 定义振荡器频率为4MHzvoid main(void)// 配置振荡器OSCICN = 0b; // 设置振荡器频率为4MHz// 配置串口SPBRG = 0x18; // 设置波特率为9600,根据需要调整TXSTA = 0b; // 设置数据位为8位,无奇偶校验位,停止位为1位 RCSTA = 0b; // 启用串口模块,使能发送和接收TRISC6 = 1; // 将TX引脚设置为推挽输出模式TRISC7 = 0; // 将RX引脚设置为输入模式// 配置中断INTCON = 0b; // 启用全局中断,并设置触发方式为下降沿触发 PIR1 = 0b; // 清除串口接收中断标志位PIE1 = 0b; // 使能串口接收中断// 主循环while (1){// 在此处添加其他代码...}// 串口接收中断服务程序void __ISR _U1RXInterrupt(void) interrupt 5 using 2{char receivedByte;receivedByte = RCREG; // 读取接收到的字节// 在此处添加处理接收到的字节的代码...}```请注意,上述代码只是一个简单的示例,实际应用中可能需要根据具体需求进行修改和扩展。

PIC_MCC程序手册

PIC_MCC程序手册

图1.2.1 模拟中所用的系统模型(a),系统模型z轴方向上网格点的划分。

0点为接射频电极极板端,Z N 为接地电极极板端。

1.2.1 PIC模型中一个时间步循环的数值计算图1.2.2 PIC一个时间步的循环运算(1)电荷密度ρj 被分配到每个网格点j上,这个过程称之为电荷分配。

因此,先从连续的节点Zpi 然后再到离散的节点Zj来计算电荷密度ρj 。

电荷分配函数可用S(Zj-Zpi)来表示,包括零节点,第一节点和最后节点。

图1.2.3中所描述的是第一节点的电荷分配方式。

这种分配方式把Zj 节点上的j单胞和Zj+1 节点上的(j+1)单胞这部分电荷看做带电粒子或电荷云。

这种带电粒子看做是一种有限度的刚性电荷云,他们可以在通过彼此时不受束缚而自由运动,这种模型我们称之为cloud_in_cell或者CIC.图1.2.3如果电荷粒子的密度是一定的,j和j+1之间的距离为△Z,那么电荷粒子q pi 分配给节点j的电量为:分配给节点j+1的电量为:因此,在Z pi 上的电荷粒子q pi 分配给j节点的电荷密度ρj 为:(2)电荷密度可以用来计算网格点上的电场E。

在静电场模拟中,▽*E=-əB/ət ≈0,所以E=-▽Φ,由一维条件下的Poisson方程可以得到:电场可以由以下公式计算得出:(3)E又按照函数S(Z j-Z pi)分配给网格点上的粒子。

在一维的静电场模型中,电场分配各网格点的电场为:带电粒子所受的电场力为F=qE,一维静电场模型中:(4)运动方程可以计算出带电粒子新的位置和速度。

在一维静电场模型中,可用以下方程代替上述运动方程:因为带电粒子的速度v和位置x是不能同时确定的,所以leap_frog算法要采用不同模式原则。

图1.2.2 leap_frog算法的网格点划分示意图。

应注意到初始条件下带电粒子在时间t=0时的速度是需要改变的,把v(0)处的速度V退回到v(-△t/2)处,然后通过带电粒子所受的电场力还计算t=0时的速度。

关于pic18f4550的c语言编程实例

关于pic18f4550的c语言编程实例

关于pic18f4550的c语言编程实例下面的示例应用程序将使得与PIC18C452 单片机PORTB 端口相连的LED 闪烁。

编译此应用程序的命令行是:mcc18 -p 18c452 -I c:\mcc18\h leds.cc:\mcc18 是安装编译器的目录。

这个示例应用程序设计为与PICDEM 2 演示板配合使用。

示例程序包括:1. 中断处理(#pragma interruptlow、中断向量、中断服务程序和现场保护)2. 系统头文件3. 针对处理器的头文件4. #pragma sectiontype5. 行内汇编/* 1 */ #include/* 2 */ #include/* 3 *//* 4 */ #define NUMBER_OF_LEDS 8/* 5 *//* 6 */ void timer_isr (void);/* 7 *//* 8 */ static unsigned char s_count = 0;/* 9 *//* 10 */ #pragma code low_vector=0x18/* 11 */ void low_interrupt (void)/* 12 */ {/* 13 */ _asm GOTO timer_isr _endasm/* 14 */ }/* 15 *//* 16 */ #pragma code/* 17 *//* 18 */ #pragma interruptlow timer_isr save=PROD/* 19 */ void/* 20 */ timer_isr (void)/* 21 */ {/* 22 */ static unsigned char led_display = 0;/* 23 *//* 24 */ INTCONbits.TMR0IF = 0;/* 25 *//* 26 */ s_count = s_count % (NUMBER_OF_LEDS + 1);/* 27 *//* 28 */ led_display = (1 << s_count++) - 1;/* 29 *//* 30 */ PORTB = led_display;/* 31 */ }/* 32 *//* 33 */ void/* 34 */ main (void)/* 35 */ {/* 36 */ TRISB = 0;/* 37 */ PORTB = 0;/* 38 *//* 39 */ OpenTimer0 (TIMER_INT_ON & T0_SOURCE_INT & T0_16BIT);/* 40 */ INTCONbits.GIE = 1;/* 41 *//* 42 */ while (1)/* 43 */ {/* 44 */ }/* 45 */ }第 1 行:这一行包含了一般处理器头文件。

PIC——MCC18中断写法

PIC——MCC18中断写法

PIC——MCC18中断写法PIC——MCC18中断写法MPLABC18 不自动把中断服务程序放在中断向量处。

通常将GOTO 指令放在中断向量处,从而把控制权转交给相应的中断服务程序。

PIC18 系列的低优先级中断入口地址在0x0018 地址,下面的代码是在入口地址处放置一个向量函数,这个向量函数里就是一个内嵌汇编的GOTO 指令,GOTO 到低优先级的中断服务函数InterruptHandlerLow。

//----------------------------低优先级中断入口-----------------------------------1#pragmacodeInterruptVectorLow=0x18//用#pragma 伪指令定义一个名字叫InterruptVectorLow 的段,并把这个段放到0x18 地址起始的代码空间2voidInterruptVectorLow(void)//低优先级中断向量函数3{4_asm5gotoInterruptHandlerLow//内嵌汇编指令6_endasm7} 8#pragmacode//这里不是多余的,它是告诉连接器回到默认的代码段,如果不加的话,连接器就会傻傻地把后面的代码紧跟着上面的代码一直放下去。

而LKR 文件里定义了向量区最多到0x29 地址,所以如果没加此行通常会报错910#pragmainterruptlowInterruptHandlerLow//这里使用interruptlow 这个关键词来声明InterruptHandlerLow 这个函数是低优先级中断服务函数,用了关键词后,这个函数将会由编译器自动产生基本的现场保护,并且这个函数的返回将是使用RETFIE 返回的。

111213voidInterruptHandlerLow(void)14{15/*低优先级服务函数的代码写在这里*/16}PIC18 系列的高优先级中断入口地址在0x0008 地址,下面的代码是在这个入口地址处放置一个向量函数,这个向量函数里就是一个内嵌汇编的GOTO 指令,GOTO 到高优先级的中断服务函数InterruptHandlerHigh。

PIC18F452单片机原理及编程实践(第十一章)PIC 18的中断编程

PIC18F452单片机原理及编程实践(第十一章)PIC 18的中断编程
3. 如果中断源属于第二梯队(外设中断),还需将PEIE置 一(如: BSF INTCON,PEIE)。
INTCON寄存器各位定义 GIE PEIE MSB
2017/8/29
TMR0IE
INNT0IF
RBIF LSB
16
中断设置举例

编写出完成下列操作的指令: 允许定时器0的中断和外部以硬件引脚中断INT0;
主程序 断点 中断返回 中断响应 中断服 务程序

2017/8/29
6

编程者可对外设编写的ISR定义 在ROM的某一位置nnnn;
将与ISR地址相关的跳转指令存 放在ROM的特定单元 中,这些 单元称之-------中断向量 。 一旦CPU响应某一外设的中断申 请就首先跳到中断向量单元,并 从中获取跳转到ISR的指令、转 到真正的ISR中;
2017/8/29
8

在PIC18系统中只用一个中断向量单元。这就意味着不论 是谁引发的中断响应,CPU都会自动的跳转到0008H单元 中,那么如何实现不同中断源的ISR服务呢? 在系统编程中,如果使用了两个或两个以上的中断源时, 就要在向量的单元(0008H)中编写一段中断源查询的程 序:判断是哪个中断源引发的中断。 当然查询程序也可以在ROM的其他位置,但要有中断向 量中的指令来引导。如:在0008H单元中写入
2017/8/29
PEIE
GIE
第一梯队的中断使能 与PEIE无关
返回前一次
15
11.1.6 中断初始化的步骤(以TMR0为例)

使能任何一个中断,必须遵循下面的步骤: 必须将GIE置一 (BSF INTCON,GIE); 将对应的中断使能为置一
1. 2.
(如使能TMR0: BSF INTCON,TMR0IE);

pic18中断处理

pic18中断处理

pic18中断处理#include /* PIC18系列单片机头文件,具体使用的时候改成你自己的CPU *//** 声明中断服务函数*************************************************************/ void Low_ISR_Handler(void);void High_ISR_Handler(void);/** 中断向量******************************************************************* **///低优先级中断入口(只要产生低优先级中断,程序会自动跳转到这里执行)#pragma code Low_Vector_Section=0x0018void low_vector(void){_asm goto Low_ISR_Handler _endasm}//高优先级中断入口(只要产生高优先级中断,程序会自动跳转到这里执行)#pragma code High_Vector_Section=0x0008void high_vector(void){_asm goto High_ISR_Handler _endasm}#pragma code // 强制代码存放到此结束,代码的存放安排权利交还给编译器/** 中断服务程序***************************************************************/ //低优先级中断服务函数#pragma interruptlow Low_ISR_Handlervoid Low_ISR_Handler(void){// 对于多源终端处理方法:// 1. 查询自己所打开的中断的标志位,确定是哪个中断源提出了中断请求;// 2. 确定中断源后,执行对应的中断服务语句;// 3. 最后手动清除该中断源中断标志位// 如果只有一个同级中断源被使能,即单源中断,可省去中断标志判断:// 1. 执行中断服务语句// 2. 手动清除中断标记}//高优先级中断服务函数#pragma interrupt High_ISR_Handlervoid High_ISR_Handler(void){// 同上面的低优先级中断服务函数写法}/** 主程序******************************************************************* ***/void main(void){//省略其他初始化程序……//初始化中断//打开模块//打开总中断//省略其他程序……}详细解读:1. #pragma code Segment_Name=指定地址#pragma code预处理指令强制其下面的程序在程序存储器指定地址处开始存放,类似于汇编里面的org指令;其中红色斜体为固定预处理指令写法,不可更改。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PIC——MCC18中断写法
MPLABC18 不自动把中断服务程序放在中断向量处。

通常将GOTO 指令
放在中断向量处,从而把控制权转交给相应的中断服务程序。

PIC18 系列的低
优先级中断入口地址在0x0018 地址,下面的代码是在入口地址处放置一个向
量函数,这个向量函数里就是一个内嵌汇编的GOTO 指令,GOTO 到低优先级
的中断服务函数InterruptHandlerLow。

//----------------------------低优先级中断入
口-----------------------------------1#pragmacodeInterruptVectorLow=0x18//用#pragma 伪指令定义一个名字叫InterruptVectorLow 的段,并把这个段放到0x18 地址起
始的代码空间2voidInterruptVectorLow(void)//低优先级中断向量函数3{4
_asm5gotoInterruptHandlerLow//内嵌汇编指令6_endasm7} 8#pragmacode//这里不是多余的,它是告诉连接器回到默认的代码段,如果不
加的话,连接器就会傻傻地把后面的代码紧跟着上面的代码一直放下去。


LKR 文件里定义了向量区最多到0x29 地址,所以如果没加此行通常会报错
910#pragmainterruptlowInterruptHandlerLow//这里使用interruptlow 这个关键词
来声明InterruptHandlerLow 这个函数是低优先级中断服务函数,用了关键词后,这个函数将会由编译器自动产生基本的现场保护,并且这个函数的返回将是使
用RETFIE 返回的。

111213voidInterruptHandlerLow(void)14{15/*低优先级服务
函数的代码写在这里*/16}PIC18 系列的高优先级中断入口地址在0x0008 地址,
下面的代码是在这个入口地址处放置一个向量函数,这个向量函数里就是一个
内嵌汇编的GOTO 指令,GOTO 到高优先级的中断服务函数InterruptHandlerHigh。

//----------------------------高优先级中断入口-----------------------------------
1#pragmacodeInterruptVectorHigh=0x08//用#pragma 伪指令定义一个名字叫。

相关文档
最新文档