Skip to main content
shopping_basket 购物车 0
登录

一种基于Forth的嵌入式控制器开发系统

Bill Marshall
0
作为计算机语言Forth的粉丝多年,我在一段时间前开始了一个项目,创建一个基于微芯片dsPIC33的嵌入式控制版本。 DS的博客文章已经报道了我在Clicker2主板上升级到这个版本的进展情况。

零件清单

数量 产品 库存编号
1 MikroElektronika Clicker 2 for dsPIC33 MCU Add On Board MIKROE-2567 144-8343
1 Development Kit USB to UART Interface for use with CP2102N USB Bridge 184-0913
1 MikroElektronika MIKROE-1154 791-6485
1 Microchip Microstick II MCU Development Kit DM330013-2 749-6445
1 FTDI Chip USB to UART Cable for Raspberry Pi - TTL-232R-Rpi 767-6200
1 Parallax Inc, BoE Prototyping Shield for Arduino - 35000 781-3027

项目

本文将作为FORTHdsPIC文档的存储库,例如最新的《用户手册》和源代码(请参见下面的“下载”)。源代码带有完整注释,对于使用Microchip dsPIC33数字信号控制器芯片的任何人,都可能产生一些有用的汇编语言例程。我还将随时为我的各种机器人项目添加FORTH源代码。

FORTHdsPIC编程语言简介

在 20 世纪 70 年代早期,出现了一种计算机语言,它与当时流行的重量级大型机语言(如 FORTRAN、ALGOL 和 COBOL)几乎没有任何相似之处。它被称为 FORTH,具有许多功能,使其在寻求高级语言编译器的工程师中颇受欢迎,这些高级语言编译器能够为在早期微处理器上运行的实时应用程序创建代码。这些功能包括:

  • 不需要操作系统 (OS),只需要简单的开发板,而非 SBC。
  • 具有高级编译结构,例如BEGIN……UNTIL 和 BEGIN……WHILE……REPEAT。
  • 提供 16 位单精度数字和 32 位双精度数字。
  • 程序执行速度快(在当时)。
  • 它既有可立即执行一行代码的解释器,又有可创建新的“字”的一个编译器。
  • 面向堆栈的操作可实现最高效率(如 LIFO 下推式栈)

       

专业的软件工程师看到上面列表中的最后一项不存在任何问题,但是非代数源代码格式(逆波兰表示法)往往会使那些不熟悉编程的人坚持使用 BASIC 或 Pascal!要了解更多有关 Forth 及其起源的信息,请访问这个非常棒的 网站。也可以浏览 Forth 兴趣小组档案和 Jupiter Ace 档案。两者均提供大量有用的可下载材料,包括原始手册和免费电子书。

Forth 可在基本命令集之外创建新命令或“字”的能力被认为是其最强大的功能之一。在任何版本的Forth的控制台命令提示符下键入 VLIST,您将得到它能“理解”的所有字的列表。请看下文的 FORTHdsPIC 屏幕转储。一个简单的人形机器人行走程序刚刚完成了下载和编译。核心字的第一个块可以立即从命令提示符执行,或者用于创建新的字定义。第二个块提供了已编译程序的结构,不能直接执行。在编译用户程序时创建了第三组字。

FORTH_VLIST_screen_project_a051c50293365aaa31841640e3f30d2f9c399200.png

字 LEANLEFT、ROTATELEFT 和 LEANLEFTBACK 分别定义了左腿上特定关节伺服电机的单个运动。它们包含在 STEPLEFT 的定义中,该定义使左腿向前移动一步。用于右腿的其他字具有相同的作用。STEP 的定义中使用了 STEPLEFT 和 STEPRIGHT,它可以使整个机器人向前移动一步。最后,STEP 在 WALK 中通过循环反复执行,从而使机器人实现连续“行走”。这些新字可能会成为机器人编程语言的“核心”字。ST Robotics 的 ROBOFORTH 就是以这种方式创建的一种商业机器人手臂编程语言。

 

什么是 FORTHdsPIC?

FORTHdsPIC的起源可以追溯到1982年,当时我正在设计一种用于测量电池充电状态的便携式仪器。复杂的算法使其成为使用数字处理的理想选择,因此基于当时普遍使用的Zilog Z80芯片的设计出现了。Forth曾经风靡一时;可以定期在计算机杂志上看到相关文章。市场上甚至有家用电脑 - Jupiter Ace - 运行Forth,而不是来自Sinclair ZX Spectrum设计师的常用BASIC。在计算机期刊中找到一些基于Z80的编译器的大纲代码后,我创建了适合4KB UV EPROM的LUT-Forth。在Kemitron计算机上的8位操作系统CP/M上也运行了相同的代码。我把它产生的编译代码写入一个4KB EPROM,然后再把EPROM插入到仪表板上的另一个插槽中。当时我还不知道,但是结果就是我们现在所说的“嵌入式”计算机!

许多年后,我不得不将原始的 LUT-Forth Z80 代码(实际上是一个子集:8085 代码)转换为更现代的处理器,并查看其运行情况。我选择了 dsPIC33,FORTHdsPIC 由此诞生。当前的微控制器具有许多功能,而 1970/1980 年代简陋的旧微处理器却没有这么多功能,所以制作更好的 Forth 不会太困难:

  • 芯片上非易失性可编程闪存。以及许多其他改进和发明。
  • 种类繁多的芯片上外围硬件接口。
  • 带有硬件乘/除指令的强大的指令集。
  • 以及其他许多功能提升。

 

第一版:采用28引脚DIL封装的40MIPS dsPIC33FJ128MC802

Arduino_dsPIC_1_89d1b38946bee54b28f8865d09cf75f70cfcc513.jpg

闪存: 128KB   RAM: 16KB

用于该项目的第一台主机是我通过eBay获得的、由一家香港公司生产的Arduino格式板。它非常适合这个工作,因为它带有板载USB-UART桥接芯片 - 一个Silicon Labs CP2102和一个USB-B连接器。该设备非常常见,我所要做的就是将USB连接到可以上网的PC,驱动程序已自动下载并安装。USB链接提供FORTHdsPIC所需的最重要的终端或控制台连接,用于程序输入和显示。

该板还具有兼容Microchip PICkit 3的ICSP头。PICkit 3提供了编程/调试接口,链接到PC上运行的MPLAB IDE。

到了固件版本0.5时,我意识到切换到功能更广泛的开发平台是个好主意。Microchip MicroStick II看起来很理想,因为它几乎保留了旧板的所有功能,并带有内置的编程器/调试工具。后者消除了对PICkit 3的需求。我在此 DS博客文章中对这个过渡进行了描述。

 

Microstick_II1_447c7e1b3e723c5b4e1cec46cdf32fffc6e3a0c7.jpg

当然,您会失去方便的Arduino头插槽,但是会获得头引脚。这些头引脚将插入到任何标准原型试验电路板模块。USB连接器提供到运行MPLAB IDE的PC的链接,而另一端的焊垫可用于访问用于控制台的芯片的UART1。如今,很少有PC具有串行COM端口,因此,如要提供一个控制台,需要UART-USB桥接电缆(767-6200)和终端仿真器软件。我使用了(现在仍然使用)免费的TeraTerm。

大小问题

您可以使用28引脚进行的操作令人惊讶,但是我开始意识到FORTHdsPIC正在开始淘汰SPDIP封装。至少作为开发工具。特定的应用可能需要使用8引脚芯片和2线I2C总线来驱动外围设备。请参见我的 关于I2C串行通信的博客文章。28引脚dsPIC33器件包含的外围功能模块远远多于外部连接。幸运的是,用户可以编程将特定功能分配给引脚。

第二版:采用100引脚TQFP封装的70MIPS dsPIC33EP512MU810

闪存:512KB   RAM: 52KB

Clicker2_a2893286f53aa1b9c31cd0bb9f61b43993d83227.png

当前(我犹豫要不要说最终版本)FORTHdsPIC 版本的新平台:0.9 版使用的是 MikroElektronika Clicker 2 开发板,它具有一个 70MIPS dsPIC33EP 部件,取代了旧的 40MIPS FJ。

像它的早前型号一样,它也不是单板计算机 (SBC),因为它没有支持像 Linux 或 Windows 这样的操作系统所需的 DDR RAM、GPU 和其他部件。实际上,除 dsPIC 本身之外,目前存在的唯一其他主要芯片是电源管理模块 (PMIC),它可调节各种可用电源,包括可选的锂聚合物充电电池。

将代码从 MicroStick 移植到 Clicker 2 并非一帆风顺,但最终我做到了。发布在此处这里博客记录整个移植过程。

Click 和 mikroBUS

除非能够快速简便地连接特定应用传感器/执行器电路并与之通信,否则微控制器开发板对设计人员而言并没有实际用处。对我而言,这意味着每个扩展板至少应提供一对并行插槽接头,以便安装匹配的外围模块。这种双接头连接方法可实现机械稳定的布置,并出现在了 Arduino、Beaglebone 和 MikroElektronika 处理器板上,它们分别采用了称为 Shield、Cape 和 Click 的扩展模块。我一直认为只有树莓派单侧的 GPIO 连接器是设计上的缺陷。像我这样的老手可能还记得 Sinclair ZX81 声名狼藉的 16K RAM Pack,在您花了很长时间键入之后,它轻而易举地丢失了所有代码。

Clicker 2 主板的扩展连接器采用“万无一失”的做法:两个 Click 模块的插槽,在主板的每一侧都提供了 26 路 GPIO 接头(参见上图)。Click 模块上的 16 针接头连接器的功能由 mikroBUS 标准 定义。它们中的半数用于通信:UART、I2C 和 SPI 总线。四个用于电源:+3.3V、+5V 和两个接地连接。其余四个具有特定功能,但是由于它们与 GPIO 引脚相连,因此可以将它们分配用于任何目的。

Clicker 2 mikroBUS 插槽上可用的 Forth 功能

mikroBUS 1:UART 通道 1(控制台),ADC 通道 1,PWM 通道 1

mikroBUS 2:UART 通道 2,SPI 通道 2,ADC 通道 2,PWM 通道 2

Clicker 2 26 路接头连接器上可用的 Forth 功能

左侧接头连接器:I2C 通道 2,伺服通道 1 至 4,测速计通道 1 & 2,SPI 通道 3 CS 1 & 2

右侧接头连接器:SPI 通道 3,ADC 通道 3 & 4

 

Click_Remote_1_d91754fa7c5ed575bc65dc6df37e577a94a3b427.jpgmikroBUS Shield

就目前而言,Clicker 2 开发板仅支持两个 Click 外围设备模块。即使是中等规模的开发项目也可能需要更多模块。这是 26 路连接器的插入位置。我将堆叠式接头连接器焊接到了板子的每一侧:这些是带有扩展焊脚的插槽接头连接器,使 Clicker 2 能够将扩展板放在顶部,插入下面的另一块板上。我的无线移动机器人项目的手动控制器需要四个 Click 模块:两个操纵杆、一个无线模块和一个用于程序开发的 UART-USB 桥接器。mikroBUS Shield  (791-6485)  提供了解决方案:它具有两组 Click 接头连接器和一个有用的“原型设计”区域。

MikroElektronika 基于 Click 板的模块化系统及其 mikroBUS 连接器均经过精心设计,可以构建坚固的原型,而无需脆弱的电线连接。我的机器人无线遥控器就是一个很好的例子:它足够坚固,可以进行各种测试,而不会有摔碎的危险!唯一必要的预防措施是保持手指远离无线模块及其天线。

 

Clicker2_plus_blog_3_c19ad45475e0e2a36fca0f01243cb52459557904.png

mikroBUS Shield 提供了另外两个 Click 插槽,可访问与 Clicker 2 板上不同的 UART、SPI 和 I2C 通信通道。

mikroBUS Shield 插槽上可用的 Forth 功能

mikroBUS 1:SPI 通道 3 (CS1),I2C 通道 2,ADC 通道 4,伺服通道 1

mikroBUS 2:SPI 通道 3 (CS2),I2C 通道 2,ADC 通道 3,伺服通道 2

mikroBUS Shield 26 路接头连接器上可用的 Forth 功能

与 Clicker 2 板相同

 

板外连接
P1000361_smaller_b7d9a0d3adc9a5c6797c2fc37134a14127376839.jpg

并不是所有的项目都可以完全由 Click 模块构建,所以我使用 Clicker 2 上的 26 路插槽接头连接器来实现与其他线路板的单线连接。来自远程控制单元的无线链路另一端的移动机器人只需为其两个超声波测距仪建立这样的连接即可。SRF08 是“智能”设备,可通过 I2C 总线接收命令并发送回距离数据。I2C 是真正的“两线制”通信系统,具有复杂的协议,仅通过这两条线即可处理一百多个可寻址设备:一条用于数据 (SDA),另一条用于数据时钟 (SCL)。dsPIC 具有两个独立的 I2C 通道:通道 1 出现在 Clicker 2 板的两个 mikroBUS 连接器上,通道 2 馈入 mikroBUS Shield 板(如果已安装)上的插槽。目前,我只编写了通道 2 的驱动程序,因为 Clicker 2 插槽只需要 UART 或 SPI 通信,而 26 路接头连接器上的通道 2 可用于板外周边设备。我发布在无线机器人上的博客包含大量有关 I2C 总线的实用信息,包括如何避免那些可能使您抓狂的设计错误!

 

未完待续....

Engineer, PhD, lecturer, freelance technical writer, blogger & tweeter interested in robots, AI, planetary explorers and all things electronic. STEM ambassador. Designed, built and programmed my first microcomputer in 1976. Still learning, still building, still coding today.

Recommended Articles

DesignSpark Electrical Logolinkedin