版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.工作总结、述职报告、申报文本、申请文书、可行性报告等精品文档RCX手册作者:Ole Caprani University of Aarhus, Department of Computer Science ocapranidaimi.au.dk译者:任永 北京交通大学电气学院 ryong21 致谢 感谢董春教授一直以来的关心与指导。感谢您为我提供乐高机器人并将办公电脑让与我使用,使我有机会接触到乐高并完成这篇文章的翻译与录入工作。 目录1.简介 2.H8/3292微型控制器 3.RCX:CPU、存储器和输入/输出设备 3.1 RCX 的CPU 3.2 RCX的存储器 3.3 RCX的输入/输
2、出设备 3.3.1 访问RCX的设备寄存器 3.3.2 RCX中断和中断处理 3.3.3按钮 3.3.4 RCX输入口和传感器3.3.5 红外发射/接收 3.3.6 LCD显示屏 3.3.7扬声器 3.3.8 RCX输出口和执行器件 4. RCX预置程序(指出厂时,ROM里预先烧好的程序) 5. 与RCX预置程序通信 5.1 请求/应答协议 5.2 字节协议 5.3 位协议 5.4连接在RS232口的红外发射/接收(发射塔) 5.5一个与RCX通信的用户程序 6RCX预置程序提供底层服务 6.1 LCD子程序 7为RCX编译程序 7.1如何安装交叉汇编器和交叉编译器 7.2编译汇编语言程序 7
3、.3 编译C语言程序 8程序下载9参考文献 介绍使用乐高MindStorms 机器人开发系统您可以搭建一辆能避开障碍走出迷宫的小车或组装一个能显示最小值、最大值和平均值的数字温度计。RCX是一个可编程控制器,MindStorms系统的一个组件。RCX可装在小车或数字式温度计上来控制小车的行为和温度计的温度采样与测量。 RCX使用的微型控制器,是日立H8/3292系列的H8/300单片机。本质上是单片机在执行控制程序,通过H8/3292的设备控制器来访问RCX的输入/输出设备如按钮、扬声器, LCD显示屏。此外, 传感器如接触传感器或温度传感器可以连接到RCX输入口,给控制程序提供输入值,然后控
4、制程序再驱动执行器件如电机。交互过程:来自环境的刺激-小车碰到障碍可由传感器如接触传感器感知,变换成输入值。引起的反应小车转向控制程序输出值到执行器件使电机完成转向。 RCX配备有以下输入/输出设备: 输入设备四个标有Run, OnOff, View, Prgm的按钮三个标有1,2,3的输入口电量定时器红外接收器输出设备显示屏扬声器三个标有A, B, C的输出口红外发射器RCX就是通过这些输入/输出设备和连接到RCX输入/输出口的传感器/执行器件与环境交互。可以使用的传感器/执行器件有: 传感器应用举例接触传感器遇到障碍后, 在按钮上产生一个信号光电传感器颜色分辨, 检测环境光亮度角度传感器轮
5、子转过的角度, 轴的运动温度传感器测量体温, 室外温度执行器件应用举例电机驱动小车, 电梯的升降灯闪光, 红色报警光声音蜂声在主机上编写好程序后,可通过串口下载到RCX中。程序可用不同的开发环境来开发,如LEGO 提供的图形化开发工具:ROBOLAB, 还有用VB来开发程序的软件开发包(参见LEGO MindStorms),它可以下载低级的机器代码。 这本手册叙述UNIX 主机上一个简单的开发环境。程序既可以用C语言也可用H8/300的汇编语言来编写,然后通过交叉汇编器和交叉编译器生成H8/300的机器码,通过由片内ROM常驻程序提供的一个简单协议下载到RCX中,常驻程序在上电和复位后就会自动
6、运行 。下载的程序运行后,RCX的预置程序提供基本的I/O服务(如访问LCD屏),这本手册同时也提供直接操作输入/输出设备的细节,直接操作是通过与单片机的设备控制器和内存分配的协调应用实现的。 这本手册和UNIX编程环境可作为为RCX开发简单程序的工具,也可作为开发实时操作系统的工具。 H8/3292 微型控制器RCX使用的是日立的H8/3292单片机,属于H8/3297系列。芯片具有计算机的三个主要功能: H8/300微处理器、存储器和输入/输出。它们通过芯片内的地址/数据/控制总线连接在一起。 H8/300 CPU采用通用寄存器结构。指令集包括暂存器-暂存器运算和逻辑操作。寻址方式包括大多
7、数常见的寻址方式如寄存器直接寻址,寄存器间接寻址,程序计数器和存储器间接寻址。最大寻址空间是16位(64K),为程序和数据所共用。 芯片存储器包括16 K 加密可编程ROM和512 个字节的RAM 。其中128字节片内寄存器用作与片内的输入/输出电路的接口。存储器空间的分配决定片内存储空间和外扩空间的如何与16位地址对应。空间分配与cpu的MD1和MD0引脚设置有关,这两个引脚决定处理器的工作模式(共有1, 2 或3三种)。在所有模式下片内RAM 和片内寄存器都使用相同的地址。模式1和2,叫外扩模式,这两种模式允许通过片内的地址/数据总线访问外扩的空间。模式3, 称单片模式、只有片内ROM和R
8、AM可以使用。当使用外扩存储器时,可以用外扩逻辑为其空间分配地址。片内输入/输出包括三种定时器(16 位自由定时器、8位定时器和监视跟踪定时器-watch dog), 一个串行通信接口,A/D转换和一些输入/输出口。定时器可以脱离外部电路使用。串行通信接口可作为外部串口发射/接收的设备控制器。同样,10 位A/D 转换可作为八个模拟通道的设备控制器。连接在A/D转换8个引脚的外部模拟信号由内部的采样-保持电路采样后,转换成10位的值。内部模拟通道有单路和扫瞄两种工作模式。扫瞄模式允许多路通道连续转换,并将转换结果保存到不同的设备寄存器里。片内输入/输出口可和外部的输入/输出线相连,此时处理器就
9、可从设备寄存器读出8位输入线上的值。在没有外部电路的情况下,按钮可以和一个输入引脚直接连接,并将其值读入。当处理器向8位输出口的设备寄存器写值时,其值可由输出口输出并直接驱动外部电路如直接驱动发光二极管LED。 片内中断控制器可响应内部和外部的中断源。片内输入/输出事件对应内部中断源。每个事件(如A/D转换结束、定时器溢出) 对应一个中断向量。外部事件对应外部中断源。所有中断都可以被屏蔽或开启(除了NMI不可屏蔽中断)。 3.RCX: CPU、存储器和输入/输出设备RCX是一个具有计算机三个主要功能(处理器、存储器,和输入/输出设备)的可编程积木块。 从物理上看,RCX的内部电路包括一块印制电
10、路板和9V电源。H8/3292单片微型控制器,32K的RAM,电机控制芯片,LCD屏和LCD控制器芯片,扬声器,四个按钮等通过电路板连接在一起。RCX的拆卸图以及详细元件清单请参考RCXInternals。 从逻辑结构上说,RCX控制器可看作一台低端个人计算机,它通过一条总线把处理器、存储器和输入/输出设备连接起来。输入/输出口都分配了确定的地址。每个设备包括两部分:一部分是通过总线与设备连接的接口电路,另一部分是组成设备的机械装置和电路元件。按钮、LCD屏、扬声器,传感器和执行器件都属于设备。接口部份通常专指设备控制器,当然,设备与接口并没有明显的界线。 当对RCX编程时,主要考虑它的逻辑结
11、构。我们将从程序员的角度来描述它的逻辑结构。 3.1 RCX的CPURCX的处理器是H8/300 CPU。工作频率16 兆赫。CPU 有八个通用16 位寄存器(r0 - r7, r7 作为堆栈指针(sp) 使用), 16 位程序寄存器(pc), 和一个8位状态寄存器(cc) 。状态寄存器显示算术状态(如进位,溢出,和零)和中断屏蔽与使能。指令集包括暂存器-暂存器运算, 如16 位加法、16 位减法、8位乘法和16 位/8 位除法),及常见的逻辑操作如异或,或,与,非,移位,位操作,子程序的调用与返回和使RCX进入节电模式的sleep指令。数据类型包括位、4位BCD码,字节,和字(2 个字节)
12、。寻址方式有: 寻址模式汇编语言寄存器直接寻址Rn寄存器间接寻址rn长转移寻址(d:16, rn)增量后寄存器间接寻址rn+增量前寄存器间接寻址 rn绝对地址寻址(8或16位)aa:8, aa:16立即寻址(8或16位)# aa:8, # aa:16pc指针寻址(d:pc)存储器间接寻址aa:83.2 RCX存储器RCX的H8/3292芯片工作在模式2下。模式的值可通过访问位于地址0xffc5的模式控制寄存器而得到。在模式2下,片内ROM、片内RAM,32K外扩RAM统一编址。 空间分配由工作模式和外部地址编码共同决定。具体为: 地址范围存储器类型内容0x000 - 0x3fff片内加密可编程
13、ROMH8/3292 中断向量, RCX预置程序0x8000 -0xefff片外RAM程序/数据0xf000片外寄存器RCX输出口设备寄存器0xfd80 -0xff7f片内RAMRCX中断向量/程序/数据0xff88 - 0xffff片内寄存器 H8/3292设备寄存器3.3 RCX输入/输出设备RCX输入/输出设备包括两部分: 输入/输出设备控制器和输入/输出设备本身。从内部看到的是设备控制器,从外面看到的是设备本身。比如四个按钮,从内部来看,是两个具有确定地址的输入/输出口;从外面看,是RCX外壳的四个塑料按钮。因为我们是从编程的角度看设备,所以将主要描述RCX设备控制器部分。 运行在RC
14、X CPU上的程序通过设备寄存器和中断来与设备通信和保持同步。通信和同步的接口是由RCX设备控制器提供的设备寄存器和RCX中断。 大多数设备控制器是基于H8/3292 输入/输出元件的。H8/3292输入/输出元件的地址分配寄存器是设备寄存器的一部分。同样输入/输出中断源也是RCX设备中断的一部分。RCX输出口是唯一的例外。RCX输出口控制器并不使用H8/3292输入/输出元件也就不使用片内寄存器。因此,RCX输出口的设备寄存器不在片内寄存器地址范围内。 基于H8/3292元件的设备控制器如下: RCX设备控制设备寄存器中断按钮I/O port4和7的设备寄存器。IRQ0,IRQ1设备寄存器R
15、UN连接在IRQ0, OnOff在IRQ1输入口A/D转换和I/O port6的设备寄存器。有三条线与port6相连A/D 中断电量A/D转换设备寄存器A/D 中断定时器定时器设备寄存器定时器中断红外发射/接收SCI设备寄存器,I/O port4和定时器1。port4与一条线相连SCI中断,定时器1中断LCDI/O port6设备寄存器。使用port6的两条线没有中断扬声器I/O port6设备寄存器和定时器0。使用port6的一条线定时器0中断输出口设备寄存器在外扩地址空间没有中断3.3.1 访问RCX的设备寄存器RCX设备寄存器的值可由汇编语言或C语言的位操作来访问。我们将用C语言来解释某
16、一位是如何被清除或置位的。为了方便,我们定义一些变量: typedef unsigned char byte;typedef unsigned short int word;/* A/D 转换*/* A/D控制/状态寄存器 */#define ADCSR *(volatile byte *) 0xffe8) #define ADF ( 1 << 7 ) /* A/D Flag , bit 7 */#define ADST ( 1 << 5 ) /* A/D Start, bit 5 */* A/D 数据寄存器 A */#define ADDRA *(volatile w
17、ord *) 0xffe0) 第一个预定义用来把地址常量变成一个指向字节型地址的指针。*( .)表示取地址里的内容,动态的限制可防止设备寄存器的值在改变前被读出。可使用这些定义在通道0启动A/D转换,转换结束后可从数据寄存器A读出10 位的数据: ADCSR = 0; ADCSR |= ADST; / * 起动转换*/while ( ! ( ADCSR & ADF ) ); /*等待转换结束*/ADCSR &= ADF; /*读寄存器,清除ADF */Port3 = ( ADDRA >> 6 ) & 0x03ff); /*移位后成为0-1023的整数 */3
18、.3.2 RCX中断和中断处理在H8/3292 向量表里第一个向量的地址是0x0000,最后一个在地址0x0048 。向量表的入口由片内ROM管理。每一个入口包含一个指向一个片内ROM中断调度程序的地址。一个中断向量对应一个调度程序。对应于每一个中断调度程序,在片内RAM都有一个用来指向中断服务程序地址的入口。这些入口保存在一张表格里。表格也可用来存放本来由H8/3292的硬件处理的中断程序。这样,片内ROM的内容和RCX中断向量就把H8/3292的硬件中断机制变成了RCX的中断机制。描述如下(对比): H8/3292中断向量地址 : 中断调度程序地址H8/3292中断调度程序: push r
19、6 mov RCX interrupt vector address, r6 jsr r6 pop r6 rteRCX中断向量地址: RCX中断管理程序地址 RCX中断管理程序: 保存寄存器的值(压栈) 处理中断 取出寄存器的值(出栈) (rts) 返回堆栈的内容由H8/3292的中断机制和中断调度程序确定。具体如下: 地址 内容sp 返回到调度程序sp - 2 r6寄存器的值sp - 4 cc寄存器的值sp - 6 pc指针的值此外,在RCX中断管理程序将cc的中断位清除并执行rte指令前,中断管理程序不会响应新的中断。因为RCX没有使用不可屏蔽中断,所以当中断位没有清除前,RCX中断管理程
20、序是不会被打断的。 RCX中断管理程序可用汇编语言和C语言编程。我们将使用C语言说明如何为RUN按钮写一个中断管理程序。为了简单做如下定义:#define Int_Handler(RCX_Vector_Addr) ( *(void (*)(void)(RCX_Vector_Addr) )#define IRQ0_Addr 0xfd94 /* RCX IRQ0 Interrupt Vector Address */#define Run_Button_Interrupt_Handler Int_Handler(IRQ0_Addr)定义把RCX_Vector_Addr变成一个指向没有参数和返回值子
21、程序的指针。最后一个定义将RunInt用作RUN按钮的中断管理程序(Run_Button_Interrupt_Handler = RunInt); RunInt定义如下: int16 Count;void RunInt (void) asm("push r0 push r1 push r2 push r3 push r4 push r5 "); /* Run按一下,Count增加1 */ Count = Count + 1; asm("pop r5 pop r4 pop r3 pop r2 pop r1 pop r0 ");为了打开RUN按钮的中断和定义
22、触发中断的事件,需要访问IRQ设备寄存器: /* IRQ Sense Control Register and IRQ Enable Register */#define ISCRaddr 0xffc6#define IERaddr 0xffc7#define ISCR *( (byte *) ISCRaddr ) #define IER *( (byte *) IERaddr )为了使RUN按钮的下降沿触发一个中断,并打开按钮的中断,设备寄存器应该如下初始化: ISCR=1;IER=1;3.3.3 按钮在RCX的上边有四个按钮: VIEW, ON/OFF, Prgm 和RUN。 四个按钮 四
23、个按钮连接在H8/3292 输入/输出口的四条输入线上。其中两个按钮可触发外部中断。具体为: 按钮输入口地址第几位中断RUNport40xffb7第2位IRQ 0OnOffport40xffb7第1位IRQ 1VIEWport70xffbe第6位没有中断Prgmport70xffbe第7位没有中断按钮按下时值为0,按钮松开时值为1。 通过位操作可以直接从设备寄存器获取各个按钮的值。我们将用C 语言说明如何使用按钮的输入。我们定义以下符号简化这个过程。比如要读RUN按钮的状态: #define port4_addr 0xffb7#define port4 *(volatile byte *) p
24、ort4_addr)#define Run ! ( port4 & ( 1 << 2 ) )最后一个定义可使RUN作为表达式来使用。RUN的值可用来停止一个循环: while ( ! Run ) .3.3.4 RCX输入口和传感器可连接传感器的三个输入口(标有1,2和3): 三个输入口传感器有两种类型: 被动和主动。被动传感器有接触传感器和温度传感器。主动传感器有光电和角度传感器。两种类型的编程方法是不同的。 五个标准LEGO传感器 传感器的正确使用首先需要正确理解传感器的电路和输入口。详细的描述请参考 输入口和传感器Internals。此外,也需要如何从传感器取值的知识。
25、具体描述如下: 从一个被动传感器取值,只需使用A/D 转换。从一个主动传感器如光电传感器还必须点亮LED二极管,可由输出线I/O port6的其中一路提供。角度传感器也包含LED二极管,使用时需点亮。它们包装在一块蓝色LEGO积木块里,从外部并不能看见。 连接在A/D 转换通道上的三个RCX输入口和I/O port6输出线如下: 输入口A/D 通道输出线 1模拟输入引脚2 (AN2)port6, 第2位2模拟输入引脚1 (AN1)port6, 第1位3模拟输入引脚0 (AN0)port6, 第0位两种类型传感器的输入值都须通过A/D 转换。A/D 转换的设备寄存器用来初始化,检测转换的结束和访
26、问10 位转换结果。A/D控制/状态寄存器用来开始转换和标志转换的结束。转换结束可触发A/D结束中断。A/D数据寄存器存放转换的结果,其值为16位的高10位。数据寄存器与A/D通道连接,转换的值可以从以下地址读取: 输入口A/D 通道寄存器 简称地址1AN2A/D数据寄存器AADDRC0xffe42AN1A/D数据寄存器BADDRB0xffe23AN0A/D数据寄存器CADDRA0xffe0A/D控制/状态寄存器(ADCSR)是位于地址0xffe8的8位设备寄存器。具体如下: 位名字简称意思7A/D结束标志ADF转换结束后置位,可由程序清除6A/D结束中断使能ADIE0:中断屏蔽;1:中断使能
27、5A/D开始ADST0:转换停止;1:开始转换4扫瞄模式SCAN0:单路模式;1:扫瞄模式3时钟选择CKS0:慢速转换;1:快速转换2到0通道选择CH2 to CH0选择通道单路模式下,通道选择位用来选择三个输入口中的一路。也可以使用多路(扫瞄模式): 输入口CH2 到CH0模式1010单路2001单路3000单路1,2,3010扫瞄头文件 AD.h含有一个A/D转换的简单例子。头文件InputPorts.h 包含一些被动和主动传感器的例子。在 RCX编程,第一节 解释了光电传感器如何识别不同的颜色。 3.3.5 红外发射/接收RCX使用IR(红外光)与主机或其他RCX通信。 红外发射 IR发
28、射/接收基于片内串行通信接口(SCI)。SCI是红外通信的一个设备控制器。信息以38.5千赫的红外光作为载波来传送:0代表红外光开启,1代表关闭。38.5千赫的载波频率是由定时器1提供的。红外传输有短和长两个模式,port4的引脚0决定传输模式:1为短距离;0为长距离。红外光不仅会由其它IR接收器接收也会由正在发射红外光的RCX接收。这意味着RCX有检测冲突的机制。每两位数据的间隔时间与SCI选择的波特率有关。2400位/每分的波特率间隔时间是417微秒 = 1位/2400 位/每分。SCI的设备寄存器决定串行通信的通信格式。用C语言所作的一个设备寄存器的声明包含在模块 SCI.h中。 IR发
29、射/接收有程序驱动和中断驱动两种方式,具体请参考IR.h。在 RCX编程, 第3节有一个例子可供参考3.3.6 LCD显示屏LCD显示一个LEGO 人在走动 LCD屏幕包含43个元素,一个元素可以是一个小点、箭头或一个小LEGO 人的腿。每个元素都是单独控制的,可让它显示或隐藏。这是通过LCD控制器实现的。有两根串口线与LCD控制器通信。这两根线连接在I/O port6的第5位和第6位。RCX就是通过对这两根线的读写来控制LCD的。RCX预置程序通过一个协议实现对LCD的高级操作: LCD每一个元素的一位值暂存在储器器的缓冲区里;RCX用户程序向缓冲区写值,调用预置程序,刷新,然后屏幕上的元素
30、就根据缓冲区里的值显示或隐藏。具体请参考: RCXInternals。 3.3.7 扬声器扬声器由I/O port6的第4位控制。在扬声器使用前,I/O port6的数据方向寄存器应该如下设置: #define P6DDR *(volatile byte *) 0xffb9)#define P6DDR_ROM *(volatile byte *) 0xfd85)#define P6DR *(volatile byte *) 0xffbb)#define bit4 (1 << 4) #define SpeakerHigh P6DR |= bit4 #define SpeakerLow
31、 P6DR &= bit4 /* 把 port6的第4位初始化成输出 */P6DDR_ROM |= bit4; P6DDR = P6DDR_ROM;要发出声音,需要以适当的间隔时间对port 6的第4位写值。如发出500 赫的声音: SpeakerHigh;Wait one msec;SpeakerLow;Wait one msec;port6的第4位也可由定时器0控制。 3.3.8 RCX输出口和执行器件RCX有标有A 、B和C的三个输出口。各种各样的执行器件可连接到输出口。如电机,灯和发声器件。一个输出口可驱动一个或多个执行器件。如电机和灯可接在一个输出口上,电机转动时灯就会跟着一
32、起亮。 三个RCX输出口A、B和C 输出口由9 V电源产生的电流驱动。流经执行器件的电流状态由位于地址0xf000的设备寄存器的值决定。每一个输出口由8 位设备寄存器中的两位控制。 输出口ABC位第7、6位第3、2位第1、0位这些输出口的控制位的值可在设备寄存器地址获取。用如下c语句可将A口的状态设成2(见下表的四种状态):#define OutputPorts *( volatile byte *) 0xf000 ):#define Amask 0xc0 byte temp;temp = OutputPorts;temp &= Amask;temp |= (2 << 6)
33、;OutputPorts = temp;两位值(有4种组合)对应于电流的四种不同模式。01和10表示电流的两种流动方向。00将执行器件从电源断开。11将执行器件的两个端子连接到电源的同极性。具体请参考Internals of Output Ports and Actuators 为了更容易地控制执行器件,我们用c语言举例如下(控制A口):#define Float 0#define OnPos 1#define OnNeg 2#define Brake 3void PortA( byte state ) byte temp; temp = OutputPorts; temp &= Am
34、ask; temp |= (state << 6); OutputPorts = temp;经过以上设置,四种状态(Float, OnPos, OnNeg, and Brake)分别对应0、1、2、3。请参考OutputPorts.h。 执行器件在四种状态下的具体表现见下表: 输出位电机灯闪光声音00自由运行没有光没有光没有声音01在某一方向转动有光闪烁发声10在另一方向转动有光闪烁发声11刹车没有光没有光没有声音对于有两个电机连接在口和口上的一辆小车(我们仍然以Float, OnPos, OnNeg, and Brake表示自由运行,前进,后退,刹车)。状态 OnPos和OnNe
35、g将根据输出口和电机导线的连接使电机顺时针或逆时针旋转。从状态OnPos或OnNeg变到Float和 Brake对正在运动的小车会有很大的影响:Brake会使小车立刻停下。Float允许电机自由地转动并逐渐停止。 电机连接在A口和C口 宏PortA、PortB和PortC允许我们用程序驱动来控制输出口。用下面的语句可使连接在口上的灯闪烁: PortA(OnPos);Wait one msec;PortA(Float);Wait one msec;这些宏也可以控制小车的运动。如: /* 如实际运动方向与程序不符,请改变电机的连接方向*/#define Aback OnNeg#define Afo
36、rward OnPos#define Cback OnNeg#define Cforward OnPosvoid CarCoast ( void ) PortA(Float); PortC(Float);void CarBrake ( void ) PortA(Brake); PortC(Brake);void CarGoForward ( void ) PortA(Aforward); PortC(Cforward);void CarGoBackward ( void ) PortA(Aback); PortC(Cback);void CarSpinClockwise ( void ) Po
37、rtA(Aforward); PortC(Cback);void CarSpinCounterClockwise ( void ) PortA(Aback); PortC(Cforward);输出状态以足够快的速度改变,如以1毫秒的间隔,如果是灯,它的亮度就没有一直供电那么亮。这叫做PWM控制。每一个供电脉冲叫作脉冲的宽度。控制脉冲宽度和脉冲的形式就能控制传递到执行器件的能量。我们可用H8/3292的定时器T0产生的定时器中断实现对输出口的PWM控制(时间间隔为1毫秒)。这些中断可用来调用预先设好占空比的子程序。一个PWM控制A口和C口的例子见MotorControl.h,共有16个能级可供使
38、用。C语言的例子见 RCX编程, 第2节。 4. RCX预置程序(指出厂时,ROM里预先烧好的程序)当RCX上电或复位后,ROM里的预置程序就开始运行并控制RCX。此时通过红外发射/接收,其它计算机就可与RCX通信了。预置程序可提供一个简单协议从其它计算机下载用户程序到RCX中。当程序下载后,可由预置程序启动。用户程序运行时,预置程序提供对RCX输入/输出设备的访问等服务。 5. 与RCX预置程序的通信预置程序通过一个简单的请求/应答协议与其它计算机通信: 计算机送出请求;预置程序响应请求并发回应答。应答可能包含数据如版本号,但应答常常用来表明请求已满足或通信一切正常。 5.1请求/应答协议可
39、发送的请求有: Alive: 验证预置程序是否运行并且RCX是否与电脑连接。 GetVersions:预置程序和固件版本号。EnterDownloadMode: 如果有程序运行将被停止。预置程序进入下载模式BeginDownload: 预置程序为下载程序做准备。 DownloadBlock: 下载字节块到RCX存储器。 RunProgram: 运行下载的程序。只有下载的程序含有"Do you byte, when I knock?"程序才会被执行。 每一个请求/应答都是作为数据帧发送的。数据帧包含请求/应答、帧头、帧尾: 数据帧=帧头 请求/应答 帧尾在这里,帧头= 0x5
40、5 0xff;请求/应答=字节序列;帧尾=校验和。校验和是请求/应答的最低有效字节。 请求是一个字节序列。第一个字节是请求代码,接下来的字节包含请求数据。应答有一个相似的结构,第一个字节是应答代码, 接下来的字节是应答数据。应答代码是请求代码的补码。每一个请求有两个请求代码,区别是两个代码的第4位的值不同。这一位是顺序控制位:预置程序只执行相同请求代码中的第一个,给第二个请求及以后的发送的应答其效果是相同的。所以为了使同样的请求连续执行两次,就需要给顺序控制位不同的值。下面是请求/应答的一个详细描述。 请求请求代码请求数据应答代码应答数据Live10/18无ef/e7无GetVersions1
41、5/1dKeyea/e2程序、固件版本EnterDownloadMode65/6dKey9a/92无BeginDownload75/7d程序入口、校验和、零8a/82结果DownloadBlock45/4d数据包号码, 长度,数据包,数据包校验和ba/b2结果RunPrograma5/adRunKey5a/52文本Key: 五个字节表示的十进制数1, 3, 5, 7, 11 。Key可防止一个正在运行的程序被非法停止。 ROMVersion: BCD码表示的ROM预置程序的版本号。 ProgramVersion: BCD码表示的固件的版本号。没有固件时,BCD码是0 。 ProgramEntr
42、yPoint: 两字节表示的16 位地址。这是用户程序下载的地址。 ProgramChecksum: 两字节表示的16 位无符号整型。已下载程序的字节数。 Zero:填充0。 BlockSequenceNumber: 两字节表示的数据包序列号。从1开始,每接收一个加1,0表示请求结束。 BlockLength: 下一个DataBlock的字节数。用两字节16 位无符号整型表示。 DataBlock:数据包;长度为BlockLength的所定义的长度。 BlockChecksum:最新的DataBlock的校验和。 RunKey: 五个ASCII值76, 69, 71, 79, 174表示的五个
43、字符"LEGO®"。 Text: 26 个ASCII 值表示的一条语句"Just a bit of the block!"。 Result:一个字节。0表示通信正常。非零表示发生了错误。错误有以下几种: 1: 空间不足 2: 格式不正确 3: 数据包校验和错误4: 程序校验和错误 6: 未进入下载模式 5.2 字节协议请求/应答作为字节组成的数据包在计算机和RCX之间的一条串行通信线间传送。这条通信线包括两个红外发射/接收设备,一个通过RS232通信端口连接到计算机,另一接入RCX。波特率是2400,即每秒传送2400位。为标记每个字节的开始和
44、结束,字节含有一个起始位和结束位,同时增加一位奇偶位,保证第9位是奇数。因此每一个字节作为11位来发送。字节除了第一个,如0x55,都被作为两个字节发送:字节本身和它的补码。结果是每一个数据包都有相等的0位和1位(帧头0x55同样有相等的0位与1位)。这可使红外接收器消除周围光线造成的影响。除了第一个字节,其他都是作为222*(起始位+一个字节+奇偶位+结束位)位发送的。波特率为2400时,需时9毫秒。 5.3 位协议一串由0,1组成的数据以2400位/每分的速率传输。传0时,红外光开启,传1时,红外光关闭。红外光的频率是38kHz。传输一位的时间是417 usec。 5.4 与RS232连接
45、的红外发射/接收(指发射塔)发射塔将电脑要发送的数据发出,同时接收来自RCX的数据包。5.5 一个和预置程序通信的用户程序 一个简单的程序:RCX_Request_Reply.c(需预先编译)可用来在UNIX主机和RCX预置程序之间通信。红外发射/接收应该连接到一个串口并将串口名赋给DEFAULT_RCX_IR。也可以使用环境变量RCX_IR代替缺省设置。 用户程序向RCX预置程序发出请求(十六进制表示的字节序列),然后等待应答。一会儿,可得到一个正确应答或是发生错误。接着用户程序以十六进制表示的字节序列输出正确的应答或发生错误。 为了检查和RCX的连接,我们使用如下命令: RCX_Reque
46、st_Reply 100000: ef发送Alive(代码10)请求,应答是ef,表明通信正常。 如下可获得程序的版本号: RCX_Request_Reply 15 1 3 5 7 b 0000: ea 00 03 00 01 00 00 00 00预置程序的版本是3.1且没有固件。 现在我们要下载和运行下面一个简单的汇编语言程序。请注意"Do you byte, when I knock?"这条语句是如何使用的。 .section .text.align 1.global _start_start:mov.w 0,r0jsr r0.section .data.string
47、 "Do you byte, when I knock?".end首先把它变成16进制表示的程序mov.w 0,r0 6b 00 00 00jsr r0 5d 00Do 44 6f 20you 79 6f 75 20byte, 62 79 74 65 2c 20when 77 68 65 6e 20I 49 20knock? 6b 6e 6f 63 6b 3f 然后我们需要计算ProgramChecksum和BlockChecksum。 如下下载程序:EnterDownloadMode: RCX_Request_Reply 65 1 3 5 7 b0000: 9aBegin
48、Download, ProgramEntryPoint = 8000, ProgramChecksum = 09a8, Zero = 0: RCX_Request_Reply 75 00 80 a8 09 000000: 8a 00DownloadBlock, BlockSequenceNumber = 0, BlockLength = 0022, DataBlock = 6b 00 . 3f 00 00, BlockChecksum = a8: RCX_Request_Reply 4d 00 00 22 00 6b 00 . 3f 00 00 a80000: b2 00RunProgram,
49、 RunKey = 4c 45 47 4f ae (hex): RCX_Request_Reply a5 4c 45 47 4f ae0000: 5a 4a 75 73 74 20 61 20 62 69 74 20 6f 66 66 20 0010: 74 68 65 20 62 6c 6f 63 6b 21 应答包含用十六进制表示的"Just a bit off the block!"语句。表明一切正常并且程序正确运行了。一会儿,程序执行两条指令跳转到复位地址,将控制权还给预置程序。 6. 使用RCX预置程序提供的底层服务用户程序可使用由预置程序提供的服务,如对 LCD
50、屏幕的高级操作。在这个部分我们将给出一些有用的服务程序并将描述怎样通过汇编和C语言使用这些服务。具体请参考RCXInternals。 我们将以一个简单的例子开始: 16位有符号整数的乘法。可通过对地址0x0130的操作实现,乘法子程序可用汇编语言调用: jsr 0x0130两个操作数传递到寄存器r5,r6里,结果存在r6里。如计算51*72: mov.w # 51, r5 mov.w # 72, r6 jsr 0x0130r6 的值是3672 =51*72。 我们可以把汇编调用嵌入到C语言程序里: int16 imul( int16 a, int16 b) int res; asm("
51、;mov.w %1,r5 mov.w %2,r6 jsr 0x0130 ; call imul mov.w r6,%0 ": "=r" (res) : "r" (a), "r" (b) : "r0", "r1", "r5", "r6" ); return res;这个C函数可像其他函数一样调用: int16 p;. p = imul(51,72);像上面的乘法程序那样,我们也可以嵌套别的语句,实现其他功能。这些嵌套程序模块可与数据类型、常数和全局
52、变量放在一个头文件里,如 RCX_RTE.h。这个头文件也包含H8/300的主要数据类型如字节、词,语句"Do you byte, when I knock?"和复位程序。可用#include "RCX_RTE.h"包含在你的c语言程序里。上面只是一个预置程序的简单应用。下面将详细描述预置程序对操作LCD提供的服务。 6.1 LCD子程序 在预置程序中有一些预先写好的子程序,它可以让我们忽略控制LCD的H8/3292 I/O port6的底层细节。也隐藏了元素在屏幕怎样显示的细节。有两个子程序可以显示或隐藏屏幕上的图标。一个图标是一个或多个元素。此外,还
53、有一个子程序用来在屏幕上显示数字。所有子程序通过操作LCD在存储器的缓冲内容来实现其各自功能。存储器的缓冲内容的变动对屏幕没有影响除非有一个执行程序不断对LCD的缓冲操作。在下表中我们假设,LCD缓冲由一个执行程序不断更新。 LCD子程序描述调用地址参数名和类型refresh更新屏幕内容0x27c8没有参数clear清屏0x27ac没有参数show_icon使图标可见 0x1b62图标(16 位)hide_icon隐藏图标 0x1e4a图标(16 位)show_number根据格式和最小分度显示整数0x1ff2格式(16位),值(16位),最小分度(16 位)子程序的第一个参数传到寄存器r6里,剩余的参数传到堆栈: 第三个参数是最先被压栈的,接着是第二个参数压栈。参数的意思如下: 图标:可调用的16 位代码,如站立或走动的LEGO人图标。图标有:16 位代码描述0x3006站立图标0x3007走动图标0x3008选择观测
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑设备识图练习题及答案
- 小学语文教师基本功大赛试题含答案
- 2026 年夏季幼儿园暑期外出亲子涉水安全知识课件
- 江苏省南通市海门区2025-2026学年七年级下学期6月期末语文试题 (文字版含答案)
- 宁夏回族自治区银川外国语实验学校2026届初三年级二模考试英语试卷(文字版含答案)
- 西点面包师职业技能考试题库及答案
- 武汉理工大大学专升本宏微观经济学题库及答案
- 2026年统计普查中心事业单位笔试真题(含答案)
- 2026年社区非机动车治理专员真题(附答案)
- 2026年合规管理员企业风控知识考试题库含答案
- 西双版纳州景洪市教育体育局选调教师笔试真题2025
- 2026广西安全员B证题库及答案
- 施工现场效率提升方法
- 水利水电工程合理使用年限及耐久性设计规范(制定说明)
- (2026年)急性胸痛的快速处理课件
- 肝胆外科围手术期护理常规
- 61.食品加工过程微生物控制程序
- 托盘标准化堆码管理规范
- 2026湖北武汉出入境边防检查站警务辅助人员招聘笔试参考题库含答案解析
- 2026年销售人员薪酬激励制度范本
- 2026年首创水务笔试+面试全套题库及完整参考答案
评论
0/150
提交评论