2011年6月28日 星期二

arsh

arsh (arduino shell) 是一個基本的 Arduino 交談式指令環境 (interactive command shell)。

下載

(1) Bert Vermeulen 寫的原始版本:

arsh-0.1.tar.gz released 2009-02-17

原始版本是用 arduino-0012 寫的,必須用 avr-gcc 編譯。

(2) 改良版本:

arsh-0.1 library by coopermaa

改良版可以直接用 arduino-0018 或之後的版本直接編譯與上傳到 Arduino 板子上。

我只對原始版本做了一點點修改:

  • 刪除 main.c
  • 把所有副檔名 .c 的檔案改為 .cpp
  • 在 arsh.h 加上底下巨集,讓舊有程式可以相容於 arduino-0018 或之後的版本:

使用 arsh

上傳 arshdemo 範例 (arshdemo.pde) 到 Arduino 板子上,打開 terminal emulator,例如 Tera term,設定 baud rate (預設是 38400),按下 Enter 鍵後會看到 command prompt:

]

輸入 'help' 顯示指令說明:

image

2011年6月17日 星期五

avrdude-GUI (yuki-lab.jp Version)

avrdude-GUI 簡介

avrdude 是很普遍使用的 AVR 燒錄程式 (programmer),不過 avrdude 是指令列的工具,對初學者來說很容易令人怯步,sourceForge 上有個 avrdude-gui 的專案,那是給 avrdude 用的 GUI 介面,不過 avrdude-gui 一直停留在 2004 的版本,已經很久沒有更新了。本文要介紹的是另一個 avrdude 的 GUI 介面,是由 KAWAKAMI Yukio 用 C# 撰寫而成的 avrdude-GUI

avrdude-GUI 主畫面如下:

image

使用 avrdude-GUI 第一件事是設定 avrdude.exe 執行檔的路徑:

image
▲ 上圖使用 Arduino IDE 裏的 avrdude.exe

設定 PATH 環境變數

為了使用 avrdude,你必須把底下幾個路徑加到 PATH 環境變數裏:

C:\arduino-00xx\hardware\tools\avr\bin;
C:\arduino-00xx\hardware\tools\avr\utils\bin;
C:\arduino-00xx\hardware\tools\avr\etc

其中,arduino-00xx 是 Arduino IDE 的版本號碼,例如 arduino-0021。

接下來將介紹如何用 avrdude-GUI 燒錄 Arduino Sketch。

WinAVR 初體驗

這篇簡介 WinAVR 並用一個簡單的例子示範 WinAVR 的使用方法。

WinAVR 簡介

WinAVR 是一套 Windows 平台的 AVR microcontrollers 韌體開發工具,它包含了許多開發 AVR 韌體所需的工具,包括 avr-gcc (GNU GCC C 與 C++ Compiler), avrlibc (C Library), avrdude (燒錄工具), avr-gdb (debugger) 以及可以自動產生 Makefile 的 MFile 等。

準備 WinAVR

你可以到官網下載最新版 WinAVR,然後按照指示安裝。

Arduino IDE 也使用 WinAVR 編譯與燒錄程式,如果你有在使用 Arduino,那麼就不用下載 WinAVR,因為 Arduino IDE 就有一份 WinAVR。你只要把底下幾個路徑加到 PATH 環境變數裏就行了:

C:\arduino-00xx\hardware\tools\avr\bin;
C:\arduino-00xx\hardware\tools\avr\utils\bin;
C:\arduino-00xx\hardware\tools\avr\etc

其中,arduino-00xx 是 Arduino IDE 的版本號碼,例如 arduino-0021。

編譯 Blink 範例

我們用一支簡單的程式示範如何使用 WinAVR 編譯程式,底下是 Blink.c 的程式碼:

關於 AVR 程式怎麼撰寫,不在本文的討論範圍。

接著下指令編譯程式:

avr-gcc -Os -DF_CPU=16000000 -mmcu=atmega328p -o Blink.o -c Blink.c
avr-gcc -Os -DF_CPU=16000000 -mmcu=atmega328p -o Blink.elf Blink.o
avr-objcopy -O ihex Blink.elf Blink.hex

其中,"-DF_CPU=16000000 -mmcu=atmega328p" 告訴 avr-gcc 所用的晶片是 atmega328p 晶片,振盪頻率為 16 MHz。我用的 AVR 晶片是 atmega328p (Arduino Duemilanove 及 UNO 所用的晶片),振盪器頻率是 16 MHz。

編譯完成後會產生 Blink.hex。

用 avrdude 燒錄韌體

接著就可以用 avrdude 把 blink.hex 燒錄到 Arduino 板子上:

avrdude -q -c stk500v1 -P com4 -b 57600 -p atmega328p -U flash:w:Blink.hex:i

當 Blink.hex 燒錄到板子上後,Arduino pin 13 上的 LED 就會開始閃爍。

我用的 Arduino 板子是 Duemilanove,接在 COM4 上,Duemilanove 用的燒錄 baud rate 是 57600 bps。你可能得根據的硬體和作業環境做適當的調整。

關於 avrdude 的使用方法,請參考「用 avrdude 燒錄 Arduino Sketch」一文。

延伸閱讀

2011年6月16日 星期四

用 avrdude 燒錄 Arduino Sketch

這篇說明如何用 avrdude 燒錄 Arduino Sketch,以下指令的方式燒錄韌體。

用 Arduino IDE 就可以燒錄韌體了,而且很方便,只要按個 upload 鍵就行了,為什麼還要學下指令的方式燒錄韌體呢?理由很簡單,其實 Arduino IDE 也是透過 avrdude 進行韌體燒錄的工作,下指令可以讓我們知道更多技術細節。

設定 PATH 環境變數

首先,為了使用 avrdude,你必須先把底下幾個路徑加到 PATH 環境變數裏:

C:\arduino-00xx\hardware\tools\avr\bin;
C:\arduino-00xx\hardware\tools\avr\utils\bin;
C:\arduino-00xx\hardware\tools\avr\etc

其中,arduino-00xx 是 Arduino IDE 的版本號碼,例如 arduino-0021。

燒錄 Arduino Sketch

以 Blink 為例,當你下底下這行指令時,avrdude 會把 Blink.cpp.hex 燒錄到 Arduino 板子上:

avrdude -q -c stk500v1 -P com4 -b 57600 -p atmega328p -U flash:w:Blink.cpp.hex:i

這行指令在做什麼呢?

●  -q

省略燒錄訊息。如果你想看燒錄過程中的資訊,可以把 -q 換成 -v 選項。

–c stk500v1

使用 stk500v1 協定燒錄程式。Arduino 大部份 bootloader 用的都是講 stk500v1 的協定。

–P com4 –b 57600

使用 COM4 並且以 57600 bps 的 baud rate 速率。如果你的 Serial port 不是 COM4,請適當調整。關於 baud rate 的設定,稍後會補充說明。

–p atmega328p

使用 atmega328p 晶片。你必須知道你 Arduino 板子所用的 AVR 晶片為何。

–U flash:w:Blink.cpp.hex:i

把 Blink.cpp.hex 寫到 Flash 中。最後的小寫 i 代表 intel hex format,可省略。

要怎麼取得 Arduino IDE 產生的 HEX 檔呢?這部份請參考「Arduino IDE Tweak (開發環境調校)」或「Arduino 產生的 HEX 檔」。

Arduino IDE Tweak (開發環境調校)

我在 Arduino 官網上找不到 Arduino IDE 調校 (Tweak) 的資料,只好自己動手整理。

首先,因為底下幾個招式會動到 Arduino 的 preference.txt,所以你得先知道 preference.txt 的位置。preferences.txt 可以在這個資料夾中找到:

  • Mac: /Users/<USERNAME>/Library/Arduino/preferences.txt
  • Windows: C:\Documents and Settings\<USERNAME>\Application Data\Arduino\preferences.txt
  • Linux: ~/.arduino/preferences.txt

另外,如果你要更動 preference.txt,記得要先關閉 Arduino IDE,等改完後再重開 IDE,這樣設定值才會生效。

底下就是降服 Arduino IDE 的幾個招式:

1. 顯示 HEX 檔所在的位置

Arduino IDE 預設不會顯示 hex 檔所在的位置,如果你想知道 hex 檔在哪,在編譯的時候只要按著 SHIFT 鍵不放,再點 Verify 編譯程式,畫面下方的狀態視窗就會顯示 HEX 檔所在的位置:

image

2011年6月8日 星期三

App. C

註: 本文為中文翻譯,原文請見底下網址:

http://www.mikroe.com/eng/chapters/view/13/appendix-c-development-systems/

TOC Introduction Ch. 1 Ch. 2 Ch. 3 Ch 4. Ch. 5 Ch. 6 Ch. 7 Ch. 8 Ch. 9 App. A App. B App. C

Appendix C: Development Systems

如何開始工作?

微控制器是本性善良的 "瓶中精靈",而且使用它不需要太多額外的知識。

為了建立一個由微控制器控制的設備,必須提供 PC、編譯工具以及將程式從 PC 端傳送到晶片上的設備。

雖然過程很合乎邏輯,不過還是有很多疑問,倒不是因為複雜,而是有很多變化。讓我們來看一看…

以組合語言撰寫程式

為了撰寫微控制器的程式,可能得使用 Windows 環境上一支專門的程式,任何作文字處理的程式都可以勝任這樣的工作。重點是要按照微控制器應該執行的次序編寫所有的指令,注意組合語言的規則,並且正確的按照定義寫出指令。換句話說,你必須遵照程式的邏輯!如此而已!在使用訂製的軟體時,也有一些輔助開發的工具。其中一個是模擬器,它讓使用者可以在把程式燒錄到 MCU 之前先測試程式碼。

為了讓編譯器順利進行工作,程式的副檔名必須為 .asm,例如 Program.asm。

在使用專門的程式時 (MPLAB),程式會自動附加 .asm 的副檔名。如果是使用其它文字處理器 (Notepad),那麼文件就必須儲存並重新命名。例如,把 Program.txt 換成 Program.asm。

給懶惰的人:跳過這個程序,在 MPLAB 裏開啟一個新的 .asm 文件,把組合語言寫成的程式剪貼過來即可。

編譯程式

微控制器並不認識組合語言。這就是為什麼必須把程式編譯成為機械語言。使用 MPLAB 來做這件工作非常的簡單,因為編譯器是 MPLAB 的一部份。只要點一下適點的圖示便可以編譯程式,而且會產生一個副檔名為 .hex的新文件。它其是同一支程式,只不過被編譯成了微控制器的機器語言。這類文件通常稱為 "hex code",而且表面上看起來是一串 16 進制的無意義的數字。

App. B

註: 本文為中文翻譯,原文請見底下網址:

http://www.mikroe.com/eng/chapters/view/12/appendix-b-examples/

TOC Introduction Ch. 1 Ch. 2 Ch. 3 Ch 4. Ch. 5 Ch. 6 Ch. 7 Ch. 8 Ch. 9 App. A App. B App. C

Appendix B: Examples

本章的目的是提供有關微控制器的基本資訊,為了能實際成功地使用微控制器所需知道的資訊。因此,本章並不包含超級有趣的程式或驚人的解決方案的設備電路圖。相反的,底下只是一些例證,說明撰寫程式既不是特權也不是天才的專利,而只是單純利用指令拼圖的能力而已。後續的例子確保設備的設計與開發主要由 "測試-矯正-重複 (test-correct-repeat)" 的方法組成。當然,你涉足的愈深,東西就愈複雜,這是因為這些是由孩子和一流的設計師想出來的題目。

基本連接方式

如下圖所見,為了讓微控制器正確地運作,必須提供:

● 電源供應;

● 重置訊號(Reset Signal); 及

● 時脈訊號(Clock Signal)。

image

顯然,它只是簡單的電路,不過不必永遠如此。如果是用來控制昂貴的機器或極其重要的功能的目標設備,一切會變得愈來愈複雜!然而,就目前而言,這個解決方案就足夠了…

電源供應

雖然 PIC16F887 可以在不同電壓下運作,但何必測試 "墨菲法則 (Murph’s low)" 呢? 上圖顯示有一個 5V 直流電壓。這個電路使用一顆便宜的三端穩壓 IC (three-terminal positive regulator) LM7805,提供高品質的穩壓功能,以及可以讓微控制器和周邊正常運作的足夠的電流 (在目前的情況下,足夠代表 1Amp)。

App. A

註: 本文為中文翻譯,原文請見底下網址:

http://www.mikroe.com/eng/chapters/view/11/appendix-a-programming-a-microcontroller/

TOC Introduction Ch. 1 Ch. 2 Ch. 3 Ch 4. Ch. 5 Ch. 6 Ch. 7 Ch. 8 Ch. 9 App. A App. B App. C

Appendix A: Programming a Microcontroller

微控制器和人類透過稱為組合語言 (Assembly Language) 的語言媒介溝通。Assembly 這個字彙本身並沒有什麼深刻的意義,它只是對應其它語言的名稱,例如英語或法語。更確切地說,組合語言只不過是個過渡方案 (passing solution)。為了讓微控制器理解以組合語言寫成的程式,程式必須編譯為 0 和 1 的語言。組合語言和組譯器的意義是不一樣的,前者指的是一套規則,用來撰寫給微控制器的程式,而後者指的是個人電腦上的一支程式,用來把組合語言的程式翻譯為 0 和 1 的語言。編譯過的程式又稱為機械碼。"程式 (Program)” 是儲存在電腦硬碟上的一個資料檔 (或在微控制器的記憶體裏,如果有載入的話),而且是根據組合語言或其它程式語言的規則撰寫而成的。組合語言是人類可以理解的,因為它有有意義的英文字母字彙和符號組成。讓我們看看指令 "RETURN" 這個例子,如其名稱所示,這個指令用來讓微控制器從某個副程式返回。在機械碼中,同一個指令是由微控制認識的 14 位元的 0 和 1 組成。所以組合語言的指令都同樣編譯成對應的 0 和 1。儲存編譯過後的程式的資料檔稱為 "執行檔 (executive file)",即 "HEX檔"。這個名稱來自 16 進制的資料檔表示方式,而且其副檔名為 "hex",例如 "probe.hex"。在檔案產生之後,HEX 檔會被載入到微控制器,使用 programmer 載入。組合語言的程式可以使用任何可以建立 ASCII 文字檔的程式撰寫,或者也可以使用如 MPLAB 的特殊工作環境撰寫,這部份稍後會討論。

image 

組合語言的元素 (ELEMENTS OF ASSEMBLY LANGUAGE)

以組合語言寫成的一支程式,由許多元素組成,這些元素在程式編譯為執行檔時會有不同的解譯。這些元素的使用需要嚴格的規則,而且在撰寫程式的時候必須特別注意,以避免錯誤。

2011年6月7日 星期二

Chapter 9

註: 本文為中文翻譯,原文請見底下網址:

http://www.mikroe.com/eng/chapters/view/10/chapter-9-instruction-set/

TOC Introduction Ch. 1 Ch. 2 Ch. 3 Ch 4. Ch. 5 Ch. 6 Ch. 7 Ch. 8 Ch. 9 App. A App. B App. C

Chapter 9: Instruction Set

我們曾經提到,微控制器跟其它積體電路不同。積體電路大部分都準備好安裝到目標設備上使用,但微控制器並不是這樣。為了使微控制器可以操作,它需要精確的指令告訴它做什麼。換言之,微控制器應該執行的程式必須先撰寫好並燒錄到微控制器裏。本章涵蓋了微控制器 "認識” 的命令。16FXX 機器的指令集總共包括 35 條指令。這樣小數目的指令是 RISC 微控制器所特有的,因為 RISC 微控制器從幾個方面做過優化:運行的速度、簡潔的架構、代碼緊密小巧。 RISC 架構唯一的缺點是 programmer 得應付這些指令。

image

Chapter 8

註: 本文為中文翻譯,原文請見底下網址:

http://www.mikroe.com/eng/chapters/view/9/chapter-8-other-mcu-s-circuits/

TOC Introduction Ch. 1 Ch. 2 Ch. 3 Ch 4. Ch. 5 Ch. 6 Ch. 7 Ch. 8 Ch. 9 App. A App. B App. C

Chapter 8: Other MCU's Circuits

振盪器 (Oscillators)

如下圖所示,時脈訊號可以由兩個內建振盪器的其中一個產生。

image
Fig. 8-1 Two built in oscillators

外部振盪器 (external oscillator) 與微控制器安裝在一起並且連接到 OSC1 和 OSC2 腳位。它被稱為 "外部(external)" 是因為它依賴外部電路來作時脈訊號與頻率的穩定 (frequency stabilization),例如獨立的振盪器、石英晶體、陶瓷諧振器或電阻-電容電路 (resistor-capacitor circuit)。振盪器模式是在燒錄的期間選擇的,稱之為 Config Word (Configuration bits)。

Chapter 7

註: 本文為中文翻譯,原文請見底下網址:

http://www.mikroe.com/eng/chapters/view/6/chapter-5-ccp-modules/

TOC Introduction Ch. 1 Ch. 2 Ch. 3 Ch 4. Ch. 5 Ch. 6 Ch. 7 Ch. 8 Ch. 9 App. A App. B App. C

Chapter 7: Analog Modules

除了大量的數位  I/O 線路外,PIC16F887 還包含了 14 個 類比輸入 (analog inputs)。不僅可以辨識腳位訊號為邏輯 0 或 1 ( 0 或 +5V),這些腳位使得微控制器也可以精確的測量其電壓,而且可以把它們轉換成數值,亦即數位格式。整個過程發生於 A/D 轉換器模組,該模組具有以下特性:

● 轉換器使用逐次逼近 (successive approximation) 的方法產生一個 10 位元的結果,並且將轉換結果儲存到 ADC 暫存器(ADRESL 和 ADRESH);

● 總共有 14 個獨立的 analog inputs;

● A/D 轉換器可以把 analog inputs 訊號轉換成 10 位元的二進位數值以表示該訊號; 及

● 透過選擇參考電壓 (voltage references) Vref- 和 Vref+,可以根據不同需要調整最小解析度和轉換品質。

ADC 模式與暫存器

雖然 A/D 轉換器的使用好像很複雜,它基本上是很簡單的,至少比計時器和序列通訊模組還簡單。

image
Fig. 7-1 ADC Mode and Registers

Chapter 6

註: 本文為中文翻譯,原文請見底下網址:

http://www.mikroe.com/eng/chapters/view/7/chapter-6-serial-communication-modules/

TOC Introduction Ch. 1 Ch. 2 Ch. 3 Ch 4. Ch. 5 Ch. 6 Ch. 7 Ch. 8 Ch. 9 App. A App. B App. C

Chapter 6: Serial Communication Modules

EUSART

增強型通用同步非同步收發器(EUSART)模組是一個序列 I/O 通訊周邊,又稱為序列通訊介面 (Serial Communications Interface, SCI)。它包含時脈產生器 (clock generators)、移位暫存器 (shift registers)和資料緩衝區 (data buffers) 等獨立於設備的必要設施以執行序列資料的傳送。如其名稱所示,除了使用時脈做同步之用外,這個模組也可以建立非同步的連線,這使得它在某些應用無可取代。

image 例如,在很難或不可能提供時脈和資料傳輸給特殊通道的情況下 (例如,無線電遙控或紅外線),EUSART 模組便扮演了一種方便的解決方案。

Fig. 6-1 Remote Control and Plane

 

 

 

 

 

 

 

 

 

整合在 PIC16F887 之內的 EUSART 系統具有下列特性:

● 全雙工 (Full duplex) 非同步發送與接收;

● 可程式化 8 或 9 位元字元長度 (Programmable 8- or 9-bit character length);

● 9 位元模式下的位址偵測 (Address detection in 9-bit mode);

● 輸入緩衝溢出錯誤檢查 (Input buffer overrun error detection); 及

● 同步模式下的半雙工 (Half-duplex) 通訊 (master or slave)。

EUSART 非同步模式

EUSART 發送與接收資料使用標準的不歸零格式 (non-return-to-zero format, NRZ)。如下圖所示,這種模式不使用時脈訊號,其傳送的資料格式非常的簡單:

image
Fig. 6-2 EUSART Asynchronous Mode

Chapter 5

註: 本文為中文翻譯,原文請見底下網址:

http://www.mikroe.com/eng/chapters/view/6/chapter-5-ccp-modules/

TOC Introduction Ch. 1 Ch. 2 Ch. 3 Ch 4. Ch. 5 Ch. 6 Ch. 7 Ch. 8 Ch. 9 App. A App. B App. C

Chapter 5: CCP Modules

CCP 是 Capture/Compare/PWM 的縮寫。

CCP 模組是一個允許使用者測量事件的時間和控制事件的周邊。

Capture Mode, 允許測量某個事件的週期。這個電路可以深入的了解某個會不斷變化其值的暫存器的當前狀態。在這種情況下,是指 TMR1 這個暫存器。

Compare Mode 比較兩個暫存器的內容。其中一個是 TMR1 暫存器。這個電路也允許使用者觸發外部事件,當預先決定好的時間已經消逝的時候。[1]


[1] 難懂嗎?這只是簡化的解釋,實際上會更複雜難懂,因為這些模組可以在很多種不同的模式下運作。試著從 datasheet 分析它們的運作。如果你使用任何 CCP 模組,首先選擇你需要的模式,分析 datasheet 上恰當的插圖,然後才開始改變暫存器的內容,否則的話 ...

PWM – 脈衝寬度調變 (Pulse Width Modulation) 可以產生不同頻率與工作週期 (duty cycle) 的訊號。

PIC16F887 微控制器有兩個這樣的模組 – CCP1 和 CCP2。

在正常模式下它們倆是一致的,只有一個例外,加強型的 PWM (Enhanced PWM) 只有 CCP1 才有。這就是為什麼這一章講 CCP1 講的很詳細。關於 CCP2,只有跟 CCP1 不同的地方才會討論。

CCP1 模組

這個電路的核心是一個 16 位元的暫存器 CCPR1,包括 CCPR1L 和 CCPR1H 暫存器。CCPR1 用於捕捉或比較儲存在 TMR1 暫存器裏的數值(TMR1H 和 TMR1L)。

image
Fig. 5-1 CCP1 Module

Chapter 4

註: 本文為中文翻譯,原文請見底下網址:

http://www.mikroe.com/eng/chapters/view/5/chapter-4-timers/

TOC Introduction Ch. 1 Ch. 2 Ch. 3 Ch 4. Ch. 5 Ch. 6 Ch. 7 Ch. 8 Ch. 9 App. A App. B App. C

Chapter 4: Timers

PIC16F887 微控制器的計時器 (timers) 用簡短一句話就可以描述,總共有 3 個完全獨立的計時器/計數器 (timers/counters),標記為 TMR0, TMR1 和 TMR2。不過事情沒那麼簡單。

TMR0 計時器

實際上 TMR0 計時器的應用很廣。很少程式不用到它。它非常方便,而且很容易用來撰寫產生任意期間的脈衝的程式或副程式 (subroutine)、測量時間,或是計數外部脈衝 (事件),幾乎沒有什麼限制。

TMR0 計時器模組是 8 位元的計時器/計數器,具有下列特性:

● 8 位元計時器/計數器;

● 8 位元 prescaler (與 Watchdog timer 共享);

● 可程式的內部或外部時脈來源 (Programmable internal or external clock sources);

● 溢位中斷 (Interrupt on overflow); 及

● 可程式選擇的外部時脈邊緣 (Programmable external clock edge selection)。

下圖表示 TMR0 計時器的電路,包含決定其運作的所有位元。這些位元儲存在 OPTION_REG 暫存器裏。

image
Fig. 4-1 Timer TMR0

2011年6月6日 星期一

Chapter 3

註: 本文為中文翻譯,原文請見底下網址:

http://www.mikroe.com/eng/chapters/view/4/chapter-3-i-o-ports/

TOC Introduction Ch. 1 Ch. 2 Ch. 3 Ch 4. Ch. 5 Ch. 6 Ch. 7 Ch. 8 Ch. 9 App. A App. B App. C

Chapter 3: I/O Ports

特性與功能

微控制器其中一個重要的特性是用來跟周邊連線的 input/output 腳位。在目前的情況下,PIC16F887 一共有 35 支 GPIO 腳位 (general purpose I/O pins),對大多數的應用來說是相當足夠的。

類似暫存器,為了讓 I/O 腳位的運作可以配合內部 8 位元的組織,所有腳位分成 A, B, C, D 和 E 等 5 個群組。它們都有一些共同的特點:

● 出於實際的理由,許多 I/O 腳位有 2 到 3 種功能。如果某個腳位用作其它的功能,它可能就不能當作 GPIO 使用,而且

● 每個 port 都有它的 "衛星 (satellite)",亦即對應的 TRIS 暫存器: TRISA, TRISB, TRISC 等,這些 "衛星" (TRISx) 決定 port 的演出/角色 (performance) 而不是 port 的內容。

透過清除 TRIS 暫存器的某個位元 (bit = 0),對應的 port 腳位會被設置成輸出。同樣的,透過設定 TRIS 暫存器某個位元 (bit = 1),對應的 port 腳位會被設置成輸入。這個規則很容易記憶: 0 等於 Output,1 等於Input。

譯註: 如果沒有特別的聲明,本書提到的「設定某個位元」指的將是「把某個位元設定為  1」,而「清除某個位元」指的將是「把某個位元清除為  0」

image
Fig. 3-1 I/O Ports

Port A 與 TRISA 暫存器

Port A 是一個 8 位元寬雙向的 port。TRISA 和 ANSEL 暫存器控制 Port A 的腳位。Port A 所有腳位均可當作 digital inputs/outputs 使用,其中 5 支腳位也可以當作 analog inputs 使用 (以 AN 表示)。

2011年6月5日 星期日

Chapter 2

註: 本文為中文翻譯,原文請見底下網址:

http://www.mikroe.com/eng/chapters/view/3/chapter-2-core-sfrs/

TOC Introduction Ch. 1 Ch. 2 Ch. 3 Ch 4. Ch. 5 Ch. 6 Ch. 7 Ch. 8 Ch. 9 App. A App. B App. C

Chapter 2: Core SFRs

特殊暫存器 (Special function registers) 可以分成兩類:

● 核心暫存器 (Core (CPU) registers) – 負責控制與監測中央處理器的運作與程序 (process)。它們的數量雖然很少,但是整個微控制器的運作全仰賴這些暫存器。

● 周邊特殊暫存器 (Peripheral SFRs) – 負責控制周邊單元的運作 (序列通訊模組、A/D converter等)。這些暫存器每一個主要都是為了某個專門的電路而設計的,由於這個原因,這些暫存器跟它們所控制的電路會一併討論。

本章描述 PIC6F877 微控制器的核心 (CPU) 暫存器。由於它們控制著晶片內部許多不同的電路,不太可能它把們分成一些特別的群組,所以這些暫存器的位元和它們控制的程序 (processes) 將合在一起描述。

image

image
Fig. 2-1 STATUS Register

 

STATUS 暫存器包含了:W 暫存器的算術狀態,RESET 狀態和 data memory 的 bank 選擇位元。在寫值到這個暫存器的時候,應該要特別小心,因為如果你不小心弄錯了,結果可能會不如預期。例如,如果你嘗試使用 CLRF STATUS 指令清除所有位元,暫存器的結果將是 000xx1xx 而不是預期的 00000000。之所以會發生這種錯誤,是因為這個暫存器的某些位元是按照硬體而被設定或清除的,而且也因為 bit-3 和 bit-4 是唯讀的位元 (readable only)。基於這些原因,如果需要改變其內容(例如,要改變 active bank),建議只用不會影響任何狀態位元(位元 C,DC 和 Z)的指令。請參考 "Instruction Set Summary"。

Chapter 1

註: 本文為中文翻譯,原文請見底下網址:

http://www.mikroe.com/eng/chapters/view/2/chapter-1-pic16f887-microcontroller-device-overview/

TOC Introduction Ch. 1 Ch. 2 Ch. 3 Ch 4. Ch. 5 Ch. 6 Ch. 7 Ch. 8 Ch. 9 App. A App. B App. C

Chapter 1: PIC16F887 Microcontroller - Device Overview

PIC16F887 是 Microchip 最新的一個產品。現代微控制器有的功能它大部份都有。它是一個理想的解決方案,因為它價格低廉、應用範圍廣、品質高而且容易取得,可應用於諸如此類的場合:工業流程控制,機械控制設備,各種不同數值的測量等,它的一些主要功能條列於下:

image

 

image
Fig. 1-1 PIC16F887 PDIP 40 Microcontroller

 

image
Fig. 1-2 PIC16F887 QFN 44 Microcontroller

 

2011年6月4日 星期六

Introduction

註: 本文為中文翻譯,原文請見底下網址:

http://www.mikroe.com/eng/chapters/view/1/introduction-world-of-microcontrollers/

TOC Introduction Ch. 1 Ch. 2 Ch. 3 Ch 4. Ch. 5 Ch. 6 Ch. 7 Ch. 8 Ch. 9 App. A App. B App. C

Introduction: World of microcontrollers

在微控制器 (microcontrollers) 這個領域,我們今日所處的世界已經開始在發展積體電路科技 (Integrated Circuits)。這個發展使我們得以在一顆晶片上儲存數十萬顆電晶體。對微處理器 (microprocessors) 製造商來說,這只是一個前提,如果不使用積體電路把大量電晶體集中到一顆小小的晶片上,便不能稱為微處理器。記憶體、輸入/輸出線路 (input/output lines)、計時器 (timers) 和其它元件等,世界上第一部電腦就是加上這些外部周邊設備而產生的。由於封裝密度 (package destiny) 的進一步提高,使得打造包含處理器和周邊設備的積體電路這件事成為可能。這便是第一顆內含微處理器與周邊設備 ---- 我們後來把它稱為微控制器者,的發展沿革。

這一切是這麼開始的

1969 年,一個來自日本 BUSICOM 電子計算機製造公司的工程師團隊來到美國,請求根據他們的計畫為計算機設計一些積體電路。這個請求後來送到了Intel,當時由 Marcian Hoff 負責這項計畫。由於有過電腦 (PDP8) 的工作經驗,他想出了一個主意,建議改用完全不同的解決方案,而不是原先建議的設計。Marcian Hoff 提出的解決方案認為積體電路的運作應該由儲存在電路本身上面的程式來決定。這意味著系統的配置會比較簡單,不過卻需要更多的記憶體,遠超過日本工程師計畫中的提議。過了一段時間,即便日本工程師們試圖尋找更簡單的解決方案,Marcian Hoff 的想法還是贏得了勝利,於是第一顆微處理器就這麼誕生了。能把想法變成準備就緒 (ready-to-use) 的產品,Federico Faggin 的幫助很大。在聘用 Federico Faggin 9 個月之後,Intel 就從原始概念到成功開發出了這款產品。Intel 在 1971 年取得這塊積體電路的銷售權。在這之前,Intel 向 BUSICOM 購買了許可,而 BUSICOM 卻不知道這塊積體電路有多麼珍貴。在同一年,市場上出現了一個叫 Intel 4004 的微處理器。這是第一個 4 位元的微處理器,每秒可以執行 6000 條指令。在這之後不久,一家叫 CTC 的美國公司分別與 Intel 和德州儀器 (Texas Instruments) 合作要製造一個適用於終端機的 8 位元微處理器。儘管後來 CTC 放棄了這個計畫,Intel 和德州儀器公司還是繼續研發這顆微處理器;1972 年 4 月,第一顆 8 位元的微處理器上市,叫做 Intel 8008。8008 可以定址到 16KB 的記憶體,有 45 個指令而且每秒可以執行 30 萬條指令。8008 是今日所有微處理器的前身。Intel 不斷地開發改良 8008,並在 1974 年 4 月推出一個稱為 8080 的微處理器。8080 可以定址到 64KB 的記憶體,有 75 個指令,起價 360 美元。

另一家美國公司 Motorola 很快就意識到正在發生什麼事情,於是他們推出 8 位元微處理器 6800。Chuck Peddle 是 Motorola 的主要設計師。除了生產處理器外,Motorola 是第一家生產 6820 和 6850 等周邊晶片的公司。在此同時,許多企業認清了微處理器的重要性,紛紛起而效仿發展自己的微處理器。Chuck Peddle 後來引進 MOS 技術(金屬氧化半導體)到 Motorola 並且不斷的在微處理器這塊領域深耕。

2011年6月2日 星期四

PIC Microcontrollers

註: 本文為中文翻譯,原文請見底下網址:

http://www.mikroe.com/eng/products/view/11/book-pic-microcontrollers/

書籍概觀

image

如果你到目前為止還沒接觸過,那麼現在該是學習知道什麼是微控制器以及它們是如何運作的時候了。為數眾多的圖解、實際範例和 PIC16F887 微控制器詳細的描述,將讓你享受與 PIC MCUs 共處的時光。

  • 書名: PIC Microcontrollers
  • 作者: Milan Verle
  • 頁數: 394
  • 出版社: mikroElektronika; 1st edition (2008)
  • 語言: English
  • ISBN-13: 978-86-84417-15-4
  • 平裝顏色: 兩種顏色
  • 封面顏色: 全彩

 

目錄

Introduction: World of Microcontrollers

Chapter 1: PIC16F887 Microcontroller - Device Overview

Chapter 2: Core SFRs

Chapter 3: I/O Ports

Chapter 4: Timers

Chapter 5: CCP Modules

Chapter 6: Serial Communication Modules

Chapter 7: Analog Modules

Chapter 8: Other MCU's Circuits

Chapter 9: Instruction Set

Appendix A: Programming a Microcontroller

Appendix B: Examples

Appendix C: Development Systems

 

讀者書評

"PIC 初學者必備" by John Peterson

"絕對值得閱讀的一本書,它提供了一個理解 PIC 架構與編程的簡單的方法。這本書不談花俏的專案,基本上它是很好的學習起點,肯定是必備的。沒有枯燥的材料與令人困惑的圖示,作者指出,微控制器是一個善良的「瓶中精靈」,而且再也沒有更好的解釋方法了。"

"非常棒的微控制器編程介紹" by Jeff Lurk

"我買過的第一本關於 PIC 編程的書,我可以老實地說這真是一本上等的好書。這本書很容易閱讀而且伴隨著很棒的 3D 插圖。作者很熱心,一步步引導讀者,讓人很輕易地進入 PIC 微控制器的世界。包括我,很多人都被組合語言編程 (assembly programming) 嚇到了,讀了這本書後,你將發現其實它遠比你想像的簡單,而且你將很快就抓到竅門。"

免責聲明

刊登在 mikroElektronika 線上圖書的內容皆受版權保護,未經 mikroElektronika 編輯部明確的書面同意,不得以任何形式複製。本書是以小心謹慎的態度而籌劃的,然而發佈者概不承擔任何責任、書籍內容的正確性或其應用產生的後果。

同意聲明

本書中文版的翻譯已取得 mikroElektronika 的同意。

2011年6月1日 星期三

Arduino API List

如果你想研讀 Arduino 的 source code,必須先取得一份 Arduino source code ,其實東西就近在眼前,它就放在你下載的 Arduino IDE 中,路徑是 (註: 00xx 是 Arduino IDE 版本號碼):

arduino-00xx\hardware\arduino\cores\arduino

有了 source code 後,如果還可以有一張 API 與檔案對照表,那就更方便了,因此這篇條列了 Arduino 的 API 佐以 API 所在的檔案資訊,比如 digitalRead() 和 digtalWrite() 這兩個函式位於 wiring_digital.c,希望這有助於你得以更方便地研讀 Arduino 的 source code。

本文的檔案鏈結直到連到 Arduino 在 GitHub 上面的 source code:

https://github.com/arduino/Arduino

Constants (wiring.h)
  • HIGH | LOW
  • INPUT | OUTPUT
  • true | false
  • LSBFIRST | MSBFIRST
  • CHANGE | FALLING | RISING
  • DEFAULT | EXTERNAL
Main program (main.cpp)
函式名稱 語法
main() main()
init() init()