您可以在没有计算机的情况下对微控制器进行编程吗?


16

假设您有一个相当简单和小型的微控制器,没有接口,没有计算机,没有调试器,编译器或汇编器。您能否以汇编形式编写代码,将其(手动)转换为机器代码,然后使用电压源向适当的引脚供电?

我知道您需要适当的I / O和内存才能真正执行任何操作,但是如果您如此倾向于并有时间,可以执行此操作吗?从历史上看,我猜想当没有计算机/编译器/汇编器开始时是如何做到的?随时将我链接到外部资源。谢谢!:)


3
看看Altair1。使用前面板开关和手动机器编程是唯一的方法。
pjc50

@ pj50他问的是微控制器,而不是微处理器。单片机将其代码运行在我们的闪存中,如果没有某种接口,该代码将无法访问。
tcrosley

您需要多少个编程单位?许多制造商会提供预先用您的代码编程的微控制器。但是,如果您只需要一个完整的卷轴,那么这是不切实际的。
Oleg Mazurov 2015年

2
早在70年代,您就已经建立了一个拨动开关和指示灯面板,以便您可以进入程序。我从来没有使用过早期的微控制器之一,而是使用过几种不同的微处理器,默认情况下就是这样。早期的微控制器和微处理器之间除了I / O功能以及程序存储器配置的一些细节之外,没有其他根本区别。
热舔

我将其留为评论,因为找不到该故事的来源。我记得有段时间回想起一个小孩的故事,这个小孩纯粹是基于对数字逻辑的理解,利用晶体管设计和制造了自己的计算机(实际上只是CPU),以参加一次科学竞赛。他当时买不起电脑,只能通过拨动开关对他的创作进行编程(我想我还记得那只是一个按钮的时钟)。一位法官印象深刻,以至于他给孩子买了一台电脑。
slebetman

Answers:


37

您能否以汇编形式编写代码,将其(手动)转换为机器代码,

是!
如果愿意,可以用二进制代码“超出您的头脑”编写代码。
很久很久以前,这就是我开始使用(然后)微处理器的方式。
我和朋友会用汇编语言编写代码,将其手动编译为机器代码(经过一些练习,您可以通过“检查”来完成),然后通过各种方式将其输入到处理器中。在我们构建的一个系统上,我们将在二进制(on-off)开关上设置地址,或者使用处理器的自动递增功能,在二进制开关上输入8个数据位,然后按“时钟”开关将数据输入内存。

使用串行SPI编程,在现代微控制器上只需更少的开关就可以实现等效功能-参见下文。

...然后使用电压源向适当的引脚供电?

是!
但这将非常缓慢!
许多现代微控制器都允许使用“ SPI”接口进行编程。
它通常由输入和输出数据线和一条“时钟”线,通常是一条复位线组成。

许多处理器允许SPI时钟和数据为“静态”,这意味着在位之间建立数据所需的时间没有限制。您可以使用由手动操作的开关驱动的数据线和时钟线对此类处理器进行编程。时钟线需要“无反弹”-您需要能够在每次操作的一次转换中将其设置为高电平或低电平-因此最小接口可能需要包括施密特触发的门。您可以“摆脱” RC延迟和按钮开关,但施密特触发的输入更为安全。数据线不需要跳动,因为它的状态仅在时钟沿读取。

某些接口是交互式的-数据在编程期间由处理器输出(例如,数据输出= MISO = AVR处理器上的主机输入串行输出)。要阅读此内容,您需要添加一个LED和一个电阻(如果驱动能力真的很低,则可能需要添加一个缓冲器或晶体管)。


MC6800:

来自半衰落的记忆(将近40年!)

LDI A,$ 7F ...... 86 7F ...... 1000 0110 0111 1111
STA,$ 1234 ...... B7 12 34 ... 1011 0111 0001 0010 0011 0100
LDI X,$ 2734 .. 。CE 27 34 ... 1100 1110 0010 0111 0011 0100
... ...


1
+1代表静态设计,使时钟一直传到DC。
pericynthion,2015年

2
这带回了回忆。我实际上是在学校里学会了使用按钮输入Z80代码的。那是在1990年左右。我的老师坚持认为,用辛苦的方法学习编程很有价值。25年后,我不得不同意。
Nils Pipenbrinck

@NilsPipenbrinck我现在正在编写C代码并应用我最初从Fortran中学到的课程:-) !!!-然后将其与嵌入式系统和汇编语言进行了磨合。这些课程通过对变量和端口访问应用思维定型来减少出错的机会,否则它们可能会做一些允许但不希望或有用的事情。装配工是终极锋利的武器-无需护手的双头剑。之后,“高级”语言似乎不那么尖锐:-)。Z80按钮输入对您的学习体验有类似的作用;-)。
罗素·麦克马洪

@Erbureth谢谢:-)。是的,1111年的ffff明显是脑衰弱。...只是“您明白了”,但完成一行不会有任何伤害。
罗素·麦克马洪

是的,我知道了,但是当我想到的时候... :)
埃伯特斯(Erbureth)说恢复莫妮卡(Monica)2015年

10

最初,在可编程机器中,程序被手动打孔到纸带或卡片中。后来,他们使用一台打字机进行打孔,甚至后来,计算机(当时已经广为人知)仍然可以打孔自己的纸带。

从字面上看,它是拿着卡片坐在那里,然后在其中手动打孔。

enter image description here

每列都是一条指令或数据位,由CPU的状态机解释以执行任务。

现在,如果所有的都是闪存,是的,首先将数据存储在其中通常需要一台计算机来完成。但这并不完全是100%正确的。

毕竟,计算机和硬件程序员会做什么,但要在正确的时间设置IO引脚的状态?因此,如果您确实有足够的自虐能力,则可以构建一个系统,该系统允许您以正确的方式将正确的指令发送到微控制器的编程引脚,以将一些指令安装到闪存中以执行。

也许涉及很多开关,一些移位寄存器,时钟发生器等。

我记得在大学时,我们有一个基于Z80的新型编程系统-一个单位的大小,包括一个Z80手提箱,一些少量的RAM,一堆7段LED显示屏和一大排开关。通过使用开关将指令手动加载到RAM中进行编程。


Z80不是有效的示例。他问的是微控制器,而不是微处理器。单片机将其代码运行在我们的闪存中,如果没有某种接口,该代码将无法访问。至少您在回答的其他地方确实提到了Flash和编程接口。
tcrosley 2015年

@tcrosley Z80的用途更多,目的是说明在Visual Studio夺走所有技能之前,计算机是如何编程的。
Majenko

尽管我不知道有任何机器可以这样做,但不难在读卡器上增加一些电路,以便用存储在卡序列中的代码对微控制器进行编程。但是,纸带可能更实用。
supercat 2015年

2
我过去常常在这些地方手动打孔。这仅在极端情况下才可行(晚上10点,学期报告明天到期,一个大型机离开,当天的打孔室小姐离开)。实际上,从前面板(几年后)对同一大型机进行编程实际上要快得多。
Oleg Mazurov 2015年

1
@Majenko-我看过巴贝奇机器的重建,它绝对不是用电话设备制成的。不过绝对嘈杂。
热门热门2015年

7

您说:“小型微控制器,没有接口,没有计算机,没有调试器,编译器或汇编器。” 好吧,您无需计算机,调试器,编译器或汇编器就可以解决问题,但是必须具有某种接口才能与微控制器连接才能加载程序。

首先,不要考虑任何高级语言,例如C。然后,最简单的方法是用汇编语言编写程序,但不要使用汇编程序将其转换为机器代码。而是在编程手册中查找每个汇编指令,找到其等效的十六进制编码,然后写下来。

您将必须分配自己的变量,因此可以在指令的操作数部分中填写适当的地址。还忘了使用堆栈和堆的工作量。完成后,您将拥有一个可以直接加载到微控制器的闪存中的机器程序-也不需要链接器。

由于几乎所有微控制器上都缺少外部地址和数据总线(因为它们占用了I / O端口和外围设备所需的太多引脚),因此实际上所有微控制器都通过如下特殊接口进行编程:

enter image description here

通常,左侧的“编程器”将连接到PC,该PC将下载由编译器/链接器生成的机器文件。

但是,如果程序员有键盘,例如下面的键盘:

enter image description here

然后,您可以将一个手动生成的程序的十六进制代码直接输入到编程器中,而无需使用您要查询的编译器,链接器或PC来对设备进行编程。(键盘也用于编辑十六进制文件,并生成校验和。)

很少有程序员会使用这种键盘。这可能不适合业余爱好者,因为它可能要花费几千美元。

这个特殊的程序员在将零件放到板上之前对其进行编程。接口和插座可用于多个PIC,以及Atmel AVR等。


5
您已经对其他各种答案的无效性发表了评论,但是可以说这个答案的有效性不如您所评论的大多数答案有效。他说:“……没有接口,没有计算机……”。您的解决方案至少是“一台计算机”。“没有接口”的意思是没有意义的。但是,在SPI接口上使用一些去抖动的开关,可以说您有一个解决方案。
罗素·麦克马洪

1
@RussellMcMahon谁说程序员中有电脑?他们中的许多人仅使用FPGA(可以用分立逻辑代替)。除非具有自举程序,否则如何通过SPI接口对微控制器进行编程?如果是这样,您如何编程引导加载程序?
tcrosley 2015年

3
在许多(可能是大多数)微控制器上,基本没有引导程序的标准低压串行编程接口在基本串行接口中使用了几行。如果存在交互作用,则MOSI MCLK(Vdd接地复位)将达到最小MISO。3个开关(仅其中之一)不需要弹跳)和一个用于MISO的LED和“您已关闭”。非常非常非常缓慢。如果允许FPGA不算作“计算机”,那么实现许多基于处理器的系统将没有问题。我怀疑“没有组合逻辑”会符合他的要求。
罗素·麦克马洪

我不得不说,烟花是与电子设备一起使用时使用的错误背景:)
Anonymous Penguin'Aug

6

实际上,诸如手动切换JTAG引脚之类的操作很容易出错。要输入任意大小的程序,将需要进行数千次切换。但从理论上讲,这是可能的。

如果允许您事先准备微控制器(或为其编写引导ROM),则可以轻松实现类似早期大型机上使用的外部拨动开关的功能。如果允许外部逻辑,甚至可以使用十六进制键盘来加快处理速度。

最后,尽管现在不那么普遍了,但是您可以购买带有自定义代码的基于ROM的微控制器。您必须预先提供一些资金并保证一定的数量,但是我看到客户这样做是为了节省大量生产的费用。在这种情况下,根本不需要外部信号即可对微控制器进行编程。该代码将内置到芯片的物理布局中。

当然,您也可以使用在外部存储器接口之外运行代码的微控制器,但这是在作弊。:-)


2
实际上,我在1976/77年建立了Imsai 8800“克隆”,并会使用拨动开关按常规对它进行二进制编程。我的引导加载序列大约为40或60多个字节(这是一辈子之前!),该序列会从我的ASR-33电传打字机中读取一张纸带,然后带入键盘监视器。在电传打字机工作之前,我将严格以二进制格式对8085(我的“克隆”和Imsai之间的差异之一)进行编程。但这是并行的,有一排开关。正如Adam所说,我已经使用电报密钥进行串行编码,而且它确实很容易出错。
user6297'4

3

绝对。实际上,我参加的第一门微处理器课程(大约87课)使用了Motorola 68000开发板。我们将在汇编中计算代码,查找汇编的十六进制,然后在终端中键入该十六进制以对电路板进行编程。如果进行了编辑,则必须确保输入的代码比要替换的代码短,然后用NOP缓冲其余代码。如果coDE较长,则必须重新输入所有内容!我们学会了添加大量的NOP。


68000不是微控制器。他问的是微控制器,而不是微处理器。单片机将其代码运行在我们的闪存中,如果没有某种接口,该代码将无法访问。
tcrosley 2015年

5
@tcrosley并非完全正确。有些微控制器需要外部ROM,因为它们自己没有ROM或闪存。使它们成为微控制器的原因不是内置于RAM或ROM中,而是内置于外围设备(IO端口,UART等)中。
Majenko

但是很少-由于您刚才提到的I / O外设,很少有外部地址和数据总线,因为它们需要两个许多引脚。
tcrosley 2015年

2

绝对。一旦有了实际指令的二进制格式(对于指定好的指令集很容易做到),您所需要做的就是实现编程协议。

例如,拿一些像 AVR Tiny 4。第14节详细介绍了编程接口,包括协议和物理层。它相对简单,只需要几个按钮和上拉/下拉电阻就可以发送/接收1或0。如果您有雄心壮志,请添加一些LED来回读输出。

最后剩下的问题是您是否可以足够快地完成它,这很幸运*,对于AVR Tiny 4(第16节),在编程时没有任何最低频率。

*注:根据数据表的规定。实际情况可能有所不同...我怀疑有人尝试过以mHz时钟速度对其进行编程。

随意将其自动化/尽可能少地完成所需的过程。无论如何,这就是大多数编程设备所要做的:使过程自动化。


2

无论以何种方式将程序输入到uC,您都在与它“接口”,因为这就是接口的含义。甚至您手动翻转的一堆开关都是“接口”。

因此,我将这个问题视为“我如何通过很大程度上与机械接口(而不是电子接口)的硬件连接到uC,并以一种最酷的方式进行?”

我的答案是,将程序输入为钢琴卷。演奏者钢琴的钢琴滚动“跟踪器栏”基本上为您提供了至少65位(取决于格式),您可以根据纸张上的穿孔独立地打开和关闭这些位。其余的工作是用大刀进行的。但是至少您的程序一旦运行就(某种程度上)被永久存储(与手动切换开关不同)。


2

不仅可以在没有计算机的情况下对微控制器进行编程,而且今天您实际上可以购买专门设计为使用硬件拨动开关编程的计算机。该工具包称为会员卡,它是1970年代COSMAC Elf计算机的再生产。该工具包在IEEE Spectrum杂志最新文章中有所描述。也可以从PC编程会员卡的最新版本。


2

好的。怎么样了:如前所述,您可以用汇编器编写程序并自己查找操作码。如何在计算机中获取它:拿起旧的磁带播放器,取下播放头,但离开绞盘和压纸轮。这将是您的交通工具。如果您有线对线播放器,则可以将播放头保持在原位。

然后,取一长又窄的纸条,或什至更好的透明胶带。在这里编码程序。您可以使用要编程的针脚使用尽可能多的轨道。在一条轨道上,您定期放置黑点;这是你的时钟。在其他轨道上,您会根据数据和信号放置黑点或小条,并留空。您可以照亮整个物体,并用小型光电晶体管对其进行检测(或者将一个LED照在胶带上,并使用其他类似的LED来检测光),并使用晶体管驱动时钟和信号线。这会在磁带播放器上占用一些空间,这就是为什么您可能需要卸下播放头的原因。

当然,您也可以将信号编码为音频,但是解码要复杂一些。或者,您可以检测反射光而不是透射光。或者,您可以在深色胶带或纸胶带上打孔,而不是在透明胶带上打上黑色标记。随你。磁带播放器以恒定速度驱动磁带,因此您无需计算机即可输入时钟信号。


1

是。主要问题可能是与编程界面进行交互。如果您有简单的地址和数据总线,则事情会容易一些。您是否见过一些真正早期的计算机?通过前面的开关,程序一次输入一个指令到RAM中。


他问的是微控制器,而不是微处理器。单片机将其代码运行在我们的闪存中,如果没有某种接口,该代码将无法访问。
tcrosley 2015年

4
@tcrosley-早期的uC没有闪存。他们有用于程序存储的RAM或ROM。
热舔

@HotLicks正确。除了少数例外,这些都是微处理器,而不是微控制器。那是我的意思,而不是程序存储区是闪存,ROM,PROM,EPROM还是EEPROM。关键是程序存储区是否在芯片上(微控制器)或不在芯片上(微处理器)。甚至1977年推出的英特尔第一个微控制器8048都有内部ROM。
tcrosley

3
@Tcrosley你是谁?对于通常有用且令人反感的tcrosley,您做了什么?:-) | 他的第一个观察结果是您可以与编程界面进行交互-这通常但并不总是有效的。“ IF”重新地址和数据总线是IF。它适用于某些大型边界混合微控制器,但他最初的IF足够好(尽管很困难也很慢)。
罗素·麦克马洪

3
试图在微处理器和微控制器之间保持硬性区分是徒劳的,而不是有用的,尤其是当它在对每个答复的评论中。
pjc50 2015年

1

Digital Equipment的40年前的PDP-8微型计算机没有自动启动功能。程序通常是从打孔的纸带加载的,但是用于加载纸带的加载器必须在前面板开关上手动输入。

enter image description here

在Digital和PDP-8客户的站点(例如将它们用作当今的嵌入式控制器的OEM厂商)中,用户记住引导加载程序并相互竞争以最快的速度进入引导程序并不少见。装入机器。这些机器使用了磁芯记忆(手在世界上遥远的地方,由女性用细小的手指,用针和细细的线子绞在一起)。

enter image description here

由于磁存储器的内容是非易失性的,因此引导加载程序在掉电后仍可幸存,并且仅在初始组装后才需要手动输入,因此该加载程序被程序错误或使用加载程序空间所需的程序清除了。


许多年前,当我们不得不艰难地在上下雪地上赤脚上学时,我们高中的PDP-8必须通过您所描述的前面板中的引导加载程序进行引导。没有一个老师对计算机非常了解,包括负责它的计算机。他认为上升为0,下降为1,因此永远无法切换到引导加载程序。我上英语课时会安排计算机崩溃,所以我被叫来重新启动计算机。我从没告诉过他关于误解的看法-对我来说太有用了。
Olin Lathrop 2015年

我喜欢PDP-8。我只能使用一台电脑大约三年了-就像在发明术语PC之前就拥有一台个人计算机一样。令人惊讶的是4K内存可以容纳的内容。当然可以通过很多纸带(没有DECtape)和电传纸。
tcrosley

0

答案是肯定的,您可以在没有计算机,调试器等的情况下对微控制器进行编程。您所需要的是提供uC制造商指定的各种电压,数据,时钟和编程序列(这不是一件容易的事)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.