資料介紹
描述
最初的想法
Steve Wozniak 曾說過,創建 Apple 1 整數基本解釋器是他一生中最大的職業挑戰。我試著做史蒂夫所做的事情,從頭開始編寫一個 BASIC 解釋器,而不使用任何其他人的任何代碼。我想要在一臺非常小的計算機上有用的東西。事實證明,它可能是 Arduino 的一個不錯的工具。對 I/O 功能的交互式訪問使測試電子設備變得容易。可以使用 BASIC 命令控制所有引腳。程序和數據可以存儲在 EEPROM 中。我實現了大部分標準 BASIC 語言,包括字符串、浮點數和大部分 Dartmouth 語言集。
查看我的 github 頁面以找到代碼https://github.com/slviajero/tinybasic
下載并編譯 BASIC 解釋器
下載 TinybasicArduino 中的代碼并將其與 hardware-arduino.h 和 basic.h 一起導入您的 Arduino IDE。打開代碼并查看代碼最開頭的設置部分。對于像上面提到的那些標準的 8 位 AVR 系統,初始部分需要看起來像這樣
#undef MINGW
#undef MSDOS
#undef
除非您想為 MSDOS 或 Windows 編譯,否則不要更改此設置。作為下面的語言功能部分,這些設置可以是
#undef BASICFULL
#undef BASICINTEGER
#define BASICSIMPLE
#undef BASICMINIMAL
#undef BASICTINYWITHFLOAT
如果您使用 Arduino UNO 為 am Integer BASIC 定義 BASICSIMPLE 宏,并使用包含字符串、數組和全套 BASIC 控制結構的合理語言集。
對于閃存較大的 Arduino,可以使用 BASICFULL。這將在 MEGA 或 NANO Every 等 8 位平臺上生成 36 kB 的可執行文件。
打開硬件-arduino.h。在硬件定義部分,除了
#define ARDUINOEEPROM
使用這些設置編譯代碼并查看內存消耗。對于 UNO,這應該是一個 24 kB 的可執行文件,并且在編譯后應該有 1.4 kB 的可用 RAM 報告。上傳代碼。
試試看!
使用具有以下設置的 Arduino IDE 的串行監視器 * 波特率 9600 * 換行
解釋器應該顯示一條啟動行,如
Stefan的基礎1.2內存1024 1024
然后提示輸入。
第一個數字是 BASIC 可用的 RAM,第二個數字是可用的 EEPROM。可用 RAM 可能因語言功能而異。1KB 大約是一個人得到的數量,因為 BASIC 的內部變量需要其余的。
輸入您的第一個 BASIC 程序
10 打印“你好世界”
并運行它。
RUN 應顯示“HELLO WORLD”并返回輸入提示。
鍵入 SAVE 會將程序存儲到 EEPROM 中。您可以通過重置您的 Arduino 來嘗試這一點,然后使用 LOAD 重新加載程序。鍵入 LIST 進行檢查。
眨眼程序
與 Arduinos 上的“Hello World”等價的是 blink 程序。
在 BASIC 中它看起來像這樣
10 PINM 13,1
20 DELAY 1000
30 DWRITE 13,1
40 DELAY 1000
50 DWRITE 13,0
60 GOTO 20
輸入它并使用 RUN 命令啟動它。Arduino 上的小 LED 現在應該每隔 1 秒閃爍一次。發送字符 '#' 將中斷程序并使解釋器返回到命令提示符。
你可以在這里下載blink程序blink.bas 。
'#' 中斷程序。所有其他輸入都被忽略。鍵入除“#”之外的任何其他字符都將淹沒串行緩沖區,并且將不再識別中斷字符。
Arduino 函數的工作原理與 C++ 中的差不多。有關移植的命令,請參見此處。您可以在交互模式下嘗試它們。這是在 Arduino 上運行 BASIC 的優勢之一。同樣,您可以通過鍵入 SAVE 將您的工作保存到 EEPROM,并在以后使用 LOAD 重新加載程序。
從 EEPROM 自動運行
如果您已將程序保存到 EEPROM,您可以通過鍵入 SET 1, 1 來激活自動運行標志
如果您現在使用重置按鈕或斷開并連接電源來重置 Arduino,程序將自動啟動。不會出現命令提示符。
從串行控制臺發送“#”會中斷程序。
如果您現在鍵入 LIST,則不會顯示任何程序。自動運行程序不加載到 RAM 中,而是直接從 EEPROM 中執行。這樣,整個 RAM 在自動運行模式下可用。可以通過命令 SET 1, 0 刪除自動運行標志。
重置后會出現命令提示符。
這里有更多關于這整組命令的內容“ SD 卡、文件命令、EEPROM 和相關內容”。
讀取數據
此項目需要任何模擬傳感器和電纜。一個很好的例子是圖片中顯示的光電傳感器。它在絕對黑暗時返回模擬值 1023,在最大亮度時返回 0。
將傳感器的模擬輸出引腳連接到模擬端口 A0,將數字輸出連接到 Arduino 的數字端口 D2。然后輸入 BASIC 程序
10 PINM AZERO ,0
20 M0=1024:M1=0
30 FOR I=1 TO 10
40 L=AREAD (AZERO )
50 IF M0>L THEN M0=L
60 IF M1THEN M1=L
70 DELAY 1000
80 NEXT I
90 PRINT "Minimum ",M0
100 PRINT "Maximum ",M1
并使用 SAVE 將其保存到 EEPROM。運行程序將記錄傳感器每秒讀取的值 10 次,并計算最小值和最大值。AZERO 是一個常數,包含最低的模擬引腳 A0。A1 將是 AZERO+1。
存儲數據
Arduino 的 EEPROM 可用于存儲測量數據。接下來測量一分鐘的平均光強度并將結果存儲在 EEPROM 中:
10 PRINT "Previous measurement ",@E(1)
20 PRINT "Starting new measurement"
30 L=0
40 FOR I=1 TO 60
50 L=L+AREAD(AZERO)/10
60 DELAY 1000
70 NEXT
80 @E(1)=L/60
90 PRINT "Average = ",@E(1)
使用 SET 1, 1 激活自動運行功能后,無需計算機即可使用 Arduino 測量數據。下次 Arduino 連接到計算機時可以讀取該值。
終端程序
Arduino IDE 有一個簡單的串行監視器,但不能下載和上傳數據。存在許多解決方案。我推薦并使用 Roger Meier 的CoolTerm 。
存在適用于 Windows、Linux 和 Mac 的二進制文件。該程序是一個功能齊全的串行終端。我從MacUpdate下載了我的 Mac 二進制文件。
在連接到 Arduino 之前,必須在選項菜單中配置終端程序:
將端口設置為您的串行端口(與使用的 Arduino IDE 相同),波特率設置為 9600,數據設置為 8,奇偶校驗設置為無,停止設置為 1。這些是 Arduino 串行和 Stefan 的 BASIC 的默認設置。在終端配置頁面中選擇了這些選項:
原始模式傳輸每個按鍵,按鍵模擬必須是 Unix 風格的 LF。除此之外,“Handle DEL and BS”需要刪除一行中的數據,“Handle FF”可以從 BASIC 清除屏幕。這些是標準 BASIC 語言集中的最小終端功能。
在 Arduino 上使用 Stefan 的 BASIC 的終端設置可以在這里下載:CoolTerm 設置。該程序不是一個功能齊全的 vt52/100 兼容終端程序。
上傳或下載程序
對于文件上傳,轉到 CoolTerm 中的連接菜單,然后選擇發送文本/二進制文件。
一個很好的例子是 101 BASIC 游戲中的字母猜謎游戲。它適合 1k Arduino BASIC 內存。上傳程序,享受 1975 年的游戲樂趣。
CoolTerm 的當前設置沒有流量控制。時序問題可能導致上傳失敗,因為 Arduino 上的 BASIC 接收字符的速度不夠快。一個簡單的解決方法是在 CoolTerm 的配置菜單的 Transmit 頁面中添加小的延遲。3ms 的線路延遲就可以完成這項工作。
可以使用捕獲文本/二進制文件功能從 Arduino 下載程序。啟動捕獲類型 LIST 后,再停止捕獲。編輯計算機上的文件以刪除最后一行和第一行。或者,您可以使用非常基本的 python 串行監視器連接到 Arduino。串行端口必須在程序的第一行中進行編輯。Control L 和 Control S 用于上傳和下載。
基于 LCD 屏蔽的 BASIC 系統
Arduino 最好的小型硬件擴展之一是帶有 4 個按鈕的 16x2 LCD 擴展板。它們可以很容易地從 BASIC 程序中使用。像以前一樣編譯解釋器,但使用附加設置
#define LCDSHIELD
#define DISPLAYCANSCROLL
在硬件 arduino.h 中。
這將激活 LCD 屏的顯示驅動程序和硬件代碼。編譯并上傳腳本。使用串行監視器或 CoolTerm 連接到 Arduino。進入
打印 &2, "你好世界"
并查看顯示屏。它應該在顯示屏的左上角顯示字符串。
修飾符 &2 將打印命令的輸出重定向到顯示器。通過上面的設置,可以作為一個迷你終端訪問,能夠滾動和一些終端命令。鍵入 PUT &2, 12 以清除顯示屏幕。12 是 Form Feed 的 ASCII 碼,用于清屏。
液晶屏的鍵盤功能
輸入代碼
10 PUT &2, 12
20 PRINT &2,"LCD shield test"
30 PRINT &2,"Key code: ";
40 @X=8:@Y=1
50 GET &2,A
60 IF A<>0 THEN PRINT &2,A;
70 DELAY 10
80 GOTO 30
或使用shield.bas將其上傳到帶有 CoolTerm 的 Arduino 。鍵入 RUN 啟動程序,然后按其中一個屏蔽鍵。密鑰代碼顯示在第二行。
鍵映射到單個字符的 ASCII 值 - 選擇 = LF、右 = 2、左 = 1、上 = 3 和下 = 4。
GET &2, A 將這些值返回到變量 A 中,無論何時按下鍵,如果沒有按下鍵,則返回 0。此代碼使用特殊變量@X 和@Y 來定位光標。它們包含從 0 開始的光標的水平和垂直位置,可以由程序讀取或分配。
顯示緩沖區數組
鍵入以下代碼,然后鍵入 RUN。
10 PUT &2, 12
20 X=0: Y=0
30 P=X+16*Y+1
40 @D(P)="X"
50 GET &2, A : IF A=0 THEN 50
60 A$=A
70 @D(P)=" "
80 IF A$="3" AND Y>0 THEN Y=Y-1
90 IF A$="4" AND Y<1 THEN Y=Y+1
100 IF A$="1" AND X>0 THEN X=X-1
110 IF A$="2" AND X<15 THEN X=X+1
120 IF A=10 GOSUB 200
130 DELAY 300
140 GOTO 30
200 PRINT "Selected", X, Y
210 DELAY 500
220 RETURN
您可以使用按鍵在“X”符號周圍移動。按選擇輸出屏幕上符號的位置。
該代碼使用顯示緩沖區數組@D()。寫入它會直接在屏幕上顯示一個字符。@D() 從數組下標 1 開始,從左到右、從上到下計算單元格。請注意程序如何在第 40 行和第 60 行將字符串轉換為整數。在賦值中,字符串將第一個字符的 ASCII 碼作為其整數值。這僅適用于賦值或整數表達式的右側。該程序具有 Arduino 草圖的典型結構——第 10 行和第 20 行是 setup(),第 30 到 140 行是循環,第 200 到 220 行是函數。
秒表
一個獨立程序的例子是秒表。
100 REM "A little stopwatch using the 16*2 shield"
200 REM "The setup()"
210 D=0:T=0:U=0:S=0:C=0
220 PUT &2,12 : PRINT &2;"Time = ";
230 GOSUB 600
300 REM "The loop()"
320 GET &2,A
330 IF A=10
340 IF C=10
350 IF A="l" THEN 500
360 DELAY 10
370 IF S=1 THEN T=MILLIS (10)-D
380 IF T<>U THEN U=T:GOSUB 600
390 GOTO 300
400 S=(S+1)%2:IF S=1 THEN D=MILLIS (10)
499 GOTO 300
500 END
600 @Y=0:@X=8:PRINT &2;" ";
605 @Y=0:@X=8:PRINT &2;T;
610 RETURN
輸入程序或使用 Coolterm 上傳程序。然后鍵入 SAVE : SET 1, 1 從 EEPROM 激活自動運行。從外部電源(如小電源條)為 Arduino 供電,使其成為獨立的秒表。
下一步是什么?
BASIC 的發展遠遠超出了本項目中描述的功能。與此同時,它擁有 Wire、許多不同的顯示器、網絡,并且可以為更大的計算機供電。我還為它移植了大部分 Arduino 示例庫。
如果您對此感興趣,請點擊這些鏈接中的任何一個
Arduino 庫中的所有標準示例都在我的倉庫中。
- 基于ESP32和FabGL的 BASIC 解釋器代碼實現
- Arduinos上的BASIC解釋器
- 3568編譯環境搭建
- 基于C++編譯器的節點融合優化方法 19次下載
- SoMachine Basic軟件操作指南電子版 0次下載
- C語言編譯器常見的預編譯指令詳細資料說明
- 如何解決proteus的c編譯器問題的方法 26次下載
- MPLAB C18編譯器到MPLAB XC8 C編譯器的移植過程詳細中文資料概述
- 如何將C源代碼從MPLAB C18編譯器移植到MPLAB XC8C編譯器的詳細概述
- 計算機測控系統——面向對象語言Visual Basic課件下載.PPT 0次下載
- TMS320C6000最優編譯器 4次下載
- Code Composer Studio(CCS) 集成開發環境( IDE )入門指導書 78次下載
- PICC編譯器的庫函數詳解 0次下載
- MCS-51程序空間擴展原理及編譯器優化
- 基于Visual Basic.net的顯微金相圖像檢測
- 如何安裝Python解釋器 5407次閱讀
- KUKA使用SUBMIT解釋器 4537次閱讀
- 泰凌微電子Zephyr硬件平臺及編譯步驟 2473次閱讀
- 領域編譯器發展的前世今生 1748次閱讀
- 交叉編譯器安裝教程 3559次閱讀
- 用10行 BASIC 語言創建很棒的游戲 1899次閱讀
- 腳本在嵌入式系統的應用 1292次閱讀
- 如何選擇PIC單片機的C編譯器 5429次閱讀
- 深入編程語言和編譯器是怎樣工作的 4374次閱讀
- 編譯器原理到底是怎樣的帶你簡單的了解編譯器原理 1.1w次閱讀
- verilog編譯指令_verilog編譯器指示語句(數字IC) 1.5w次閱讀
- 命令解釋程序工作流程 5216次閱讀
- Java程序編譯和運行的過程 8884次閱讀
- 編譯器是如何工作的_編譯器的工作過程詳解 1.6w次閱讀
- 編譯器跟編輯器有什么區別 3w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多