社区
单片机/工控
帖子详情
AVR单片机如何手动触发中断!
StudyKaKa
2010-01-07 09:54:12
AVR单片机是写‘1’来清0中断标志位的,如何可以手动来启动中断,让程序跳到中断入口去执行??
...全文
285
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
单片机
的心得体会,涵盖了
AVR
的特点、架构、寄存器、
中断
系统、I/O操作、定时器、ADC、串行通信SPI和TWI等内容,深入浅出地介绍了
AVR
的使用和编程技巧,是初学者的宝贵资料。
03
AVR
单片机
中断
的学习探究(外部
中断
与内部
中断
)
本文深入探讨了
AVR
单片机
的外部和内部
中断
。外部
中断
涉及INT0和INT1引脚的配置,通过MCUCR寄存器控制
触发
条件。内部
中断
则是基于
单片机
内部行为,如UART串口操作,通过
中断
向量地址进行处理。文章提供详细的初始化步骤和
中断
服务例程。
AVR
嵌入式
单片机
芯片的
中断
系统介绍
这篇博客详细介绍了
AVR
嵌入式
单片机
的
中断
系统,包括
中断
的种类、工作原理、如何配置和管理
中断
,以及
中断
在实际应用中的重要性。对于想要深入理解
AVR
单片机
中断
操作的读者来说,是十分有价值的参考资料。
Microchip 系列:
AVR
系列 (基于
AVR
架构)_(9).
AVR
中断
系统详解
本文详细介绍了
AVR
单片机
的
中断
系统,包括
中断
概述、控制寄存器、各类
中断
(外部、定时器、串行通信等)的配置示例及详细说明,还阐述了
中断
系统在实时数据采集、通信处理等方面的应用。合理配置和使用
中断
可提高
单片机
系统的实时性和效率。
AVR
单片机
实验六 AD转换应用实验
该博客介绍了如何在
AVR
单片机
上进行AD转换应用实验,通过定时器
中断
自动
触发
AD转换,将模拟电压输入转化为数字值,并在数码管上实时显示电压值(单位:mv)。实验步骤包括设置模数转换器、调整可变电阻、编写相关函数等,旨在理解
AVR
单片机
AD转换的工作原理。
单片机/工控
27,521
社区成员
28,798
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章