搜索
bottom↓
回复: 16

感觉很怪 数码管闪烁问题,想了一天了 不是普通动态扫描问题!

[复制链接]

出0入0汤圆

发表于 2010-7-10 20:18:26 | 显示全部楼层 |阅读模式
#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群里问了下,上来就被一个人鄙视了下,“数码管问题也要问?”,老师不要笑话,希望能帮我看下,多谢!

出0入0汤圆

发表于 2010-7-10 20:35:43 | 显示全部楼层
中断里加入延时不好,你为啥不在主程序里读18b20 传递给一个全局变量。中断里只负责扫描,显示全局变量。闪烁原因不清楚,可能是扫描时间不均匀导致的,另外建议你的全局变量用 volatile 有时候优化会导致问题。

出0入0汤圆

发表于 2010-7-10 20:37:07 | 显示全部楼层
坛子里面,不要重复发帖,虚拟总论坛都能看到的。看来是初学,2.5ms d的定时中断内,却搞个 5ms 软件延时, 这里是有问题的。

出0入0汤圆

 楼主| 发表于 2010-7-10 20:48:46 | 显示全部楼层
to 【2楼】  不好意思,我不怎么发帖的。

to 【1楼】 我这学期都在用51,AVR放了一阵,  中断用到的变量我是一直都加volatile的,忘了。 你说的在主程序里读18B20我知道,但是18b20时序是有要求的,在读写这些敏感的地方,是不能中断的,我试过在主程序里读温度,在读写18B20的时候关中断,这种方法不闪烁,但关掉中断后,如果是个时钟在运行的话,就不准了。  还有种方法就是不用定时器,显示和读温度,都在主函数的while(1)里执行,这种也不闪,但这种效率太低。我只想在中断里完成。照理说是可以的。
定时为2.5ms时,延时超过3ms就会闪,当定时为1.25ms时,延时超过2ms就闪了。照理说,把时间缩短了,应该不会闪啊。我想了下,定时时间大于延时时间,就是延时后,下一次中断和可以响应,就不会闪。 当延时时间大于定时时间后,有中断到不能及时响应,得等到延时完后再响应,就会闪,可是当延时完出中断后马上会相应未响应的中断,马上会刷新数码管,不应该闪啊?

出0入4汤圆

发表于 2010-7-10 20:53:52 | 显示全部楼层
多看别人写的程序,论坛高手如云,上传源代码无数,看看。

出0入0汤圆

 楼主| 发表于 2010-7-10 21:15:54 | 显示全部楼层
to 【4楼】 谢谢    现在不是怎么用18B20的问题,而是这个程序,有什么问题。 有谁写过电子钟用定时器定时,同时显示温度的程序?貌似一般都是用DS1302+18B20做的。用内部定时器,会打断18B20读写过程,而用DS1302不存在这个问题。


数码管问题,没人理。。。

出0入0汤圆

发表于 2010-7-10 21:26:57 | 显示全部楼层
应该是定时器里延时搞的,要不你就在中断里关掉计数器,要不就退出时重新初始化定时器,要不搞不懂

出0入0汤圆

 楼主| 发表于 2010-7-10 21:32:19 | 显示全部楼层
to 【6楼】   ...

出0入0汤圆

发表于 2010-7-10 21:33:56 | 显示全部楼层
觉得lz最好读读农民_运动讲习所的那篇大作。。。
你 其实完全可以在中断中只update单向递增的一个时标,然后在主程序中根据时标安排2个工作,在主程序中关键部分可以关中断,因为是CTC,所以从微观上看每个时标间隔可能有误差,但是在整体上,仍然是没有误差的,计时也不会有问题。

出0入0汤圆

 楼主| 发表于 2010-7-10 21:40:39 | 显示全部楼层
to 【8楼】   "其实完全可以在中断中只update单向递增的一个时标,然后在主程序中根据时标安排2个工作"
这句话看不懂,是不是中断里计时当时间到后,置度温度标志位,然后主程序检测到标志后执行读温度? 在读温度时关中断,这种我试过了,上边也说了。如果有时钟的话,关中断会影响时钟时间的。

出0入0汤圆

 楼主| 发表于 2010-7-10 21:42:34 | 显示全部楼层
“农民_运动讲习所” 不懂。

出0入0汤圆

发表于 2010-7-10 22:17:27 | 显示全部楼层
...你有ctc啊 所以总体上还是没有误差的
18b20的通讯时间很短的,1wire就传几个字节而已,肯定不会超过你一个2.5ms的时间片,所以你堵塞了中断后再打开,虽然当前时间片的间隔发生了改变,但是总体上因为有ctc的自动装载,所以不会有误差的阿。

不是置标志位 ,而是更新一个单向递增的数字,然后在主循环中用mask处理这个数字后安排工作

农民_运动讲习所是一个单片机牛人,他写了个文章很有名,我觉得读了以后你就真正入门了。。。

出0入0汤圆

发表于 2010-7-10 22:18:49 | 显示全部楼层
你现在的纠结就在于要在一个2.5ms周期性中断里干5ms的事情。。。。。。

出0入21汤圆

发表于 2010-7-10 22:40:11 | 显示全部楼层
在2.5ms中断里置一下标志,在主循环里面判断这个标志然后去处理5ms的事情就行呀。

出0入0汤圆

 楼主| 发表于 2010-7-10 22:50:20 | 显示全部楼层
to  ilovezeno 鸣
是很纠结。。。

我查了下 “农民讲习所”,看见一个有关多任务的程序,貌似很牛,没细看,有时间好好看看。

你说的在理,没有误差。但如果是溢出中断的话,那误差就会累积了。51的自动重装只有256us,多于1次的中断标志会被挤掉。

出0入0汤圆

 楼主| 发表于 2010-7-11 01:43:16 | 显示全部楼层
问题在cowboy 的帮助下解决了,抖动问题是延时5ms比正常点亮2.5ms时间长,造成某一位数码管比较亮,而不是数码管熄灭。

以后不发重复贴了。。

出0入0汤圆

发表于 2010-7-17 15:12:33 | 显示全部楼层
to feng741 梦不落:

这样简单的问题,在这里转了这么多的圈子。如果还是信任本栏目,应该买(或至少借)一本我编写的教材仔细学习。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-29 15:27

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

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