社区
单片机/工控
帖子详情
AVR单片机如何手动触发中断!
StudyKaKa
2010-01-07 09:54:12
AVR单片机是写‘1’来清0中断标志位的,如何可以手动来启动中断,让程序跳到中断入口去执行??
...全文
246
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
单片机
是一种高性能的微控制器,其内部集成了
中断
系统,用于处理来自外围设备的事件。
中断
系统的主要功能是允许
单片机
在处理主程序的同时,能够响应外部或内部事件的请求,从而执行特定...
关于
AVR
中断
的优先级
AVR
单片机
中的
中断
大致可以分为两类:事件
触发
型
中断
和条件满足型
中断
。 1. **事件
触发
型
中断
**:这类
中断
由特定事件
触发
,并设置相应的
中断
标志。一旦
中断
发生,程序计数器跳转到相应的
中断
向量执行
中断
服务程序,...
AVR
单片机
教程6PPT参考课件.ppt
AVR
单片机
是一种广泛使用的基于RISC...
AVR
单片机
的
中断
系统设计复杂而高效,通过精心配置和管理
中断
源、
中断
向量、
中断
标志位、
中断
优先级和
中断
嵌套策略,可以使得
AVR
单片机
在各种应用场合中发挥出色的任务处理能力。
单片机/工控
27,511
社区成员
28,797
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章