搜索
bottom↓
回复: 43

超奇特的跑马灯实验,不闪,能亮了还亮度不一。。。。。

[复制链接]

出0入0汤圆

发表于 2012-12-26 16:25:16 | 显示全部楼层 |阅读模式
本帖最后由 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,看不到亮了。估计得用仪器测。。。。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-12-26 16:31:25 | 显示全部楼层
系统频率/(255*44),这频率的闪烁肉眼分辨不出来,增大delay的时间吧

出0入55汤圆

发表于 2012-12-26 16:35:31 | 显示全部楼层
原来是写一手好字的楼主。

出0入0汤圆

发表于 2012-12-26 16:56:42 | 显示全部楼层
哪个参数0-100啊,这个应该是可以看到亮的吧,只是延时时间长了看起来会比较闪。

出0入0汤圆

 楼主| 发表于 2012-12-26 17:18:33 | 显示全部楼层
jssd 发表于 2012-12-26 16:35
原来是写一手好字的楼主。

潦草之迹,让您见笑了。

出0入0汤圆

 楼主| 发表于 2012-12-26 17:20:37 | 显示全部楼层
richyhuang 发表于 2012-12-26 16:56
哪个参数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,暗得看不见。。。。

出0入0汤圆

发表于 2012-12-26 17:28:56 | 显示全部楼层
不可能吧,楼主,你delay_ms()这个函数都没有引用啊。

出0入0汤圆

发表于 2012-12-26 17:31:21 | 显示全部楼层
刚好今天有人问我这个程序
     while(1)        
    {        
                   delay(255);
                PORTD=0x00;     
                delay(255);
                PORTD=0xff;   

    }                        
}
应该上面的delay是delay
下面的delay 是delay_ms吧 …………

出0入0汤圆

发表于 2012-12-26 18:07:53 | 显示全部楼层
楼主  你的delay_ms 没用到啊?  你改那个121 居然有变化? 见鬼了

出0入0汤圆

发表于 2012-12-26 19:02:41 | 显示全部楼层
确实神奇!等待下文

出0入0汤圆

 楼主| 发表于 2012-12-26 21:50:36 | 显示全部楼层
本帖最后由 dianzichina 于 2012-12-26 21:53 编辑
xuboluan 发表于 2012-12-26 17:31
刚好今天有人问我这个程序
     while(1)        
    {        


谢谢你们的回答,你们让我在这个寒冷的冬夜感受了许许温暖。

delay_ms()是我的延时子程序,上边有121字样,把121改成0-100能亮,100-122亮度小,125,看不到亮了。估计得用仪器测。。。。这是一个亮与不亮的临界值,向左越来越亮了,向右越来越不亮。

delay()子程序是网友给我的程序,与上面大同小异,上边有44字样,以44为基,偏左一点越来越亮,向右,越来越不亮。。。。

明天大早继续调试。。。。。呵呵,让朋友们见笑了。

出0入0汤圆

 楼主| 发表于 2012-12-27 08:43:24 | 显示全部楼层
本帖最后由 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个动作,还原第三行,把第五行注释,大家看到这条停机指令了没?如果把注释去掉,执行停机,啥现象?-------------------------------------------------------------------------------------------灯还亮!!!不过没前一步亮了,暗了一些,按一般思路,应该是全灭才对!

出0入0汤圆

发表于 2012-12-27 09:05:19 | 显示全部楼层
本帖最后由 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)

出0入0汤圆

 楼主| 发表于 2012-12-27 09:41:18 | 显示全部楼层
Tliang 发表于 2012-12-27 09:05
- - !
不知道楼主在搞什么。
如果只是让灯闪的话你的延时函数是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);
    }                       
}                       
按您的指示改了一下,还是不闪。

出0入0汤圆

发表于 2012-12-27 09:53:31 | 显示全部楼层
字写得真的挺好

出0入0汤圆

发表于 2012-12-27 10:25:30 | 显示全部楼层
dianzichina 发表于 2012-12-27 09:41
您说编译器的问题,这个真有可能了,我也不清楚编译器有何问题。我下载了没经编译的文件?那这些变化的现 ...

while(1)        
    {        
                PORTD=0x00; //LED接PD6,0XBF可亮。低电平。      
                   delay_ms(600);
                PORTD=0xff;   
                delay_ms(600);
                while(1);
    }               
怎么里面还有个while啊????肯定不会闪烁啦      

出0入0汤圆

发表于 2012-12-27 10:32:46 | 显示全部楼层
本帖最后由 Tliang 于 2012-12-27 10:35 编辑
dianzichina 发表于 2012-12-27 09:41
您说编译器的问题,这个真有可能了,我也不清楚编译器有何问题。我下载了没经编译的文件?那这些变化的现 ...


仿真文件,PORTD翻转

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-12-27 10:35:02 | 显示全部楼层
qwermhb 发表于 2012-12-27 10:25
while(1)        
    {        
                PORTD=0x00; //LED接PD6,0XBF可亮。低电平。      

这是做了最后的一个可苦逼的测试的时候关掉的。那就是把这个语句用上,灯还是亮着。。。。。

出0入0汤圆

发表于 2012-12-27 10:38:28 | 显示全部楼层
dianzichina 发表于 2012-12-27 10:35
这是做了最后的一个可苦逼的测试的时候关掉的。那就是把这个语句用上,灯还是亮着。。。。。 ...

如果你的单片机是ATMEGA8可以把我的那个HEX直接下进去看看。

出0入0汤圆

发表于 2012-12-27 12:59:19 | 显示全部楼层
学习,  mark

出0入0汤圆

 楼主| 发表于 2012-12-27 17:15:24 | 显示全部楼层
真是苦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);   
            }      
        }
}

但至今未知何故。。。。。请大师出马?虽然这是一个超级简单的问题,而大师往往能对一个简单的问题回答得更加完美,一如大学时一位教授给我们讲座“黑洞”,学生提问说在一个黑洞的星球上用光速发一道光,外界能看到不?教授说这只是一个上抛运动而已。这道光在引力的作用之下它会回来。

出0入0汤圆

发表于 2012-12-27 17:25:05 | 显示全部楼层
本帖最后由 yklstudent 于 2012-12-27 20:41 编辑

这个感觉还是看编译后的生成的汇编代码 估计会看出点啥

出0入0汤圆

发表于 2012-12-27 17:53:49 | 显示全部楼层
学习,mark

出0入0汤圆

发表于 2012-12-28 15:32:47 | 显示全部楼层
楼主,你放在1楼的程序 没问题 ,很正常,

出0入0汤圆

发表于 2012-12-28 20:57:52 | 显示全部楼层
dianzichina 发表于 2012-12-27 17:15
真是苦B啊,换了一个编译器,现在用的是CVAVR 2.04.4a,用了下面的程序,直接成功:
#include
#include

是不是用ICCAVR?我上次编译的时候选择型号导致找了2天的问题,估计很有可能

出0入0汤圆

 楼主| 发表于 2012-12-29 09:13:15 | 显示全部楼层
HeP028 发表于 2012-12-28 20:57
是不是用ICCAVR?我上次编译的时候选择型号导致找了2天的问题,估计很有可能 ...

开始就是用的ICCAVR 6.31A,出现这个奇特的问题的,后来用CVAVR给解决了,这样算能结帖了吗?我认为不能,就是想看看这ICCAVR到底是在干啥?

出0入0汤圆

发表于 2012-12-29 09:42:38 | 显示全部楼层
dianzichina 发表于 2012-12-29 09:13
开始就是用的ICCAVR 6.31A,出现这个奇特的问题的,后来用CVAVR给解决了,这样算能结帖了吗?我认为不能 ...

ICCAVR要选择目标型号:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-12-29 13:55:19 | 显示全部楼层
SMX 发表于 2012-12-29 13:05
没看明白楼主这个帖子想说什么。

知我者谓我心忧,不知我者谓我何求,也许您是一高人,无瑕顾及偶等初学者尔。

出0入0汤圆

发表于 2012-12-29 14:24:51 | 显示全部楼层
dianzichina 发表于 2012-12-29 13:55
知我者谓我心忧,不知我者谓我何求,也许您是一高人,无瑕顾及偶等初学者尔。

...

楼主啊,你放在一楼的程序没问题啊? 你出现啥问题了

出0入0汤圆

 楼主| 发表于 2012-12-29 17:29:20 | 显示全部楼层
qwermhb 发表于 2012-12-29 14:24
楼主啊,你放在一楼的程序没问题啊? 你出现啥问题了

一楼,以及后续补充已很清楚,如结描述有不清楚之处,提出来我继续补充。

出0入0汤圆

发表于 2012-12-29 19:18:41 | 显示全部楼层
27楼说的对!你再编译下试试,这个程序不复杂,估计是你没选择型号哦。

出0入0汤圆

 楼主| 发表于 2012-12-29 20:11:34 | 显示全部楼层
HeP028 发表于 2012-12-29 09:42
ICCAVR要选择目标型号:

片子是MEGA8,上面的型号也选的是MEGA8,至于是否一致,我无从而知了。

出0入0汤圆

发表于 2012-12-30 13:46:25 | 显示全部楼层
那这估计就和RP有关系了,看你经常遇到奇怪的问题~囧

出0入0汤圆

 楼主| 发表于 2012-12-30 15:38:53 | 显示全部楼层
HeP028 发表于 2012-12-30 13:46
那这估计就和RP有关系了,看你经常遇到奇怪的问题~囧

您老搞错了,我奇怪的问题也不是就这几天提的,而是一直都有。。。。

出0入0汤圆

发表于 2012-12-30 18:51:44 | 显示全部楼层
dianzichina 发表于 2012-12-30 15:38
您老搞错了,我奇怪的问题也不是就这几天提的,而是一直都有。。。。

你程序没用delay_ms  但是你却说改变它会有变化???什么意思?,而且你的delay_ms里面不应该用121,8M的晶振怎么也得用个1000啊

出0入0汤圆

 楼主| 发表于 2012-12-30 20:44:38 | 显示全部楼层
qwermhb 发表于 2012-12-30 18:51
你程序没用delay_ms  但是你却说改变它会有变化???什么意思?,而且你的delay_ms里面不应该用121,8M ...

上面的delay()子程序是网友给的,用我的代码做了测试之后,没有成功,又用上了他的代码做的测试。所以贴上来的代码是直接用他的代码做实验后拷贝下来了。

出0入0汤圆

发表于 2012-12-30 21:45:37 | 显示全部楼层
dianzichina 发表于 2012-12-30 20:44
上面的delay()子程序是网友给的,用我的代码做了测试之后,没有成功,又用上了他的代码做的测试。所以贴 ...

delay_ms是毫秒级得延时,8M晶振,你至少得把121改成1000以上,还有,按照你的程序,0-100的时候,是脉冲频率高,相当于一直是高电平,所以很亮,100-121的时候,平率降低了,LED通电时间减少,所以变暗了,过了121后,平率更低,电压不够,所以不亮了

出0入0汤圆

 楼主| 发表于 2012-12-30 22:04:13 | 显示全部楼层
qwermhb 发表于 2012-12-30 21:45
delay_ms是毫秒级得延时,8M晶振,你至少得把121改成1000以上,还有,按照你的程序,0-100的时候,是脉冲 ...

你分析得不错,122以后,频率低了,所以不亮了,那改成1000以后,这它还会亮吗?程序中高低电平的延时是一样的,也就是说亮的时间跟灭的时间相等。这如何解释啊?

出0入0汤圆

发表于 2012-12-30 22:11:38 | 显示全部楼层
本帖最后由 qwermhb 于 2012-12-30 22:12 编辑
dianzichina 发表于 2012-12-30 22:04
你分析得不错,122以后,频率低了,所以不亮了,那改成1000以后,这它还会亮吗?程序中高低电平的 ...


改成1000后用delay_ms(500),就会产生一秒平率的脉冲而闪烁,还有高低电平是的时间是一样啊,要解析什么?

出0入0汤圆

 楼主| 发表于 2012-12-30 22:41:58 | 显示全部楼层
qwermhb 发表于 2012-12-30 22:11
改成1000后用delay_ms(500),就会产生一秒平率的脉冲而闪烁,还有高低电平是的时间是一样啊,要解析什么? ...

我不想解析什么,只想让它闪起来。也仅此而已。谢你的回答。

出0入0汤圆

发表于 2012-12-30 23:01:52 | 显示全部楼层
WGC编译如果设置了优化直接把你的延时函数优化掉了

出0入0汤圆

 楼主| 发表于 2012-12-31 09:28:21 | 显示全部楼层
qingguogao 发表于 2012-12-30 23:01
WGC编译如果设置了优化直接把你的延时函数优化掉了

恩,这种可能还能说得过去,所以看到的都是亮的了。PS一个问题,楼主位有说把121改大一点,会变成常灭,何解?

出0入0汤圆

发表于 2012-12-31 11:33:55 | 显示全部楼层
不知楼主的问题解决了没有?
如果是编译器优化问题,那就把优化级别设低些。
或者定义变量时加volatile ,如
void delay_ms(uint k)
{
   volatile  uint i,j;   

出0入0汤圆

 楼主| 发表于 2013-1-1 12:43:08 | 显示全部楼层
lcw_swust 发表于 2012-12-31 11:33
不知楼主的问题解决了没有?
如果是编译器优化问题,那就把优化级别设低些。
或者定义变量时加volatile , ...

ytm 谢您的回答。楼主位的延时子程序似乎与您的一样:
void delay(uint t)
{
        volatile uint m;
        while(t--)
        {
            for (m=0;m<44;m++)
                {}
        }
}

这个的测试是把另一个子程序的121变成了44,结果依旧。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 06:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表