AVR单片机如何手动触发中断!

StudyKaKa 2010-01-07 09:54:12
AVR单片机是写‘1’来清0中断标志位的,如何可以手动来启动中断,让程序跳到中断入口去执行??
...全文
235 14 打赏 收藏 转发到动态 举报
写回复
用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楼的说法“楼主,你如果想手动触发中断, 完全可以直接调用中断处理程序。 ”既然是手动触发的,那中断还有什么意义呢?不是就相当于你手动触发时就是调用这个中断服务吗

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧