2018年1月2日 星期二

XC8 MCC使用注意事項

使用MCC設定Timer時,不要使用Callback function,以免轉跳後工作太多造成Uart接收逾時

使用MCC產生EE, Flash操作時,生成的Code有錯,變更NVMREG後沒切回來,會造成程式錯誤

NVMCON1bits.NVMREG = 0;
NVMCON1bits.NVMREG = 2;
​

2017年12月20日 星期三

狀態機方式分析INI檔案

使用狀態機方式來拆分INI檔案,取出Group、Key Name、 Key Value等值
可用於字串解析
其中,註解以;開始,CRLF結束
INI範例:
; for 16-bit app support
[fonts]

[extensions]

[mci extensions]

[files]

[MCI Extensions.BAK]
aif=MPEGVideo
aifc=MPEGVideo

[annie]
CaptureFile=
VideoDevice=0
AudioDevice=0
FrameRate=333333

[SciCalc]
layout=0
static void ini_parse (char* buffer, char comment_char, char delim_char)
{
    char* p = buffer;
    char* group_start = NULL;
    char* key_start   = NULL;
    char* value_start = NULL;

    // 解析用的狀態
    enum _State
    {
        STAT_NONE = 0,
        STAT_GROUP,
        STAT_KEY,
        STAT_VALUE,
        STAT_COMMENT
    }state = STAT_NONE;

    // 掃描整個文件內容
    for(p = buffer; *p != '/0'; p++)
    {
        switch(state)
        {
            case STAT_NONE:
            {
                if(*p == '[')
                {
                    // 進入Group狀態
                    state = STAT_GROUP;
                    group_start = p + 1;
                }
                else if(*p == comment_char)
                {
                    // 注釋字元
                    state = STAT_COMMENT;
                }
                else if(!isspace(*p))
                {
                    // 掃到Key值
                    state = STAT_KEY;
                    key_start = p;
                }
                break;
            }
            case STAT_GROUP:
            {
                // Group狀態結束
                if(*p == ']')
                {
                    *p = '/0';
                    state = STAT_NONE;
                    strtrim(group_start);
                    printf("[%s]/n", group_start);
                }
                break;
            }
            case STAT_COMMENT:
            {
                // 注釋狀態結束
                if(*p == '/n')
                {
                    state = STAT_NONE;
                    break;
                }
                break;
            }
            case STAT_KEY:
            {
                // Key名稱讀取完成,開始讀取其值
                if(*p == delim_char || (delim_char == ' ' && *p == '/t'))
                {
                    *p = '/0';
                    state = STAT_VALUE;
                    value_start = p + 1;
                }
                break;
            }
            case STAT_VALUE:
            {
                // 讀取Key值
                if(*p == '/n' || *p == '/r')
                {
                    *p = '/0';
                    state = STAT_NONE;
                    strtrim(key_start);
                    strtrim(value_start);
                    printf("%s%c%s/n", key_start, delim_char, value_start);
                }
                break;
            }
            default:break;
        }
    }

    if(state == STAT_VALUE)
    {
        strtrim(key_start);
        strtrim(value_start);
        printf("%s%c%s/n", key_start, delim_char, value_start);
    }

    return;
}
​

2014年11月20日 星期四

Microchip C18-Bootloader設定

本文簡述如何在MPLAB C18環境中,將專案檔的起始位址改為0x1000,使Debug、Release時可不必額外設定
其實改用XC8後,用到的機會應該不多了,但還是當作歸檔,稍微記錄一下

概念:

調整C018i中的進入點,設備上電、由0x00開始執行後後,初始化完成即轉跳至0x1000,interrupt則轉跳至0x1008
關鍵字:Linker script、C018i.c、Hexmate、remap

c018x.c簡單說明

負責將做些預設初始化、轉跳至Main():
檔名 說明
c018i.o 有初始化
c018i_e.o 有初始化,延伸模式
c018.o 無初始化
c018_e.o 無初始化,延伸模式

步驟:

1. 修改c018i.c
找出c018i.c,複製一份至專案檔下,並由MPLAB加入該檔案
void _entry(void)中之轉跳位址由_startup改為0x1000
在_entry下面新增:
#pragma code High_IV = 0x0008
void High_ISR (void)
{
     _asm goto 0x1008 _endasm
}
#pragma code
2. 修改Linerscript(以18F67k22為例)
CODESTART段中,新增:(注意DEBUG與RELEASE都要設定)
CODEPAGE NAME=bootloader START=0x0 END=0xFFF PROTECTED
CODEPAGE NAME=vectors START=0x1000 END=0x1029 PROTECTED
CODEPAGE NAME=page START=0x102A END=0x1FBFF (原有項目)
-新增booloader與vectors所佔的空間(新的中斷指定在0x1000-0x1029間
將FILES c018i_e.o註解掉,使專案直接使用我們import的c018i.c檔案
3. 修改Main.c檔,在最上方新增:
extern void _startup (void);
#pragma code Remap_RESET_VECTOR = 0x1000
void Remap_entry (void)
{
    _asm goto _startup _endasm
}
​

2012年9月2日 星期日

消失中的書店

到儒林書局晃了一下,其實不常走進去,但它就要關門了。

新聞說書街的店減少了多少間,看起來是讓人滿傷心的事,但似乎又是個必然。

走在儒林裡,店裡看來相當老舊,書也一樣,沒有太多新書,書架上看到一本dos6.0的書,及許多早就被淘汰的電腦書籍。站在收銀台前的老闆娘也顯得也些老態,店裡散發著一股陳舊的氣息。

知識會過時,書店裡看來充滿了書,但有意義的資訊量其實不如想像,且各種相互矛盾的觀點充斥其間,「追求卓越」、「第二名哲學」、「老三哲學」,「放牛班的奇蹟」,每個人都振振有詞,彷彿只有自己說的是真理。「xxx的成功哲學」也有無數版本,似乎看了就能再創他們的成功奇跡,但你其實不能肯定作者知不知道自己在說什麼。

出書變得太容易,也讓書的價值不斷降低,隨興的一個觀點,沒有驗証就好像是個專家一樣想指導別人,3分鐘學會50音、5分鐘學會說英文、21天教你學會C++,讓人對這些「作家」的專業程度存疑。

「大師」、「宗師」、「上師」,「達人」、書名上充滿各種了不起的頭銜,要教你這樣思考、那樣行事。封面照片中個個英俊瀟灑、美麗動人、眼神散發著智慧的光輝,翻開內頁後不得了,紙質光滑、圖片清析、排版悅目,一看內文卻是不知所云,邏輯不通,只好默默閤上放回原處。

人們買書變得少了,但其實有價值的書也少了,值得放在家裡的書,總是會有人買,即使放在書架後很少翻開。只靠標題聳動吸引人的書,一般都沒有收藏價值,事件熱潮一過,便成為一堆廢紙。

書市冷清的原因很多,對書的作者、讀者,及書局的經營者來說,都有須要面對的問題,書店在減少,但會不會消失,大概只能說:該活的,還是活下來 了。
 

XC8 MCC使用注意事項

使用MCC設定Timer時,不要使用Callback function,以免轉跳後工作太多造成Uart接收逾時 使用MCC產生EE, Flash操作時,生成的Code有錯,變更NVMREG後沒切回來,會造成程式錯誤 NVMCON1bits.NVMREG = 0 ; NV...