1、 掌握IRQ0、IRQ1、IRQ2中断的编程方法。【实验设备】 装有Windows系统和nSP? IDE集成开发环境的PC机一台,nSP?十六位单片机实验箱一个。 本实验用到的实验箱硬件模块为:SPCE061A核心及周边电路模块(包含32个I/O口),发光二极管电路模块。【实验要求】 编程要求:编写一个C语言程序。 实现功能: 打开并设置TimerA和TimerB定时器,并且开TimerA的IRQ1中断和TimerB的IRQ2中断,当有TimerA的IRQ1中断或者TimerB的IRQ2中断请求时,响应相应的中断服务程序,在中断服务中翻转I/O端口输出电平,以控制接在I/O端口的发光二极管的亮
2、灭。 实验现象:TimerA定时长度为2s,当进入TimerA的IRQ1中断后,翻转IOA口低四位输出电平以控制接在IOA低四位端口的发光二极管;TimerB定时长度为1s,当进入TimerB的IRQ2中断后,翻转IOB 口低四位输出电平以控制接在IOB 低四位端口的发光二极管。程序运行时,可以观察到接在IOA低四位端口的发光二极管亮灭的周期为4s,而接在IOB低四位端口的为2s【实验原理】【实验原理】IRQ0_fosc/1024、IRQ1_TMA、IRQ2_TMB中断源,通过写P_INT_Ctrl来允许中断,通过IRQ ON、INT IRQ或者INT FIQ,IRQ开总中断,其中IRQ ON
3、的功能是打开IRQ中断;INT IRQ的功能是打开IRQ中断,关闭FIQ中断;INT FIQ,IRQ的功能是打开FIQ和IRQ中断。IRQ1_TMA和IRQ2_TMB中断源分别是通过定时器A、定时器B产生的,当计数溢出时产生中断请求信号TA_TIMEOUT_INT或TB_TIMEOUT_INT,CPU响应后进入对应的中断服务子程序。中断控制寄存器的设置在本章实验九有详细说明,不再赘述。在本实验中,利用TimerA定时器定时一个固定长度时间,当定时时间到时产生溢出信号,进入TimerA的IRQ1中断IRQ1_TMA,翻转一次I/O口输出电平以控制接在对应I/O口的发光二极管,TimerA重新开始
4、计数,当计数到定时时间溢出再响应一次IRQ1_TMA中断,翻转一次IOA口低四位输出电平以控制接在IOA低四位端口的发光二极管,如此循环;同样,利用TimerB定时器定时一个固定长度时间,当定时时间到时溢出,进入TimerB的IRQ2中断IRQ2_TMB,翻转I/O口输出电平以控制接在对应I/O口的发光二极管。程序运行时,可以观察到接在I/O端口的发光二极管亮灭状态周期性变化。【硬件连接】IOA口低四位IOA03连接发光二极管D4D7,IOB口低四位IOB03连接发光二极管D8D11,即用一根排线将J16的第03号排针和IOA口低8位的第03号排针依次连接起来;用另一根排线将J16的第47号排
5、针和IO8口低8位的第03号排针依次连接起来。硬件连接图如图1-38。1. 主程序流程图 在主程序中,初始化 A 口、B 口为同相低电平输入口,设置定时器的计数初值和时钟源频率以确定定时器溢出频率(本实验中 TimerA 和 TimerB 的时钟源频率都选为 4096Hz,设置 TimerA 的定时时间为2s,设置 TimerB 的定时时间为 1s) ,开 IRQ0、IRQ1、IRQ2 中断。主程序流程图如图 1-41。2. 中断服务子程序流程图 IRQ0、IRQ1、IRQ2 中断服务子程序的流程图如图 1-42。IRQ1_TMA 中断中,先进行寄存器压栈保护,IOA 口低四位输出电平翻转,以
6、翻转 D4D7 四个发光二极管亮灭状态,清 IRQ1_TMA 中断标志,寄存器出栈,中断返回;IRQ1_TMB 中断中,同样先进行寄存器压栈保护,IOB 口低四位输出电平翻转,以翻转 D8D11 四个发光二极管亮灭状态,清 IRQ1_TMB 中断标志,寄存器出栈,中断返回;IRQ0_fosc/1024 中断中,先进行寄存器压栈保护,清 IRQ0_fosc/1024 中断标志,寄存器出栈,中断返回。 【实验步骤】 1. 建立一个新工程 ex10_asm_IRQ0_IRQ1_IRQ2,根据程序流程图编写程序。2. Rebuild All。3. 按照硬件连接图连接电路。4. 下载程序,运行。5. 观
7、察发光二极管的状态,分析是否与实验要求的相统一。源程序如下:/main.c#include SPCE061A.hint main(void)/设置IOA、IOB低四位为同相输出,初始为低电平,*P_IOA_Dir = 0x000f;/0000 0000 0000 1111*P_IOA_Attrib =0x000f;*P_IOA_Data = 0x0000;*P_IOB_Dir = 0x000f;*P_IOB_Attrib = 0x000f;*P_IOB_Data = 0x0000;/设置定时器A、B的属性*P_TimerA_Ctrl = C_TMA1_4KHz | C_TMA2_1;*P_Ti
8、merA_Data = 0xf000;/1=(1/4096)*(0xffff+1-x)*P_TimerB_Ctrl = C_TMB_4KHz;*P_TimerB_Data = 0xe000;/2=(1/4096)*(0xffff+1-x)*P_INT_Ctrl = C_IRQ0_PWM | C_IRQ1_TMA | C_IRQ2_TMB;/设置中断 三个中断或起来asm(INT IRQ);/开IRQ中断while (1)*P_Watchdog_Clear = C_WDTCLR; return 0;/isr.cvoid BREAK(void) _attribute_ (ISR);void FIQ
9、(void) _attribute_ (ISR);void IRQ0(void) _attribute_ (ISR);void IRQ1(void) _attribute_ (ISR);void IRQ2(void) _attribute_ (ISR);void IRQ3(void) _attribute_ (ISR);void IRQ4(void) _attribute_ (ISR);void IRQ5(void) _attribute_ (ISR);void IRQ6(void) _attribute_ (ISR);void IRQ7(void) _attribute_ (ISR);voi
10、d BREAK(void)/add your code herevoid FIQ(void)void IRQ0(void)if (*P_INT_Ctrl & C_IRQ0_PWM )/判断是不是中断*P_INT_Clear = C_IRQ0_PWM;/清出中断void IRQ1(void)/对应定时器Aunsigned int uiData = 0; C_IRQ1_TMA )uiData = *P_IOA_Data;/读取A口的灯uiData = 0x000f;/0000 0000 0000 1111 =:表异或,与全1异或为反,与全0异或为同*P_IOA_Data = uiData;*P_I
11、NT_Clear = C_IRQ1_TMA;void IRQ2(void) C_IRQ2_TMB )uiData = *P_IOB_Data;/读取B口的灯*P_IOB_Data = uiData;*P_INT_Clear = C_IRQ2_TMB;void IRQ3(void)void IRQ4(void)void IRQ5(void)void IRQ6(void)void IRQ7(void)1、程序编写:实验箱硬件连接图:实验现象:根据设置不同的中断频率信号,左右各四个LED灯交替闪烁的频率就有所不同,由此得到中断设置的具体运用.【实验总结】1、实验中遇到的问题及解决办法答:1、问题:对
12、不同中断信号频率的设置需要符合程序运行的方式,LED灯的闪烁频率太快时就无法看见其在闪烁,交替闪烁的快慢也会随之变化,在程序的编写上要严格按照规则编写,否则就会出错,因此在实验中一定要弄清楚其缘由。2、解决方法:通过实际的计算测量。老师的引导,同学之间的相互交流沟通学习,一步步的完成了此实验,并在老师的详细讲解下熟悉了个窗口的功能及硬件的了解和正确的连接,做出与实验目的相符合的结果。2、自己在考虑本实验时的想法及实现情况对该实验的设计上,要追求用最简洁的程序代码编写,逻辑清晰明了,步骤少,条理清楚,用高级语言(C语言)完成编写,经过事先的计算测量,得到能肉眼观察的范围后再导入硬件进行运算展示。并在实验箱上看到LED等在不同设定频率下的闪烁情况,记录数据是否与理论相符合,最后完成本次实验。继续阅读
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1