新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR編程_位定義

        AVR編程_位定義

        作者: 時間:2016-11-23 來源:網絡 收藏
        Question
        在我的源代碼中如何進行位定義
        Answer

        我們總是在AVR器件數據手冊中推薦使用位定義的方式來編寫你的C或匯編源代碼。

        本文引用地址:http://www.104case.com/article/201611/320369.htm

        位定義與器件手冊的該位定義一致的話可以很方便的理解代碼的含義和讓其他人更好的理解你的代碼。同時,如果你需要移植你的代碼到其他的AVR器件,用位定義可以很方便的進行移植,因為不同的AVR器件的絕對地址和位的位置或許不同,但是位定義通常都保持一致。當移植一個設計,經常需要包含正確的定義文件。

        在不同的AVR器件的編譯器包含文件中,所有的I/O寄存器位命名和位置都被定義了。

        下面是一個Atmega16在WinAVR中的例子,iom16.h包含文件中TXEN(使能USART發送器)和RXEN位(使能USART接收器)定義如下:

        #define UCSRB _SFR_IO8(0x0A)
        #define TXEN 3 //Bit 3
        #define RXEN 4 //Bit 4

        因此,在代碼中,寫UCSRB = (1<

        另一個匯編和c代碼的例子如下:

        匯編代碼

        ***************************************************************
        ...
        ; Define pull-ups and set outputs high
        ; Define directions for port pins
        ldi r16,(1<ldi r17,(1<out PORTB,r16
        out DDRB,r17
        ; Insert nop for synchronization
        nop
        ; Read port pins
        in r16,PINB
        ...
        ***************************************************************

        C代碼
        ***************************************************************
        unsigned char i;
        ...


        PORTB = (1<DDRB = (1<
        asm("nop");

        i = PINB;
        ...
        ***************************************************************

        為了避免各多的附加功能和寄存器功能的沖突,不要訪問被標注為保留的寄存器位。保留的寄存器總是被寫為0。這能確保前向兼容性,同時當前未用的功能將都保持在默認的狀態。

        ____________________以下為老于添加,2009/06/07________________________

        讀取外部引腳電平時,應讀取PINX.n的值,比如,

        1)判斷PD6是否高電平:

        if(PIND & (1<<6))...

        2)等待PD6變為低電平,如判斷ADC轉換完成

        while( !(PIND & (1<<6) );

        或者寫成:

        while( (PIND & 0x40) == 0x40 );

        需要注意的是,在純粹軟件環境下,如VC,一個變量與一個常量與操作之后,往往會改變該變量的值,如

        unsigned char ch = 0xc0;

        unsigned char ch1 = ch & 0x40;

        此時ch1 = 0x40,其值已經改變。

        而讀取管腳的輸入狀態,PINX,或者讀取寄存器數據,如UCSR0A串口接收寄存器的內容,該數值與一個常量與操作之后,并不會改變其內容本身,即,下次再讀取PINX和UCSR0A,其值不會改變,除非硬件條件發生了改變它才會發生變化。這些變量依存于硬件環境。

        這也是初學者對變量,常量,位操作使用上容易混淆的問題所在。




        關鍵詞: AVR編程位定

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 舒城县| 剑河县| 张家港市| 阿坝| 北辰区| 翁源县| 台中市| 太康县| 宜城市| 宁蒗| 武安市| 穆棱市| 咸宁市| 临沭县| 百色市| 浦县| 阜康市| 正宁县| 万宁市| 平湖市| 凌海市| 麻江县| 衡阳市| 田林县| 高邮市| 霸州市| 册亨县| 金门县| 津南区| 安义县| 富顺县| 彩票| 盐源县| 游戏| 宁化县| 洛南县| 濉溪县| 靖江市| 嵊州市| 文登市| 萍乡市|