社区
单片机/工控
帖子详情
AVR单片机如何手动触发中断!
StudyKaKa
2010-01-07 09:54:12
AVR单片机是写‘1’来清0中断标志位的,如何可以手动来启动中断,让程序跳到中断入口去执行??
...全文
235
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楼的说法“楼主,你如果想手动触发中断, 完全可以直接调用中断处理程序。 ”既然是手动触发的,那中断还有什么意义呢?不是就相当于你手动触发时就是调用这个中断服务吗
单片机
项目设计.doc
4 学习情境五:
单片机
外部
中断
仿真 4 学习情境六:直流电机正反转 4 学习情景一:快速掌握PROTEUS的用法 为了更快掌握PROTEUS设计与仿真操作,我们先从一简单实例入手。 让我们首先来熟悉一下仿真软件的主界面: 图5...
java 定时器 的
中断
程序,
AVR
单片机
教程——定时器
中断
本文隶属于
AVR
单片机
教程系列。
中断
,是
单片机
的精华。
中断
基础当一个事件发生时,CPU会停止当前执行的代码,转而处理这个事件,这就是一个
中断
。
触发
中断
的事件成为
中断
源,处理事件的函数称为
中断
服务程序(ISR)。...
AVR
单片机
学习笔记
下面是自己在学习
AVR
单片机
时的学习经验,分享出来给大家,一起学习。 1、
AVR
单片机
采用RISC架构,8051
单片机
采用CISC架构。前者速度为后者的2~4倍,为流水线操作指令 2、
AVR
单片机
有32个通用寄存器(地址...
matlab 串口
单片机
,
AVR
单片机
和Matlab串口通信的计时器系统
以上两个函数设置为当串口检测到输入缓存中达到了3个字符的数据时,则
触发
串口
中断
。② 串口
中断
处理函数。串口
中断
处理函数可以根据用户需要自行定义。如串口读
中断
处理函数可以这样定义:obj....
[PIC®/
AVR
®/dsPIC®产品]PIC16(L)F1826使用——IOC、外部
中断
两者都是外部信号(上升沿/下降沿)引起
中断
.MCU工作在普通模式下时两者基本没啥区别,只是IOC是可以同时设置两个边沿
触发
中断
(上升沿和下降沿都可以
触发
)而INT只是设置一种
触发
方式(要不上升沿要不下降沿)。...
单片机/工控
27,382
社区成员
28,770
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章