搜索
bottom↓
回复: 76

精确定时是用单片机内的定时器好还是时钟芯片好

[复制链接]

出0入0汤圆

发表于 2010-7-22 09:43:50 | 显示全部楼层 |阅读模式
刚看了一个帖子http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4056474&bbs_page_no=1&search_mode=1&search_text=定时&bbs_id=9999
好像用单片机内的定时器定时会有误差,是这样吗?误差来源是什么呢?定时器不是1微妙加一计时的吗? 怎么会有误差呢?我用过方式2,就是那种自动重装载的方式,用protues仿真运行一个小时,好像也看不到误差啊?
    要是用时钟芯片,会不会降低系统的稳定性呢?毕竟多了一部分电路,且在单片机外部,在工控场合会不会容易受到干扰而计时不准呢?
帖子内容如下:
/********定时器T0中断函数**********/
void t0(void) interrupt 1  
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//这样的定时数据,是不是正好是50000*1微秒=50毫秒?
aa++;
if(aa==18)//这里的意思是中断18次,需要1秒的时间(晶振12MHz),我怎么感觉应该是中断20次用时1秒?
  {
    aa=0;
    miao++;
    if(miao==60)
    {
      miao=0;
      fen++;
       if(fen==60)
        {
           fen=0;
           shi++;
          if(shi==24)
             shi=0;
        }
    }
  }

----------------问题附在注释里面,请指点一下,看看这个18是怎么算的吧!

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入147汤圆

发表于 2010-7-22 10:10:14 | 显示全部楼层
进中断是需要时间的,误差就来源于进中断程序的时间,因此每次定时中断的时间并不是正好50ms,而是50ms+中断执行时间,因此aa才会取18,也就是说,每一秒里,中断执行的时间大约占用了100ms。

出0入4汤圆

发表于 2010-7-22 10:25:24 | 显示全部楼层
软件延时可以做到精确,用中断不可能做到精确,因为51单片机每次进中断所用的时间是不固定的,最长4个机器周期,最短1个机器周期。12M晶振的话,误差就是3us。

出0入0汤圆

发表于 2010-7-22 10:38:35 | 显示全部楼层
使用自动重装置方式,不存在误差,误差就是晶振的误差。可以做到跟时钟芯片一样的精度,而且更方便,

前提是程序要写对,比如一楼说的50mS中断一次,但执行一次中断不只用了50mS,所以中断程序尽量简短。

出0入0汤圆

发表于 2010-7-22 11:00:42 | 显示全部楼层
支持3楼的说法。
你可以做到比时钟芯片更高精度的,就是选择很高精度的晶振来当单片机的晶振,如果时钟芯片采用普通的32K晶振的话,那单片机定时就会比时钟芯片更准。

出0入0汤圆

发表于 2010-7-22 11:01:39 | 显示全部楼层
我记得阿莫邮购部就卖过一批高精度的晶振,你用它来做,定时精度就高了。

出0入0汤圆

发表于 2010-7-26 15:52:00 | 显示全部楼层
进中断也需要时间么。。。直观理解。。

出0入0汤圆

发表于 2010-7-26 16:19:55 | 显示全部楼层
LS,漂亮头像的兄弟,你咋又来了

出0入0汤圆

发表于 2010-7-27 10:51:43 | 显示全部楼层
回复【7楼】majia-2  
-----------------------------------------------------------------------
我来学习啊。。晕

出0入0汤圆

发表于 2010-7-28 08:45:28 | 显示全部楼层
try this:

========zero cumulative error timing routine, from Black Roman============
//initialize the timer
void t0_init(unsigned short duration) {
  TH0=duration >> 8;  //th0 has the msb
  TL0=duration & 0xff; //tl0 has the lsb
}

/********定时器T0中断函数**********/  
void t0(void) interrupt 1   
{  
static unsigned long total_ticks=0;  //initialize total_ticks
//clear the flag
//TH0=(65536-50000)/256;  
//TL0=(65536-50000)%256;//这样的定时数据,是不是正好是50000*1微秒=50毫秒?  
  total_ticks += 65536ul;  //advance duration;
  if (total_ticks >= DURATION) { //desired duration has reached;
    total_ticks -= DURATION;  //update total_ticks but retain the error
    t0_flag=1;  //set the flag
  }
}

==========================

DURATION is a macro or global variable that determines how long t0_flag will be set.
t0_flag is set when the desired ticks, as specified by DURATION, have been reached.

so if each tick is 1us, and you want t0_flag is set every 500ms, you set DURATION to 500000ul.

the accuracy here depends entirely on the oscillator, and the approach is highly portable.

出0入93汤圆

发表于 2010-7-28 09:04:51 | 显示全部楼层
我很奇怪,为什么51做不到精确定时?我的小弟也是这么说,我面试过几个,也这么说。但是我自己却从来都是认为51的定时器和时钟芯片的误差是一样的,误差的来源仅仅取决于振荡器。若要定时精确,就选用好的振荡器。
很是不明白为什么总以51的T0说事,52(现在基本上都是标准的52居多吧)是有T2定时器的,自动重载,何来的中断引起的误差?

我面试那些不知道有T2的都被我刷掉了,哈哈。

出0入93汤圆

发表于 2010-7-28 09:08:27 | 显示全部楼层
回复【11楼】takashiki  岚月影
-----------------------------------------------------------------------

就我个人来说,优先选择单片机,时钟芯片能不用则不用。使用时钟芯片的考虑仅仅出于耗电方面的考虑,有的51本身带有RTC,比如NXP的,时钟芯片就更没有什么用了。

出0入0汤圆

发表于 2010-7-28 11:21:34 | 显示全部楼层
【11楼】 takashiki 岚月影

自动重载跟定时器几无关啊,是跟工作方式有关,T0、T1一样可以工作在自动重装载方式,所以没必要用到T2

52单片机的T2有别于T0和T1,应该用在更重要的地方。


在学校刚出来的时候可能对51还不是很了解的,我刚出来的时候也不知道AT89S51有双数据指针,有看门狗,有空闲掉电模式,

因为这是老师不会讲的东西,需要自己啃数据手册的。

出0入4汤圆

发表于 2010-7-28 11:44:43 | 显示全部楼层
回复【11楼】takashiki  岚月影
我很奇怪,为什么51做不到精确定时?我的小弟也是这么说,我面试过几个,也这么说。但是我自己却从来都是认为51的定时器和时钟芯片的误差是一样的,误差的来源仅仅取决于振荡器。若要定时精确,就选用好的振荡器。
很是不明白为什么总以51的t0说事,52(现在基本上都是标准的52居多吧)是有t2定时器的,自动重载,何来的中断引起的误差?
我面试那些不知道有t2的都被我刷掉了,哈哈。
-----------------------------------------------------------------------
就你这点水平还面试别人,多少人被你冤枉掉了?误差不是来自于计数过程,而是来自于中断执行过程,跟自动重载有何关系?你大学老师没教你?今天心情好免费教你。51单片机中断响应机制就是“等待当前指令执行完毕再响应中断”,中断时随机发生的,所以当前指令时随机的,如果赶上单片机在执行除法指令,那么需要四个机器周期之后,中断才能执行,也有可能当前指令刚好执行完毕,无需等待即可响应中断程序。所以说最大误差4个机器周期。还不明白的话自己好好看看“51单片机中断响应过程”。

出0入93汤圆

发表于 2010-7-28 11:59:13 | 显示全部楼层
回复【13楼】hsztc  
-----------------------------------------------------------------------

T0、T1的自动重载时是8位的,中断频率太快,最多256机器周期就中断一次,过于频繁了。T2重载是16位的,可以明显减少中断执行的频率。



回复【14楼】wajlh  
-----------------------------------------------------------------------
就你这点水平还面试别人,多少人被你冤枉掉了?误差不是来自于计数过程,而是来自于中断执行过程,跟自动重载有何关系?你大学老师没教你?今天心情好免费教你。51单片机中断响应机制就是“等待当前指令执行完毕再响应中断”,中断时随机发生的,所以当前指令时随机的,如果赶上单片机在执行除法指令,那么需要四个机器周期之后,中断才能执行,也有可能当前指令刚好执行完毕,无需等待即可响应中断程序。所以说最大误差4个机器周期。还不明白的话自己好好看看“51单片机中断响应过程”。


请你把51结构看清楚一次,尤其是自动重载部分。误差到底是不是来自中断执行过程。在定时器自动重载时,不管是不是有中断,都不会有误差的。已经由硬件完成的东西,你扯什么中断,有意义吗?
例如:
RCAP2 = 0x1000
那么,等到(TH2, TL2)=0xFFFF向上计数到0000时,(TH2、TL2)溢出并重载成0x1000,此时产生中断,不管你当前指令占用多长时间,进入中断进行跳转,保护现场到底用了多长时间,定时器还是一直在走,怎么会引起误差呢?


就凭你“所以说最大误差 4个机器周期。”就凭你这句话,就凭你这点水平,我就可以在面试时刷掉你了,一点也不冤枉你。学院派的吧?应该看书的应该是你吧?

举例:
我的系统中含有INT0中断、T0中断、×××中断一批。出于实时性的考虑,INT0中断优先级最高。
现在,INT0中断正在执行过程中,假设耗时100个机器周期,此时T0中断了,你给出一个T0中断最大误差4个机器周期的程序我看看。

误差不是来自于计数过程,而是来自于中断执行过程,跟自动重载有何关系?
好,退一步,我就认为你所谓的“误差来自中断执行过程”一下。我好像没说过误差来自计数过程吧,我是说来自振荡器。你看清楚了没有?你保证你的振荡器没有误差?
中断执行过程的任意时间运行那条指令你能保证?会不会被其他中断所中断?

书本知识都是有前提的,你随便应用到所有场合,行吗?



回复【2楼】wajlh  
软件延时可以做到精确,用中断不可能做到精确,因为51单片机每次进中断所用的时间是不固定的,最长4个机器周期,最短1个机器周期。12m晶振的话,误差就是3us。
-----------------------------------------------------------------------
再来打击你一下。软件延时精确?我给其他人做延时时都特别说明软件延时极其不可靠,可能会被中断。就算我写的《单片机大杂烩》软件中有软件延时的部分,也特别提到软件延时不精确,尽量少用。这还精确?

出0入4汤圆

发表于 2010-7-28 17:00:03 | 显示全部楼层
回复【15楼】takashiki  岚月影
-----------------------------------------------------------------------
实践需要理论支持的,关于软件延时准确确实是在没有中断的情况下的。

来自于晶体振荡器的误差无论采取何种方法都是一样的,这个没有疑问,也不是这里讨论的。这里讨论的是定时器定时到底是否精确。看准了题目。
假设你需要每过100ms对P1.0口取反,12M晶振的前提下,你用定时器能实现输出波形周期精确到1us?


举例:
我的系统中含有INT0中断、T0中断、×××中断一批。出于实时性的考虑,INT0中断优先级最高。
现在,INT0中断正在执行过程中,假设耗时100个机器周期,此时T0中断了,你给出一个T0中断最大误差4个机器周期的程序我看看。
————————————————————————————————
你这个例子不恰当吧,INT0优先级最高,那么T0的中断子程序必须要等到INT0中断程序执行完才能执行,你在否定你自己?中断从产生到执行是需要时间的,好好看看,51单片机中断的执行过程。

出0入93汤圆

发表于 2010-7-28 17:31:15 | 显示全部楼层
假设你需要每过100ms对P1.0口取反,12M晶振的前提下,你用定时器能实现输出波形周期精确到1us?

鉴于这个题目的变态性,变态解法:

每一步都精确到1us也能做到,只是没有意义。N步平均值精确到1us要做到很容易。

每一步都精确到1us的做法:
前提:T2可以直接在P1.0输出时钟。
关了中断,让T2自由定时计数(递增、递减都可以,比如每次10ms吧),那么9次之后,再改变T2的T2CAP以及控制模式,搞定。

出0入0汤圆

发表于 2010-7-28 18:41:56 | 显示全部楼层
自动重载是硬件执行的,不用CPU干预,跟CPU正在执行的是几个字节几个周期的指令没有关系,CPU在忙的时候顶多引起进入中断时间不定,但是中断间隔是不会受影响的,在保证时钟精度的前提下,设计得好的程序用单片机内的定时器可以媲美外部时钟芯片,外部时钟芯片功能专一,耗电很小,用后备电池可以在主控掉电时正常走时

出0入4汤圆

发表于 2010-7-28 22:10:45 | 显示全部楼层
不管变不变态,这里讨论的是中断能不能做到精确定时。上两个仿真图吧,看图说话。第一个图式软件实现的延时,第二个图是定时器中断的方式实现的延时。
看到最大4个机器的误差了吧。


软件延时50us对P1.0取反效果 (原文件名:软件延时1.JPG)


中断延时50us对P1.0取反效果 (原文件名:中断延时1.JPG)

出0入4汤圆

发表于 2010-7-28 22:29:19 | 显示全部楼层
源程序

软件延时
        ORG        0000H
       
MAIN:        SETB        P1.0
        LCALL        L1
        NOP
        NOP
        CLR        P1.0       
        LCALL        L1
        SJMP        MAIN
L1:        MOV        R3,#21
L2:        DJNZ        R3,L2
        RET
       
        END




中断延时:
        ORG        0000H
        SJMP        MAIN
        ORG        000BH
        CPL        P1.0
        RETI
       
MAIN:        SETB        ET0
        SETB        EA
        MOV        TMOD,#02H        ;T0设为8位自动重载模式
        MOV        TH0,#0CEH
        MOV        TL0,#0CEH
        SETB        TR0
        MOV        A,#08H
        MOV        B,#02H
L1:        MUL        AB
        MUL        AB
        MUL        AB       
        MUL        AB
        MUL        AB
        MUL        AB
        MUL        AB
        MUL        AB
        MUL        AB
        MUL        AB
        MUL        AB
        MUL        AB
        MUL        AB
        MUL        AB
        MUL        AB
        SJMP        L1
        END

出0入0汤圆

发表于 2010-7-29 07:59:39 | 显示全部楼层
回复【楼主位】balance
----------------------------------------------------------------------
自动重载没有误差吧,至于晶振的误差,用时钟芯片也要用晶振的。用时钟芯片的好处是软件开销小,什么时分秒星期月日年闰年等不用计算了,还有掉电不停和ram,以及功耗小。

出0入0汤圆

发表于 2010-7-29 08:01:43 | 显示全部楼层
用定时器的比较中断就没有影响 CTC模式

出0入93汤圆

发表于 2010-7-29 09:23:59 | 显示全部楼层
回复【19楼】wajlh  
不管变不变态,这里讨论的是中断能不能做到精确定时。上两个仿真图吧,看图说话。第一个图式软件实现的延时,第二个图是定时器中断的方式实现的延时。
看到最大4个机器的误差了吧。
中断延时50us对p1.0取反效果
-----------------------------------------------------------------------

鉴于你的水平,我觉得我说什么都是没有用的。
还有,我啥时候跟你讨论过中断能不能精确定时了?我是说,T2定时器可以做到精确定时,这与中断无关吧。是我表述有问题,还是你眼睛有问题?
你这个题目,很容易就能做到。能使用硬件完成的,干嘛非得使用软件(中断)?100ms对于1us来说,是大了,100000比T2的最大定时时间65536要大,我们分两次进行就可以了。第一次P1_0不输出时钟,中断发生后随即设置成P1_0输出时钟,然后中断后设置P1_0不输出时钟。
自动重载是由硬件自动完成的,你的中断再长,也无法影响到硬件自动计数的吧。

就凭你这点水平,我实在很无语。只能说,你的硬件根本刚刚处于入门的阶段,别以为搬出Protues了就有说服力了。对于你上面的问题,我懒得为你计算每一步的值,自己想想吧。
还是那句话,连Timer2都不知道的人,我面试时,刷无赦!

对于50us来说,对P1.0取反,用得着中断吗?T2打开,自己运行去吧,要什么中断?
我也给你一个程序,学你的样。12MHz振荡器,50us翻转,10kHz输出方波。其他的东西你随便加都可以。
sfr16 RCAP2 = 0xCA;

void main(){
   T2CON = 0;               //定时器
   T2MOD = 2;               //允许时钟输出:P1.0输出10kHz方波
   RCAP2 = 0xFED4;
   TR2 = 1;
   while(1);
}

没有经过验算,你有空自己试验一下吧。

-----------------------------------------------------------------------
一向不喜欢发脾气,但是你对我人身攻击,我就用道理好好教育下你。

出0入0汤圆

发表于 2010-7-29 11:41:15 | 显示全部楼层
回复【19楼】wajlh
不管变不变态,这里讨论的是中断能不能做到精确定时。上两个仿真图吧,看图说话。第一个图式软件实现的延时,第二个图是定时器中断的方式实现的延时。
看到最大4个机器的误差了吧。


软件延时50us对p1.0取反效果 (原文件名:软件延时1.jpg)

<center>
中断延时50us对p1.0取反效果
-----------------------------------------------------------------------

进中断有机器误差不假,但是每次中断的时间间隔还是固定的。。。。哎,我咋开始婆妈了

出0入0汤圆

发表于 2010-7-29 12:32:44 | 显示全部楼层
不管变不变态,这里讨论的是中断能不能做到精确定时。上两个仿真图吧,看图说话。第一个图式软件实现的延时,第二个图是定时器中断的方式实现的延时。  
看到最大4个机器的误差了吧。  



_______________________
USB接口JTAGICE制作详解:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3286882
HT1632C点阵电子钟制作:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3568911
视频:http://v.youku.com/v_show/id_XMTE3NTYzMDY0.html
DIY USBASP套件,支持51/AVR
USB转串口模块,稳定支持STC下载
mini USB接口JTAGICE,带隔离缓冲芯片,支持3V~5V宽电压
双色OLED模块
我的淘宝店铺:http://shop34694757.taobao.com

出0入0汤圆

发表于 2010-7-29 15:23:13 | 显示全部楼层
takashiki 和 wajlh两位大哥都说的有理,只是各自理解点不同,而产生了矛盾。
硬件定时器(即计数器)的精度只与单片机外面的晶振有关(现在不管CPU的参不参与,现只对计数这一过程),大家认同吧?当计数器溢出时,此刻会产生中断,而此刻计数器并不会因中断而停止(自动重载,硬件自动现实),因此这个定时是精确的(排除晶振因素)。而我们的软件此刻会拿这个时刻去做一些事,但CPU去拿这个时刻所用的时间是并不却定的(即进中断时间),所以这个定时是不精确的。takashiki 举的这个例子对P1.0输出方波,正好是不需要CPU参与的(硬件自动实现的),所以是精确的;而wajlh举的这个例子是要CPU参与的(中断实现的),所以会出现4个机器的误差。而我们平时用到定时器一般都要用到中断,所以严格来说定时不精确,但这个定时误差不是累加的,因此在精度要求不是相当高的场合下“长时间”(排除晶振的累计误差)的定时还是“相当精确”的。小生个人理解,有错误之处还不请两位大哥指正,先谢了。

出0入0汤圆

发表于 2010-7-29 15:32:09 | 显示全部楼层
定时功能的另一个不需要CPU参与的(硬件自动实现的)应用就是:串口的波特率产生。

出0入0汤圆

发表于 2010-7-29 16:59:29 | 显示全部楼层
这贴子有点意思

出0入4汤圆

发表于 2010-7-29 22:15:16 | 显示全部楼层
回复【23楼】takashiki  岚月影
-----------------------------------------------------------------------
不争论了,谁是谁非大家都看着呢。你认为我有对你人身攻击的地方,我说声对不起。多多讨论技术。

出0入0汤圆

发表于 2010-7-30 16:26:16 | 显示全部楼层
同意26楼说的,2个人说的都对的,只是着眼点不同,论述的是2个不同的方面。

出0入0汤圆

发表于 2010-7-30 17:25:35 | 显示全部楼层
哎!连中断响应和中断处理都没搞清楚就争起来了。
一句话,用自动重载方式只要中断程序没有定时时间那么长,就不会有累积误差。只是中断处理可能会延后几个机器周期而已。定时肯定是准确的。

出0入0汤圆

发表于 2010-7-30 20:46:35 | 显示全部楼层
回复【楼主位】balance
    刚看了一个帖子http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4056474&amp;bbs_page_no=1&amp;search_mode=1&amp;search_text=定时&amp;bbs_id=9999
好像用单片机内的定时器定时会有误差,是这样吗?误差来源是什么呢?定时器不是1微妙加一计时的吗? 怎么会有误差呢?我用过方式2,就是那种自动重装载的方式,用protues仿真运行一个小时,好像也看不到误差啊?
    要是用时钟芯片,会不会降低系统的稳定性呢?毕竟多了一部分电路,且在单片机外部,在工控场合会不会容易受到干扰而计时不准呢?
帖子内容如下:
/********定时器t0中断函数**********/  
void t0(void) interrupt 1   
{  
th0=(65536-5000......
-----------------------------------------------------------------------
进中断是要时间,但是决不影响计时精度。

影响精度的只有一个因素,那就是晶振本省。若晶振毫无误差,计时就可以毫无误差

出0入0汤圆

发表于 2010-8-2 13:23:45 | 显示全部楼层
回复【32楼】bitter rain
若晶振毫无误差,计时就可以毫无误差  
-----------------------------------------------------------------------
不敢苟同,代码的运行是需要占用cpu时间的,进行精确的定时必须考虑代码的运行时间。

出0入0汤圆

发表于 2010-8-2 13:28:13 | 显示全部楼层
回复【33楼】fanka
回复【32楼】bitter rain  
若晶振毫无误差,计时就可以毫无误差   
-----------------------------------------------------------------------
不敢苟同,代码的运行是需要占用cpu时间的,进行精确的定时必须考虑代码的运行时间。

-----------------------------------------------------------------------

自动重装模式。。。

出0入0汤圆

 楼主| 发表于 2010-8-4 11:18:20 | 显示全部楼层
看来我这个坑是越挖越深了。首先感谢大家的激_情似火的讨论。看了一遍大家的讨论,我得出的结论和【26楼】 zhangxun0712
的结论一样。
    首先要明确题目,单片机内的定时器与时钟芯片相比较哪个更准。基于此题目,对于晶振的误差当然就不考虑在内了,毕竟两种方案都要用晶振,晶振误差是不可避免的,而中断响应时间嘛,却要考虑在内,毕竟中断是定时器与单片机沟通的桥梁嘛。
    至于【23楼】 takashiki 岚月影,说到的那种不用中断的定时方式,确实挺好,可是我毕竟还是要把定时用在很多场合的,就我现在而言,只是想用这个时间来做一个定时开关的(可任意设定开通和关断时间的那种,类似于闹钟吧,而且是能设定多个时间的那种)。不能只用于方波的产生啊。
    我的理解是,单片机内的定时器与时钟芯片相具有同等的精确性(有人还想咬晶振的话,请参照上面的第二段)(非自动重载方式,在定时溢出之前and自动重载方式却可以无限定时)。至于这个定时之后的事情嘛,那是cpu要做的事情了,与定时器和时钟芯片无关。
    所以请大家不要再在中断响应时间上大吐口水了。对于软件延时,小生确实不敢重用,毕竟一个系统中要是不用中断的话,确实做不出什么大文章。当然啦,有人还非要较真,定时1uS(12M晶振)之类的,那个确实该用软件延时啦。
    既然是定时,那就必然会在定时时间到后做一些事情啦。cpu或主动或被动获取这个时间。
    时钟芯片,我觉得是cpu主动获取的吧,不过这里还有个疑问,cpu该怎么获取呢,难道cpu要把时钟芯片的时间取过来,实时的与定时时间相比较呢?或者是时钟芯片有定时报警之类的东西,这样的话(就是cpu被动了),是不是要通过中断告诉cpu,定时时间到,要是这样的话,不就是也有中断响应时间的问题吗?(希望得到大家的解惑)
    单片机内的定时器嘛,好像就只有定时中断一种吧。既然定时准确,自动重载方式中,又无误差累计,还有什么要计较的吗?既然都用定时器啦,那肯定是mS级别以上的吧,差那么1~4个周期的中断响应时间又不伤大雅,否则,您还是用软件延时吧。
    我的初衷和【32楼】 bitter rain 类似。
    要是用时钟芯片,会不会降低系统的稳定性呢?毕竟多了一部分电路,且在单片机外部,在工控场合会不会容易受到干扰而计时不准呢?
    而且多一个芯片,就会多一部分成本啊。当然啦,人工费,软件费,还有其他一些想得到的想不到的费用都不计。单就是器件费用而言的。

出0入0汤圆

发表于 2010-8-4 11:42:43 | 显示全部楼层
我的理解是,单片机内的定时器与时钟芯片相具有同等的精确性(有人还想咬晶振的话,请参照上面的第二段)(非自动重载方式,在定时溢出之前and自动重载方式却可以无限定时)。至于这个定时之后的事情嘛,那是cpu要做的事情了,与定时器和时钟芯片无关。
--------------------------------非自动重装模式一样要考虑中断后CPU响应时间和赋初值的时间,

时钟芯片,我觉得是cpu主动获取的吧,不过这里还有个疑问,cpu该怎么获取呢,难道cpu要把时钟芯片的时间取过来,实时的与定时时间相比较呢?或者是时钟芯片有定时报警之类的东西,这样的话(就是cpu被动了),是不是要通过中断告诉cpu,定时时间到,要是这样的话,不就是也有中断响应时间的问题吗?(希望得到大家的解惑)
--------------------------------------------------------------------------比较,先比较小时,小时匹配再比较分钟,这样比较的次数最少,效率高,最多比较次数也才23+59次而已,带闹钟的时钟芯片也有,闹钟时间到来以后CPU响应的时间不会超过1S吧?闹钟可是一分钟之内都有效的,忽略

单片机内的定时器嘛,好像就只有定时中断一种吧。既然定时准确,自动重载方式中,又无误差累计,还有什么要计较的吗?既然都用定时器啦,那肯定是mS级别以上的吧,差那么1~4个周期的中断响应时间又不伤大雅,否则,您还是用软件延时吧。
--------------------------------------
每次1个周期的误差(按12M算是1us),假设定时250us,那么就是1/250的误差了,当250min后就会有1min的误差,每天就是5分多的误差,很可观而不是无伤大雅。。


要是用时钟芯片,会不会降低系统的稳定性呢?毕竟多了一部分电路,且在单片机外部,在工控场合会不会容易受到干扰而计时不准呢?
-----------------------------------------------------
听说过CPU死机,跑飞的,没听过时钟芯片跑飞,死机的(孤陋寡闻了,呵呵),而且时钟芯片的耗电比CPU可是小很多的,特别是在掉电以后

出0入93汤圆

发表于 2010-8-4 12:23:26 | 显示全部楼层
回复楼主:
本帖我以前的一些回复有些偏激,因为某人的某些语气受不了。即使使用T2来定时,也同样是需要进出中断的,我那个例子只是讲T2定时器具有时钟输出功能,同样说明使用T2可以进行16位自动重载而不至计时不精确。

下面是我的一些个人看法,不见得正确。

晶振是需要考虑的,原因在于单片机一般采样的都是高频晶振,而时钟芯片一般采用的32768Hz的表振,精度是不一样的。很少有人在单片机上使用高精度的晶振,所以,不可一概而论。

本人习惯于芯片数量越少越好,习惯而已。要是我选择,我绝对不会选择外部时钟芯片,我会选择带有RTC的单片鸡。现在的单片机种类多得很,适用于不同用途的总是可以选到的,我会为不同的项目选择各自合适的芯片,而不是单一一种包打天下。

出0入0汤圆

发表于 2010-8-4 12:46:23 | 显示全部楼层
请大家看看马潮老师专栏有一相似的帖子。

出0入0汤圆

发表于 2010-8-4 13:22:35 | 显示全部楼层
我是用时间片工作的,做完一片任务进睡眠,定时溢出唤醒,然后软件重 装,再切还,有水知8052这样工作计时有抖动吗?

出0入0汤圆

 楼主| 发表于 2010-8-4 14:37:50 | 显示全部楼层
回复【36楼】little Monkey
-----------------------------------------------------------------------
非自动重装模式一样要考虑中断后CPU响应时间和赋初值的时间,

-------------------------------- 我都说了,定时精确与否是单片机内的定时器与时钟芯片的事,与中断无关。关于非自动重装模式赋初值的时间,不知道你是想说什么。如果是说非自动重装模式的计时是从赋初值开始的,那的确不能忽略赋初值的时间。但是从逻辑上分析一下,就知道,这个很不正确。既然初值都没有赋上,何来的计时开始呢。如果那你想说,下一次的赋初值的时间,那你就多虑了。既然都是非自动重装模式了,那计时的开始和结束,当然是在本次的计时数值之内的啦,干嘛还要费劲用上下次啊。否则用自动重载岂不是更好。
*************************************************************************************
比较,先比较小时,小时匹配再比较分钟,这样比较的次数最少,效率高,最多比较次数也才23+59次而已,

-------------------------------- 这个确实很好
*************************************************************************************
带闹钟的时钟芯片也有,闹钟时间到来以后CPU响应的时间不会超过1S吧?闹钟可是一分钟之内都有效的,忽略

--------------------------------恩,这个也要用到中断吧。否则,闹钟时间到来时,cpu可是正在干别的啊。既然用了中断,那就有相应中断的相应时间误差。与单片机内的定时器同。
*************************************************************************************
每次1个周期的误差(按12M算是1us),假设定时250us,那么就是1/250的误差了,当250min后就会有1min的误差,每天就是5分多的误差,很可观而不是无伤大雅。。
--------------------------------不是有说,自动重载是由硬件完成的(貌似老师也是这么讲的)吗,与软件无关吧。如果您说的是自动重载要占用一个1个周期的话(按12M算是1us),那在计时中,我少记一个数不就可以了吗,这个只是算法问题,也与精确性无关啊。若是说,自定重载的时间不定,那就没有办法了,不过好像,无此说法啊
*************************************************************************************
听说过CPU死机,跑飞的,没听过时钟芯片跑飞,死机的(孤陋寡闻了,呵呵),而且时钟芯片的耗电比CPU可是小很多的,特别是在掉电以后
--------------------------------至于这个嘛,我的考虑是,多个器件,就多了一个故障几率,况且也增加了电路面积,还增加了成本。至于耗电嘛,好像我不必考虑吧,我做的是定时开关,又不是电子表,至于掉电就更不必考虑了。省电模式下的方案,我确实不知,还望指教。

出0入0汤圆

发表于 2010-8-7 18:41:03 | 显示全部楼层
明显是始终芯片定时精确啊
这个不用问了啊

出0入0汤圆

发表于 2010-8-9 22:32:21 | 显示全部楼层
回复【40楼】balance
我都说了,定时精确与否是单片机内的定时器与时钟芯片的事,与中断无关。关于非自动重装模式赋初值的时间,不知道你是想说什么。如果是说非自动重装模式的计时是从赋初值开始的,那的确不能忽略赋初值的时间。但是从逻辑上分析一下,就知道,这个很不正确。既然初值都没有赋上,何来的计时开始呢。如果那你想说,下一次的赋初值的时间,那你就多虑了。既然都是非自动重装模式了,那计时的开始和结束,当然是在本次的计时数值之内的啦,干嘛还要费劲用上下次啊。否则用自动重载岂不是更好。
-----------------------------------------------------------------------
“如果是说非自动重装模式的计时是从赋初值开始的,那的确不能忽略赋初值的时间。但是从逻辑上分析一下,就知道,这个很不正确。既然初值都没有赋上,何来的计时开始呢。”--------------你忘记了定时器溢出以后初值就是0xff(8位的话),即使当时CPU没有处理,定时器一样在0xff上计数,只要定时器启动了并且有计数脉冲那么定时器就会一直计数。
“既然都是非自动重装模式了,那计时的开始和结束,当然是在本次的计时数值之内的啦”,----------------再好好想想,定时没有溢出之前CPU是不知道的,除非是实现计算好进中断的时间(这个上面已经讨论,时间可能不一样),上面很多人都说了自动重载完全就是硬件操作,不存在累积误差。


“恩,这个也要用到中断吧。否则,闹钟时间到来时,cpu可是正在干别的啊。既然用了中断,那就有相应中断的相应时间误差。与单片机内的定时器同。 ”---------------中断处理时间对于闹钟时间来说实在是微乎其微了,假设在12:00闹钟时间到,即使CPU是在12:00:01才处理,相信你也不会在意。


*************************************************************************************
每次1个周期的误差(按12M算是1us),假设定时250us,那么就是1/250的误差了,当250min后就会有1min的误差,每天就是5分多的误差,很可观而不是无伤大雅。。  
--------------------------------不是有说,自动重载是由硬件完成的(貌似老师也是这么讲的)吗,与软件无关吧。如果您说的是自动重载要占用一个1个周期的话(按12M算是1us),那在计时中,我少记一个数不就可以了吗,这个只是算法问题,也与精确性无关啊。若是说,自定重载的时间不定,那就没有办法了,不过好像,无此说法啊
-----------------------------

你忘记了1~4个周期的误差是用定时器的,看看你在上面说的“单片机内的定时器嘛,好像就只有定时中断一种吧。既然定时准确,自动重载方式中,又无误差累计,还有什么要计较的吗?既然都用定时器啦,那肯定是mS级别以上的吧,差那么1~4个周期的中断响应时间又不伤大雅,否则,您还是用软件延时吧。”

回复【41楼】zgxbcf
明显是始终芯片定时精确啊
这个不用问了啊

-----------------------------------------------------------------------

在晶振精度一样的情况下,用时钟芯片与定时器精度一样

出0入0汤圆

发表于 2010-8-9 22:41:11 | 显示全部楼层
凡事都要具体情况具体对待,不能没有任何条件的情况下比较两种方案的优劣,这明显不合理。
如果单片机内部资源足够的话,用内部定时器中断也能实现比较准确的定时,只不过需要一定的系统开销。
如果单片机内部资源不够的话,考虑RTC也是个不错的选择,尤其是好多RTC带有定时功能,这个是个很好的功能,而且RTC维护方便,不需要占用单片机的资源即可实现比较准确的定时。

出0入0汤圆

发表于 2010-9-15 09:11:46 | 显示全部楼层
自动重载绝对可以保证精度,只要中断所处理的时间不超过定时器时间就行了,如果有其它中断优先级比较高且用的时间比较多的,就要注意了。
而上面所说的中断要等待,只要等待的时间不超过定时器时间就行了。

剩下的就是精度和省电问题:
一般32.768K 精度要比普通晶振高,还有32.768分频后刚后0.5S,好计算。
其它用RTC最主要是省电问题,且不占用单片机资源。

                                    结贴了。。。。。逸风

出0入0汤圆

 楼主| 发表于 2010-9-28 11:09:32 | 显示全部楼层
回复【楼主位】balance
-----------------------------------------------------------------------

用事实来说话,我的东西已经完成了,而且运行了将近72个小时,和电脑上的时间对准后,运行至今,至少现在人眼还分辨不出误差

出0入0汤圆

发表于 2010-9-28 13:26:18 | 显示全部楼层
总结一下,使用自动重载或者AVR的CTC方式,定时是精确的,只不过你每次处理这中断的时间有差异。

出0入0汤圆

发表于 2010-9-28 13:34:04 | 显示全部楼层
回复【14楼】wajlh  
回复【11楼】takashiki  岚月影
我很奇怪,为什么51做不到精确定时?我的小弟也是这么说,我面试过几个,也这么说。但是我自己却从来都是认为51的定时器和时钟芯片的误差是一样的,误差的来源仅仅取决于振荡器。若要定时精确,就选用好的振荡器。
很是不明白为什么总以51的t0说事,52(现在基本上都是标准的52居多吧)是有t2定时器的,自动重载,何来的中断引起的误差?
我面试那些不知道有t2的都被我刷掉了,哈哈。
-----------------------------------------------------------------------
就你这点水平还面试别人,多少人被你冤枉掉了?误差不是来自于计数过程,而是来自于中断执行过程,跟自动重载有何关系?你大学老师没教你?今天心情好免费教你。51单片机中断响应机制就是“等待当前指令执行完毕再响应中断”,中断时随机发生的,所以当......
-----------------------------------------------------------------------
对于重载或者CTC方式,每次发生溢出或比较匹配的时间是一样的,即设置中断标志位的时间间隔是一样的,即只要一到中断发生的情况,就立即产生中断请求。只不过这个中断请求要在执行完一条指令或相应高优先级中断后才能处理,但是只要被处理了,就能被精确使用,比如中断20次是一秒,无论你每一次中断的间隔是19.999还是20.001,只要中断20次就是过去了1秒。

出0入0汤圆

发表于 2010-9-29 09:09:59 | 显示全部楼层
两个人都扯淡!

出0入0汤圆

发表于 2010-9-29 09:15:48 | 显示全部楼层
老子.......
各种放屁啊....
呃..我错了...粗口了....
单片机自己的内部的时钟究竟有多精密,诸君看过datasheet没有.很多片子内部时钟都是1%误差起步啊,居然还在这里谈论精密,有个啥意义哦.

出0入0汤圆

发表于 2010-9-29 09:17:14 | 显示全部楼层
"使用自动重载"

even if you don't use auto reload, you can still make the timing incredibly accurate, if you code carefully.

see the example I posted earlier. Its long-term accuracy depends only on the crystal.

出0入4汤圆

发表于 2010-9-29 09:32:06 | 显示全部楼层
我想,对于单片机,只要有一个定时器,可以赋初值,无论它可不可以重载,做RTC都只取决于晶振的精度,与其它无关,因为指令的执行时间和中断时间都是可测的,采用汇编就可以精确的控制定时器的时间。

出0入0汤圆

发表于 2010-9-29 09:44:38 | 显示全部楼层
回复【49楼】telefunken  德律MM
老子.......
各种放屁啊....
呃..我错了...粗口了....
单片机自己的内部的时钟究竟有多精密,诸君看过datasheet没有.很多片子内部时钟都是1%误差起步啊,居然还在这里谈论精密,有个啥意义哦.
-----------------------------------------------------------------------

我从来不用单片机内部的RC,为了省钱也不会这样。

出0入0汤圆

发表于 2010-9-29 17:15:29 | 显示全部楼层
" TH0=(65536-50000)/256;  
TL0=(65536-50000)%256;//这样的定时数据,是不是正好是50000*1微秒=50毫秒?  "

this way of setting timers is the biggest mistake that contributes to bad timing.

the reason is fairly simple: because of interrupt latency / context saving associated with entering an interrupt, by the time your code executes to this point, it is likely that the timer has advanced to a point where TL0 has some values. by resetting TL0 to your own offset, you would have created timing error.

so the correct way is to add your offset to TL0 (TH0 to a lesser extent), like the following


TL0+=(65536-50000)%256;//这样的定时数据,是不是正好是50000*1微秒=50毫秒?  

you can simulate this in hardware and software and you can clearly see the difference between the two approaches.

出0入0汤圆

发表于 2010-9-29 17:41:00 | 显示全部楼层
回复【53楼】millwood0  
" th0=(65536-50000)/256;  
tl0=(65536-50000)%256;//这样的定时数据,是不是正好是50000*1微秒=50毫秒?  "
this way of setting timers is the biggest mistake that contributes to bad timing.
the reason is fairly simple: because of interrupt latency / context saving associated with entering an interrupt, by the time your code executes to this point, it is likely that the timer has advanced to a point where tl0 has some va......
-----------------------------------------------------------------------

我想不是。先记录了50000计数,溢出、进入中断程序,重新赋值,再计数50000……

出0入0汤圆

发表于 2010-9-29 17:52:01 | 显示全部楼层
the following hopefully will help you all understand the issue here.

this is a shot of single stepping through an AVR timer interrupt service routine. I stop'd the code right after it entered the isr, before executing the first statement.

on the right, I was showing the value of the timer / counter, TCNT0. The timer here works similar to the C51 timer: once TCNT0 hits a pre-set value (100 here and 0x100 in the case of a C51 8-bit timer), it rolls over and fires an interrupt.

so TCNT0 was just reset and that triggered the interrupt.

because of latency and context saving, by the time we are to execute the very 1st user code in the isr, the timer has advanced from 0x00 to 0x19.

if you ignore the value of the timer / counter at this point, by writing an explicit value to it, you would have created timing errors.

instead, you should simply increment or decrement the timer, as suggested earlier.



(原文件名:avr tmr isr.PNG)

出0入0汤圆

发表于 2010-9-29 19:21:18 | 显示全部楼层
最近刚好在用定时器做一个时钟,没有自动重装,进中断怎么调整都不准(跑一天),后来只好不用中断,也不重装,让它自己无限跑,主程序判断中断标志(500ms)然后计时处理,现在跑了一天,还没看到有1s的误差。
另:用的单片机不是51,是fm8ps56

出0入0汤圆

发表于 2010-12-21 17:00:29 | 显示全部楼层
大家讨论得很好,虽然俺不懂,

出0入0汤圆

发表于 2010-12-21 23:50:28 | 显示全部楼层
非常好  我也不懂

出0入0汤圆

发表于 2010-12-22 14:36:01 | 显示全部楼层
定时器中断的proteus仿真,我的笔记本比其他电脑上仿真速度居然慢N多

出0入0汤圆

发表于 2010-12-22 15:27:21 | 显示全部楼层
使用一点技巧,不是自动重载的定时器,也可以保障精确的中断请求(不是响应),
因为当定时器加到0xffff,再加一翻到0x0000的时候,不管怎样还是会0x0001,0x0002的加上去的,通过合理的取晶振的频率和定时值,使TL为0,在中断中只要重装入TH就行了.

    比如12MHz 定时2.56MS

oid InitTimer1(void)
{
    TMOD = 0x10;
    TH1 = 0x0F6;
    TL1 = 0x00;
    EA = 1;
    ET1 = 1;
    TR1 = 1;
}


void Timer1Interrupt(void) interrupt 3
{
    TH1 = 0x0F6;
//    TL1 = 0x00;  这个就可以不用了.
}

再给哟个例子:18.432MHz  2MS  定时

void InitTimer1(void)
{
    TMOD = 0x10;
    TH1 = 0x0F4;
    TL1 = 0x00;
    EA = 1;
    ET1 = 1;
    TR1 = 1;
}


void Timer1Interrupt(void) interrupt 3
{
    TH1 = 0x0F4;
//    TL1 = 0x00;
}

出0入0汤圆

 楼主| 发表于 2010-12-22 15:36:33 | 显示全部楼层
回复【60楼】zhxzhx 一丁
-----------------------------------------------------------------------

你这个程序不还是在中断里给TH1赋值的吗,时间的不确定性是由进中断的时间不同引起的,因此你的程序不能解决问题

出0入0汤圆

发表于 2010-12-22 16:23:48 | 显示全部楼层
仔细体会,这样赋值不会引起定时器的不确定性,因为我进中断的误差包含在TL中了.

出0入93汤圆

发表于 2010-12-22 16:35:49 | 显示全部楼层
楼上,在Timer1的优先级设为最高时,60楼的程序是没有问题的,时间的不确定性最多占用的时间(比如Keil)也就是DIV指令+中断入口时间+LJMP的时间,这段时间之内TL1一直累加,但是无法溢出,因此TH1始终等于0。然后再给TH1赋初值不会带来额外的误差。

如果不是最高优先级,那就可能会杯具。比如INT0优先级最高,占用了300周期,那么这个程序就不行了。所以Timer1一定要设为最高优先级。

另外,这个程序只能解决一部分定时时间,不能任意定时的。

我出一个馊点子。
如果仅仅作为RTC计时的话,推荐使用7.3728MHz/14.7456MHz的晶振。实时时钟喜欢采用32768的表振,那么单片机采用这个振荡器也是完全说得过去的。这个东西很不常用,但是是有的,他的强大之处就是可以产生精确的波特率(如115200,7372800÷115200=64,1T的MCU则直接使用,12T的51请使用Timer2产生)和定时(7372800÷32768=225),聪明的你一定知道该如何做了,呵呵。

下面使用7.3728MHz,Timer1产生精确的1s计时。这个程序不受优先级的限制。
void main(){
   TR1 = 1;               //T0工作于方式0,13位定时器,没有中断机制
   while(1){
      static uchar Cnt;
      if(_testbit_(TF1)){ //Timer1每1/75s溢出一次。8192个周期怎么着也执行一圈了吧,不然的话就做成子函数多次调用,或使用方式1,65536次溢出
          Cnt++;
          if(Cnt == 75){  //这个就是精确的1s了。
               Sec ++;
               ...
          }
      }
   }
}
这个程序利用的其实还是自动重载方式,只是定时器溢出后自动重装了0而已。

出0入0汤圆

发表于 2010-12-22 22:21:14 | 显示全部楼层
好帖!MARK

出0入0汤圆

发表于 2010-12-22 23:37:46 | 显示全部楼层
技术就需要这样的讨论,才能将问题搞明白!

出0入0汤圆

发表于 2010-12-23 00:51:12 | 显示全部楼层
"void Timer1Interrupt(void) interrupt 3
{
    TH1 = 0x0F4;
//    TL1 = 0x00;
} "

you should never "assign" a value to timer/counter within the interrupt ->  you lose long-term accuracy.

Instead, you should "increment" the timer/counter.

like:

TH1 += 0xf4;
TL1 += 0x04;

the best is to google "Roman Black timing error", as I mentioned earlier.

出0入0汤圆

发表于 2010-12-23 07:27:25 | 显示全部楼层
学到了,原来如此

出0入0汤圆

发表于 2010-12-23 08:02:17 | 显示全部楼层
【63楼】 takashiki 岚月影

    所以说要一点技巧嘛!怕别人不明白,我第二个例子就是用晶振凑的时间.

【66楼】 millwood0

  你这个只能是减小到最小,不能完全消除,可能在你做TL1 += 0x04;的时候TL1又加了1了

出0入0汤圆

发表于 2010-12-23 09:00:26 | 显示全部楼层
"可能在你做TL1 += 0x04;的时候TL1又加了1了"

google atomicity.

出0入0汤圆

发表于 2010-12-23 09:20:54 | 显示全部楼层
回复【10楼】millwood0  
try this:
========zero cumulative error timing routine, from black roman============

-----------------------------------------------------------------------

晚上回去仔细研究一下。

出0入0汤圆

发表于 2010-12-23 09:24:30 | 显示全部楼层
我来总结一下吧,使用自动重载或者CTC方式,产生中断请求(标志位置位)的时间间隔是一样的,只是相应中断请求的时间有些差异(立即响应,执行一条指令后响应,或者执行更高优先级中断后响应),但是产生的定时是准确的。

出0入0汤圆

发表于 2010-12-23 09:44:00 | 显示全部楼层
【69楼】 millwood0

    你10楼的方法,其实就是和我的一样的,只不过我给TH1赋值使可延迟的时间变短了,要技巧配合了,而TL1 += 0x04;这种方式是决不能用的!因为我以前也以为这是个好方法,时间证明无效至少在MCS51上.

出0入0汤圆

发表于 2011-8-25 17:39:15 | 显示全部楼层
必然是时钟芯片好啊    这个东西不占用MCU资源
可以自动计时
自动计算闰年
自动对年月日的累加

外接电池可以掉电保持

出0入0汤圆

发表于 2012-4-2 19:46:39 | 显示全部楼层
我尝试了40楼的办法,就是让CPU在中断到来前进入空闲模式,用keil 仿真时,进入中断函数可以没有时间误差,只是不知道实际会不会有,如果没有,要求高的场合,这还算是一种可用的方式吧(经验不足,个人看法)。如果主函数要一直运行的话,可以用定时器T1,差不多到20ms中断就让CPU进入空闲模式。不过这样的话,一个精确定时就要用到两个定时器了……

出0入0汤圆

发表于 2012-4-3 18:40:21 | 显示全部楼层
yz0853 发表于 2010-7-27 10:51
回复【7楼】majia-2  
-----------------------------------------------------------------------
我来学 ...

mm还是gg哦?不要让大家光看你而不回答问题了?

出0入0汤圆

发表于 2012-7-5 23:43:42 | 显示全部楼层
lryxr2507 发表于 2012-4-3 18:40
mm还是gg哦?不要让大家光看你而不回答问题了?

- -

出0入0汤圆

发表于 2012-7-6 11:27:34 | 显示全部楼层
自动重装就一定准吗?
用非自动重装的把装载初值的时间考虑进去(定时少2US(12M晶振的话))不就一样了吗?
况且T2还有个问题就是请求标志只能通过软件清零,又多占用一个机器周期。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-14 13:53

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

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