跳轉到內容

嵌入式系統/Atmel AVR

來自華夏公益教科書,開放世界的開放書籍

Atmel AVRTM 是由Atmel 生產的 8 位 RISC 微控制器 系列。 AVR 架構由挪威科技大學 (NTH) 的兩名學生構思,並在由兩位晶片架構師創立的Atmel Norway(Atmel子公司)得到進一步完善和發展。

記憶體

[編輯 | 編輯原始碼]

Atmel AVR 處理器的記憶體是修改後的哈佛架構,其中程式和資料記憶體位於單獨的總線上,以允許更快的訪問和增加容量。 AVR 使用內部記憶體來儲存資料和程式,因此不需要任何外部記憶體。

Atmel AVR 中的四種記憶體型別是

  • 資料記憶體:暫存器、I/O 暫存器和 SRAM
  • 程式快閃記憶體
  • EEPROM
  • 熔絲位

所有這些記憶體都與 CPU 核心位於同一晶片上。 每種記憶體型別彼此分開,位於晶片上的不同位置。 資料記憶體中的地址 0 與程式快閃記憶體中的地址 0 和 EEPROM 中的地址 0 不同。

程式記憶體

[編輯 | 編輯原始碼]

一些 AVR 微控制器具有 16 位寬的非易失性,而另一些則具有 8 位快閃記憶體 用於程式儲存,從 1 KB 到 256 KB(或 512-128K 通常的程式字)。 程式記憶體儲存可執行程式操作碼和靜態資料表。 程式記憶體是線性定址的,因此不需要頁面銀行或段暫存器來呼叫任何函式,無論其在程式記憶體中的位置如何。

AVR 無法使用外部程式記憶體;晶片上的快閃記憶體是 AVR 核心可用的唯一程式記憶體。 SRAM(靜態 RAM)是隨機存取記憶體 (RAM),只要供電,它就會在記憶體中保留資料位。 與動態 RAM (DRAM)(它將位儲存在由電容器和電晶體組成的單元中)不同,SRAM 不需要定期重新整理。

SRAM 速度非常快;但是,它有很多缺點。 1)它需要 4-6 個電晶體來儲存一位,這使得 SRAM 空間效率低下,2)由於元件要求高,SRAM 的功耗非常大,3)由於元件要求高和功耗成本,SRAM 價格非常昂貴,4)SRAM 是一種易失性記憶體型別,這意味著當電源連線斷開時,SRAM 中的所有資料也會丟失。

快閃記憶體程式記憶體可以使用程式設計工具重新程式設計,最流行的是那些就地程式設計晶片的工具,稱為線上程式設計器 (ISP)。 Atmel AVR 還可以使用高壓並行或序列程式設計器進行重新程式設計,以及透過某些晶片上的 JTAG(同樣,就地)進行重新程式設計。 AVR 中的快閃記憶體至少可以重新程式設計 10,000 次。

許多較新的 AVR(MegaAVR 系列)具有自程式設計快閃記憶體的功能。 此功能主要由引導載入程式 使用。

資料記憶體

[編輯 | 編輯原始碼]

資料記憶體包括暫存器、I/O 暫存器和內部 SRAM。

AVR 具有 32 個通用 8 位暫存器 (R0 到 R31),其中 6 個可以成對使用作為 16 位指標 (X、Y 和 Z)。

所有 AVR 微控制器都具有一定量的 RAM,從 32 位元組到幾 KB 不等。 此記憶體是位元組可定址的。 暫存器檔案(通用和專用)對映到第一個地址,因此也可以作為 RAM 訪問。 一些最小的 AVR 微控制器僅將暫存器檔案作為其 RAM。

資料地址空間由暫存器檔案、I/O 暫存器和 SRAM 組成。 工作暫存器對映為前 32 個記憶體空間 (000016-001F16),然後是最多 64 個 I/O 暫存器的保留空間 (002016-005F16)。 實際可用的 SRAM 從這兩個部分之後開始(地址 006016)。(請注意,在一些更大型的裝置上,I/O 暫存器空間可能更大,在這種情況下,SRAM 的起始地址將更高。)即使存在用於暫存器檔案和 I/O 暫存器訪問的單獨定址方案和最佳化的操作碼,它們仍然可以像 SRAM 一樣定址和操作。

I/O 暫存器(和程式計數器)在發生復位時會重置為其預設起始值。 暫存器和 SRAM 的其餘部分具有初始隨機值,因此通常程式的第一件事之一就是將其全部清除為零或載入其他初始值。

暫存器、I/O 暫存器和 SRAM 永遠不會磨損,無論寫入多少次。

外部資料記憶體

[編輯 | 編輯原始碼]

一些引腳數量較多的 AVR 微控制器允許外部擴充套件資料空間,可定址至 64 KB。 啟用後,外部 SRAM 將由內部 SRAM 重疊;對資料空間中地址 000016 的訪問始終將解析為片上記憶體。 根據特定 AVR 中存在的片上 SRAM 數量,從 512 位元組到幾 KB 的外部 RAM 將無法訪問。 這通常不會造成問題。

所需的支撐電路在支援外部資料記憶體的任何裝置的資料手冊中都有描述,例如Mega 162,位於“外部記憶體介面”部分。 支撐電路很少,由一個 '573 或類似的鎖存器組成,以及一些潛在的片選邏輯。 SRAM 片選可以連線到永久啟用晶片的邏輯電平,或者可以由 AVR 的一個引腳驅動。 對於 32 KB 或更小的 SRAM,一種選擇是使用更高階的地址線來驅動 SRAM 的片選線。

EEPROM 儲存

[編輯 | 編輯原始碼]

幾乎所有 AVR 微控制器都擁有內部 EEPROM 儲存器用於非易失性資料儲存。只有 Tiny11 和 Tiny28 沒有 EEPROM。

EEPROM 儲存器在程式空間或資料空間中沒有直接對映,而是作為外設間接訪問,使用 I/O 暫存器。許多用於 AVR 的編譯器隱藏了訪問 EEPROM 的某些或全部細節。 IAR 的 AVR C 編譯器在變數宣告中識別特定於編譯器的關鍵字 __eeprom。此後,開發人員使用與普通變數(在 RAM 中)相同的標準 C 語法編寫程式碼來讀取和寫入該變數,但編譯器會生成程式碼來訪問 EEPROM 而不是常規資料儲存器。

Atmel 的資料手冊指出,EEPROM 最少可以重寫 100,000 次。如果應用程式頻繁寫入 EEPROM,以至於在達到裝置預期使用壽命之前就會達到寫入限制,則應用程式必須實現磨損均衡方案。AVR 從工廠發貨時,EEPROM 已擦除,即 EEPROM 中每個位元組的值為 FF16

許多 AVR 存在關於在某些電源條件下(通常在 電壓下降 期間)寫入 EEPROM 地址 0 的錯誤資訊,因此 Atmel 建議程式不要使用 EEPROM 中的該地址。

熔絲設定

[編輯 | 編輯原始碼]

熔絲是控制低階功能和引腳分配的 EEPROM 位。熔絲無法透過程式訪問,只能透過晶片程式設計器更改。熔絲控制必須在晶片退出復位並開始執行程式碼之前設定的功能。

最常修改的熔絲包括:

  1. 振盪器/晶體特性,包括驅動強度和啟動時間。
  2. 用於 JTAG 或 GPIO 的 JTAG 引腳
  3. RESET 引腳用作復位輸入、debugWire 或 GPIO
  4. 掉電檢測 (BOD) 啟用和 BOD 電壓觸發點

還有一個熔絲用於啟用序列線上程式設計,預設情況下該熔絲已設定。如果設定不正確,唯一可以程式設計晶片的方法是使用高壓程式設計器,例如 STK-500、AVR Dragon 或第三方程式設計器。因此,開發者在操作熔絲時應謹慎。

AVR 的 RESET 引腳是低電平有效輸入,用於強制復位處理器及其整合外設。該線可以由外部上電覆位發生器、電壓監視器(當電源電壓下降到預定義閾值以下時會斷言 RESET)或更大系統中的另一個元件驅動。例如,如果 AVR 管理著幾個感測器和伺服器作為大型整合系統的一部分,另一個控制器可能會觀察到一些需要復位 AVR 的情況,它可以透過斷言 AVR 的 RESET 線來做到這一點。

AVR 還包含一個 看門狗定時器,當它超時時可以復位處理器。看門狗定時器必須定期復位以防止其超時。未能復位看門狗定時器通常表明程式程式碼已失效(鎖死、進入無限迴圈或以其他方式偏離軌道),並且應該復位處理器。在某些 AVR 上,看門狗可以被程式設計為發出中斷而不是復位處理器。此功能可用於喚醒處於睡眠模式的 AVR。

RESET 引腳用於線上序列程式設計、作為 GPIO 或用於 debugWIRETM 低引腳計數除錯,具體取決於晶片和熔絲位的程式設計。如果該引腳的復位功能被停用,則無法透過線上序列程式設計恢復,必須使用其他方法,例如高壓程式設計。

AVR 支援多種中斷源,包括內部中斷和外部中斷。中斷可能是來自內部外設達到特定狀態(例如 UART 上接收到的字元),也可能是來自外部事件,例如引腳上的特定電平。每個中斷源都會導致跳轉到記憶體中的特定位置。該位置預計將包含 RETI(從中斷返回)指令,基本上忽略中斷,或跳轉到實際的中斷處理程式。

大多數 AVR 至少有一個專用的外部中斷引腳 (INT0)。較舊的 AVR 可以在高電平或低電平,或在下降沿觸發中斷。較新的 AVR 添加了更多選項,例如在上升沿或任一沿觸發。此外,許多較新的 AVR 為每組 8 個引腳實現了引腳變化中斷,無需 輪詢 引腳。引腳變化中斷處理程式必須檢查與該中斷向量關聯的引腳的狀態,並確定要採取的行動。

由於按鈕抖動問題,將按鈕或其他使用者輸入直接連線到中斷引腳被認為是設計不良的做法;必須插入一些去抖或其他訊號調節,以便來自按鈕的訊號不會違反中斷引腳上所需的建立時間和保持時間。

通用 I/O 埠

[編輯 | 編輯原始碼]

通用 I/O 或 GPIO 引腳是 AVR 系列的數字 I/O。這些引腳是真正的推輓輸出。AVR 可以驅動高電平或低電平,或將引腳配置為帶或不帶上拉的輸入。GPIO 分組到最多 8 個引腳的“埠”中,儘管某些 AVR 沒有足夠的引腳來提供特定埠中的所有 8 個引腳,例如 Mega48/88/168 沒有 PortC7 引腳。提供了控制暫存器用於設定資料方向、輸出值(或上拉啟用)以及讀取引指令碼身的值。可以使用按位操作指令訪問單個引腳。

每個埠都有 3 個與其關聯的控制暫存器,DDRx、PORTx 和 PINx。這些暫存器中的每個位控制一個 GPIO 引腳,即 DDRA 中的位 0 控制 PortA0 的資料方向(通常簡稱為 PA0),而 PORTA 中的位 0 將控制 PA0 的資料(或上拉)。

DDR(資料方向暫存器)控制引腳是輸入還是輸出。當引腳被配置為輸出時,PORT 暫存器中的相應位將控制引腳的驅動電平,高電平或低電平。當引腳被配置為輸入時,PORT 暫存器中的位控制該引腳上是否啟用了上拉。在較早的 AVR 上,PIN(埠輸入)暫存器是隻讀的,用於讀取埠引腳上的值,無論資料方向如何。較新的 AVR 允許寫入 PIN 暫存器以切換相應的 PORT 位,這在對介面進行位邦定操作時可以節省一些處理器週期。

定時器/計數器

[編輯 | 編輯原始碼]

所有 AVR 至少有一個 8 位定時器/計數器。為了簡潔,定時器/計數器通常簡稱為定時器。

一些 Tiny 系列只有一個 8 位定時器。在 Mega 系列的高階,有些晶片有多達六個定時器(兩個 8 位和四個 16 位)。

定時器可以由系統時鐘直接時鐘,由一個分頻的系統時鐘時鐘,或由一個外部輸入(上升沿或下降沿)時鐘。一些 AVR 還包含一個選項,可以使用外部晶體(與系統時鐘非同步),可以用於使用 32.768 kHz 晶體保持即時時鐘。

在正常模式下,定時器計數到頂部 FF8(或 FFFF16),翻轉到零,並設定一個溢位位,如果啟用了溢位位,則可能導致中斷。在中斷例程中,除了需要執行的任何其他處理之外,還可以將計數器載入所需的值。

比較匹配時清除定時器 (CTC) 模式允許定時器在到達頂部並溢位之前,當它與比較暫存器中的值匹配時被清除。在溢位之前清除定時器會操作定時器解析度,從而更好地控制比較匹配的輸出頻率。它還可以簡化外部事件的計數。

即使定時器正在執行,也可以隨時讀取定時器的值。 (資料手冊中記錄了用於讀回 16 位定時器的特定序列,以便返回一致的結果,因為 AVR 每次只能移動 8 位。) 透過將定時器的時鐘輸入更改為“無時鐘源”可以暫時停止定時器,然後透過重新選擇之前時鐘輸入可以恢復定時器。

脈衝寬度調製 (PWM)

[edit | edit source]

許多 AVR 至少包含一個定時器的比較暫存器。當定時器值與比較暫存器中的值匹配時,可以使用比較暫存器觸發中斷和/或切換輸出引腳(例如,定時器 1 的 OC1A)。這可以獨立於溢位中斷進行,從而可以利用脈衝寬度調製 (PWM)。

一些 AVR 還包括用於相位校正 PWM 或相位和頻率校正 PWM 的選項。許多電機都需要相位校正。

ATtiny26 的獨特之處在於它包含 64 MHz 高速 PWM 模式。64 MHz 時鐘是由 PLL 生成的,獨立於處理器時鐘,並且與處理器時鐘非同步。

一些 AVR 還包括適合控制某些電機的互補輸出。死區時間發生器 (DTG) 在一個訊號下降和另一個訊號上升之間插入延遲,以確保兩個訊號永遠不會同時為高電平。高階 AT90PWM 系列允許將死區時間程式設計為系統時鐘週期的數量,而具有此功能的其他 AVR 僅使用 1 個時鐘週期作為死區時間。

輸出比較調製器

[edit | edit source]

輸出比較調製器 (OCM) 允許生成以載波頻率調製的訊號。OCM 需要兩個定時器,一個用於載波頻率,另一個用於要調製的訊號。OCM 在某些 Mega 系列中可用。

序列通訊

[edit | edit source]

AVR 微控制器通常能夠支援大量序列通訊協議和序列匯流排標準。確切的序列通訊支援型別因 AVR 微控制器系列的不同成員而異。

除了硬體支援之外,通常還可以選擇完全用軟體實現特定的序列通訊機制。通常,這用於 AVR 控制器在硬體上不支援某些序列通訊機制、特定硬體已被使用(例如,需要兩個 RS-232 介面,但硬體中只支援一個)或晶片的硬體無法使用時,因為它與其他晶片功能共享引腳,並且該功能已被用於特定硬體。這種情況經常發生在低引腳數 AVR 的 DIP 封裝中。

最後,還可以使用額外的邏輯來實現序列通訊功能。例如,大多數 AVR 不支援 USB 匯流排(一些更新的 AVR 支援)。當使用不支援 USB 的 AVR 時,電路設計師可以使用固定功能晶片(例如 FTDI232 USB 到 RS-232 轉換器晶片)或通用 USB 介面(例如 PDIUSB11)新增 USB 功能。實際上,某些支援的通訊協議需要新增額外的電子器件,例如,標準相容的 RS-232 通訊需要新增電壓電平轉換器,例如 MAX232。

特定 AVR 支援的序列通訊可能性數量有時會讓人感到困惑,尤其是當引腳與其他晶片功能共享時。強烈建議深入研究特定 AVR 的資料手冊。以下部分討論了 AVR 上最常見的序列通訊功能。

通用同步非同步接收器發射器 (USART)

[edit | edit source]

最近的 AVR 通常內建了通用同步非同步接收器發射器 (USART)。USART 是一塊可程式設計硬體,能夠生成和解碼各種序列通訊協議。USART 是以下詞語的首字母縮寫詞

通用
可以在許多不同的序列通訊場景中使用
同步
可用於同步序列通訊(傳送方和接收方由特定時鐘訊號同步)
非同步
可用於非同步序列通訊(傳送方和接收方沒有透過時鐘訊號明確同步,而是透過資料訊號同步)。
接收器
AVR 中的硬體可以接收序列資料
發射器
硬體可以傳送序列資料

早期的 AVR 具有 UART,它不支援同步序列通訊,因此縮寫詞中缺少“S”。

USART 或 UART 使用邏輯電壓電平,而例如 RS-232 協議需要的電壓電平與 AVR 電路中常見的 5V 或 3.3V 電源不同。從這種電壓電平到這種電壓電平的轉換由一個額外的晶片執行,該晶片通常稱為線路驅動器或線路介面。

使用正確的線路介面,AVR 的 USART 可以用於與 RS-232、RS-485、MIDI、LIN 匯流排或 CAN 匯流排裝置通訊,僅舉一些流行的協議為例。

有關更多詳細資訊,請參閱 機器人學:計算機控制:介面:網路

RS-232 訊號

[edit | edit source]

RS-232 規範要求負電壓代表“1”位,正電壓代表“0”位。規範允許電平從 +3 到 +15V,以及 -3 到 -15V,但 +/-12V 是常見的。AVR 無法在任何 GPIO 引腳上驅動負輸出電壓,因此使用電平轉換器(例如 MAX232)與 PC 和嚴格的 RS-232 裝置進行通訊。有關 RS-232 佈線的更多詳細資訊,請參閱 序列程式設計:RS-232 連線

RS-232 的最大電纜長度相對較短。對於更長的電纜距離,請考慮在 USART 上使用 RS-485 訊號。

雙線介面

[edit | edit source]

TWI 是飛利浦 I²C 匯流排介面的變體。I²C 由兩條線組成,稱為 SDA(序列資料)和 SCL(序列時鐘),它們使用開漏驅動器,因此需要上拉到邏輯 1 狀態。I²C 使用公共接地,因此總線上的所有裝置都應該具有相同的接地電位,以避免接地迴路。TWI 使用 7 位定址,這允許將多個裝置連線到匯流排。

許多 TWI 裝置至少將地址的前四個位硬編碼,而其餘位可以透過某些方法配置,例如將專用地址引腳連線到電源或接地;這通常只允許總線上有 2-8 個型號為 X 的裝置。AVR 的 TWI 硬體可以充當主裝置或從裝置,並且可以滿足 400 kbit/s 的規格。

序列外設介面 (SPI)

[edit | edit source]

SPI(即 序列外設介面匯流排)是一種主從同步序列協議。這意味著有一條時鐘線來確定脈衝的取樣位置,並且一方始終負責啟動通訊。它至少使用三條線,分別稱為

MISO
主裝置輸入從裝置輸出。
MOSI
主裝置輸出從裝置輸入。
SCK
序列時鐘。

從概念上講,SPI 是一個雙向移位暫存器;當位從 MISO 或 MOSI 移出時,位在另一條線上移入。主裝置始終控制時鐘。

SPI 從裝置有一個從裝置選擇 (SS) 訊號,它向從裝置發出訊號,指示它應該響應來自主裝置的訊息。SS 通常是低電平有效。如果只有一個主裝置和一個從裝置,從裝置的 SS 線可以接地,主裝置不需要驅動它。如果有兩個或多個從裝置,則主裝置必須對每個從裝置使用單獨的從裝置選擇訊號。這種方法的缺點是主裝置只能定址與其額外輸出數量一樣多的從裝置(不使用單獨的解碼器)。

硬體實現 較大的 AVR 微控制器具有內建的 SPI 收發器(從 ATmega8 開始)。序列時鐘來自處理器時鐘,並提供多個分頻器。資料長度始終為 8 位。時鐘極性和相位可以配置,導致晶片資料進出時的四種可能的組合。這種介面非常流行,並且在各種其他處理器和外設中廣泛使用。

用於 SPI 匯流排的引腳也用作透過 ISP(系統內程式設計)程式設計晶片的一種方式(在 mega128 上除外)。

通用序列介面 一些 AVR,特別是在 Tiny 系列中,提供通用序列介面 (USI) 而不是 SPI。USI 可以作為 SPI 工作,也可以作為 I2C 控制器,並且透過一些額外的努力,還可以作為 USART。傳輸的位長是可配置的,時鐘驅動程式也是如此。時鐘可以由軟體、定時器 0 溢位或外部源驅動。

軟體實現 SPI 可以使用 位邦定 I/O 線來實現。透過將 SCLK 連線到外部中斷源,可以高效地實現從裝置。

特定 AVR 的資料手冊提供了該晶片上 SPI 或 USI 控制器的框圖。

協議問題

[edit | edit source]

SPI、RS-232、I2C 和其他序列介面只定義了位和位元組的傳輸方法;它們對應於 OSI 模型 中的第一層,即物理層。位元組可以是任何東西:溫度讀數(以攝氏度或華氏度表示,具體取決於你的感測器)、來自壓力感測器的讀數、關閉泵的控制訊號或 JPEG 影像的位元組。一些含義可以透過使用序列通訊協議來指定。

序列協議必須處理各種使用情況,並提供從故障中恢復的方法。例如,如果兩個感測器連線到一個微控制器(例如室內和室外溫度),則該協議提供了一種方法,使序列線另一端的接收器能夠區分哪個讀數屬於哪個感測器。如果電纜在傳輸過程中斷開連線,或者由於線路噪聲而丟失了位元組,則該協議可以提供一種方法來重新同步發射器和接收器。

序列程式設計 華夏公益教科書中包含了關於序列協議的更多討論。

模擬介面

[edit | edit source]

模數轉換

[edit | edit source]

模數轉換使用數字來表示取樣模擬訊號的比例。例如,透過將 3 V 應用於全量程為 5 V 的 ADC 的輸入,將導致數字輸出為數字輸出全量程的 60%。數字可以用 ADC 的 8 位或 10 位表示。8 位轉換器將提供從 0 到 ,或 255。10 位將提供從 0 到 的輸出。

10 位樣本: 在 ADCH:ADCL 中,或

8 位樣本: 在 ADCL 中

許多 AVR 包含一個 ADC,特別是 逐次逼近 ADC。ADC 參考電壓(在上面的示例中為 5 V)可以是外部電壓,也可以是內部固定的 1.1 V 參考電壓。

具有 ADC 的 AVR 有幾個模擬輸入,這些模擬輸入透過模擬多路複用器連線到 ADC。在任何給定時間,只能轉換一個模擬輸入。ADC 控制器提供了一種順序轉換輸入的方法,因此 AVR 可以輕鬆地在每秒數千次內迴圈遍歷多個源。AVR 可以連續在後臺執行 ADC 轉換,或者使用特殊的“ADC 休眠”模式在轉換期間停止處理器,以最大程度地減少來自 MCU 其他的電壓干擾。

模擬比較器外設

[edit | edit source]

幾乎所有 AVR 微控制器都具有一個模擬比較器,它可用於在沒有 ADC 的 AVR 上實現 ADC,或者如果所有 ADC 輸入都已使用。Atmel 提供使用比較器作為低速 ADC 的示例程式碼和文件。要測量的訊號連線到反相輸入,參考訊號連線到同相輸入。當訊號低於或高於參考值時,AVR 會產生中斷。

模擬比較器的常見用途是檢測電池電壓,以提醒使用者電池電量不足。

其他整合硬體

[edit | edit source]

除了微控制器通常認為的典型外設(UART、SPI、ADC)之外,一些 AVR 還包括針對特定應用的更專業的外設。

LCD 驅動程式

[edit | edit source]

在像 ATmega169 這樣的大型型號(如 AVR Butterfly 中所見)中,集成了 LCD 驅動程式。LCD 驅動程式控制 AVR 的幾個埠,以驅動顯示器的列/行連線。液晶的一個特殊特性必須注意,即不能在其上施加直流偏壓。直流偏壓或在泵送交流電時,更多電子透過一個方向而不是另一個方向,會使液晶化學分解。AVR 的 LCD 模組使用精確的定時來驅動畫素向前和向後相等。

USB 介面

[edit | edit source]

AT90USB 系列中,包含一個片上 USB 控制器。一些型號僅為“功能”型,而另一些型號則具有 On-The-Go 功能,可以充當 USB 主機(用於與其他從裝置介面)或 USB 從裝置(用於與 USB 主機介面)。

沒有內建 USB 的 AVR 可以使用外部晶片,例如 PDIUSB12,或者對於低速和功能最少的裝置,可以使用僅韌體的方法。

兩個僅韌體的 USB 驅動程式是

  • obdev,它在一些限制下,可以根據與開源相容的許可證獲得,並且
  • USBtiny,它的許可證是 GPL。
  • LUFA 庫在 MIT 許可證下發布,允許支援 USB 的 AVR 微控制器充當 USB 主機、從機或 OTG 裝置。[1]

儘管這些軟體實現提供了新增 USB 連線性的非常廉價的方式,但它們僅限於低速傳輸,並且佔用相當多的 AVR 資源。其他將 USB 訊號轉換為 RS-232(序列)的硬體 IC 可從 FTDI 等供應商處獲得。FTDI。這些 IC 的優點是將管理 USB 連線的繁重任務解除安裝,但缺點是受限於 AVR 序列埠的速度。有關此類 USB 介面晶片的更多詳細資訊,請參閱嵌入式系統/特定微處理器#USB 介面

溫度感測器

[編輯 | 編輯原始碼]

一些較新的型號內建了一個連線到 ADC 的溫度感測器。

AVR 選擇

[編輯 | 編輯原始碼]

AVR 微控制器分為三組

  • tinyAVR
  • AVR(經典 AVR)
  • megaAVR

這些器件之間的差異主要在於可用的功能。與 megaAVR 相比,tinyAVR 微控制器通常是引腳數較少或功能集簡化的器件。所有 AVR 器件都具有相同的基本指令集和儲存器組織,因此從一個器件遷移到另一個 AVR 通常是微不足道的。

經典 AVR 主要已停產,因此新設計應使用 Mega 或 Tiny 系列。一些經典 AVR 在 mega 系列中具有替代部件,例如 AT90S8515 被 mega8515 替代。

Atmel 提供了一個引數化產品表,其中比較了 AVR 全系列產品中可用的儲存器、外設和功能。

硬體設計注意事項

[編輯 | 編輯原始碼]

Atmel 提供了AVR 硬體設計注意事項 來幫助硬體設計師。本檔案還顯示了標準的電路內序列程式設計聯結器。

AVR 開發/應用板

[編輯 | 編輯原始碼]

Butterfly 演示板

[編輯 | 編輯原始碼]

AVR Butterfly 是一款自包含的、電池供電的演示板,執行 ATMEL AVR ATmega169V 微控制器。該板包括 LCD 螢幕、操縱桿、揚聲器、序列埠、RTC、快閃記憶體晶片、溫度、光線和電壓感測器。該板背面有一個襯衫別針,可以佩戴為名牌。

AVR Butterfly 預裝了軟體來演示微控制器的功能。出廠韌體可以滾動您的姓名、顯示感測器讀數和顯示時間。此外,AVR Butterfly 還配有一個壓電蜂鳴器,可以再現聲音。

AVR Butterfly 透過執行 14 段、6 個字母數字字元顯示來演示 LCD 驅動。但是,LCD 介面消耗了大量的 I/O 引腳。

Butterfly 的 ATmega169 CPU 能夠以高達 8 MHz 的速度執行,但它在出廠時透過軟體設定為 2 MHz 以節省紐扣電池壽命。預裝的引導載入程式程式允許使用標準 RS-232 序列插頭重新程式設計電路板。

Ecros Technology 生產了一個Butterfly 載板,它提供電源、方便的 I/O 埠連線、DB-9 序列埠(帶電平轉換器)以及一個大型原型製作區域。

STK500 啟動套件

[編輯 | 編輯原始碼]

STK500 啟動套件和開發系統具有 ISP 和高壓程式設計功能,適用於所有 AVR 器件,無論是直接程式設計還是透過擴充套件板程式設計。該板配備了適用於所有 DIP 封裝 AVR 的 DIP 插座。

有多種擴充套件模組可用於 STK500 板。這些模組包括

  • STK501 - 新增對 64 引腳 TQFP 封裝微控制器的支援。
  • STK502 - 新增對 64 引腳 TQFP 封裝 LCD AVR 的支援。
  • STK503 - 新增對 100 引腳 TQFP 封裝微控制器的支援。
  • STK504 - 新增對 100 引腳 TQFP 封裝 LCD AVR 的支援。
  • STK505 - 新增對 14 引腳和 20 引腳 AVR 的支援。
  • STK520 - 新增對 AT90PWM 家族的 14 引腳和 20 引腳微控制器的支援。

第三方板

[編輯 | 編輯原始碼]

有許多基於 AVR 的開發板和/或應用板可從第三方獲得,數量太多,這裡無法列出所有。

  • Arduino 建立在 ATmega328(舊版板卡中為 ATmega8 或 ATmega168)的基礎上,旨在與開源開發環境一起使用。
  • 來自斯坦福大學帕斯卡爾·斯坦格先生的基於 AVR 的支援和應用板
  • GPMPU40 支援許多不同的 Atmel AVR 晶片
  • Futurlec 2313 板(請注意,AT90S2313 已過時,已被 ATtiny2313 替代。)
  • Olimex 生產許多基於 AVR 的開發板和原型製作板,並提供指向示例專案 的連結列表。
  • Protostack 提供 28 引腳 AVR 微控制器(atmega8 等)的開發板和套件,以及大量AVR 教程

程式設計介面

[編輯 | 編輯原始碼]

有許多方法可以將程式程式碼上傳到 AVR。

系統內程式設計

[編輯 | 編輯原始碼]

在功能上,ISP 是透過SPI 完成的,並且對 Reset 進行了一些調整。只要 AVR 的 SPI 引腳沒有連線到任何干擾性內容,AVR 晶片就可以在重新程式設計時焊接到電路板上。只需要一個 6 針插頭和一個經濟實惠的 PC 介面卡。這是使用 AVR 進行開發的最常見方法。

Atmel 的 AVR ISP mkII 連線到 PC 的 USB 埠,並使用 Atmel 的軟體執行系統內程式設計。

avrdude(AVR 下載器上傳器)在 Linux、FreeBSD、Windows 和 Mac OS X 上執行,並支援各種系統內程式設計硬體,包括 Atmel AVR ISP mkII、Atmel JTAG ICE、較舊的 Atmel 序列埠程式設計器以及各種第三方和“自制”程式設計器。

高壓序列程式設計

[編輯 | 編輯原始碼]

HVSP 主要是較小 AVR 的備用模式。8 引腳封裝沒有留下很多獨特的訊號組合來將 AVR 踢入程式設計模式。當使用 RESET 引腳被停用的 AVR 時,HVSP 是必不可少的,以允許將其用作另一個通用 I/O 引腳。由於 RESET 不再具有其內建的 SPI 程式設計功能,因此 12 伏訊號允許可靠地發出程式設計應進行的訊號,因為它是在正常執行期間晶片不應該看到的東西。

高壓並行程式設計

[編輯 | 編輯原始碼]

HVP 是較大型 AVR 的備用模式。它可能是與具有瘋狂振盪器保險絲設定的 AVR 通訊的唯一方式。並行程式設計也可能更快,如果你有一個適度的生產線進行,這很好。

引導載入程式程式設計

[編輯 | 編輯原始碼]

大多數 AVR 型號可以保留一個引導載入程式區域,256 B - 2 KB,重新程式設計程式碼可以駐留其中。在通電時,引導載入程式首先執行,並執行一些使用者程式設計的確定,以確定是重新程式設計,還是跳轉到主應用程式。該程式碼可以透過任何可用的介面重新程式設計,如果它願意,它可以透過乙太網介面卡讀取加密的二進位制檔案。Atmel 針對從 RS-232 開始的任何介面提供應用程式說明和程式碼。

引導載入程式在第 引導載入程式和引導扇區 章中詳細介紹。

完全不程式設計

[編輯 | 編輯原始碼]

AT90SC 系列 AVR 可用掩模 ROM 而不是快閃記憶體來儲存程式儲存器。 [2]

由於前期成本高昂且最低訂購量大,掩模 ROM 僅在大批次生產中才具有成本效益。

除錯介面

[編輯 | 編輯原始碼]

AVR 提供了多種除錯選項,大多數都涉及在晶片位於目標系統中的情況下進行片上除錯。

JTAG 在晶片在目標系統中執行時提供對片上除錯功能的訪問。JTAG 允許訪問內部儲存器和暫存器,在程式碼上設定斷點,以及單步執行以觀察系統行為。

Atmel 為 AVR 提供了一系列 JTAG 介面卡。

  1. JTAGICE 介面卡 透過標準序列埠與 PC 互動。以愛好者標準衡量,它價格昂貴,約 300 美元,但比許多其他微控制器模擬系統便宜得多。JTAGICE 已 EOL'ed,但它仍在 AVR Studio 和其他工具中得到支援。
  2. JTAGICE mkII 取代了 JTAGICE,價格也相似。JTAGICE mkII 透過 USB 與 PC 互動,並支援 JTAG 和更新的 debugWIRE 介面。
  3. AVR Dragon 是 JTAGICE mkII 的低成本(約 50 美元)替代品,用於某些目標器件。AVR Dragon 提供系統內序列程式設計、高壓序列程式設計和並行程式設計,以及對程式儲存器為 32 KB 或更小的器件的 JTAG 或 debugWIRE 模擬。

還有一些第三方的 JTAG 偵錯程式/重新程式設計器,價格在 40 美元左右,例如來自 Ecros 和 Olimex 的那些,以及 DIY 專案,包括 EvertoolAquaticus。這些是原始 JTAGICE 的克隆,

JTAG 也可用於執行 邊界掃描 測試 [3],該測試測試 AVR 與系統中其他支援邊界掃描的晶片之間的電氣連線。邊界掃描非常適合生產線;愛好者可能最好使用萬用表或示波器進行測試。

debugWIRE

[編輯 | 編輯原始碼]

debugWIRETM 是 Atmel 的解決方案,用於透過單個微控制器引腳提供片上除錯功能。它對於引腳數量較少的器件特別有用,這些器件無法提供 JTAG 所需的四個“備用”引腳。JTAGICE mkII 和 AVR Dragon 支援 debugWIRE。debugWIRE 是在原始 JTAGICE 釋出後開發的,所有 JTAG 克隆都不支援它。

模擬本身不是除錯介面,但在軟體中的模擬可以是在將設計提交給物理硬體之前有效的除錯輔助手段。

Atmel Studio 在組合語言級別模擬 AVR 核心,並允許檢視和操作所有內部暫存器。 HAPsim 是一組虛擬裝置,它們可以插入 AVR Studio。它提供 LCD、LED、按鈕和啞終端。

還存在其他軟體包,它們提供 AVR 核心和外設的軟體模擬。

  • VMLab 提供完整的電路模擬以及虛擬示波器。偵錯程式提供了單步執行 C 程式碼以及編輯和重建 winAVR 程式的能力。從 3.12 版開始,VMLab 是免費軟體。
  • AVRora 是一個“AVR 模擬和分析框架”。
  • Proteus 提供原理圖捕獲、PCB 編輯和微控制器模擬,包括 AVR。模擬器將程式碼“下載”到模擬的 AVR 核心中。模擬器中還支援各種虛擬外設。
  • Simulavr 是一個免費(GPLv2)模擬器,它與 GDB 協同工作,並通常與 AVR-GCC 一起使用。

韌體程式設計

[編輯 | 編輯原始碼]

沒有 韌體,微控制器就不會做太多;程式程式碼告訴微控制器做什麼。AVR 的韌體可以用多種語言編寫。Atmel 釋出了 AVR 開發新手指南,這是 Atmel 應用程式期刊 2001 年夏季 的一部分,它提供了使用 AVR Studio 進行組合語言程式設計的簡要教程。

AVR 組合語言

[編輯 | 編輯原始碼]

AVR 微處理器的某些功能只能透過組合語言訪問。

與其他編譯語言相比,組合語言幾乎總是會生成最小的程式碼,因此,它是必須適應非常小的程式碼空間的應用程式的流行選擇。

AVR Studio 免費提供,但該程式僅在 Windows 上執行,其原始碼也不可用。兩個特別適合 AVR 的免費/開源彙編器是 AVRAToms AVR Assembler

  • B# 是一種現代的面向物件的語言,專門為小型嵌入式系統而設計。
  • Atmel AVR 系列的 BASCOM-AVR 開發環境 是一個 BASIC 編譯器。 IDE 包括編輯器、編譯器、模擬器和許多庫函式。 演示版本程式碼限制為 4K。 bascomp.exe 命令列在 Wine 中執行。
  • BASIC to C 提供了一個名為 RVK-BASIC 的免費 ATMEL AVR BASIC 啟動程式,該程式在 Windows 上執行。 下載版本程式碼限制為 100 行。
  • EEBasic 是在 AVR Mega644 上實現的 BASIC,只需要一個終端或終端模擬器即可程式設計; 不使用基於 PC 的編譯器(或其他 IDE)。 語言擴充套件提供了對片上外設的使用。
  • AttoBASIC 是一個免費的硬體導向型 Tiny BASIC 實現,適用於 AVR ATmega88、ATmega168、ATmega328、ATmega2560、ATmega32U4 和 AT90USB1286 微控制器。 這包括使用支援的 AVR 的所有 ARDUINO 產品,以及 TEENSY++2.0。 通訊透過所有支援的 AVR 的 UART(或 ATmega32U4 和 AT90USB1286 USB 介面)。 它包含對 ADC、PWM、SPI、TWI 和 1-Wire 介面的支援,以及輸入捕獲功能(可選擇門控時間脈衝計數器)、透過單個埠位切換進行的方波直接數字合成 (DDS)、nRF24L01 RF 收發器以及 DHT 溫度和溼度感測器。 程式可以透過檔案系統儲存到 EEPROM 或從 EEPROM 載入,並且自啟動功能允許在啟動時自動執行儲存在 EEPROM 中的程式。 LUFA(DFU 和 CDC 模式)和 OptiBoot 引導載入程式已整合到專案中。 針對 ATmega88、ATmega168、ATmega328、ATmega2560、ATmega32U4 和 AT90USB1286,提供時鐘速度為 4、8、16 和 20 MHz 的預構建 HEX 檔案。 有提供帶和不帶 OptiBoot 載入程式(或 LUFA)的構建,以及用於 ATmega32U4 和 AT90USB1286 的 UART 或 USB 構建,用於序列 I/O。 提供完整的原始碼以及示例程式。 較舊的版本支援 ATMEGA163 和 ATMEGA8515/AT90S8515,以及 ATTINY2313/AT90S2313。
  • GCC 也支援 AVR 上的 C++。

C++ 的某些功能不適合在像 AVR 這樣的較小微型機上使用,因為實現它們需要大量的記憶體; 這些包括異常和模板。 然而,在使用適當的 C++ 子集時,生成的程式碼的大小與其 C 語言等效程式碼相當。 在 AVR 上使用 C++ 的一個著名例子是 Arduino

Forth

[edit | edit source]
  • ByteForth (wiki) (購買) - 包括一個(反)彙編器、模擬器、ISP 程式設計器,並支援幾乎所有迄今為止的 AVR 微控制器。 許多庫函式和示例程式。 它附帶一個完整的 (荷蘭語) 語言手冊。 但是,有一個包含速成課程的英語版本,包含在免費但完整的 2 KB 演示版本 中。 ByteForth 在 DOS 或支援工作 DOS 盒子的任何系統下執行,如 Linux、Windows 95、Windows 98SE 等。
  • amforth: ATmega forth 是一個適用於 AVR ATmega 微控制器的緊湊型 Forth。 它在 GPL 2 下發布,並以 ANS 94 為模型。
  • Avise (Atmel VIrtual Stack Engine) 是一個“修改版的 Forth 程式語言”。 Avise 僅以 HEX 檔案形式提供,以便程式設計到支援的 AVR 中; 原始碼不可用。 作者的網站還包括一些用於 Avise 的 PCB 佈局。
  • PFAVRpForth 到 AVR 的移植版本(GNU GPL)。
  • avrforth 是一個針對 Atmel AVR 系列微控制器的 16 位子例程執行緒 Forth 核心。
  • FlashForth 是一個針對 Atmel Atmega 系列微控制器的 16 位子例程執行緒 Forth 系統。
  • MikroForth 針對 ATtiny(文件為德語)
  • asforth 一個類似子例程執行緒 Forth 的系統

請注意,一些 Forth 環境在 AVR 上互動執行。 例如,Avise 在 AVR 的 UART0 上提供一個控制檯,該控制檯可以接受新的詞定義並執行操作。 PC 上不需要軟體(除了終端模擬器之外)。

  • NanoVM - 用 C 編寫的 Java 虛擬機器,適用於具有至少 8k 快閃記憶體的 Atmel AVR 微控制器。
  • MCU Java 原始碼 - Java 原始碼到 C 原始碼的轉換器,它允許用 Java 編寫 MCU 程式。

JavaScript

[edit | edit source]
  • Espruino - 一個適用於 STM32F1-F4 ARM Cortex 微控制器的 JavaScript 直譯器。
  • uLisp - 一個適用於 Arduino 的 Lisp 直譯器。 基於 Common Lisp 的子集,支援 ATmega328、ATmega2560 和 ATmega644/1284。

Pascal

[edit | edit source]
  • AVRco 開發環境 - IDE 還包括模擬器和帶有 JTAG-ICE 的 HLL 偵錯程式。 包含許多庫函式。
  • MikroPascal - 包含 AVR 特定的庫,以及幫助和示例。 免費版本程式碼限制為 4 KB。
  • 嵌入式 Pascal - 在 Windows 95、98 和 NT 下執行的 IDE。 語言擴充套件提供了在 Pascal 程式碼中混合 AVR 彙編的功能。

Python

[edit | edit source]
  • Micro Python 是 Python 3 程式語言的一個精簡而快速的實現,經過最佳化可以在微控制器上執行。
  • PyMite 是 Python 的一個子集,可以在“任何具有至少 64 KiB 程式記憶體和 4 KiB RAM 的 AVR 系列裝置上執行”。

參考資料

[編輯 | 編輯原始碼]

Atmel 官方網站

[編輯 | 編輯原始碼]

程式設計和教育網站

[編輯 | 編輯原始碼]

郵件列表和論壇

[編輯 | 編輯原始碼]
  • Muhammad Ali Mazidi - AVR 微控制器和嵌入式系統:使用匯編和 C, Pearson Education.
  • Dhananjay Gadre - 程式設計和定製 AVR 微控制器, McGraw-Hill, 2000.
  • Richard H. Barnett, Sarah A. Cox, Larry D. O'Cull - 嵌入式 C 程式設計和 Atmel AVR, Thomson Delmar Learning, 2002.
  • John Morton - AVR: 入門課程, Newnes, 2002.
  • Claus Kuhnel - AVR RISC 微控制器手冊, Newnes, 1998.
  • Joe Pardue - C 語言微控制器程式設計,以 ATMEL 的 AVR Butterfly 和免費的 WinAVR 編譯器為特色, Smiley Micros, 2005. Smiley Micros
  • Chuck Baird - 使用匯編語言程式設計微控制器, Lulu.com, 2006. cbaird.net
  • Richard H. Barnett - 嵌入式 C 程式設計和 Atmel AVR, Delmar Cengage Learning; 第 2 版 (2006 年 6 月 5 日)

大學課程

[編輯 | 編輯原始碼]

以下課程已知使用 Atmel AVR 作為課程的一部分。

大學課程

[編輯 | 編輯原始碼]

以下課程已知使用 Atmel AVR 作為課程的一部分。

AVR 專案

[編輯 | 編輯原始碼]
華夏公益教科書