cassel 发表于 2009-8-13 18:47:22

请教傻孩子 AVR studio 中断函数如何加入模块

买了版主的书 呵呵 开始学习单片机以及模块化编程
我现在想用attiny26用pwm控制电路并用模数转换监测电流大小
尝试
1.PWM相关的初始化和函数写入pwm.c和pwm.h
2.模数转换相关的写入 adc.c 和 adc.h
我用的环境是avr studio 和 avr gcc
到目前为止我只在main函数前调用了才达到我想要的效果,我想把中断函数也加入模块 而不是在main函数前调用
这个在.h文件里该如何设置呢?
//ADC.h
#define F_CPU 1000000UL
#include<avr/interrupt.h>

extern void ADC_PORT_INIT(void);
extern void ADC_IIT(void);
extern void ADC_DEVICE_INIT(void);


//ADC.c
#include "ADC.h"

void ADC_PORT_INIT(void){
//...
}

void ADC_INIT(void){
//...
}

ISR(ADC_vect){
//...
}

因为我也想像书里所说的那样 从外部只调用 ADC_DEVICE_INIT 如何把ISR加入下面的函数呢?
void ADC_DEVICE_INIT(void){
cli();
ADC_PORT_INIT();
ADC_INIT();
ISR();//???
sei();
}
还是有别的技巧?初学者问题 呵呵 多谢了!

Gorgon_Meducer 发表于 2009-8-27 12:11:38

我不明白?什么叫做 “ 如何把ISR加入下面的函数呢”
能说得更详细一些么?

xinjie1023 发表于 2009-8-27 13:26:43

类似的单独直接写在c文件里就可以了

xinjie1023 发表于 2009-8-27 13:28:29

类似的单独直接写在c文件里就可以了

xinjie1023 发表于 2009-8-27 13:30:11

类似的单独直接写在c文件里就可以了

cassel 发表于 2009-8-28 06:16:42

多谢回复
不好意思
表达的不是很清楚

由于写的程序需要AD转换 我把所有和AD相关设置以及函数都写进 ADC.h 和ADC.c 里面

//ADC.c大致如下
#include "ADC.h"

void ADC_PORT_INIT(void){
//...
}

void ADC_INIT(void){
//...
}

ISR(ADC_vect){
//... 中断函数用来读取转换后数据的命令
}

把所有函数都集中在DEVICE函数中好方便调用
void ADC_DEVICE_INIT(void){
ADC_PORT_INIT();
ADC_INIT();
ISR();...// 调用中断函数 这也是我问题所在 中断函数是否可以这样调用
}
最后在主程序里面只调用 ADC_DEVICE_INIT 函数

我现在把中断函数直接放在main前面调用 程序运行没有问题

xinjie1023 发表于 2009-8-28 09:59:30

ISR();...// 调用中断函数 这也是我问题所在 中断函数是否可以这样调用

中断函数当有中断时自动调用,不用在函数中显式调用,

Gorgon_Meducer 发表于 2009-8-28 19:02:47

嗯……就是楼上的解释

cassel 发表于 2009-8-29 17:59:50

多谢各位的回复!

现在自己看来问的有点笨了 呵呵

ISR在编译器预带的<avr/interrupt.h>里面被定义了 自然不用在写进DEVICE里调用了。。。。

不知道版主还有哪位使用过英飞凌的单片机?

xinjie1023 发表于 2009-8-29 22:28:32

英飞凌的单片机?没用过

cassel 发表于 2009-9-1 05:59:09

呵呵

在这个网站学了不少 看了傻孩子的书也学了很多

我是学强电的 下个月底开始在英飞凌实习 做前期研发

很可能要用单片机控制电路 实在不行只好用atmel的了 ^^'
页: [1]
查看完整版本: 请教傻孩子 AVR studio 中断函数如何加入模块