社区
单片机/工控
帖子详情
AVR单片机如何手动触发中断!
StudyKaKa
2010-01-07 09:54:12
AVR单片机是写‘1’来清0中断标志位的,如何可以手动来启动中断,让程序跳到中断入口去执行??
...全文
263
14
打赏
收藏
AVR单片机如何手动触发中断!
AVR单片机是写‘1’来清0中断标志位的,如何可以手动来启动中断,让程序跳到中断入口去执行??
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
单片机
技术
AVR
的
中断
系统习题.doc 学习资料 复习资料 教学资源
AVR
单片机
技术 与
中断
相关的寄存器教案.doc
AVR
单片机
技术 与
中断
相关的寄存器教案.doc 学习资料 复习资料 教学资源
AVR
单片机
中断
完整版.pptx
AVR
单片机
中断
完整版.pptx
第4讲
AVR
单片机
中断
教学教材.ppt
第4讲
AVR
单片机
中断
教学教材.ppt
关于
AVR
中断
的优先级
将本讲简单介绍一下
AVR
中断
的优先级
单片机/工控
27,518
社区成员
28,799
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章