搜索
bottom↓
回复: 42

初识AVR-Ada(一个闪烁LED实例) 重量级酷贴

[复制链接]

出0入4汤圆

发表于 2007-11-25 17:35:11 | 显示全部楼层 |阅读模式
初识AVR-Ada

1. 缘由
Ada语言,最初是从上学时一本计算机书里知道的,据说是 DoD 的专用语言,用在紧要场合。之所以把这种编程语言命名为 Ada 是为了纪念第一个给Babbage差分机写程序的程序员 Augusta Ada Byron(1815--1852)。我住处附件有条小街,街上有个店,招牌上就写着三个大字 Ada,每次路过这三个字都让我想起 Babbage 的机器和 Ada,我也没有注意那个店是干嘛的,不过至少有一点我可以肯定:一定不会是搞 Ada 程序的 :-)

我一直对 Babbage 的机器很感兴趣,他那台复杂的机械计算机可以说是一件杰出的艺术品,当然,了解计算机历史的人可能知道法国人 Joseph Marie Jacquard 和他的可编程自动织布机。

因为根本用不上,从来没有去解一下这门语言的细节。近两年断断续续学了一些AVR单片机知识,主要是用C语言开发。昨天晚上不知道是什么原因,突然想到了 AVR-Ada。(不会是那个小店的招牌吧,哈哈)。

到目前为止,可以用很多种语言来开发 AVR 软件,当我得知 AVR 可以用 Ada 来编程时,还吃了一惊。 2006年8月31日在 ouravr 发了一个贴,感兴趣的人不多,Ada 这种语言比较冷门。

对这个好玩的东西当然不能放过,于是决定要弄一下,了解一些 Ada 的语法,看用它怎样给 AVR 开发程序。好的,先从一个简单的例子开始吧:闪烁一个 LED 。

2. 电路

电路很简单:LED接在 OC1A 上,通过一个330 Ohm 的限流电阻接地。

3. 程序

这是编译器附带的例程,我把它取出来作为一个独立的项目,原例子用的是AT90S8515,我把 MCU 改成了常用的 ATmega16,在编译的过程中发现一个错误:没有定义CTC1,因为在新器件中寄存器的名字已经改了。

我查看了一下 mega16 的 datasheet,仅把下面这一句:

   -- use CLK/64 prescale value, clear timer/counter on compareA match
   Set (TCCR1B, TMC16_CK64 or CTC1);

修改为:

   -- use CLK/64 prescale value, clear timer/counter on compareA match
   Set (TCCR1B, TMC16_CK64 or WGM12);

下面是修改过的代码:
---------------------------------------------------------------------------
-- The AVR-Ada Library is free software;  you can redistribute it and/or --
-- modify it under terms of the  GNU General Public License as published --
-- by  the  Free Software  Foundation;  either  version 2, or  (at  your --
-- option) any later version.  The AVR-Ada Library is distributed in the --
-- hope that it will be useful, but  WITHOUT ANY WARRANTY;  without even --
-- the  implied warranty of MERCHANTABILITY or FITNESS FOR A  PARTICULAR --
-- PURPOSE. See the GNU General Public License for more details.         --
---------------------------------------------------------------------------



--   Title:    Timer/Counter Output Compare Mode: Pin PD5 (OC1A) toggles
--             with 1Hz

--   Author:   Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
--   Date:     December 2002
--   Software: AVR-GCC 3.3
--   Hardware: AT90S8515 at 4 Mhz, STK200 compatible starter kit

--   Description:
--   Timer1 support the possibility to react on timer interrupt events
--   on a purely hardware basis without the need to execute
--   code. Related output pins can be configured to be set, cleared or
--   toggled automatically on a compare match.

--   This examples shows how to toggle an output pin and flashing a
--   LED with 1 Hz.  After initialization, the LED flashes on both OC1A
--   and OC1B output pin without code execution.

--   A LED with a series resistor should be connected from OC1A/OC1B
--   pin to GND.

--   See also Atmel AVR Application Note AVR130


with Interfaces;     use Interfaces;
with AVR.IO;         use AVR.IO;
with AVR.MCU;        use AVR.MCU;

procedure Flash_Led is

   -- output compareA pin on ATmega16
   OC1A : constant AVR.Bit_Number := PORTD5_Bit;

   -- Timer1 Preset for 1Hz clock
   TIMER_1_CNT : constant Unsigned_16 := 16#F424#;

   -- 16 bit Timer Counter Prescaler Values
   TMC16_CK64 : constant Unsigned_8 := CS10 + CS11;

begin
   --
   --  Initialisation
   --

   -- set OC1A pin as output, required for output toggling
   -- 将 OC1A 设为输出, 触发 LED
   Set_Bit (DDRD, OC1A, True);

   -- enable toggle OC1A and OC1B output on compare match
   -- 比较匹配使能
   Set (TCCR1A, COM1A0 or COM1B0);

   -- use CLK/64 prescale value, clear timer/counter on compareA match
   -- Timer1 64 分频, 匹配时清零计数器
   Set (TCCR1B, TMC16_CK64 or WGM12);

   -- preset timer1 high/low byte
   -- 向计数器预置计数值
   Set16 (OCR1A, TIMER_1_CNT);
   Set16 (OCR1B, TIMER_1_CNT);

   --
   -- Initialisation done, LED will now flash without executing any code !
   --
   loop   -- loop forever
      null;
   end loop;
end Flash_Led;

4. 工程文件和Makefile

到目前为止,我还没有仔细研究过 GCC 的 Makefile,所以我准备找一个现有的 Makefile 来修改,在ada-examples 目录中正好有一个 ds1820 的例子,我把它复制到我的项目文件夹中,并作了相应的修改,无外乎就是修改 mcu 的型号、要编译器的目标文件、avrdude 所用的编程器以及编程器所用端口。

OK,我自以为万事具备只欠东风了,在命令行执行 make all 命令,没想到根本行不通,出现一些错误提示,于是我又观察了一下 ds1820 的例子。原来在目录中还有一个扩展名为 gpr 的 GNAT project file 文件,这是一个工程文件,在其中定义了这个工程,因为是用英语描述,也能看懂个大概,于是我也复制了一个到我的项目文件夹中,把名字作了改成 flash_led.gpr 并进行了相应的修改,如下:

---------------------------------------------------------------------------
-- The AVR-Ada Library is free software;  you can redistribute it and/or --
-- modify it under terms of the  GNU General Public License as published --
-- by  the  Free Software  Foundation;  either  version 2, or  (at  your --
-- option) any later version.  The AVR-Ada Library is distributed in the --
-- hope that it will be useful, but  WITHOUT ANY WARRANTY;  without even --
-- the  implied warranty of MERCHANTABILITY or FITNESS FOR A  PARTICULAR --
-- PURPOSE. See the GNU General Public License for more details.         --
---------------------------------------------------------------------------

with "avr.gpr";

project flash_led is


   for Main use ("flash_led");

   for Languages use ("Ada");
   for Object_Dir use "obj";
   for Exec_Dir use ".";


   package Builder is
      for Default_Switches ("Ada") use AVR.Builder'Default_Switches ("Ada");

      for Global_Configuration_Pragmas use
         AVR.Builder'Global_Configuration_Pragmas;

      for Executable_Suffix use ".elf";

   end Builder;


   package Compiler is
      for Default_Switches ("Ada") use AVR.Compiler'Default_Switches ("Ada");
   end Compiler;


   package Binder is
      for Default_Switches ("Ada") use AVR.Binder'Default_Switches ("Ada");
   end Binder;


   package Linker is
      for Default_Switches ("Ada") use AVR.Linker'Default_Switches ("Ada");
   end Linker;


   for Source_Dirs use (".");

end flash_led;

5. 实验结果

最后,我在命令行执行 make all,编译通过!在面包板上搭好电路,将生成的hex文件写入mcu,LED闪烁起来啦!电路上用的是 8MHz 晶振,对照时钟观察了一下,LED 以 1Hz 的频率闪烁。

我们来作一个计算,下面是 ATmega16 数据手册上的公式:

f_OCnA:生成波形的频率;
f_clk_I/O: MCU时钟频率;
N:计时器分频系数;
OCRnA:输出比较寄存器中存的值,在此例中,Timer1 的计数值会不停地和它比较,一旦匹配则清除 Timer1 计数值。

F424 转换成十进制是 62500,Timer1 64分频,代入具体的数字,作一个计算:
F = 8000000/[2x64x(1+62500)] = 0.9999... (结果表明,生成方波的频率是 1Hz)

啊哈,真是好玩极了!发觉 Ada 的语法和 Pascal 很相似,Lisp 语言也是一种很优美、古怪的语言,要是可以用 LISP 给 AVR 编程,我也要下功夫学一学 Lisp。

嗯,我写文章总是这里扯到那里,或许这就是我的风格吧。

6. 下载

有四个文件,分别是:
1) 源程序 flash_led.adb
2) 工程文件 flash_led.gpr
3) Makefile
4) Eagle原理图 ada_flash_led.sch

点击此处下载ourdev_182722.rar(文件大小:23K)

7. 相关资料

1. AVR-Ada 官方网站:http://avr-ada.sourceforge.net/
2. Snapshot 版本下载地址:https://sourceforge.net/project/showfiles.php?group_id=74228
3. Ada 程序设计语言:http://all.163.com/it/school/apl/
4. 中文Ada语言FAQ站点:http://adaicq.gro.clinux.org/
5.《贝比奇奇特的一生》见《现代世界中的数学》第83页,上海教育出版社
6. 另一篇关于 Babbage 的文章:http://libai.math.ncu.edu.tw/bcc16/pool/3.01.shtml
7. An Illustrated History of Computers: http://www.computersciencelab.com/ComputerHistory/HistoryPt2.htm

Atommann  创建日期:2007-11-22  最后编辑:2007-11-25
原文地址:http://atommann.googlepages.com/avr_ada

出0入0汤圆

发表于 2007-11-25 18:08:29 | 显示全部楼层
那么有技术含量的文章,不赶快收藏起来将会后悔终生!
头像被屏蔽

出0入0汤圆

发表于 2007-11-25 19:30:30 | 显示全部楼层
Cool !

出0入0汤圆

发表于 2007-11-25 19:35:31 | 显示全部楼层
看来奥特曼兄又要往新领域进军了

出0入0汤圆

发表于 2007-11-25 20:31:04 | 显示全部楼层
Ada 一直是法国计算机学院必修课程,当初我用它来做内存管理,类似java和net中的垃圾回收装置。Ada的优势是在编写多任务的real times system方面的软件。

不过现在Ada比较少在民用方面。

VHDL其实是从Ada借鉴了语法元素。

出0入0汤圆

发表于 2007-11-25 20:43:00 | 显示全部楼层
楼主 什么时候用Fortran来编avr试试啊 上世纪50年代出现的古老语言 就是不知道支不支持

出0入0汤圆

发表于 2007-11-26 07:55:08 | 显示全部楼层
我一直在AVR上跑JAVA虚拟机(JVM),很不错!

出0入4汤圆

 楼主| 发表于 2007-11-26 08:16:31 | 显示全部楼层
hackerboygn 可以写一篇文章向大家介绍一下怎么在 AVR 上跑 Java 虚拟机,期待!Python, Java, Lisp, Perl 都是我想学的语言。

出0入0汤圆

发表于 2007-11-26 09:02:49 | 显示全部楼层
AVR 上跑 Java 虚拟机,是不是用JAVA编的游戏就可以在上面运行了,加个键盘,液晶,添加些RAM,就可以玩了?

出0入0汤圆

发表于 2007-11-26 12:32:21 | 显示全部楼层
如果AVR上面跑的Java虚拟机,能如楼上所说的那样,那就很值得期待了!

出0入0汤圆

发表于 2007-11-26 12:57:16 | 显示全部楼层
强贴要顶一下,美国空间国防技术目前可能还是在用Ada,我看过一个网友的blog,上海某所做卫星的,去年电池没打开的那个鑫诺3和他们有些关系,他用的就是Ada。

有机会俺也学习一下。

出0入0汤圆

发表于 2007-11-26 13:56:48 | 显示全部楼层
to atommann Forever ben00

我写了点东东,大家感兴趣的话看看。
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=858124&bbs_page_no=1&bbs_id=1000

出0入0汤圆

发表于 2007-11-26 13:59:29 | 显示全部楼层
AVR上玩JAVA游戏理论上是可以实现的,但前提是我们要为AVR写很多很多本地方法。

出0入4汤圆

 楼主| 发表于 2007-11-26 19:23:19 | 显示全部楼层
> to atommann Forever ben00

> 我写了点东东,大家感兴趣的话看看。
> http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=858124&bbs_page_no=1&bbs_id=1000
To hackerboygn:
下班回来,正在仔细阅读你的文章,从字里行间可以读出你的热情,好样的!
除了 Java 这个名字,我对这门语言一无所知,是 AVR 和你的这篇文章让我接触 Java。

出0入0汤圆

发表于 2007-11-26 20:32:36 | 显示全部楼层
楼主热情可佳,值得学习.

只不过AVR-Ada是建立在avr-lib和avr-gcc上的一种语法封装而已,不能用ada的编译器直接编译.

但是把avrx按照tash封装在AVR-ada,体现出avr-ada的价值.

出0入4汤圆

 楼主| 发表于 2007-11-27 08:31:14 | 显示全部楼层
我猜想用的是GNAT编译器,在 AVR-Ada 主页上有如下描述:
Aim
The aim of the project is to make the gcc based Ada compiler GNAT available for AVR microcontrollers.

More specifically the project provides

    * a GNAT compiler based on the existing AVR and Ada support in gcc
    * a minimalistic Ada runtime system
    * a useful AVR specific support library

第一句大意是说:
该项目的目标是让基于 gcc 的 Ada 编译器 GNAT 可用于 AVR mcu.

GNAT 编译器见:
1. http://www.adacore.com/home/
2. http://www.gnu.org/software/gnat/gnat.html

最初我也在电脑里面装了一个 GNAT,去下载的时候还要注册(免费的)。

好像以前 GCC = GNU C Compiler
  而现在 GCC = GNU Compilers Collection
因为它支持 Ada, C, C++, Common Lisp, Fortran 等语言

出0入0汤圆

发表于 2007-11-29 03:18:10 | 显示全部楼层
是的GNAT编译器。

楼主有没有留意avrpy。

用python实现的avr工具,不过现在只是支持一款tiny。

我倒是觉得如果用python开发avr将是全新的一章。

出0入0汤圆

发表于 2007-11-29 14:23:06 | 显示全部楼层
虽不知是什么东西.但相信是好东西.
顶一下,有空也了解一下.

出0入0汤圆

发表于 2007-11-29 16:51:59 | 显示全部楼层
这是做什么用的

出0入0汤圆

发表于 2007-11-29 17:04:40 | 显示全部楼层
虽然用不上。。。文章不错。。顶一个

出0入0汤圆

发表于 2007-12-18 16:42:45 | 显示全部楼层
水平不够,看的没头绪,呵呵.

出0入0汤圆

发表于 2010-6-3 22:51:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-4 10:05:35 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-6-8 15:31:26 | 显示全部楼层
不知道以后会不会用上,先占个位置!

出0入0汤圆

发表于 2010-6-8 16:54:48 | 显示全部楼层
以后试试,mark

出0入0汤圆

发表于 2010-9-9 00:19:08 | 显示全部楼层
我也标记一下,呵呵

出0入0汤圆

发表于 2010-10-5 16:40:11 | 显示全部楼层
了解下

出0入0汤圆

发表于 2010-10-5 21:09:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-5 23:10:04 | 显示全部楼层
先知道一下

出0入0汤圆

发表于 2010-10-7 17:36:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-7 19:14:49 | 显示全部楼层
别顶了,1993年DoD宣布COTS( Commercial Off The Shelf)policy以后,ADA就已经是一种死亡的过时技术了。你们居然拿一个进了棺材17年的东西当宝贝,愚昧透顶!

出0入0汤圆

发表于 2010-10-13 22:32:34 | 显示全部楼层

出0入0汤圆

发表于 2010-10-14 14:03:57 | 显示全部楼层
ADA在编译时能够检查很多其他语言运行时才能发现的错误,最大的特点也在于此处,非常严谨和安全的编程语言,适合高可靠开发,所以繁琐,也就流行不起来的原因吧。

出0入0汤圆

发表于 2010-10-31 21:39:44 | 显示全部楼层
顶。。

出0入4汤圆

发表于 2010-10-31 23:04:22 | 显示全部楼层
大虾要是能给个例子说明一下从编译环境建立,编辑文件,以及编译执行就好了.

出0入0汤圆

发表于 2010-10-31 23:15:21 | 显示全部楼层
收藏 是必须滴

出0入0汤圆

发表于 2010-11-1 00:22:58 | 显示全部楼层
不是很理解  但是支持下

出0入0汤圆

发表于 2010-12-31 21:57:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-24 19:59:39 | 显示全部楼层
长见识了

出0入0汤圆

发表于 2011-6-24 21:45:07 | 显示全部楼层
............................

出0入0汤圆

发表于 2011-6-25 11:25:56 | 显示全部楼层
jixiaxian!

出0入0汤圆

发表于 2011-6-27 00:04:25 | 显示全部楼层
回复【4楼】zzsoft  
-----------------------------------------------------------------------

彪悍。。。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-6 04:36

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

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