0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ATmega芯片以及I/O引腳的簡單說明

454398 ? 來源:工程師吳畏 ? 2019-07-31 09:54 ? 次閱讀

原理圖

ATmega芯片以及I/O引腳的簡單說明

AVR Core

大多數(shù)ATmega設(shè)備的核心是AVR CPU,它被描述為RISC型CPU。然而,盡管是RISC CPU,AVR內(nèi)核可以說非常強(qiáng)大,并且與競爭器件(例如Microchip PIC系列)相比具有許多優(yōu)勢(shì)。

例如,AVR內(nèi)核包含通用的8位寄存器可以配對(duì)為內(nèi)存位置創(chuàng)建16位指針。此外,AVR內(nèi)核有超過130條指令,其中許多是單周期的(由于一級(jí)管道),并且沒有方案。

然而,AVR設(shè)備特別容易發(fā)生磚塊化用戶開始使用保險(xiǎn)絲(特定芯片選項(xiàng)),這就是為什么強(qiáng)烈建議您手頭有多個(gè)AVR設(shè)備。 AVR器件的另一個(gè)問題是如果沒有購買官方編程器,他們很難進(jìn)行芯片編程(例如與PICKIT3相比)。

盡管如此,AVR已成為最流行的微控制器之一,謝謝Arduino的發(fā)明,其核心包含ATmega。事實(shí)上,Arduino只是一個(gè)AVR微控制器,帶有一些特殊的啟動(dòng)加載代碼和一個(gè)USB轉(zhuǎn)串口轉(zhuǎn)換器。

以下是典型ATmega器件的內(nèi)部架構(gòu)(在我們的例子中,ATmega168) 。

I/O端口

了解微控制器的內(nèi)部工作情況很好,但知道如何讓芯片與外界交流是很好的。大多數(shù)微控制器(如果不是全部)都包含引腳,允許器件讀取和寫入外部電路的數(shù)字值。例如,LED可以連接到I/O(帶有串聯(lián)電阻),這將允許微控制器打開和關(guān)閉LED。另一個(gè)例子是一個(gè)開關(guān),它可以連接在引腳和電源之間,微控制器可以在檢測(cè)到開關(guān)被按下時(shí)執(zhí)行動(dòng)作。

當(dāng)然,微控制器可以連接到幾乎任何電路,并以您可能想象的任何方式與它進(jìn)行交互。但要做到這一點(diǎn),我們需要了解I/O端口如何在AVR設(shè)備上工作以及如何正確使用它們!

I/O端口包含三個(gè)寄存器:

DDRx - 端口x的數(shù)據(jù)方向寄存器

PINx - 從端口x讀取

PORTx - 寫入端口x

數(shù)據(jù)方向寄存器

數(shù)據(jù)方向寄存器(DDR)很可能是您配置的第一個(gè)寄存器,因?yàn)镈DR寄存器確定特定端口上的引腳是輸入還是輸出。 DDR寄存器長8位,每個(gè)位對(duì)應(yīng)I/O端口的引腳。

例如,DDRB的第一位(位0)將決定PB0是輸入還是輸出,最后一位(第7位)將確定PB7是輸入還是輸出。

在PIC器件中,值1用于輸入,值0用于輸出,但對(duì)于AVR器件則反之亦然; 1表示輸出,0表示輸入。因此,假設(shè)我們想要將PORT B上的所有引腳配置為輸出,我們只需使用以下代碼:

DDRB = 0xFF;

DDRB = 0b11111111;

第一個(gè)示例使用十六進(jìn)制,而第二個(gè)示例使用二進(jìn)制。雖然通常的做法是使用十六進(jìn)制,但二進(jìn)制版本可以更清楚地將端口中的哪些位用作輸入或輸出。如果我們想將PORT B上的所有引腳轉(zhuǎn)換為輸入引腳,那么我們可以使用。。.。。.

DDRB = 0x00;

DDRB = 0b00000000;

更復(fù)雜的事情怎么樣?假設(shè)您希望前兩個(gè)引腳為輸出(PB0和PB1),其余引腳為輸入。以下代碼可以解決這個(gè)問題:

DDRB = 0x03;

DDRB = 0b00000011;

PINx寄存器

我們的DDR寄存器排序out,是時(shí)候?qū)W習(xí)如何從現(xiàn)實(shí)世界中將數(shù)字值讀入微控制器。這是使用寄存器PINx完成的,其中x是要讀取的寄存器。從端口讀取相當(dāng)容易,如下面的代碼示例所示:

dataValue = PINB;

執(zhí)行此操作時(shí),PORT B上的所有引腳都被讀入dataValue,并且dataValue中的每個(gè)位現(xiàn)在將對(duì)應(yīng)于讀取時(shí)每個(gè)引腳上的數(shù)字電平。雖然這可能很有用,但我們有時(shí)可能希望同時(shí)測(cè)試單個(gè)位而不是所有位。在PIC中,.bits成員可用于訪問各個(gè)位,但AVR設(shè)備不是這種情況。相反,訪問單個(gè)位涉及一些操作(原諒雙關(guān)語),包括使用邏輯AND,OR和XOR。

要測(cè)試一個(gè)位是否打開(邏輯1),以下兩個(gè)可以使用語句。這些函數(shù)對(duì)PIN寄存器和位執(zhí)行邏輯AND(表示為8位數(shù))。如果結(jié)果為零,則不會(huì)執(zhí)行if語句,因?yàn)閕f語句僅在條件為非零時(shí)執(zhí)行。第一個(gè)語句使用二進(jìn)制值來表示要測(cè)試的位,而第二個(gè)語句使用邏輯移位指令來創(chuàng)建位掩碼,該掩碼表示要測(cè)試的位。邏輯移位版本可以說更具可讀性,因此更容易理解。但是,執(zhí)行該指令可能需要比第一次更長的時(shí)間(取決于優(yōu)化)。

if(PINB&(0b00000001))

if(PINB&(1 《

在主要測(cè)試(?。?/p>

if(?。≒INB&(0b00000001)))

或《之前使用否定運(yùn)算符可以輕松地測(cè)試邏輯0 br》 if(!(PINB&(1 《

PORTx寄存器

現(xiàn)在我們可以讀取整個(gè)端口和各個(gè)引腳,我們?nèi)绾螌懭攵丝诤蛦蝹€(gè)引腳?這是PORTx寄存器的用武之地。寫入該寄存器(其中x表示要寫入的端口)將導(dǎo)致輸出引腳打開或關(guān)閉。請(qǐng)記住,物理輸出引腳只有與PORTx寄存器IF對(duì)應(yīng)的數(shù)字電平,只有相應(yīng)的DDR位被設(shè)置為輸出!

將值寫入端口非常容易:

PORTB = 0xFF;

PORTB = 0b11111111;

但個(gè)別位怎么樣?這再次使用按位運(yùn)算符完成,并且設(shè)置/清除位稍微復(fù)雜一些。這是因?yàn)槲覀冃枰A鬚ORT寄存器中其他位的值,否則它們可能會(huì)被更改,如果它們連接到外部設(shè)備(如LED,顯示器,IC等),可能會(huì)導(dǎo)致意外行為。

要打開特定位,我們可以使用OR邏輯運(yùn)算符:

PORTB = PORTB | (0b00000001);打開位0

PORTB = PORTB | (1 《

要關(guān)閉特定位,我們使用AND運(yùn)算符和NOT運(yùn)算符(?):

PORTB = PORTB& ?(0b00000001);關(guān)閉位0

PORTB = PORTB& ?(1 《

要切換一點(diǎn)(以便它與以前相反)我們可以使用XOR運(yùn)算符:

PORTB = PORTB ^(0b00000001);切換位0

o r

PORTB = PORTB ^(1 《

引腳名稱

使用數(shù)字來表示引腳可能會(huì)導(dǎo)致某些不可讀代碼,這就是為什么WinAVR足夠好,可以包含一些我們可以使用的定義。請(qǐng)參閱以下示例:

PORTB = PORTB& ?(1 《

如果(PINC&(1 《

一個(gè)簡單的例子

在我們的例子中,我們將制作一個(gè)電路當(dāng)按下連接到PD1的開關(guān)時(shí),切換連接到PD0的LED。

/*

* AVR IO.c

*

* Created: 03/01/2018 11:25:21

* Author : RobinLaptop

*/

#define F_CPU 1000000UL

#include

#include

int main(void)

{

// Configure PORT D bit 0 to an output and bit 1 to an input

DDRD = 0b00000001;

// Main program loop

while (1)

{

// Wait until the switch found on PIND1 (bit 1)

if(PIND & (1 《《 PIND1))

{

// Toggle the LED found on PIND0

PORTD = PORTD ^ (1 《《 PIND0);

// Force a delay to prevent de-bounce!

_delay_ms(100);

// Wait until the button is released

while(PIND & (1 《《 PIND1));

}

}

}

結(jié)論

現(xiàn)在我們可以控制I/O引腳了,沒有理由不能在復(fù)雜控制器可以使用的項(xiàng)目中開始使用AVR。使用本文中的知識(shí),您可以創(chuàng)建一個(gè)鍵盤輸入系統(tǒng),一個(gè)復(fù)雜的7段顯示控制器,一個(gè)音樂系統(tǒng),甚至是一個(gè)基本的80年代風(fēng)格的計(jì)算機(jī)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ATmega
    +關(guān)注

    關(guān)注

    2

    文章

    79

    瀏覽量

    42773
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    直接I/O

    電子發(fā)燒友網(wǎng)站提供《直接I/O庫.pdf》資料免費(fèi)下載
    發(fā)表于 10-14 10:55 ?0次下載
    直接<b class='flag-5'>I</b>/<b class='flag-5'>O</b>庫

    物聯(lián)網(wǎng)中常見的I/O擴(kuò)展電路設(shè)計(jì)方案_IIC I/O擴(kuò)展芯片

    物聯(lián)網(wǎng)系統(tǒng)中為什么要使用 IIC I/O擴(kuò)展芯片 ??在物聯(lián)網(wǎng)系統(tǒng)中使用IIC(也稱為I2C)I/O
    的頭像 發(fā)表于 09-24 11:29 ?190次閱讀
    物聯(lián)網(wǎng)中常見的<b class='flag-5'>I</b>/<b class='flag-5'>O</b>擴(kuò)展電路設(shè)計(jì)方案_IIC <b class='flag-5'>I</b>/<b class='flag-5'>O</b>擴(kuò)展<b class='flag-5'>芯片</b>

    用SN6507優(yōu)化PLC I/O模塊的24V隔離電源設(shè)計(jì)應(yīng)用說明

    電子發(fā)燒友網(wǎng)站提供《用SN6507優(yōu)化PLC I/O模塊的24V隔離電源設(shè)計(jì)應(yīng)用說明.pdf》資料免費(fèi)下載
    發(fā)表于 09-12 09:52 ?0次下載
    用SN6507優(yōu)化PLC <b class='flag-5'>I</b>/<b class='flag-5'>O</b>模塊的24V隔離電源設(shè)計(jì)應(yīng)用<b class='flag-5'>說明</b>

    MSP430 I/O口驅(qū)動(dòng)段式LCD設(shè)計(jì)說明

    電子發(fā)燒友網(wǎng)站提供《MSP430 I/O口驅(qū)動(dòng)段式LCD設(shè)計(jì)說明.pdf》資料免費(fèi)下載
    發(fā)表于 08-30 10:39 ?0次下載
    MSP430 <b class='flag-5'>I</b>/<b class='flag-5'>O</b>口驅(qū)動(dòng)段式LCD設(shè)計(jì)<b class='flag-5'>說明</b>

    簡述計(jì)算機(jī)的I/O控制方式

    計(jì)算機(jī)的I/O(輸入/輸出)控制方式是計(jì)算機(jī)系統(tǒng)中至關(guān)重要的部分,它決定了CPU與外設(shè)之間數(shù)據(jù)交換的方式和效率。隨著計(jì)算機(jī)技術(shù)的不斷發(fā)展,I/O控制方式也經(jīng)歷了從
    的頭像 發(fā)表于 08-20 10:55 ?381次閱讀

    淺談如何克服FPGA I/O引腳分配挑戰(zhàn)

    形式顯示出PCB布局和FPGA物理器件引腳,以及內(nèi)部FPGA I/O點(diǎn)和相關(guān)資源。不幸的是,到今天為止還沒有單個(gè)工具或方法能夠同時(shí)滿足所有這些協(xié)同設(shè)計(jì)需求。然而,可以結(jié)合不同的技術(shù)和策
    發(fā)表于 07-22 00:40

    PLC的I/O點(diǎn)數(shù)是什么意思

    在工業(yè)自動(dòng)化領(lǐng)域中,可編程邏輯控制器(PLC)扮演著至關(guān)重要的角色。PLC以其高可靠性、易編程性和強(qiáng)大的控制功能,廣泛應(yīng)用于各種自動(dòng)化系統(tǒng)中。而在PLC的性能參數(shù)中,I/O點(diǎn)數(shù)是一個(gè)不可忽視的重要指標(biāo)。本文將對(duì)PLC的I/
    的頭像 發(fā)表于 06-27 11:15 ?2768次閱讀

    求助,關(guān)于CX3上未使用的I/O引腳簡單問題

    這是一個(gè)關(guān)于 CX3 上未使用的 I/O 引腳簡單問題。CYUSB306X 數(shù)據(jù)表(第 20 頁)建議 \" 應(yīng)使用內(nèi)部上拉電阻 \" 將所有未使用的
    發(fā)表于 02-22 06:55

    FANUC外部I/O點(diǎn)數(shù)不夠用了怎么辦?可以擴(kuò)展I/O點(diǎn)數(shù)嗎?

    連接起來,以便進(jìn)行輸入和輸出操作。每個(gè)I/O模塊都有一定數(shù)量的輸入和輸出點(diǎn)數(shù),這取決于具體的模塊型號(hào)。但是,當(dāng)您的應(yīng)用需要更多的I/O點(diǎn)數(shù)時(shí),您可以使用以下方法來擴(kuò)展: 1. 增加
    的頭像 發(fā)表于 02-18 15:21 ?1529次閱讀

    空調(diào)制熱原理簡單說明 空調(diào)制熱開輔熱和不開輔熱的區(qū)別

    空調(diào)制熱原理簡單說明: 空調(diào)制熱是利用空調(diào)系統(tǒng)中的制冷循環(huán)來實(shí)現(xiàn)的。制冷循環(huán)是根據(jù)熱力學(xué)原理,通過改變制冷劑的狀態(tài)變化,將室內(nèi)熱量轉(zhuǎn)移到室外,從而降低室內(nèi)溫度。而在冬季,我們需要提高室內(nèi)溫度,因此
    的頭像 發(fā)表于 02-04 15:08 ?806次閱讀

    應(yīng)用方案:MCU通用I/O引腳擴(kuò)展

    MCU通用I/O引腳擴(kuò)展 低端MCU由于I/O口數(shù)量不足導(dǎo)致部分功能無法實(shí)現(xiàn),用戶需要使用數(shù)字集成芯片
    發(fā)表于 01-08 09:35

    物理約束實(shí)踐:I/O約束

    I/O約束(I/O Constraints)包括I/O標(biāo)準(zhǔn)(
    的頭像 發(fā)表于 11-18 16:42 ?986次閱讀
    物理約束實(shí)踐:<b class='flag-5'>I</b>/<b class='flag-5'>O</b>約束

    Linux I/O 接口的類型及處理流程

    Linux I/O 接口 Linux I/O 接口可以分為以下幾種類型: 文件 I/O 接口:用
    的頭像 發(fā)表于 11-08 16:43 ?800次閱讀
    Linux <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 接口的類型及處理流程

    51單片機(jī)雙向I/O口與準(zhǔn)雙向I/O口解析

    通過前面的輸入輸出的內(nèi)容(LED控制與按鍵的使用),我們對(duì)控制I/O口有了一個(gè)基本的了解。如果需要輸出高低電平,可以對(duì)該引腳進(jìn)行寫"1"或者"0";如果需要讀取I/
    的頭像 發(fā)表于 10-31 17:50 ?6326次閱讀
    51單片機(jī)雙向<b class='flag-5'>I</b>/<b class='flag-5'>O</b>口與準(zhǔn)雙向<b class='flag-5'>I</b>/<b class='flag-5'>O</b>口解析

    I/O電路中電壓比較器與I/O信號(hào)完整性介紹

    在高速I/O電路設(shè)計(jì)中,輸入I/O的比較器是一個(gè)非常重要的模塊。
    的頭像 發(fā)表于 10-30 15:02 ?1481次閱讀
    <b class='flag-5'>I</b>/<b class='flag-5'>O</b>電路中電壓比較器與<b class='flag-5'>I</b>/<b class='flag-5'>O</b>信號(hào)完整性介紹