搜索
bottom↓
回复: 31

原创:用M8制作的电子日历

[复制链接]

出0入0汤圆

发表于 2007-2-8 13:46:34 | 显示全部楼层 |阅读模式
这纯粹是一个练手的东东。叫什么名字呢?就叫“jimo版电子30年历”吧。不过,也可以实用的哦。

    如果你觉得你从中获益,就向你不认识的人提供一次帮助。

    如果你做了板,还觉得挺漂亮的,就送我一块。我的电路是在试验板上完成的(惭愧,我不会画电路图,也不会制板)。这样我也可以做一个漂亮的电子日历。



    我设计时,目标之一是多MPU易于迁移的。事实上,几乎所有的代码是在Windows操作系统里运行调试的,仅仅和硬件相关的少量代码是在Atmega8上调试的。

    不仅如此,硬件线路设计也是非常的自由,在写代码时已经考虑了硬件线路设计的某些不便,因此,需要改动硬件线路的连接时,不需要带原代码进行改动,只需要调整一些定义就可以。

    因为硬件资源有限,因此,只提供了30年的日历数据。如果换成Atmega16,则可以轻而易举的做成“百年历”。



日历功能说明:

    日历的界面标准配置是:11位LED数码显示管,10个LED指示灯,一个蜂鸣器,上下左右四个按钮。3个指示灯用于指示当前正在调整时间、日期和闹钟,另外7个指示灯指示闹钟星期天到星期六的有效日期。

    加电时,日历从2000年1月1日0点时刻开始计时。

    一共提供5个闹钟,9个铃声,可控制的整点半点报时。

    调整日期时,阴历、星期自动调整。

    按左键显示日期。7个指示灯还表示整点报时是有有效。显示日期的时候,长按左键可以开关整点报时。如果当天是某节气,则显示该节气的序号(没有点阵式LED嘛)。

    按上下键显示闹钟。

    按右键显示阴历。并显示下一个节气的序号及距当天还有多少天。

    长按右键,进入设置状态。在设置状态,按上下键选择设置闹钟时间日期。



    除了参考了Atmega8的Datasheet的少量代码,其它代码都是原创。但是不排除和他人的代码相似。





硬件设计指南:

    应用在Atmega8上时,PORTD口驱动LED的8个段,PC0-PC4做位选。

    PB1驱动蜂鸣器,PB2-PB5作按键输入,下拉表示按键。PB6-PB7接32768Hz晶振。



    前面说了,设计目标之一是易于迁移,因此我把与硬件相关的内容没有设计到核心部分。如果要迁移到不同的硬件平台上,下列几个类及文件可能需要重写:

        CAvrCalendar,

        CEEprom,

        CRing,

        Interrupt.cpp



    1、CAvrCalendar

    CAvrCalendar是日历框架的派生类,实现在不同硬件平台上的主程序运行。包括端口初始化、时钟初始化、LED驱动、按键驱动。

    日历核心只需要一个64Hz的精确定时即可,时钟初始化就是为了得到这64Hz的精确时钟。

    日历核心假设所需的四个按键使用一个字节的其中4个比特位来表示,按键驱动则是获得当前四个按键状态的,某个键接触用1表示,断开了用0表示。





    2、CEEprom

    闹钟数据及日历数据是保存在EEPROM里的,不同的硬件读写EEPROM的方法可能会不一样。或者,干脆选择其它的保存方式。CEEprom就是提供掉电数据保存的。



    3、CRing

    驱动铃声的方式亦随硬件的不同而变化,因此,根据不同的硬件来编写合适的铃声驱动代码。

    铃声是用16Hz定时信号控制,16位Timer驱动的,每一个脉冲相当于乐谱里的1/16拍,针对不同的硬件,需要修改里面定义的访问硬件的宏,及表示12个乐符频率的代码。当然在AVR上是不需要再修改了。

    乐谱的表示,在Ring.cpp里有说明。作为一份上再调试中的代码,只给了两个非常简单的乐谱。一个是大家常用的电子钟的“嘀嘀嘀嘀……嘀嘀嘀嘀……”声,一个是“1234567”。



    4、Interrupt.cpp

    毫无疑问这是和硬件紧密相关中断处理。现在的电子日历只需要一个精确的64Hz定时中断。至于里面还有一个EEPROM准备好中断,那是为EEPROM写而准备的,不属于日历的核心需要。





    遗憾之:

    1、

    应用在Atmege8上,因为Flash空间的限制,不能把节气计算的代码编译进去,所以没有节气显示的功能。但是已经写好的代码都是经过调试无误的。

    2、

    EEPROM读写是我自以为很得意的一段代码,居然运行的结果不对,读写EEPROM的位置不对,数据也不对,调试了多天依旧没有找到问题。本来想调试好再发布的,但是我马上要回老家过年,没有时间上网了,就只好将有问题的代码上传,恳请大家帮我指出其中的错误,年后我再来维护这份代码。



    上传之前,我对代码的版面作了一下美化,希望没有因此无意中弄坏代码。



AVR快乐。



jimo

2007.2.8





点击此处下载AvrCalendar-2007-0208.rar

出0入0汤圆

 楼主| 发表于 2007-2-8 14:00:02 | 显示全部楼层
实验板上的电子日历:









    拍摄的时候作了一下弊:晶振对地短路,图上能看出来。要不拍不到时分之间的两颗豆豆。





ps: 传文件好困难呀,我起码传了10回才成功。

出0入0汤圆

发表于 2007-2-8 14:14:45 | 显示全部楼层
支持中。。。》》!

出0入0汤圆

发表于 2007-2-8 15:18:28 | 显示全部楼层
支持,顶上去。

出0入0汤圆

发表于 2007-2-8 18:03:34 | 显示全部楼层
顶一顶

出0入0汤圆

发表于 2007-2-8 20:23:05 | 显示全部楼层

出0入0汤圆

发表于 2007-2-9 00:24:33 | 显示全部楼层
不错,我也在做电子时钟













呵呵
头像被屏蔽

出0入0汤圆

发表于 2007-2-9 08:00:23 | 显示全部楼层
谢谢。



Cool.



能将电路图也上传上来吗?

出0入0汤圆

 楼主| 发表于 2007-2-9 10:12:19 | 显示全部楼层
惭愧,不会画电路图。于是手画了一个:





昨天发现Ring.cpp文件里一处bug,这是更改后的Ring.cpp的压缩文件:

Ring.cpp





我的EEPROM读写还望大家帮我找找错误呀,要不不能保存设置的闹钟。



图中未标注型号的芯片为74HC138。M8没在图中画出来,主频使用内置1M振荡,32768Hz晶振提供精确的时钟信号。
-----此内容被jimo于2007-02-09,10:16:12编辑过

出0入0汤圆

 楼主| 发表于 2007-3-7 13:43:13 | 显示全部楼层
电子日历更新,原来一片M8不能实现的功能(8k代码空间太小),现在都实现了。明天就是“三·八”妇女节,特此命名为“三·八”纪念版电子日历。顺便祝各位mm节日快乐。



    不能读写EEPROM的原因很简单,写代码时脑袋里读写EEPROM代码,同时又在思考另一份代码,所以手上写出来的又是另外一分代码(中央电视台,中央电视台,……阿莫三十公里外一脚远射,球,进了……)。春节过后把代码一读,立马找到问题所在。之后的这段时间,一直在想方设法压缩代码量,以求能全部装入到一片M8里,谢天谢地,终于可以了。



    代码里有许多的注释,说明可以改动的地方,不过,除非删除一些铃声,否则不要指望能改动什么地方的代码。8k的flash被我耗得只剩几个字节。这几个字节也是非常宝贵的,一旦你的74hc138坏了一条腿,在代码里修正时,这几个字节刚好派上用场。我的138坏了几条腿,程序里修正之后,M8的8k flash刚好用完。



    附件压缩包里的readme.txt文件包含平台移植向导,想用M16做单芯片解决方案的AVR友们可以参考向导进行移植。编译平台为IAR 4.20A,device.h文件里可以定制编译后所需要的功能,压缩包里有不同配置下的eeprom烧写文件。

    不想自己编译的,请用M8,压缩包里有烧写文件,eeprom选用40-有节气.eep的那个。



    基于压缩包里的烧写文件的最终产品使用说明书正在编写之中,完成后立即上传。



附件:AvrCalendar-0308.rar

出0入0汤圆

 楼主| 发表于 2007-3-7 13:48:31 | 显示全部楼层
这纯粹是一个练手的东东。叫什么名字呢?就叫“jimo版电子40年历”吧。不过,也可以实用的哦。

    如果你觉得你从中获益,就向你不认识的人提供一次帮助。

    如果你做了板,还觉得挺漂亮的,就送我一块。我的电路是在试验板上完成的(惭愧,我不会画电路图,也不会制板)。这样我也可以做一个漂亮的电子日历。



    我设计时,目标之一是多MPU易于迁移的。事实上,几乎所有的代码是在Windows操作系统里运行调试的,仅仅和硬件相关的少量代码是在Atmega8上调试的。

    不仅如此,硬件线路设计也是非常的自由,在写代码时已经考虑了硬件线路设计的某些不便,因此,需要改动硬件线路的连接时,不需要带原代码进行改动,只需要调整一些定义就可以。

    因为硬件资源有限,因此,只提供了40年的日历数据。如果换成Atmega16,则可以轻而易举的做成“百年历”。



日历功能说明:

    日历的界面标准配置是:11位LED数码显示管,10个LED指示灯,一个蜂鸣器,上下左右四个按钮。3个指示灯用于指示当前正在调整时间、日期和闹钟,另外7个指示灯指示闹钟星期天到星期六的有效日期。

    加电时,日历从2000年1月1日0点时刻开始计时。

    一共提供5个闹钟,9个铃声,可控制的整点半点报时。

    调整日期时,阴历、星期自动调整。

    按左键显示日期。7个指示灯还表示整点报时是有有效。显示日期的时候,长按左键可以开关整点报时。如果当天是某节气,则显示该节气的序号(没有点阵式LED嘛)。

    按上下键显示闹钟。

    按右键显示阴历。并显示下一个节气的序号及距当天还有多少天。

    长按右键,进入设置状态。在设置状态,按上下键选择设置闹钟时间日期。



    除了参考了Atmega8的Datasheet的少量代码,其它代码都是原创。但是不排除和他人的代码相似。





硬件设计指南:

    应用在Atmega8上时,PORTD口驱动LED的8个段,PC0-PC3做位选。

    PB1驱动蜂鸣器,PB2-PB5作按键输入,下拉表示按键。PB6-PB7接32768Hz晶振。



    前面说了,设计目标之一是易于迁移,因此我把与硬件相关的内容没有设计到核心部分。如果要迁移到不同的硬件平台上,下列几个类及文件可能需要重写:

        CAvrCalendar,

        CEEprom,

        CRing,

        Interrupt.cpp



    1、CAvrCalendar

    CAvrCalendar是日历框架的派生类,实现在不同硬件平台上的主程序运行。包括端口初始化、时钟初始化、LED驱动、按键驱动。

    日历核心只需要一个64Hz的精确定时即可,时钟初始化就是为了得到这64Hz的精确时钟。

    日历核心假设所需的四个按键使用一个字节的其中4个比特位来表示,按键驱动则是获得当前四个按键状态的,某个键接触用1表示,断开了用0表示。





    2、CEEprom

    闹钟数据及日历数据是保存在EEPROM里的,不同的硬件读写EEPROM的方法可能会不一样。或者,干脆选择其它的保存方式。CEEprom就是提供掉电数据保存的。



    3、CRing

    驱动铃声的方式亦随硬件的不同而变化,因此,根据不同的硬件来编写合适的铃声驱动代码。

    铃声是用16Hz定时信号控制,16位Timer驱动的,每一个脉冲相当于乐谱里的1/16拍,针对不同的硬件,需要修改里面定义的访问硬件的宏,及表示12个乐符频率的代码。当然在AVR上是不需要再修改了。

    乐谱的表示,在Ring.cpp里有说明。作为一份上再调试中的代码,只给了五个非常简单的乐谱。分别是四个短嘀声,一长两短的嘀声,儿歌《小燕子》,儿歌《一分钱》,催眠曲。



    4、Interrupt.cpp

    毫无疑问这是和硬件紧密相关中断处理。现在的电子日历只需要一个精确的64Hz定时中断。至于里面还有一个EEPROM准备好中断,那是为EEPROM写而准备的,不属于日历的核心需要。



软件移植指南:

    现在的程序是基于Atmega8编写,但是已经把和硬件相关的代码提取出来,因此,要移植到不同的MCU上(主要还是针对Atmage芯片),请参考如下说明。

    附加说明:代码里已经给出了移植到Atmega16上例子,但是仅仅是个例子而已,我没有阅读Atmega16的Datasheet,针对Atmega16的端口的定义,是从Atmega8的代码复制而来,确保能编译,但是运行可能不能得到期望的结果。

    1、修改CAvrCalendar::InitPort()

        修改CAvrCalendar::InitPort()的目的,是定义目标芯片的引脚定义,使得其它部分的代码能正确驱动外部电路。

    2、修改CAvrCalendar::InitTimer()

        修改CAvrCalendar::InitTimer()的目的,是得到两个定时时钟,一个64Hz的时间驱动,一个是蜂鸣器驱动。蜂鸣器的定时时钟默认是关闭状态。

    3、修改device.h文件里的头文件包含、Timer操作宏、功能定义、LED驱动、键盘驱动五部分的定义。

        头文件包含部分里,加入你期望的芯片判断及该芯片的头文件,格式请看代码中的范例。

        Timer操作宏定义了蜂鸣器操作所代码对Timer的操作方法。

        功能定义部分针对不同的芯片及期望,可以定义不同的功能。

        LED驱动部分定义了如何对LED的数据输出、位选、消隐进行操作。

        键盘驱动定义了如何获取键盘状态。键盘状态要求用一个字节表示,最低位开始的四个比特位分别表示:UP, DOWN, LEFT, RIGHT。当然,可以修改defines.h文件来重新定义。

    如何移植到其它平台,请和作者联系。



其它说明:

    1、作者试图用GCC编译,并且编写代码时也考虑过其它编译器问题。但是因为代码量比较多,GCC不能将代码大小优化到能装入Atmega8,所以放弃使用GCC。

    2、代码里有WIN32之类的字眼,请忽略它。这是作者在Windows操作系统上调试代码时编写的,考虑到以后还可能在Windows操作系统上调试,就保留下来了。

    3、出于个人学习的目的,您可以自由的修改使用这份代码。但是请不要分发原始代码及修改后的代码,更不要用于商业用途。您可以向第三方自然人推荐这份代码,但是请说明代码的作者,以及只有在www.ouravr.com能下载到这份代码。

    4、如果您修改了这份代码,建议您告诉作者您做了何修改,但这不是必须的。

    5、本代码的农历数据来自互联网络,无法确定数据录入者。但是作者仍然向最初录入数据的人致敬。



AVR快乐。



jimo

2007.3.8

出0入0汤圆

 楼主| 发表于 2007-3-8 17:21:13 | 显示全部楼层
使用说明书完成了,感谢阿莫,借此贵地卖弄一番。

点击此处打开jimo版电子40年历使用说明书.pdf







avrvi 古欣,你的电子钟怎么样了?
-----此内容被jimo于2007-03-08,17:28:01编辑过

出0入0汤圆

发表于 2007-3-9 08:32:49 | 显示全部楼层
cool

出0入0汤圆

 楼主| 发表于 2007-3-9 08:46:34 | 显示全部楼层
校对发现了错误:

点击此处打开校对后的说明书.pdf

出0入0汤圆

发表于 2007-3-9 09:05:58 | 显示全部楼层
顶~~~~~~~~~

出0入0汤圆

 楼主| 发表于 2007-3-12 11:03:55 | 显示全部楼层
感冒好了,烧也退了,头脑清醒了,512字节的eeprom最多只能保存35年的农历数据:

      512 / (农历月份天数信息(2字节)+闰月(0.5字节)+节气信息(12字节))

    = 512 / 14.5

    = 35.31...



    因此编译的时候,对M8芯片,device.h文件里的年份定义必须改成2030,eeprom文件必须选用30年的那个。说明书里的2039改成2029。



    昨天逛了一天街,找到了一个勉强合适的盒子,再找了一家做广告牌的小店,加工了一下盒子的前后盖,大致的装配了一下,还有那么一点样子。可恶的就是,居然盒子的成本比实验板、原件再加我的开发时间的费用还高。

    装配完成后,我再传个图上来。

出0入0汤圆

发表于 2007-4-15 09:00:37 | 显示全部楼层
支持楼主!

我也在做电子日历,我用的16,用共阴极数码管,PC口接数码管的8段,调试发现最多只有3段加一个点四个亮,不能正常显示数字,正在查找原因.

楼主也是用PD口直接驱动数码管吧?

出0入0汤圆

发表于 2009-9-15 22:58:18 | 显示全部楼层
弱弱的问一个问题,为什么日历核心只需要一个64Hz的精确定时即可,其它的hz为什么不行。

出0入0汤圆

发表于 2009-10-25 22:53:11 | 显示全部楼层
我建议加时钟电路!不然掉电怎么办?最好也加上存储器!

出0入0汤圆

发表于 2009-10-25 23:17:25 | 显示全部楼层
-我也想做一个简单的万年历,向楼主学习了。

出0入0汤圆

发表于 2009-10-26 00:00:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-27 21:29:45 | 显示全部楼层
学习了

出0入0汤圆

发表于 2009-10-28 21:07:36 | 显示全部楼层
Mark

出0入0汤圆

发表于 2009-11-17 17:20:09 | 显示全部楼层
楼主,我做的那个电子表比你简单的多,但是问题很多呀,我的按键和闪烁很有问题呀。能否解决一下。现在我的按键问题就是按主按键时要长按才管用,按加或减按一下就会变很多。当我按下判断加延时后秒就不自动加了。万分感谢。

出0入0汤圆

 楼主| 发表于 2009-11-17 20:04:20 | 显示全部楼层
哈哈,这么老的贴子也翻出来了。
看你的描述,你不是在中断中处理计时。
首先,为了计时准确而且方便,在中断中计时是比较合适的。
其次,你处理按键的时间需要调整一下,平均的分配时间,就不会出现有些按键时间超长有些超短。
其实,在中断中处理按键也是个选择。

选择64Hz,是分频后容易得到1Hz计时,关键是,与乐谱中常用的节拍相近,音乐处理里面能看到。

这个贴子之后再没贡献过有价值的技术贴,惭愧。

出0入0汤圆

发表于 2009-11-21 15:17:14 | 显示全部楼层
GOOD

出0入0汤圆

发表于 2009-11-23 21:00:33 | 显示全部楼层
想问下LZ 你这个用的什么电源驱动的啊?
我也想做一个

出0入0汤圆

发表于 2009-11-24 10:46:40 | 显示全部楼层
挺有意思的

出0入0汤圆

发表于 2009-11-24 12:29:09 | 显示全部楼层
怀念这样的帖子。

出0入0汤圆

发表于 2010-3-28 00:17:44 | 显示全部楼层
顶,强帖

出0入0汤圆

发表于 2010-6-22 21:05:26 | 显示全部楼层
顶顶更健康

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-8 07:04

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

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