混合信号嵌入式设计实验指南-数字实验之:实验2—中断

时间:2013-12-26来源:网络

下面给出了代码的例子(也可用于Lab2C)

#include m8c.h> // part specific constants and macros

#include PSoCAPI.h // PSoC API definitions for all User Modules

extern unsigned char bShadow=0; void main(void)

{

PRT1DR=0;

INT_MSK0|=0x40;

M8C_EnableGInt;

while(1)

{

M8C_Sleep; //sleep commandbShadow++; PRT1DR=bShadow;

}
}

1.2.4 实验2D—汇编器中断服务例程

步骤1:创建新的工程。复制Lab2C,将其命名为Lab2D。

所有参数和跳线连接保持一样。重新生成应用。

步骤2:修改代码。创建新的名字为SleepTimerRoutines.asm 的汇编文件。打开该文件,并按照图1.16 所示添加代码。

图1.16 SleepTimer 中断服务程序

需要注意这个工程中的一些条目:

保存累加器的值,以后从堆栈中恢复。中断硬件只保护程序计数器和标志寄存器,这是一个中断服务程序的最小要求。其他主程序使用的寄存器也需要保护。这通常是通过将它们暂存在堆栈中实现的。

bShadow 是一个在main.c 中声明的全局变量。当使用汇编语言时,必须在这个变量前加一个下划线。反之,任何一个在汇编文件中定义的全局变量,必须以下划线开头,为了让C 例程能找到它。

例程以reti 结尾。—打开boot.asm 文件,在休眠定时器向量位置放置如下代码:ljmp SleepTimerISR 练习2D-1 :这个指令要求多少个字节?

重新生成工程。

打开boot.asm ,并且验证刚才输入的代码消失了,这是因为当每次重新生成工程时,每次都重写boot.asm 。对于这个地方的代码,必须输入到用于生成boot.asm 的模板文件。

打开boot.tpl ,将下面的代码放到休眠定时器向量位置。

ljmp SleepTimerISR

重新生成工程。

打开boot.asm ,验证代码现在驻留在正确的向量位置。

打开main.c 文件,删除控制循环内的所有代码。程序始终处于这个循环,一直等到在休眠定时器中断服务程序中为休眠定时器服务为止。

重新建立工程,下载到Eval1 板子,并运行。

像前面一样验证程序。

1.2.5 实验2E—C 语言中断服务例程

步骤1:创建新的工程。

复制Lab2D,将其命名为Lab2E。

所有参数和跳线连接保持一样。

重新生成应用。

步骤2:修改代码。

删除名字为SleepTimerRoutines.asm 的汇编文件。

打开main.c 文件,并按照图1.17 所示添加代码。

图1.17 Lab2C 控制软件

需要注意这个工程中的一些条目:

Pragma 允许一个函数被用做一个中断句柄。编译器将自动添加必要的代码来保护它所使用的任何寄存器。它被用做一个也添加reti。当然,这样一个函数不能接受参数和返回一个结果。

练习2E-1:为什么?

将必要的代码添加到该函数中,实现前面的汇编中断服务程序。打开boot.tpl ,转到休眠定时器向量,在SleepTimerISR 前面添加下划线。注意:对于在C 中声明的函数和变量,添加下划线。如果在C 中声明了一个变量

CVar ,则在汇编例程中作为_iCVar 使用,在C 中作为iCVar 使用。如果_iAsmVar 在汇编语言中声明为一个变量,则它在汇编例程中作为_iASmVar 使用,在C 例程中作为iCVar 使用。iAsmVar 是一个在汇编语言中声明的变量,它可以在汇编例程中作为iASmVar 使用,但在C 中不可使用。

重新生成应用,重新建立工程,下载到Eval1 板子,运行;像前面一样验证程序。

1 2 3 4

关键词: 混合信号 嵌入式设计 数字实验 中断

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版