ATMEL公司有基於8051內核、基於AVR內核和基於ARM內核的三大系列單片機產品。
先進的EEPROM電可擦除和Flash ROM閃速存儲器技術。
8051單片機采用復雜指令系統:CISC;由於CISC結構存在指令系統不等長,指令數多,CPU利用效率低,執行速度慢等缺陷;AVR單片機采用精簡指令系統:RISC;RISC采用流水線操作(Pipelining),和等長指令體系結構。
AVR單片機吸取了PIC及8051等單片機的優點,改進:
1、程序存儲器為價格低廉、可擦寫1萬次以上、指令長度單元為16位(字)的FlashROM(即程序存儲器寬度為16位,按8位字節計算時應乘2)。而數據存貯器為8位。因此AVR還是屬於8位單片機。
2、采用CMOS技術和RISC架構,實現高速(50ns)、低功耗(μA)、具有SLEEP(休眠)功能。AVR的一條指令執行速度可達50ns(20MHz),而耗電則在1uA~2.5mA間。AVR采用Harvard結構,以及一級流水線的預取指令功能,即對程序的讀取和數據的操作使用不同的數據總線,因此,當執行某一指令時,下一指令被預先從程序存儲器中取出,這使得指令可以在每一個時鍾周期內被執行。
3、工業級產品。具有大電流10~20mA(輸出電流)或40mA(吸電流)的特點,可直接驅動LED、SSR或繼電器。有看門狗定時器(WDT)安全保護,可防止程序走飛,提高產品的抗干擾能力。
4、通用數字I/O口的輸入輸出特性與PIC的HI/LOW輸出及三態高阻抗HI-Z輸入類同,同時可設定類同與8051結構內部有上拉電阻的輸入端功能,便於作為各種應用特性所需(多功能I/O口),AVR的I/O口是真正的I/O口,能正確反映I/O口的輸入/輸出的真實情況。
5、像8051一樣,有多個固定中斷向量入口地址,可快速響應中斷,而不是像PIC一樣所有中斷都在同一向量地址,需要以程序判別后才可響應,這會浪費且失去控制時機的最隹機會。
單片機結構:
AVR單片機特點(ATmega16):
1、131條機器指令,且大多數指令的執行時間為單個系統時鍾周期;
2、32個8位通用工作寄存器;
3、工作在16MHz時具有16MIPS的性能;
4、配備只需要2個時鍾周期的硬件乘法器。
IO口:
四個端口的第一功能是通用的雙向數字輸入/輸出(I/O)口,其中每一位都可以由指令設置為獨立的輸入口,或輸出口。當I/O設置為輸入時,引腳內部還配置有上拉電阻,這個內部的上拉電阻可通過編程設置為上拉有效或上拉無效。
如果AVR的I/O口設置為輸出方式工作,當其輸出高電平時,能夠輸出20mA的電流,而當其輸出低電平時,可以吸收40mA的電流。因此AVR的I/O口驅動能力非常強,能夠直接驅動LED發光二極管、數碼管等。而早期單片機I/O口的驅動能力只有5mA,驅動LED時,還需要增加外部的驅動電路和器件。
芯片Reset復位后,所有I/O口的缺省狀態為輸入方式,上拉電阻無效,即I/O為輸入高阻的三態狀態。
系統時鍾:
ATmega16的片內含有4種頻率(1/2/4/8M)的RC振盪源,可直接作為系統的工作時鍾使用。同時片內還設有一個由反向放大器所構成的OSC(Oscillator)振盪電路,外圍引腳XTAL1和XTAL2分別為OSC振盪電路的輸入端和輸出端,用於外接石英晶體等,構成高精度的或其它標稱頻率的系統時鍾系統。
為ATmega16提供系統時鍾源時,有三種主要的選擇:(1)直接使用片內的1/2/4/8M的RC振盪源;(2)在引腳XTAL1和XTAL2上外接由石英晶體和電容組成的諧振回路,配合片內的OSC(Oscillator)振盪電路構成的振盪源;(3)直接使用外部的時鍾源輸出的脈沖信號。方式2和方式3的電路連接見圖2-6(a)和2-6(b)。
內部看門狗:
在AVR片內還集成了一個1MHz獨立的時鍾電路,它僅供片內的看門狗定時器(WDT)使用。因此,AVR片內的WDT是獨立硬件形式的看門狗,使用AVR可以省掉外部的WDT芯片。使用WDT可以有效的提高系統的可靠行。
工作流程:
AVR CPU的工作是由系統時鍾直接驅動的,在片內不再進行分頻。圖2-7所示為Harvard結構和快速訪問寄存器組的並行指令存取和指令執行時序。CPU在啟動后第一個時鍾周期T1取出第一條指令,在T2周期便執行取出的指令,並同時又取出第二條指令,依次進行。這種基於流水線形式的取指方式,使AVR可以以非常高的速度執行指令,獲得高達1MIPS/MHz的效率。
存儲器:
所有的I/O寄存器可以通過IN(I/O口輸入)和OUT(輸出到I/O口)指令訪問,這些指令是在32個通用寄存器與I/O寄存器空間之間傳輸交換數據,指令周期為1個時鍾周期。此外,I/O寄存器地址范圍在$00-$1F之間的寄存器(前32個)還可通過指令實現bit位操作和bit位判斷跳轉。SBI(I/O寄存器中指定位置1)和CBI(I/O寄存器中指定位清零)指令可直接對I/O寄存器中的每一位進行位操作。使用SBIS(I/O寄存器中指定位為1跳行)和SBIC(I/O寄存器中指定位為0跳行)指令能夠對這些I/O寄存器中的每一位的值進行檢驗判斷,實現跳過一條指令執行下一條指令的跳轉。
在I/O寄存器專用指令IN、OUT、SBI、CBI、SBIS和SBIC中使用I/O寄存器地址$OO~$3F。
當以SRAM方式尋址I/0寄存器時,必須將該其地址加上$0020,映射成在數據存儲器空間的地址。
兩個重要的寄存器:狀態寄存器SREG和堆棧指針寄存器SP
堆棧是數據結構中所使用的專用名詞,它是由一塊連續的SRAM空間和一個堆棧指針寄存器組成,主要應用於快速便捷的保存臨時數據、局部變量和中斷調用或子程序調用的返回地址。堆棧在系統程序的設計和運行中起者非常重要的作用,只要程序中使用了中斷和子程序調用,就必須正確的設置堆棧指針寄存器SP,在SRAM空間建立堆棧區。
處在I/O地址空間的$3E($005E)和$3D($005D)的兩個8位寄存器構成了AVR單片機的16位堆棧指針寄存器SP。AVR單片機復位后堆棧寄存器的初始值為SPH=$00、SPL=$00,因此建議用戶程序必須首先對堆棧指針寄存器SP進行初始化設置。
AVR的堆棧區是建立在SRAM空間的,16位的SP寄存器可以尋址的空間為64K。
由於AVR的堆棧是向下增長的,即新數據進入堆棧時棧頂指針的數據將減小(注意:這里與51不同,51的堆棧是向上增長的,即進棧操作時棧頂指針的數據將增加),所以盡管原則上堆棧可以在SRAM的任何區域中,但通常初始化時將SP的指針設在SRAM最高處。
對於具體的ATmega16芯片,堆棧指針必須指向高於$0060的SRAM 地址空間,因為低於$0060的區域為寄存器空間。ATmega16片內集成有1K的SRAM,不支持外部擴展SRAM,所以堆棧指針寄存器SP的初始值應設在SRAM的最高端:$045F處。
根據上面所講述,AVR的SP堆棧指針寄存器指示了在數據SRAM中堆棧區域的棧頂地址,一些臨時數據、局部變量,以及子程序返回地址和中斷返回地址將被放置在堆棧區域中。在數據SRAM中,該堆棧空間的頂部地址必須在系統程序初始化時由初始化程序定義和設置。
當執行PUSH指令,一個字節的數據被壓入堆棧,堆棧指針(SP中的數據)將自動減1;當執行子程序調用指令CALL或CPU響應中斷時,硬件會自動把返回地址(16位數據)壓入堆棧中,同時將堆棧指針自動減2。反之,當執行POP指令,從堆棧頂部彈出一個字節的數據,堆棧指針將自動加1;當執行從子程序RET返回或從中斷RETI返回指令時,返回地址將從堆棧頂部彈出,堆棧指針自動加2。