打印

新手求助

[复制链接]
4431|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiangfeizi|  楼主 | 2010-9-23 11:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教各位大侠一个问题。本人用普通IO口做一路PWM信号,由于频率在比较高,且要可调脉宽(256档),所以想把PWM的输出做在基准定时的中断服务程序里。程序如下:
@far @interrupt void TIM6_UPD_OVF_TRG_IRQHandler(void)
{
unsigned char count_songsi;
unsigned char count_128us;
count_songsi++;
count_128us++;
if(count_128us>=8)
{
  flag_1ms=1;
  count_128us=0;
}
if(count_songsi>pwm_songsi)
  PD_ODR=PD_ODR||0x01;
else
  PD_ODR=PD_ODR&&0xfe;
  return;
}

上面的1ms标志flag_1ms和PWM_songsi 在主程序里已经有过定义,PWM_songsi就是不同的脉宽值,但是在中断服务程序编译的时候始终说这两个变量未定义。本人是新手,请各位大侠指教我该怎么弄?
沙发
xiangfeizi|  楼主 | 2010-9-23 14:55 | 只看该作者
斑竹呢?怎么都不愿意指教一下呢?

使用特权

评论回复
板凳
香水城| | 2010-9-23 17:49 | 只看该作者
1)不是不愿意指教,我不是时时在线,这是公共论坛,任何人都可以帮忙,不一定非要版主回答。

2)请说清楚你使用的芯片型号。

3)如果使用ST的MCU,你可以使用定时器的PWM输出模式,不必使用中断方式。

使用特权

评论回复
地板
xiangfeizi|  楼主 | 2010-9-23 18:03 | 只看该作者
芯片型号是:STM8S903K3 ,因为整个系统有3路PWM  频率各不相同,TIM1做了一路带死区的互补信号,TIM5单独做了一路PWM信号。所以就用普通的I/O口来做一路输出了。现在最大的问题是,为什么我在主程序里设置的全局变量在中断服务程序里不能识别呢?包括1ms的基准时间标志,好象也识别不了。主程序和中断程序似乎联系不起来,够郁闷的,不知道是什么原因。

使用特权

评论回复
5
bruceleeIKA| | 2010-9-23 19:19 | 只看该作者
主程序指的是什么?是main函数吗?首先你要了解全局变量和局部变量的定义。在main函数里定义的变量只能在main中有限,当然不能应用到中断函数中。
如果你是定义的全局变量,但主函数和中断函数并不在一个文件中,那么你需要在中断函数所在的文件中,使用extern将变量声明一下,目的是告诉编译器这些变量在别的文件中已经声明和定义过,否则,编译器就会提示错误。

使用特权

评论回复
6
xiangfeizi|  楼主 | 2010-9-23 20:03 | 只看该作者
在主程序里定义全局变量的时候增加了 extern 声明;同时在中断服务程序里增加了 #include"main.c" 程序编译通过,非常感谢!

使用特权

评论回复
7
香水城| | 2010-9-23 20:27 | 只看该作者
请按照5楼提示:“你需要在中断函数所在的文件中,使用extern将变量声明一下”。

另外,#include"main.c"  也是不对的。

使用特权

评论回复
8
xiangfeizi|  楼主 | 2010-9-23 20:50 | 只看该作者
好的,在主函数里定义了函数类型,并在中断程序所在的文件里进行了申明,现在两个文件都可以编译通过了,谢谢!

使用特权

评论回复
9
xiangfeizi|  楼主 | 2010-9-24 09:12 | 只看该作者
晕,还是有些问题,今天早上过来按“built"或者“debug"都出现以下错误提示。
clnk -m Debug\hanji.map -lF:\程序\Lib  -o Debug\hanji.sm8 Debug\hanji.lkf
#error clnk Debug\hanji.lkf:47 can't open file crtsi0.sm8
#error clnk Debug\hanji.lkf:59 can't open file libis0.sm8
#error clnk Debug\hanji.lkf:60 can't open file libm0.sm8
#error clnk Debug\hanji.lkf:67 Debug\stm8_interrupt_vector.o: symbol _count_50us multiply defined (Debug\main.o)
#error clnk Debug\hanji.lkf:67 Debug\stm8_interrupt_vector.o: symbol _flag_1ms multiply defined (Debug\main.o)
#error clnk Debug\hanji.lkf:67 Debug\stm8_interrupt_vector.o: symbol _count_songsi multiply defined (Debug\main.o)
#error clnk Debug\hanji.lkf:67 Debug\stm8_interrupt_vector.o: symbol _pwm_songsi multiply defined (Debug\main.o)
The command: "clnk -m Debug\hanji.map -lF:\程序\Lib  -o Debug\hanji.sm8 Debug\hanji.lkf " has failed, the returned value is: 1
exit code=1.

hanji.elf - 9 error(s), 0 warning(s)
其中有几条好象是说count_50us;flag_50us;count_songsi;pwm_songsi这几个变量重复定义。这个又是为什么呢?

使用特权

评论回复
10
xiangfeizi|  楼主 | 2010-9-24 09:43 | 只看该作者
定义的问题是自己不小心写错了,:L 现在这个问题已经OK。
#error clnk Debug\hanji.lkf:47 can't open file crtsi0.sm8
#error clnk Debug\hanji.lkf:59 can't open file libis0.sm8
#error clnk Debug\hanji.lkf:60 can't open file libm0.sm8
这个问题请大侠们指点,非常感谢!

使用特权

评论回复
11
gxgclg| | 2010-9-24 16:22 | 只看该作者
似乎很多人碰到问题的第一反应,就是直接呼唤香版主:lol

使用特权

评论回复
12
xiangfeizi|  楼主 | 2010-9-24 16:28 | 只看该作者
11# gxgclg

没办法啊,第一次写程序,又没人带,压力好大。

使用特权

评论回复
13
hzt818| | 2010-9-24 21:13 | 只看该作者
5楼和7楼说的对。

使用特权

评论回复
14
秋天落叶| | 2010-9-24 21:16 | 只看该作者
求助版主其实挺好的:lol

使用特权

评论回复
15
xiangfeizi|  楼主 | 2010-9-25 09:05 | 只看该作者
14# 秋天落叶


恩,需要多学习学习!

使用特权

评论回复
16
txcy| | 2010-9-25 15:58 | 只看该作者
似乎很人在问香主问题的时候都没给芯片型号的,都得让香主问一次:lol

使用特权

评论回复
17
sinadz| | 2010-9-25 18:16 | 只看该作者
擅于问问题,就是一个不断进步的过程

使用特权

评论回复
18
xiangfeizi|  楼主 | 2010-9-27 08:33 | 只看该作者
17# sinadz

谢谢各位前辈鼓励!可是现在问题还没解决,急切ing.

使用特权

评论回复
19
baidudz| | 2010-9-27 18:24 | 只看该作者
不是已经解决了吗??还有啥问题,说得详细点,大家再探讨一下

使用特权

评论回复
20
xiangfeizi|  楼主 | 2010-9-28 08:26 | 只看该作者
19# baidudz

已经解决,谢谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

62

帖子

0

粉丝