社区
单片机/工控
帖子详情
AVR单片机如何手动触发中断!
StudyKaKa
2010-01-07 09:54:12
AVR单片机是写‘1’来清0中断标志位的,如何可以手动来启动中断,让程序跳到中断入口去执行??
...全文
254
14
打赏
收藏
AVR单片机如何手动触发中断!
AVR单片机是写‘1’来清0中断标志位的,如何可以手动来启动中断,让程序跳到中断入口去执行??
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
qnmdsb2008
2010-01-10
打赏
举报
回复
硬件配置好 定时器就可以中断了
想在中断中处理程序
TIMSK = 0x05; //定时器1中断允许
这个是m128的
StudyKaKa
2010-01-07
打赏
举报
回复
谢谢
kyzf
2010-01-07
打赏
举报
回复
[Quote=引用 8 楼 studykaka 的回复:]
请问怎样直接调用,有示例吗?
谢谢!
[/Quote]
你的中断处理是一个子函数吧,你申明下,在MAIN.C 直接调用该子函数就可以。
宇帆
2010-01-07
打赏
举报
回复
如果直接调用,就把中断服务程序 做成一个子程序就可以了,但是这样又没有啥意义的
StudyKaKa
2010-01-07
打赏
举报
回复
请问怎样直接调用,有示例吗?
谢谢!
kyzf
2010-01-07
打赏
举报
回复
楼主,你如果想手动触发中断,
完全可以直接调用中断处理程序。
另外一般的中断标志位,不是能置位的,你对该位写入1,一般都是清楚该中断标志位。
中断的标志位,一般由单片机的内部结构与整体设计决定,并非软件可随便置位的。
StudyKaKa
2010-01-07
打赏
举报
回复
LS误会了我的意思,我用51单片机举个例子:
void MSComm_Settings(void)
{
TMOD &= 0x0f;
TMOD |= 0x20;
AUXR |= 1 << T1x12;
TH1 = TL1 = BAND_RELOAD_1T;
PCON &= 0x7f; // 波特率不倍频
SCON = 0x50;
TR1 = 1;;
ES = 1;
// 测试
// EA = 1;
// TI = 1; // 程序运行此命令后会立即进入串行发送中断。
// RI = 1;
}
不知LS现在是否明白了我的意思??
空影
2010-01-07
打赏
举报
回复
中断标志位好像只能由硬件置位的,手动是无法的
galle
2010-01-07
打赏
举报
回复
如果要手动启动中断,你直接执行中断程序也可以呀!
galle
2010-01-07
打赏
举报
回复
定一个非常小的时间就ok了!
StudyKaKa
2010-01-07
打赏
举报
回复
我说的手动是用软件。比如TO定时溢出中断。
//ICC-AVR application builder : 2010-1-7 8:57:24
// Target : M16
// Crystal: 8.0000Mhz
#include <iom16v.h>
#include <macros.h>
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}
//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: 1mSec
// actual value: 1.000mSec (0.0%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x83; //set count
OCR0 = 0x7D; //set compare
TCCR0 = 0x03; //start timer
}
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0 = 0x83; //reload counter value
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer0_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x01; //timer interrupt sources
TIFR = 1 << TOV0; // 像这样手动触发中断,是否可行?当然这样做是没有用的。
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void main(void)
{
init_devices();
while(1)
{
}
}
kyzf
2010-01-07
打赏
举报
回复
关键你初始化的是什么中断,即你开启和准备使用的是什么中断。
如果是外部中断,则可以通过手动控制对应GPIO的电平变化,从而可以触发中断。
StudyKaKa
2010-01-07
打赏
举报
回复
不,不,不是这样的。
用软件测试进入中断可以测试串口初始化代码是否OK。
调用就是另外一回事了。
空影
2010-01-07
打赏
举报
回复
[Quote=引用 6 楼 studykaka 的回复:]
LS误会了我的意思,我用51单片机举个例子:
void MSComm_Settings(void)
{
TMOD &= 0x0f;
TMOD |= 0x20;
AUXR |= 1 < < T1x12;
TH1 = TL1 = BAND_RELOAD_1T;
PCON &= 0x7f; // 波特率不倍频
SCON = 0x50;
TR1 = 1;;
ES = 1;
// 测试
// EA = 1;
// TI = 1; // 程序运行此命令后会立即进入串行发送中断。
// RI = 1;
}
不知LS现在是否明白了我的意思??
[/Quote]51的串口发送确实是用手动置位TI才触发发送中断的,另外我赞同7楼的说法“楼主,你如果想手动触发中断, 完全可以直接调用中断处理程序。 ”既然是手动触发的,那中断还有什么意义呢?不是就相当于你手动触发时就是调用这个中断服务吗
AVR
单片机
技术
AVR
的
中断
系统习题.doc
AVR
单片机
是Atmel公司(现已被Microchip Technology收购)开发的一种高性能、低功耗的8位微控制器系列,广泛应用于嵌入式系统设计。
中断
系统是
AVR
单片机
的重要特性之一,它允许
单片机
在执行正常程序的同时,能够对...
AVR
单片机
技术 与
中断
相关的寄存器教案.doc
AVR
单片机
的外部
中断
INT1,若要设置为下降沿
触发
,需要在MCUCR寄存器中进行配置。具体来说,将ISC11和ISC10设置为00,表示选择下沿
触发
。其他
中断
源如INT0和INT2的
触发
方式配置类似,通过调整相应的控制位即可。 **...
AVR
单片机
中断
完整版.pptx
AVR
单片机
中断
系统概述:
AVR
单片机
是一种高性能的微控制器,其内部集成了
中断
系统,用于处理来自外围设备的事件。
中断
系统的主要功能是允许
单片机
在处理主程序的同时,能够响应外部或内部事件的请求,从而执行特定...
第4讲
AVR
单片机
中断
教学教材.ppt
在本教学中,硬件原理图描述了LED数码管与
AVR
单片机
的连接方式,以及按键如何连接到外部
中断
引脚以
触发
中断
。此外,教学内容还涉及了
中断
的初始化设置,包括选择下降沿
触发
方式、编写
中断
服务程序以及计数变量的处理...
关于
AVR
中断
的优先级
AVR
单片机
中的
中断
大致可以分为两类:事件
触发
型
中断
和条件满足型
中断
。 1. **事件
触发
型
中断
**:这类
中断
由特定事件
触发
,并设置相应的
中断
标志。一旦
中断
发生,程序计数器跳转到相应的
中断
向量执行
中断
服务程序,...
单片机/工控
27,517
社区成员
28,798
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章