超奇特的跑马灯实验,不闪,能亮了还亮度不一。。。。。
本帖最后由 dianzichina 于 2012-12-26 17:21 编辑MEGA8 的片子,PD6经电阻LED到5V,简单吧,上程序:
//#include<iom16v.h>
#include<iom8v.h>
#define uchar unsigned char
#define uint unsigned int
//=============================
void delay(uint t)
{
volatile uint m;
while(t--)
{
for (m=0;m<44;m++)
{}
}
}
void delay_ms(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++);
}
}
//=============================
void main(void)
{
PORTB=0xff;
DDRB =0xff;
PORTC=0xff;
DDRC =0xff;
PORTD=0xff;
DDRD =0xff;
while(1)
{
delay(255);
PORTD=0x00;
delay(255);
PORTD=0xff;
// while(1);
}
}
程序还是简单,做实验嘛。。这个样子能点亮LED,但不够亮了,把延时子程序里的121改成0-100能亮,100-122亮度小,125,看不到亮了。估计得用仪器测。。。。 系统频率/(255*44),这频率的闪烁肉眼分辨不出来,增大delay的时间吧 原来是写一手好字的楼主。 哪个参数0-100啊,这个应该是可以看到亮的吧,只是延时时间长了看起来会比较闪。 jssd 发表于 2012-12-26 16:35 static/image/common/back.gif
原来是写一手好字的楼主。
潦草之迹,让您见笑了。 richyhuang 发表于 2012-12-26 16:56 static/image/common/back.gif
哪个参数0-100啊,这个应该是可以看到亮的吧,只是延时时间长了看起来会比较闪。 ...
实在不好意思,没把问题描述清楚,浪费了您的时间。
补充如下:
void delay_ms(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++);
}
}
把延时里的121,改成0-100,很亮,从100到121,开始变暗,过了121,暗得看不见。。。。 不可能吧,楼主,你delay_ms()这个函数都没有引用啊。 刚好今天有人问我这个程序
while(1)
{
delay(255);
PORTD=0x00;
delay(255);
PORTD=0xff;
}
}
应该上面的delay是delay
下面的delay 是delay_ms吧 ………… 楼主你的delay_ms 没用到啊?你改那个121 居然有变化? 见鬼了 确实神奇!等待下文 本帖最后由 dianzichina 于 2012-12-26 21:53 编辑
xuboluan 发表于 2012-12-26 17:31 static/image/common/back.gif
刚好今天有人问我这个程序
while(1)
{
谢谢你们的回答,你们让我在这个寒冷的冬夜感受了许许温暖。
delay_ms()是我的延时子程序,上边有121字样,把121改成0-100能亮,100-122亮度小,125,看不到亮了。估计得用仪器测。。。。这是一个亮与不亮的临界值,向左越来越亮了,向右越来越不亮。
delay()子程序是网友给我的程序,与上面大同小异,上边有44字样,以44为基,偏左一点越来越亮,向右,越来越不亮。。。。
明天大早继续调试。。。。。呵呵,让朋友们见笑了。 本帖最后由 dianzichina 于 2012-12-27 08:49 编辑
今晨继续调这个LED,目的只有一个,就是让PD6闪起来。上述的程序可能有些混乱,今天又按普通的方式进行了调整,列出如下:
void delay_ms(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<1;j++);
}
}
//=============================
void main(void)
{
PORTB=0xff;
DDRB =0xff;
PORTC=0xff;
DDRC =0xff;
PORTD=0xff;
DDRD =0xff;
while(1)
{
PORTD=0x00; //LED接PD6,0XBF可亮。低电平。
delay_ms(1);
PORTD=0xff;
delay_ms(255);
// while(1);
}
}
所以见到的现象得重新描述,但大体跟上述差不多。重大更改的地方就是主程序里把程序里延时跟亮灯的地方交换了位置。
PORTD=0xff;
delay_ms(255);
这样的话现象不一样了!!!-------------------------------------------亮灯延时为1,灭灯延时255,大家了知道这是调节占空比了,这时灯微暗,加大亮灯的延时,PORTD=0x00; //LED接PD6,0XBF可亮。低电平。delay_ms(100); 这里把1改为100,可以很亮了。请注意延时子程序里改成了 for(j=0;j<1;j++);
原来是在这个位置调亮度,把这里固定为1后,亮度的调节在主程序里了。1-100逐渐变亮,这样的更改符合一般的规律(这个值越大越亮,前代码是越小越暗)。上述有朋友因为这产生了小疑惑,在此表示歉意。
调好了亮度比,现在专心来调主程序。第1个动作,注释掉主程序主循环里第一行,//PORTD=0x00;灯灭,这里正常。
第2个动作,还原第一行,把第三行注释,//PORTD=0xff; 灯亮,也正常,因为就没有关灯嘛。。。
第3个动作,还原第三行,把第五行注释,大家看到这条停机指令了没?如果把注释去掉,执行停机,啥现象?-------------------------------------------------------------------------------------------灯还亮!!!不过没前一步亮了,暗了一些,按一般思路,应该是全灭才对! 本帖最后由 Tliang 于 2012-12-27 09:08 编辑
- - !
不知道楼主在搞什么。
如果只是让灯闪的话你的延时函数是ms?
也不知道楼主的晶振是多少
不过改成下面的应该就可以看到了。
void delay_ms(uint16 ms)
{
uint16 ticks;
while(ms--)
{
for(ticks = 0;ticks < 1000;ticks++)asm("nop");
}
}
然后
PORTD = 0X00;
delay_ms(500);
PORTD = 0xff;
delay_ms(500);
如果闪不出的话那就是你编译器问题,或者你没编译就重新把程序下进去了。
编辑:
延时函数是延时多少我也不知道,不过还行的样子(11.0592MHZ) Tliang 发表于 2012-12-27 09:05 static/image/common/back.gif
- - !
不知道楼主在搞什么。
如果只是让灯闪的话你的延时函数是ms?
您说编译器的问题,这个真有可能了,我也不清楚编译器有何问题。我下载了没经编译的文件?那这些变化的现象是不可能出现的。
//#include<iom16v.h>
#include<iom8v.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long int
//=============================
void delay(uint t)
{
// volatile uint m;
uint m;
while(t--)
{
for (m=0;m<120;m++);
}
}
void delay_ms(ulong k)
{
ulong i,j;
for(i=0;i<k;i++)
{
for(j=0;j<1000;j++)asm("nop");
}
}
//=============================
void main(void)
{
PORTB=0xff;
DDRB =0xff;
PORTC=0xff;
DDRC =0xff;
PORTD=0xff;
DDRD =0xff;
while(1)
{
PORTD=0x00; //LED接PD6,0XBF可亮。低电平。
delay_ms(600);
PORTD=0xff;
delay_ms(600);
while(1);
}
}
按您的指示改了一下,还是不闪。 字写得真的挺好 dianzichina 发表于 2012-12-27 09:41 static/image/common/back.gif
您说编译器的问题,这个真有可能了,我也不清楚编译器有何问题。我下载了没经编译的文件?那这些变化的现 ...
while(1)
{
PORTD=0x00; //LED接PD6,0XBF可亮。低电平。
delay_ms(600);
PORTD=0xff;
delay_ms(600);
while(1);
}
怎么里面还有个while啊????肯定不会闪烁啦 本帖最后由 Tliang 于 2012-12-27 10:35 编辑
dianzichina 发表于 2012-12-27 09:41 static/image/common/back.gif
您说编译器的问题,这个真有可能了,我也不清楚编译器有何问题。我下载了没经编译的文件?那这些变化的现 ...
仿真文件,PORTD翻转 qwermhb 发表于 2012-12-27 10:25 static/image/common/back.gif
while(1)
{
PORTD=0x00; //LED接PD6,0XBF可亮。低电平。
这是做了最后的一个可苦逼的测试的时候关掉的。那就是把这个语句用上,灯还是亮着。。。。。 dianzichina 发表于 2012-12-27 10:35 static/image/common/back.gif
这是做了最后的一个可苦逼的测试的时候关掉的。那就是把这个语句用上,灯还是亮着。。。。。 ...
如果你的单片机是ATMEGA8可以把我的那个HEX直接下进去看看。 学习,mark 真是苦B啊,换了一个编译器,现在用的是CVAVR 2.04.4a,用了下面的程序,直接成功:
#include <mega16.h>
#include <delay.h>
void main(void)
{
unsigned char i;
PORTD=0xFF;
DDRD=0xFF;
while (1)
{
PORTD=0xFF;
for(i=0;i<4;i++)
{
PORTD.2=~PORTD.2;
PORTD.6=~PORTD.6;
delay_ms(400);
}
}
}
但至今未知何故。。。。。请大师出马?虽然这是一个超级简单的问题,而大师往往能对一个简单的问题回答得更加完美,一如大学时一位教授给我们讲座“黑洞”,学生提问说在一个黑洞的星球上用光速发一道光,外界能看到不?教授说这只是一个上抛运动而已。这道光在引力的作用之下它会回来。 本帖最后由 yklstudent 于 2012-12-27 20:41 编辑
这个感觉还是看编译后的生成的汇编代码 估计会看出点啥 学习,mark 楼主,你放在1楼的程序 没问题 ,很正常, dianzichina 发表于 2012-12-27 17:15 static/image/common/back.gif
真是苦B啊,换了一个编译器,现在用的是CVAVR 2.04.4a,用了下面的程序,直接成功:
#include
#include
是不是用ICCAVR?我上次编译的时候选择型号导致找了2天的问题,估计很有可能 HeP028 发表于 2012-12-28 20:57 static/image/common/back.gif
是不是用ICCAVR?我上次编译的时候选择型号导致找了2天的问题,估计很有可能 ...
开始就是用的ICCAVR 6.31A,出现这个奇特的问题的,后来用CVAVR给解决了,这样算能结帖了吗?我认为不能,就是想看看这ICCAVR到底是在干啥? dianzichina 发表于 2012-12-29 09:13 static/image/common/back.gif
开始就是用的ICCAVR 6.31A,出现这个奇特的问题的,后来用CVAVR给解决了,这样算能结帖了吗?我认为不能 ...
ICCAVR要选择目标型号: SMX 发表于 2012-12-29 13:05 static/image/common/back.gif
没看明白楼主这个帖子想说什么。
知我者谓我心忧,不知我者谓我何求,也许您是一高人,无瑕顾及偶等初学者尔。
dianzichina 发表于 2012-12-29 13:55 static/image/common/back.gif
知我者谓我心忧,不知我者谓我何求,也许您是一高人,无瑕顾及偶等初学者尔。
...
楼主啊,你放在一楼的程序没问题啊? 你出现啥问题了 qwermhb 发表于 2012-12-29 14:24 static/image/common/back.gif
楼主啊,你放在一楼的程序没问题啊? 你出现啥问题了
一楼,以及后续补充已很清楚,如结描述有不清楚之处,提出来我继续补充。 27楼说的对!你再编译下试试,这个程序不复杂,估计是你没选择型号哦。 HeP028 发表于 2012-12-29 09:42 static/image/common/back.gif
ICCAVR要选择目标型号:
片子是MEGA8,上面的型号也选的是MEGA8,至于是否一致,我无从而知了。 那这估计就和RP有关系了,看你经常遇到奇怪的问题~囧{:lol:} HeP028 发表于 2012-12-30 13:46 static/image/common/back.gif
那这估计就和RP有关系了,看你经常遇到奇怪的问题~囧
您老搞错了,我奇怪的问题也不是就这几天提的,而是一直都有。。。。 dianzichina 发表于 2012-12-30 15:38 static/image/common/back.gif
您老搞错了,我奇怪的问题也不是就这几天提的,而是一直都有。。。。
你程序没用delay_ms但是你却说改变它会有变化???什么意思?,而且你的delay_ms里面不应该用121,8M的晶振怎么也得用个1000啊 qwermhb 发表于 2012-12-30 18:51 static/image/common/back.gif
你程序没用delay_ms但是你却说改变它会有变化???什么意思?,而且你的delay_ms里面不应该用121,8M ...
上面的delay()子程序是网友给的,用我的代码做了测试之后,没有成功,又用上了他的代码做的测试。所以贴上来的代码是直接用他的代码做实验后拷贝下来了。 dianzichina 发表于 2012-12-30 20:44 static/image/common/back.gif
上面的delay()子程序是网友给的,用我的代码做了测试之后,没有成功,又用上了他的代码做的测试。所以贴 ...
delay_ms是毫秒级得延时,8M晶振,你至少得把121改成1000以上,还有,按照你的程序,0-100的时候,是脉冲频率高,相当于一直是高电平,所以很亮,100-121的时候,平率降低了,LED通电时间减少,所以变暗了,过了121后,平率更低,电压不够,所以不亮了 qwermhb 发表于 2012-12-30 21:45 static/image/common/back.gif
delay_ms是毫秒级得延时,8M晶振,你至少得把121改成1000以上,还有,按照你的程序,0-100的时候,是脉冲 ...
你分析得不错,122以后,频率低了,所以不亮了,那改成1000以后,这它还会亮吗?程序中高低电平的延时是一样的,也就是说亮的时间跟灭的时间相等。这如何解释啊? 本帖最后由 qwermhb 于 2012-12-30 22:12 编辑
dianzichina 发表于 2012-12-30 22:04 static/image/common/back.gif
你分析得不错,122以后,频率低了,所以不亮了,那改成1000以后,这它还会亮吗?程序中高低电平的 ...
改成1000后用delay_ms(500),就会产生一秒平率的脉冲而闪烁,还有高低电平是的时间是一样啊,要解析什么? qwermhb 发表于 2012-12-30 22:11 static/image/common/back.gif
改成1000后用delay_ms(500),就会产生一秒平率的脉冲而闪烁,还有高低电平是的时间是一样啊,要解析什么? ...
我不想解析什么,只想让它闪起来。也仅此而已。谢你的回答。 WGC编译如果设置了优化直接把你的延时函数优化掉了
qingguogao 发表于 2012-12-30 23:01 static/image/common/back.gif
WGC编译如果设置了优化直接把你的延时函数优化掉了
恩,这种可能还能说得过去,所以看到的都是亮的了。PS一个问题,楼主位有说把121改大一点,会变成常灭,何解? 不知楼主的问题解决了没有?
如果是编译器优化问题,那就把优化级别设低些。
或者定义变量时加volatile ,如
void delay_ms(uint k)
{
volatileuint i,j;
lcw_swust 发表于 2012-12-31 11:33 static/image/common/back.gif
不知楼主的问题解决了没有?
如果是编译器优化问题,那就把优化级别设低些。
或者定义变量时加volatile , ...
ytm 谢您的回答。楼主位的延时子程序似乎与您的一样:
void delay(uint t)
{
volatile uint m;
while(t--)
{
for (m=0;m<44;m++)
{}
}
}
这个的测试是把另一个子程序的121变成了44,结果依旧。
页:
[1]