1. 程式人生 > >PIC微控制器之注意事項

PIC微控制器之注意事項

MPLAB IDE v8.92  只能支援英文目錄,所以一般而言是把相應的工程拷到D盤中,然後開啟編譯,最後如果想要儲存工程,應該拷回想要儲存的位置

當在中文目錄中會出現“找不到指定路徑”的錯誤,如下:

關於超大陣列問題:

本實驗用的編譯器是xc16-gcc.exe,整合開發環境是MPLAB IDE v8.92,當前的編譯器配置如下:

-g -Wall -mlarge-code -mlarge-data -Os -fno-ivopts

如下圖:

其中這裡有一個超大的陣列:

這時候編譯會有這樣的一個錯誤:

從提示可以知道,這是一個數據超出的錯誤,但是這裡是超出了資料段,而不是說超出了晶片的flash,我們可以這樣檢視是否超過了flash,去掉這個陣列編譯看看佔用了多少flash,如下:

也就是說佔用的flash空間是:81459+7674=89133,但是微控制器的flash卻是這樣的:

所以即是加上陣列的35408也是124541並沒有超出flash,所以這個錯誤完全是編譯器的問題,從網上收到這個文章:

http://electronics.stackexchange.com/questions/25878/epmp-on-pic24fj128da210

其中有關鍵的提示:

所以這裡增加-mlarge-arrays這個編譯命令,如下:

這時候的編譯結果如下所示:

從網上找到這個辦法:

http://www.microchip.com/forums/m621857.aspx

其中的關鍵的地方是這樣的:

在檔案中修改如下:

這時候編譯結果如下:

編譯成功了,要說明的是,如果陣列再增大到一定的程度,如下

這時候又會出現新的錯誤,本人決定去弄一張更小的圖片吧,不要那麼大的圖片了,所以這個錯誤將不再深究,錯誤如下:

從這裡看,或許真的是因為溢位flash了

注意:上面只是說明了怎麼裝資料,並沒有說明怎麼使用資料,下面的函式給出了一個怎麼使用這個陣列資料的說明:

void show_photo(unsigned short int StartX, unsigned short int StartY, __prog__ unsigned char *BmpAddress)
{
    __prog__ HEADCOLOR *BmpHeadr;
    unsigned short int Width, Height,Column,row;
    __prog__ unsigned char *BmpData;
    BmpHeadr = (__prog__ HEADCOLOR *)BmpAddress;
    Width = BmpHeadr->w;    //177
    Height = BmpHeadr->h;   //100
    BmpData = (__prog__ unsigned char *)(BmpAddress + sizeof(HEADCOLOR));    //sizeof表示該陣列記憶體的多少 單位是位元組 算出畫素資料在陣列中的偏移
    LCD_SetPos(StartX,StartX+Width-1,StartY,StartY+Height-1);
    for(Column=0;Column<Height;Column++)
    {
        for(row=0;row<Width;row++)
        {
            Write_Data(*(__prog__ unsigned short int *)BmpData);
            BmpData +=2;
        }
    }
}

一定要注意這時候使用的是__prog__型別,而不是const型別

下面是這個函式的呼叫方法:

show_photo(0,0,gImage_100X177);

這個陣列的定義是這樣的:

__prog__ unsigned char gImage_100X177[35408] __attribute__((space(prog)))= { 0X00,0X10,0XB1,0X00,0X64,0X00,0X01,0X1B,
0XDD,0XC6,0XDD,0XC6,0XFE,0XC6,0XFD,0XCE,0XFD,0XCE,0XFE,0XCE,0X1E,0XCF,0X1E,0XCF,
0X1E,0XCF,0X1E,0XCF,0X1E,0XC7,0X1E,0XCF,0X1E,0XCF,0X3E,0XD7,0X3E,0XD7,0X3E,0XD7,
0X3E,0XD7,0X3E,0XD7,0X3E,0XD7,0X3E,0XD7,0X3E,0XD7,0X3E,0XCF,0X3E,0XC7,0X1E,0XC7,
0X1E,0XC7,0X1E,0XC7,0X1E,0XC7,0X3E,0XC7,0X3E,0XC7,0X3E,0XCF,0X3E,0XCF,0X5E,0XCF,
0X5F,0XCF,0X3E,0XCF,0X3E,0XCF,0X3E,0XCF,0X3F,0XCF,0X3E,0XC7,0X3F,0XCF,0X3F,0XCF,
0X3F,0XC7,0X5F,0XCF,0X5F,0XCF,0X5F,0XCF,0X5E,0XCF,0X5F,0XCF,0X5F,0XCF,0X5F,0XCF,

現在我們可以看看實驗效果了:

下面上傳本實驗的程式,這個程式的主晶片是PIC24FJ256DA210,液晶型號是S663DE,模組型號是深圳愛維信公司的IGF240320MC28N01

程式碼用好壓軟體分成了兩份壓縮檔案:

http://download.csdn.net/detail/chengdong1314/9552679

http://download.csdn.net/detail/chengdong1314/9552680

下面是取模軟體和圖片:

http://download.csdn.net/detail/chengdong1314/9552683