【精華】rcx手冊_第1頁
【精華】rcx手冊_第2頁
【精華】rcx手冊_第3頁
【精華】rcx手冊_第4頁
【精華】rcx手冊_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、.工作總結(jié)、述職報告、申報文本、申請文書、可行性報告等精品文檔RCX手冊作者:Ole Caprani University of Aarhus, Department of Computer Science ocapranidaimi.au.dk譯者:任永 北京交通大學電氣學院 ryong21 致謝 感謝董春教授一直以來的關(guān)心與指導。感謝您為我提供樂高機器人并將辦公電腦讓與我使用,使我有機會接觸到樂高并完成這篇文章的翻譯與錄入工作。 目錄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 紅外發(fā)射/接收 3.3.6 LCD顯示屏 3.3.7揚聲器 3.3.8 RCX輸出口和執(zhí)行器件 4. RCX預置程序(指出廠時,ROM里預先燒好的程序) 5. 與RCX預置程序通信 5.1 請求/應答協(xié)議 5.2 字節(jié)協(xié)議 5.3 位協(xié)議 5.4連接在RS232口的紅外發(fā)射/接收(發(fā)射塔) 5.5一個與RCX通信的用戶程序 6RCX預置程序提供底層服務 6.1 LCD子程序 7為RCX編譯程序 7.1如何安裝交叉匯編器和交叉編譯器 7.2編譯匯編語言程序 7

3、.3 編譯C語言程序 8程序下載9參考文獻 介紹使用樂高MindStorms 機器人開發(fā)系統(tǒng)您可以搭建一輛能避開障礙走出迷宮的小車或組裝一個能顯示最小值、最大值和平均值的數(shù)字溫度計。RCX是一個可編程控制器,MindStorms系統(tǒng)的一個組件。RCX可裝在小車或數(shù)字式溫度計上來控制小車的行為和溫度計的溫度采樣與測量。 RCX使用的微型控制器,是日立H8/3292系列的H8/300單片機。本質(zhì)上是單片機在執(zhí)行控制程序,通過H8/3292的設備控制器來訪問RCX的輸入/輸出設備如按鈕、揚聲器, LCD顯示屏。此外, 傳感器如接觸傳感器或溫度傳感器可以連接到RCX輸入口,給控制程序提供輸入值,然后控

4、制程序再驅(qū)動執(zhí)行器件如電機。交互過程:來自環(huán)境的刺激-小車碰到障礙可由傳感器如接觸傳感器感知,變換成輸入值。引起的反應小車轉(zhuǎn)向控制程序輸出值到執(zhí)行器件使電機完成轉(zhuǎn)向。 RCX配備有以下輸入/輸出設備: 輸入設備四個標有Run, OnOff, View, Prgm的按鈕三個標有1,2,3的輸入口電量定時器紅外接收器輸出設備顯示屏揚聲器三個標有A, B, C的輸出口紅外發(fā)射器RCX就是通過這些輸入/輸出設備和連接到RCX輸入/輸出口的傳感器/執(zhí)行器件與環(huán)境交互??梢允褂玫膫鞲衅?執(zhí)行器件有: 傳感器應用舉例接觸傳感器遇到障礙后, 在按鈕上產(chǎn)生一個信號光電傳感器顏色分辨, 檢測環(huán)境光亮度角度傳感器輪

5、子轉(zhuǎn)過的角度, 軸的運動溫度傳感器測量體溫, 室外溫度執(zhí)行器件應用舉例電機驅(qū)動小車, 電梯的升降燈閃光, 紅色報警光聲音蜂聲在主機上編寫好程序后,可通過串口下載到RCX中。程序可用不同的開發(fā)環(huán)境來開發(fā),如LEGO 提供的圖形化開發(fā)工具:ROBOLAB, 還有用VB來開發(fā)程序的軟件開發(fā)包(參見LEGO MindStorms),它可以下載低級的機器代碼。 這本手冊敘述UNIX 主機上一個簡單的開發(fā)環(huán)境。程序既可以用C語言也可用H8/300的匯編語言來編寫,然后通過交叉匯編器和交叉編譯器生成H8/300的機器碼,通過由片內(nèi)ROM常駐程序提供的一個簡單協(xié)議下載到RCX中,常駐程序在上電和復位后就會自動

6、運行 。下載的程序運行后,RCX的預置程序提供基本的I/O服務(如訪問LCD屏),這本手冊同時也提供直接操作輸入/輸出設備的細節(jié),直接操作是通過與單片機的設備控制器和內(nèi)存分配的協(xié)調(diào)應用實現(xiàn)的。 這本手冊和UNIX編程環(huán)境可作為為RCX開發(fā)簡單程序的工具,也可作為開發(fā)實時操作系統(tǒng)的工具。 H8/3292 微型控制器RCX使用的是日立的H8/3292單片機,屬于H8/3297系列。芯片具有計算機的三個主要功能: H8/300微處理器、存儲器和輸入/輸出。它們通過芯片內(nèi)的地址/數(shù)據(jù)/控制總線連接在一起。 H8/300 CPU采用通用寄存器結(jié)構(gòu)。指令集包括暫存器-暫存器運算和邏輯操作。尋址方式包括大多

7、數(shù)常見的尋址方式如寄存器直接尋址,寄存器間接尋址,程序計數(shù)器和存儲器間接尋址。最大尋址空間是16位(64K),為程序和數(shù)據(jù)所共用。 芯片存儲器包括16 K 加密可編程ROM和512 個字節(jié)的RAM 。其中128字節(jié)片內(nèi)寄存器用作與片內(nèi)的輸入/輸出電路的接口。存儲器空間的分配決定片內(nèi)存儲空間和外擴空間的如何與16位地址對應??臻g分配與cpu的MD1和MD0引腳設置有關(guān),這兩個引腳決定處理器的工作模式(共有1, 2 或3三種)。在所有模式下片內(nèi)RAM 和片內(nèi)寄存器都使用相同的地址。模式1和2,叫外擴模式,這兩種模式允許通過片內(nèi)的地址/數(shù)據(jù)總線訪問外擴的空間。模式3, 稱單片模式、只有片內(nèi)ROM和R

8、AM可以使用。當使用外擴存儲器時,可以用外擴邏輯為其空間分配地址。片內(nèi)輸入/輸出包括三種定時器(16 位自由定時器、8位定時器和監(jiān)視跟蹤定時器-watch dog), 一個串行通信接口,A/D轉(zhuǎn)換和一些輸入/輸出口。定時器可以脫離外部電路使用。串行通信接口可作為外部串口發(fā)射/接收的設備控制器。同樣,10 位A/D 轉(zhuǎn)換可作為八個模擬通道的設備控制器。連接在A/D轉(zhuǎn)換8個引腳的外部模擬信號由內(nèi)部的采樣-保持電路采樣后,轉(zhuǎn)換成10位的值。內(nèi)部模擬通道有單路和掃瞄兩種工作模式。掃瞄模式允許多路通道連續(xù)轉(zhuǎn)換,并將轉(zhuǎn)換結(jié)果保存到不同的設備寄存器里。片內(nèi)輸入/輸出口可和外部的輸入/輸出線相連,此時處理器就

9、可從設備寄存器讀出8位輸入線上的值。在沒有外部電路的情況下,按鈕可以和一個輸入引腳直接連接,并將其值讀入。當處理器向8位輸出口的設備寄存器寫值時,其值可由輸出口輸出并直接驅(qū)動外部電路如直接驅(qū)動發(fā)光二極管LED。 片內(nèi)中斷控制器可響應內(nèi)部和外部的中斷源。片內(nèi)輸入/輸出事件對應內(nèi)部中斷源。每個事件(如A/D轉(zhuǎn)換結(jié)束、定時器溢出) 對應一個中斷向量。外部事件對應外部中斷源。所有中斷都可以被屏蔽或開啟(除了NMI不可屏蔽中斷)。 3.RCX: CPU、存儲器和輸入/輸出設備RCX是一個具有計算機三個主要功能(處理器、存儲器,和輸入/輸出設備)的可編程積木塊。 從物理上看,RCX的內(nèi)部電路包括一塊印制電

10、路板和9V電源。H8/3292單片微型控制器,32K的RAM,電機控制芯片,LCD屏和LCD控制器芯片,揚聲器,四個按鈕等通過電路板連接在一起。RCX的拆卸圖以及詳細元件清單請參考RCXInternals。 從邏輯結(jié)構(gòu)上說,RCX控制器可看作一臺低端個人計算機,它通過一條總線把處理器、存儲器和輸入/輸出設備連接起來。輸入/輸出口都分配了確定的地址。每個設備包括兩部分:一部分是通過總線與設備連接的接口電路,另一部分是組成設備的機械裝置和電路元件。按鈕、LCD屏、揚聲器,傳感器和執(zhí)行器件都屬于設備。接口部份通常專指設備控制器,當然,設備與接口并沒有明顯的界線。 當對RCX編程時,主要考慮它的邏輯結(jié)

11、構(gòu)。我們將從程序員的角度來描述它的邏輯結(jié)構(gòu)。 3.1 RCX的CPURCX的處理器是H8/300 CPU。工作頻率16 兆赫。CPU 有八個通用16 位寄存器(r0 - r7, r7 作為堆棧指針(sp) 使用), 16 位程序寄存器(pc), 和一個8位狀態(tài)寄存器(cc) 。狀態(tài)寄存器顯示算術(shù)狀態(tài)(如進位,溢出,和零)和中斷屏蔽與使能。指令集包括暫存器-暫存器運算, 如16 位加法、16 位減法、8位乘法和16 位/8 位除法),及常見的邏輯操作如異或,或,與,非,移位,位操作,子程序的調(diào)用與返回和使RCX進入節(jié)電模式的sleep指令。數(shù)據(jù)類型包括位、4位BCD碼,字節(jié),和字(2 個字節(jié))

12、。尋址方式有: 尋址模式匯編語言寄存器直接尋址Rn寄存器間接尋址rn長轉(zhuǎn)移尋址(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下,片內(nèi)ROM、片內(nèi)RAM,32K外擴RAM統(tǒng)一編址。 空間分配由工作模式和外部地址編碼共同決定。具體為: 地址范圍存儲器類型內(nèi)容0x000 - 0x3fff片內(nèi)加密可編程

13、ROMH8/3292 中斷向量, RCX預置程序0x8000 -0xefff片外RAM程序/數(shù)據(jù)0xf000片外寄存器RCX輸出口設備寄存器0xfd80 -0xff7f片內(nèi)RAMRCX中斷向量/程序/數(shù)據(jù)0xff88 - 0xffff片內(nèi)寄存器 H8/3292設備寄存器3.3 RCX輸入/輸出設備RCX輸入/輸出設備包括兩部分: 輸入/輸出設備控制器和輸入/輸出設備本身。從內(nèi)部看到的是設備控制器,從外面看到的是設備本身。比如四個按鈕,從內(nèi)部來看,是兩個具有確定地址的輸入/輸出口;從外面看,是RCX外殼的四個塑料按鈕。因為我們是從編程的角度看設備,所以將主要描述RCX設備控制器部分。 運行在RC

14、X CPU上的程序通過設備寄存器和中斷來與設備通信和保持同步。通信和同步的接口是由RCX設備控制器提供的設備寄存器和RCX中斷。 大多數(shù)設備控制器是基于H8/3292 輸入/輸出元件的。H8/3292輸入/輸出元件的地址分配寄存器是設備寄存器的一部分。同樣輸入/輸出中斷源也是RCX設備中斷的一部分。RCX輸出口是唯一的例外。RCX輸出口控制器并不使用H8/3292輸入/輸出元件也就不使用片內(nèi)寄存器。因此,RCX輸出口的設備寄存器不在片內(nèi)寄存器地址范圍內(nèi)。 基于H8/3292元件的設備控制器如下: RCX設備控制設備寄存器中斷按鈕I/O port4和7的設備寄存器。IRQ0,IRQ1設備寄存器R

15、UN連接在IRQ0, OnOff在IRQ1輸入口A/D轉(zhuǎn)換和I/O port6的設備寄存器。有三條線與port6相連A/D 中斷電量A/D轉(zhuǎn)換設備寄存器A/D 中斷定時器定時器設備寄存器定時器中斷紅外發(fā)射/接收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 轉(zhuǎn)換*/* A/D控制/狀態(tài)寄存器 */#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 數(shù)據(jù)寄存器 A */#define ADDRA *(volatile w

17、ord *) 0xffe0) 第一個預定義用來把地址常量變成一個指向字節(jié)型地址的指針。*( .)表示取地址里的內(nèi)容,動態(tài)的限制可防止設備寄存器的值在改變前被讀出??墒褂眠@些定義在通道0啟動A/D轉(zhuǎn)換,轉(zhuǎn)換結(jié)束后可從數(shù)據(jù)寄存器A讀出10 位的數(shù)據(jù): ADCSR = 0; ADCSR |= ADST; / * 起動轉(zhuǎn)換*/while ( ! ( ADCSR & ADF ) ); /*等待轉(zhuǎn)換結(jié)束*/ADCSR &= ADF; /*讀寄存器,清除ADF */Port3 = ( ADDRA >> 6 ) & 0x03ff); /*移位后成為0-1023的整數(shù) */3

18、.3.2 RCX中斷和中斷處理在H8/3292 向量表里第一個向量的地址是0x0000,最后一個在地址0x0048 。向量表的入口由片內(nèi)ROM管理。每一個入口包含一個指向一個片內(nèi)ROM中斷調(diào)度程序的地址。一個中斷向量對應一個調(diào)度程序。對應于每一個中斷調(diào)度程序,在片內(nèi)RAM都有一個用來指向中斷服務程序地址的入口。這些入口保存在一張表格里。表格也可用來存放本來由H8/3292的硬件處理的中斷程序。這樣,片內(nèi)ROM的內(nèi)容和RCX中斷向量就把H8/3292的硬件中斷機制變成了RCX的中斷機制。描述如下(對比): H8/3292中斷向量地址 : 中斷調(diào)度程序地址H8/3292中斷調(diào)度程序: push r

19、6 mov RCX interrupt vector address, r6 jsr r6 pop r6 rteRCX中斷向量地址: RCX中斷管理程序地址 RCX中斷管理程序: 保存寄存器的值(壓棧) 處理中斷 取出寄存器的值(出棧) (rts) 返回堆棧的內(nèi)容由H8/3292的中斷機制和中斷調(diào)度程序確定。具體如下: 地址 內(nèi)容sp 返回到調(diào)度程序sp - 2 r6寄存器的值sp - 4 cc寄存器的值sp - 6 pc指針的值此外,在RCX中斷管理程序?qū)c的中斷位清除并執(zhí)行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變成一個指向沒有參數(shù)和返回值子

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、觸發(fā)中斷的事件,需要訪問IRQ設備寄存器: /* IRQ Sense Control Register and IRQ Enable Register */#define ISCRaddr 0xffc6#define IERaddr 0xffc7#define ISCR *( (byte *) ISCRaddr ) #define IER *( (byte *) IERaddr )為了使RUN按鈕的下降沿觸發(fā)一個中斷,并打開按鈕的中斷,設備寄存器應該如下初始化: ISCR=1;IER=1;3.3.3 按鈕在RCX的上邊有四個按鈕: VIEW, ON/OFF, Prgm 和RUN。 四個按鈕 四

23、個按鈕連接在H8/3292 輸入/輸出口的四條輸入線上。其中兩個按鈕可觸發(fā)外部中斷。具體為: 按鈕輸入口地址第幾位中斷RUNport40xffb7第2位IRQ 0OnOffport40xffb7第1位IRQ 1VIEWport70xffbe第6位沒有中斷Prgmport70xffbe第7位沒有中斷按鈕按下時值為0,按鈕松開時值為1。 通過位操作可以直接從設備寄存器獲取各個按鈕的值。我們將用C 語言說明如何使用按鈕的輸入。我們定義以下符號簡化這個過程。比如要讀RUN按鈕的狀態(tài): #define port4_addr 0xffb7#define port4 *(volatile byte *) p

24、ort4_addr)#define Run ! ( port4 & ( 1 << 2 ) )最后一個定義可使RUN作為表達式來使用。RUN的值可用來停止一個循環(huán): while ( ! Run ) .3.3.4 RCX輸入口和傳感器可連接傳感器的三個輸入口(標有1,2和3): 三個輸入口傳感器有兩種類型: 被動和主動。被動傳感器有接觸傳感器和溫度傳感器。主動傳感器有光電和角度傳感器。兩種類型的編程方法是不同的。 五個標準LEGO傳感器 傳感器的正確使用首先需要正確理解傳感器的電路和輸入口。詳細的描述請參考 輸入口和傳感器Internals。此外,也需要如何從傳感器取值的知識。

25、具體描述如下: 從一個被動傳感器取值,只需使用A/D 轉(zhuǎn)換。從一個主動傳感器如光電傳感器還必須點亮LED二極管,可由輸出線I/O port6的其中一路提供。角度傳感器也包含LED二極管,使用時需點亮。它們包裝在一塊藍色LEGO積木塊里,從外部并不能看見。 連接在A/D 轉(zhuǎn)換通道上的三個RCX輸入口和I/O port6輸出線如下: 輸入口A/D 通道輸出線 1模擬輸入引腳2 (AN2)port6, 第2位2模擬輸入引腳1 (AN1)port6, 第1位3模擬輸入引腳0 (AN0)port6, 第0位兩種類型傳感器的輸入值都須通過A/D 轉(zhuǎn)換。A/D 轉(zhuǎn)換的設備寄存器用來初始化,檢測轉(zhuǎn)換的結(jié)束和訪

26、問10 位轉(zhuǎn)換結(jié)果。A/D控制/狀態(tài)寄存器用來開始轉(zhuǎn)換和標志轉(zhuǎn)換的結(jié)束。轉(zhuǎn)換結(jié)束可觸發(fā)A/D結(jié)束中斷。A/D數(shù)據(jù)寄存器存放轉(zhuǎn)換的結(jié)果,其值為16位的高10位。數(shù)據(jù)寄存器與A/D通道連接,轉(zhuǎn)換的值可以從以下地址讀取: 輸入口A/D 通道寄存器 簡稱地址1AN2A/D數(shù)據(jù)寄存器AADDRC0xffe42AN1A/D數(shù)據(jù)寄存器BADDRB0xffe23AN0A/D數(shù)據(jù)寄存器CADDRA0xffe0A/D控制/狀態(tài)寄存器(ADCSR)是位于地址0xffe8的8位設備寄存器。具體如下: 位名字簡稱意思7A/D結(jié)束標志ADF轉(zhuǎn)換結(jié)束后置位,可由程序清除6A/D結(jié)束中斷使能ADIE0:中斷屏蔽;1:中斷使能

27、5A/D開始ADST0:轉(zhuǎn)換停止;1:開始轉(zhuǎn)換4掃瞄模式SCAN0:單路模式;1:掃瞄模式3時鐘選擇CKS0:慢速轉(zhuǎn)換;1:快速轉(zhuǎn)換2到0通道選擇CH2 to CH0選擇通道單路模式下,通道選擇位用來選擇三個輸入口中的一路。也可以使用多路(掃瞄模式): 輸入口CH2 到CH0模式1010單路2001單路3000單路1,2,3010掃瞄頭文件 AD.h含有一個A/D轉(zhuǎn)換的簡單例子。頭文件InputPorts.h 包含一些被動和主動傳感器的例子。在 RCX編程,第一節(jié) 解釋了光電傳感器如何識別不同的顏色。 3.3.5 紅外發(fā)射/接收RCX使用IR(紅外光)與主機或其他RCX通信。 紅外發(fā)射 IR發(fā)

28、射/接收基于片內(nèi)串行通信接口(SCI)。SCI是紅外通信的一個設備控制器。信息以38.5千赫的紅外光作為載波來傳送:0代表紅外光開啟,1代表關(guān)閉。38.5千赫的載波頻率是由定時器1提供的。紅外傳輸有短和長兩個模式,port4的引腳0決定傳輸模式:1為短距離;0為長距離。紅外光不僅會由其它IR接收器接收也會由正在發(fā)射紅外光的RCX接收。這意味著RCX有檢測沖突的機制。每兩位數(shù)據(jù)的間隔時間與SCI選擇的波特率有關(guān)。2400位/每分的波特率間隔時間是417微秒 = 1位/2400 位/每分。SCI的設備寄存器決定串行通信的通信格式。用C語言所作的一個設備寄存器的聲明包含在模塊 SCI.h中。 IR發(fā)

29、射/接收有程序驅(qū)動和中斷驅(qū)動兩種方式,具體請參考IR.h。在 RCX編程, 第3節(jié)有一個例子可供參考3.3.6 LCD顯示屏LCD顯示一個LEGO 人在走動 LCD屏幕包含43個元素,一個元素可以是一個小點、箭頭或一個小LEGO 人的腿。每個元素都是單獨控制的,可讓它顯示或隱藏。這是通過LCD控制器實現(xiàn)的。有兩根串口線與LCD控制器通信。這兩根線連接在I/O port6的第5位和第6位。RCX就是通過對這兩根線的讀寫來控制LCD的。RCX預置程序通過一個協(xié)議實現(xiàn)對LCD的高級操作: LCD每一個元素的一位值暫存在儲器器的緩沖區(qū)里;RCX用戶程序向緩沖區(qū)寫值,調(diào)用預置程序,刷新,然后屏幕上的元素

30、就根據(jù)緩沖區(qū)里的值顯示或隱藏。具體請參考: RCXInternals。 3.3.7 揚聲器揚聲器由I/O port6的第4位控制。在揚聲器使用前,I/O port6的數(shù)據(jù)方向寄存器應該如下設置: #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;要發(fā)出聲音,需要以適當?shù)拈g隔時間對port 6的第4位寫值。如發(fā)出500 赫的聲音: SpeakerHigh;Wait one msec;SpeakerLow;Wait one msec;port6的第4位也可由定時器0控制。 3.3.8 RCX輸出口和執(zhí)行器件RCX有標有A 、B和C的三個輸出口。各種各樣的執(zhí)行器件可連接到輸出口。如電機,燈和發(fā)聲器件。一個輸出口可驅(qū)動一個或多個執(zhí)行器件。如電機和燈可接在一個輸出口上,電機轉(zhuǎn)動時燈就會跟著一

32、起亮。 三個RCX輸出口A、B和C 輸出口由9 V電源產(chǎn)生的電流驅(qū)動。流經(jīng)執(zhí)行器件的電流狀態(tài)由位于地址0xf000的設備寄存器的值決定。每一個輸出口由8 位設備寄存器中的兩位控制。 輸出口ABC位第7、6位第3、2位第1、0位這些輸出口的控制位的值可在設備寄存器地址獲取。用如下c語句可將A口的狀態(tài)設成2(見下表的四種狀態(tài)):#define OutputPorts *( volatile byte *) 0xf000 ):#define Amask 0xc0 byte temp;temp = OutputPorts;temp &= Amask;temp |= (2 << 6)

33、;OutputPorts = temp;兩位值(有4種組合)對應于電流的四種不同模式。01和10表示電流的兩種流動方向。00將執(zhí)行器件從電源斷開。11將執(zhí)行器件的兩個端子連接到電源的同極性。具體請參考Internals of Output Ports and Actuators 為了更容易地控制執(zhí)行器件,我們用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;經(jīng)過以上設置,四種狀態(tài)(Float, OnPos, OnNeg, and Brake)分別對應0、1、2、3。請參考OutputPorts.h。 執(zhí)行器件在四種狀態(tài)下的具體表現(xiàn)見下表: 輸出位電機燈閃光聲音00自由運行沒有光沒有光沒有聲音01在某一方向轉(zhuǎn)動有光閃爍發(fā)聲10在另一方向轉(zhuǎn)動有光閃爍發(fā)聲11剎車沒有光沒有光沒有聲音對于有兩個電機連接在口和口上的一輛小車(我們?nèi)匀灰訤loat, OnPos, OnNeg, and Brake表示自由運行,前進,后退,剎車)。狀態(tài) OnPos和OnNe

35、g將根據(jù)輸出口和電機導線的連接使電機順時針或逆時針旋轉(zhuǎn)。從狀態(tài)OnPos或OnNeg變到Float和 Brake對正在運動的小車會有很大的影響:Brake會使小車立刻停下。Float允許電機自由地轉(zhuǎn)動并逐漸停止。 電機連接在A口和C口 宏P(guān)ortA、PortB和PortC允許我們用程序驅(qū)動來控制輸出口。用下面的語句可使連接在口上的燈閃爍: 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);輸出狀態(tài)以足夠快的速度改變,如以1毫秒的間隔,如果是燈,它的亮度就沒有一直供電那么亮。這叫做PWM控制。每一個供電脈沖叫作脈沖的寬度??刂泼}沖寬度和脈沖的形式就能控制傳遞到執(zhí)行器件的能量。我們可用H8/3292的定時器T0產(chǎn)生的定時器中斷實現(xiàn)對輸出口的PWM控制(時間間隔為1毫秒)。這些中斷可用來調(diào)用預先設好占空比的子程序。一個PWM控制A口和C口的例子見MotorControl.h,共有16個能級可供使

38、用。C語言的例子見 RCX編程, 第2節(jié)。 4. RCX預置程序(指出廠時,ROM里預先燒好的程序)當RCX上電或復位后,ROM里的預置程序就開始運行并控制RCX。此時通過紅外發(fā)射/接收,其它計算機就可與RCX通信了。預置程序可提供一個簡單協(xié)議從其它計算機下載用戶程序到RCX中。當程序下載后,可由預置程序啟動。用戶程序運行時,預置程序提供對RCX輸入/輸出設備的訪問等服務。 5. 與RCX預置程序的通信預置程序通過一個簡單的請求/應答協(xié)議與其它計算機通信: 計算機送出請求;預置程序響應請求并發(fā)回應答。應答可能包含數(shù)據(jù)如版本號,但應答常常用來表明請求已滿足或通信一切正常。 5.1請求/應答協(xié)議可

39、發(fā)送的請求有: Alive: 驗證預置程序是否運行并且RCX是否與電腦連接。 GetVersions:預置程序和固件版本號。EnterDownloadMode: 如果有程序運行將被停止。預置程序進入下載模式BeginDownload: 預置程序為下載程序做準備。 DownloadBlock: 下載字節(jié)塊到RCX存儲器。 RunProgram: 運行下載的程序。只有下載的程序含有"Do you byte, when I knock?"程序才會被執(zhí)行。 每一個請求/應答都是作為數(shù)據(jù)幀發(fā)送的。數(shù)據(jù)幀包含請求/應答、幀頭、幀尾: 數(shù)據(jù)幀=幀頭 請求/應答 幀尾在這里,幀頭= 0x5

40、5 0xff;請求/應答=字節(jié)序列;幀尾=校驗和。校驗和是請求/應答的最低有效字節(jié)。 請求是一個字節(jié)序列。第一個字節(jié)是請求代碼,接下來的字節(jié)包含請求數(shù)據(jù)。應答有一個相似的結(jié)構(gòu),第一個字節(jié)是應答代碼, 接下來的字節(jié)是應答數(shù)據(jù)。應答代碼是請求代碼的補碼。每一個請求有兩個請求代碼,區(qū)別是兩個代碼的第4位的值不同。這一位是順序控制位:預置程序只執(zhí)行相同請求代碼中的第一個,給第二個請求及以后的發(fā)送的應答其效果是相同的。所以為了使同樣的請求連續(xù)執(zhí)行兩次,就需要給順序控制位不同的值。下面是請求/應答的一個詳細描述。 請求請求代碼請求數(shù)據(jù)應答代碼應答數(shù)據(jù)Live10/18無ef/e7無GetVersions1

41、5/1dKeyea/e2程序、固件版本EnterDownloadMode65/6dKey9a/92無BeginDownload75/7d程序入口、校驗和、零8a/82結(jié)果DownloadBlock45/4d數(shù)據(jù)包號碼, 長度,數(shù)據(jù)包,數(shù)據(jù)包校驗和ba/b2結(jié)果RunPrograma5/adRunKey5a/52文本Key: 五個字節(jié)表示的十進制數(shù)1, 3, 5, 7, 11 。Key可防止一個正在運行的程序被非法停止。 ROMVersion: BCD碼表示的ROM預置程序的版本號。 ProgramVersion: BCD碼表示的固件的版本號。沒有固件時,BCD碼是0 。 ProgramEntr

42、yPoint: 兩字節(jié)表示的16 位地址。這是用戶程序下載的地址。 ProgramChecksum: 兩字節(jié)表示的16 位無符號整型。已下載程序的字節(jié)數(shù)。 Zero:填充0。 BlockSequenceNumber: 兩字節(jié)表示的數(shù)據(jù)包序列號。從1開始,每接收一個加1,0表示請求結(jié)束。 BlockLength: 下一個DataBlock的字節(jié)數(shù)。用兩字節(jié)16 位無符號整型表示。 DataBlock:數(shù)據(jù)包;長度為BlockLength的所定義的長度。 BlockChecksum:最新的DataBlock的校驗和。 RunKey: 五個ASCII值76, 69, 71, 79, 174表示的五個

43、字符"LEGO®"。 Text: 26 個ASCII 值表示的一條語句"Just a bit of the block!"。 Result:一個字節(jié)。0表示通信正常。非零表示發(fā)生了錯誤。錯誤有以下幾種: 1: 空間不足 2: 格式不正確 3: 數(shù)據(jù)包校驗和錯誤4: 程序校驗和錯誤 6: 未進入下載模式 5.2 字節(jié)協(xié)議請求/應答作為字節(jié)組成的數(shù)據(jù)包在計算機和RCX之間的一條串行通信線間傳送。這條通信線包括兩個紅外發(fā)射/接收設備,一個通過RS232通信端口連接到計算機,另一接入RCX。波特率是2400,即每秒傳送2400位。為標記每個字節(jié)的開始和

44、結(jié)束,字節(jié)含有一個起始位和結(jié)束位,同時增加一位奇偶位,保證第9位是奇數(shù)。因此每一個字節(jié)作為11位來發(fā)送。字節(jié)除了第一個,如0x55,都被作為兩個字節(jié)發(fā)送:字節(jié)本身和它的補碼。結(jié)果是每一個數(shù)據(jù)包都有相等的0位和1位(幀頭0x55同樣有相等的0位與1位)。這可使紅外接收器消除周圍光線造成的影響。除了第一個字節(jié),其他都是作為222*(起始位+一個字節(jié)+奇偶位+結(jié)束位)位發(fā)送的。波特率為2400時,需時9毫秒。 5.3 位協(xié)議一串由0,1組成的數(shù)據(jù)以2400位/每分的速率傳輸。傳0時,紅外光開啟,傳1時,紅外光關(guān)閉。紅外光的頻率是38kHz。傳輸一位的時間是417 usec。 5.4 與RS232連接

45、的紅外發(fā)射/接收(指發(fā)射塔)發(fā)射塔將電腦要發(fā)送的數(shù)據(jù)發(fā)出,同時接收來自RCX的數(shù)據(jù)包。5.5 一個和預置程序通信的用戶程序 一個簡單的程序:RCX_Request_Reply.c(需預先編譯)可用來在UNIX主機和RCX預置程序之間通信。紅外發(fā)射/接收應該連接到一個串口并將串口名賦給DEFAULT_RCX_IR。也可以使用環(huán)境變量RCX_IR代替缺省設置。 用戶程序向RCX預置程序發(fā)出請求(十六進制表示的字節(jié)序列),然后等待應答。一會兒,可得到一個正確應答或是發(fā)生錯誤。接著用戶程序以十六進制表示的字節(jié)序列輸出正確的應答或發(fā)生錯誤。 為了檢查和RCX的連接,我們使用如下命令: RCX_Reque

46、st_Reply 100000: ef發(fā)送Alive(代碼10)請求,應答是ef,表明通信正常。 如下可獲得程序的版本號: RCX_Request_Reply 15 1 3 5 7 b 0000: ea 00 03 00 01 00 00 00 00預置程序的版本是3.1且沒有固件。 現(xiàn)在我們要下載和運行下面一個簡單的匯編語言程序。請注意"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!"語句。表明一切正常并且程序正確運行了。一會兒,程序執(zhí)行兩條指令跳轉(zhuǎn)到復位地址,將控制權(quán)還給預置程序。 6. 使用RCX預置程序提供的底層服務用戶程序可使用由預置程序提供的服務,如對 LCD

50、屏幕的高級操作。在這個部分我們將給出一些有用的服務程序并將描述怎樣通過匯編和C語言使用這些服務。具體請參考RCXInternals。 我們將以一個簡單的例子開始: 16位有符號整數(shù)的乘法。可通過對地址0x0130的操作實現(xiàn),乘法子程序可用匯編語言調(diào)用: jsr 0x0130兩個操作數(shù)傳遞到寄存器r5,r6里,結(jié)果存在r6里。如計算51*72: mov.w # 51, r5 mov.w # 72, r6 jsr 0x0130r6 的值是3672 =51*72。 我們可以把匯編調(diào)用嵌入到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函數(shù)可像其他函數(shù)一樣調(diào)用: int16 p;. p = imul(51,72);像上面的乘法程序那樣,我們也可以嵌套別的語句,實現(xiàn)其他功能。這些嵌套程序模塊可與數(shù)據(jù)類型、常數(shù)和全局

52、變量放在一個頭文件里,如 RCX_RTE.h。這個頭文件也包含H8/300的主要數(shù)據(jù)類型如字節(jié)、詞,語句"Do you byte, when I knock?"和復位程序??捎?include "RCX_RTE.h"包含在你的c語言程序里。上面只是一個預置程序的簡單應用。下面將詳細描述預置程序?qū)Σ僮鱈CD提供的服務。 6.1 LCD子程序 在預置程序中有一些預先寫好的子程序,它可以讓我們忽略控制LCD的H8/3292 I/O port6的底層細節(jié)。也隱藏了元素在屏幕怎樣顯示的細節(jié)。有兩個子程序可以顯示或隱藏屏幕上的圖標。一個圖標是一個或多個元素。此外,還

53、有一個子程序用來在屏幕上顯示數(shù)字。所有子程序通過操作LCD在存儲器的緩沖內(nèi)容來實現(xiàn)其各自功能。存儲器的緩沖內(nèi)容的變動對屏幕沒有影響除非有一個執(zhí)行程序不斷對LCD的緩沖操作。在下表中我們假設,LCD緩沖由一個執(zhí)行程序不斷更新。 LCD子程序描述調(diào)用地址參數(shù)名和類型refresh更新屏幕內(nèi)容0x27c8沒有參數(shù)clear清屏0x27ac沒有參數(shù)show_icon使圖標可見 0x1b62圖標(16 位)hide_icon隱藏圖標 0x1e4a圖標(16 位)show_number根據(jù)格式和最小分度顯示整數(shù)0x1ff2格式(16位),值(16位),最小分度(16 位)子程序的第一個參數(shù)傳到寄存器r6里,剩余的參數(shù)傳到堆棧: 第三個參數(shù)是最先被壓棧的,接著是第二個參數(shù)壓棧。參數(shù)的意思如下: 圖標:可調(diào)用的16 位代碼,如站立或走動的LEGO人圖標。圖標有:16 位代碼描述0x3006站立圖標0x3007走動圖標0x3008選擇觀測

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論