5307|14

62

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

AVR单片机如何手动触发中断! [复制链接]

AVR单片机是写‘1’来清0中断标志位的,如何可以手动来启动中断,让程序跳到中断入口去执行??

最新回复

硬件配置好 定时器就可以中断了   想在中断中处理程序 TIMSK = 0x05;                 //定时器1中断允许 这个是m128的  详情 回复 发表于 2010-1-10 22:21
点赞 关注

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
关键你初始化的是什么中断,即你开启和准备使用的是什么中断。

如果是外部中断,则可以通过手动控制对应GPIO的电平变化,从而可以触发中断。
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我说的手动是用软件。比如TO定时溢出中断。
//ICC-AVR application builder : 2010-1-7 8:57:24
// Target : M16
// Crystal: 8.0000Mhz

#include
#include

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)
{

}
}
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

4
 
定一个非常小的时间就ok了!
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 
如果要手动启动中断,你直接执行中断程序也可以呀!
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

6
 
中断标志位好像只能由硬件置位的,手动是无法的
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

7
 
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现在是否明白了我的意思??
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

8
 
楼主,你如果想手动触发中断,
完全可以直接调用中断处理程序。

另外一般的中断标志位,不是能置位的,你对该位写入1,一般都是清楚该中断标志位。
中断的标志位,一般由单片机的内部结构与整体设计决定,并非软件可随便置位的。
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

9
 
请问怎样直接调用,有示例吗?
谢谢!
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 
如果直接调用,就把中断服务程序 做成一个子程序就可以了,但是这样又没有啥意义的
 
 
 

回复

71

帖子

1

TA的资源

一粒金砂(初级)

11
 
引用 8 楼 studykaka 的回复:
请问怎样直接调用,有示例吗?
谢谢!


你的中断处理是一个子函数吧,你申明下,在MAIN.C 直接调用该子函数就可以。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

12
 
谢谢
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 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现在是否明白了我的意思??
51的串口发送确实是用手动置位TI才触发发送中断的,另外我赞同7楼的说法“楼主,你如果想手动触发中断, 完全可以直接调用中断处理程序。 ”既然是手动触发的,那中断还有什么意义呢?不是就相当于你手动触发时就是调用这个中断服务吗
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

14
 
不,不,不是这样的。
用软件测试进入中断可以测试串口初始化代码是否OK。
调用就是另外一回事了。
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

15
 
硬件配置好 定时器就可以中断了  
想在中断中处理程序
TIMSK = 0x05;                 //定时器1中断允许
这个是m128的
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表