搜索
bottom↓
回复: 20

感觉很怪 数码管闪烁问题,想了一天了

[复制链接]

出0入0汤圆

发表于 2010-7-10 20:28:52 | 显示全部楼层 |阅读模式
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "led.h"

uint c_tmp=0;
uchar dis_buf[]={0,0,0,0,0,0},pos=0;



ISR(TIMER0_COMP_vect)//2.5ms
{
        PORTC=0xff;
        PORTA=led[dis_buf[pos]];
        PORTC=~(1<<pos);//以上三句点亮一位数码管

        if(++pos==2)//总共两个数码管
                pos=0;

        if(++c_tmp==200)//200*2.5ms=500ms,延时一次
        {
                c_tmp=0;
                _delay_ms(5);//延时5ms
        }
}


int main()
{
        uchar tmp;
        DDRA=0xff;
        PORTA=0xff;
        DDRC=0xff;
        PORTC=0xff;
       
        //CTC模式,定时2.5ms
           TCCR0=0x0c;
        OCR0=108;
        TIMSK=0x02;
        TCNT0=0;       

        sei();
       
        while(1);

        return 0;
}

症状:两位数码管(本来是6位的,为了测试改成2位的),每500ms闪烁一下,闪烁不是一闪一闪的,是稍微抖一下,不太明显。

数码管2.5ms扫描一位,问题出在:
        if(++c_tmp==200)//200*2.5ms=500ms,延时一次
        {
                c_tmp=0;
                _delay_ms(5);//延时5ms
        }
500ms到,会延时5ms,可5ms也够短了吧?一位2.5ms,延时5ms,再次点亮当前数码管也就2.5+5ms=7.5ms,怎么会闪?我试了下,6位数码管,小于4ms点亮一位就不会闪,那就是重新点亮一位的最大时间为4*(6-1)=20ms。不加那段语句,没问题。 定时为2.5ms时,延时超过3ms就会闪,当定时为1.25ms时,延时超过2ms就闪了。照理说,把时间缩短了,应该不会闪啊,很费解。。

本来是个18B20测温的程序,51做的,发现问题后,查了很久,没有结果,后来想到AVR上试下,结果还是一样。_delay_ms(5)实际是读温度时间,为了测试改成延时。那个500ms是温度转换时间,500ms转换一次。时间到后,读温度,完了之后,重启18B20准备下一次转换,500ms再到,继续读温度、重启。

刚在一个QQ群里问了下,上来就被一个人鄙视了下,“数码管问题也要问?”。希望能帮我看下,多谢!

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-7-11 00:03:50 | 显示全部楼层
定时器中断周期才2.5ms,却在中断程序内嵌入5ms的延时,必然造成时序的抖动,表现为数码管闪亮。
简单的解决方法是把定时中断周期设为大于5ms,如设定为6ms,应该可以解决问题,但如果扫描6位数码管一轮需要36ms,频率可能有点低了。也可以设法减少18B20的读温度时间。其实访问18B20所需的各个指令传送之间是可以停顿,不必连续进行。

出0入0汤圆

 楼主| 发表于 2010-7-11 00:45:05 | 显示全部楼层
恩,我测了下,超过大约24ms就会闪。 你说的“必然造成时序的抖动”,很笼统。我试着吧2.5ms减小到800us、500us,再加一个5ms延时,还是抖动,800*6=5ms+5ms=10ms ?  为什么还抖?
51程序:
#include <at89x51.h>
#include "led.h"
#include "delay.h"


uint c_tmp=0;
uchar dis_buf[]={0,0,0,0,0,0},pos=0;

void ISR_T0() interrupt TF0_VECTOR
{
        TH0=0xfd;//833us
        TL0=0x00;

        P2=0xff;
        P0=led[dis_buf[pos]];
        P2=~(1<<pos);

        if(++pos==6)
                pos=0;

        if(++c_tmp==200)
        {
                c_tmp=0;
                _delay_ms(5);//5ms延时
        }

}

void main()
{
        TMOD=0x01;
        TH0=0xfe;
        TL0=0x34;
        ET0=1;
        EA=1;
        TR0=1;

        while(1);
}

出0入0汤圆

发表于 2010-7-11 00:51:18 | 显示全部楼层
应该是试着吧2.5ms增加到6ms,而不是减小到800us、500us。

出0入0汤圆

 楼主| 发表于 2010-7-11 00:53:00 | 显示全部楼层
不是不是,  增加到6ms就会全闪了啊  超过24ms就会闪    把时间调小,总周期不就小了么,可还是抖。

出0入0汤圆

 楼主| 发表于 2010-7-11 00:56:16 | 显示全部楼层
加到6ms   减少扫描的个数,是不会抖,   我就感觉延时超过定时时间就会抖,可为什么抖啊。。

出0入0汤圆

发表于 2010-7-11 01:14:15 | 显示全部楼层
楼主还没明白我意思,其实这里有两种闪,超过24ms就会闪是扫描频率低引起的闪,用2.5ms * 6 可以解决,但你在中断里有一个5ms的处理过程,这使得每位数码管点亮的时间不全是2.5ms,每隔500ms其中一位就会点亮 (2.5ms + 5ms) , 从而看到抖动。

出0入0汤圆

发表于 2010-7-11 01:21:45 | 显示全部楼层
回复【5楼】feng741 梦不落
加到6ms   减少扫描的个数,是不会抖,   我就感觉延时超过定时时间就会抖,可为什么抖啊。。
-----------------------------------------------------------------------

感觉延时超过定时时间就会抖,是对的,所以在不能加长定时时间的情况下,就只能减少中断内的延时时长,也就是减少18B20的访问时间。我在一楼也提到,18B20的访问不必一气呵成,可以分成几个步骤,每次中断只处理一个步骤,这样使得中断内的处理时间尽量短,以提高系统的实时响应速度。

出0入0汤圆

 楼主| 发表于 2010-7-11 01:25:26 | 显示全部楼层
我没说清楚。。。
我改成500us,   0.5ms*6=3ms, 每隔500ms其中一位就会点亮 (0.5ms + 5ms),  总共还没到10ms,依然抖动。。

出0入0汤圆

 楼主| 发表于 2010-7-11 01:27:19 | 显示全部楼层
恩 我记下了。  可现在抛开18B20,就看这个程序,怎么理解?

出0入0汤圆

 楼主| 发表于 2010-7-11 01:33:18 | 显示全部楼层
恍然大悟!数码管在抖,实际上不是熄灭了,而是由于那个5ms的点亮时间,比其他的大,亮度会强,就出现了抖动效果?? 而当延时时间小于定时时间时,不影响下一次扫描,就没有这种情况。我想应该是答案了!

出0入0汤圆

发表于 2010-7-11 01:35:27 | 显示全部楼层
恍然大悟了:)

出0入0汤圆

 楼主| 发表于 2010-7-11 01:36:28 | 显示全部楼层
哈哈,谢谢~!!

出0入0汤圆

 楼主| 发表于 2010-7-11 01:39:10 | 显示全部楼层
怪我前边没理解你的意思啊 呵呵。

出0入21汤圆

发表于 2010-7-11 01:40:52 | 显示全部楼层
回复【10楼】feng741  梦不落
恍然大悟!数码管在抖,实际上不是熄灭了,而是由于那个5ms的点亮时间,比其他的大,亮度会强,就出现了抖动效果?? 而当延时时间小于定时时间时,不影响下一次扫描,就没有这种情况。我想应该是答案了!
-----------------------------------------------------------------------

正是这样。

出0入0汤圆

 楼主| 发表于 2010-7-11 01:43:55 | 显示全部楼层
恩 也谢谢你

出0入0汤圆

发表于 2010-8-10 15:08:12 | 显示全部楼层
mark 呵呵 本论坛的氛围真好

出0入0汤圆

发表于 2010-8-11 14:57:22 | 显示全部楼层
mark mark

出0入0汤圆

发表于 2014-11-1 10:35:46 | 显示全部楼层
谢谢楼主的提问,也让我的数码管抖动找到了原因

出0入0汤圆

发表于 2014-11-7 23:56:10 | 显示全部楼层
谢谢分享!!!!!!

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-26 04:25

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

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