zealot 发表于 2023-9-8 11:55:24

奇怪,stc8g1k08的程序到了stc8h1k08上面,EEP相关程序不动了

8G和8H最大的差别是(至少就我的认识)
8G有PCA,没有高级PWM,
而8H有高级pwm而没有PCA,

除此之外,看pdf这2个芯片几乎是一样的,
差异部分经过修改,用PWM替代PCA部分动起来了,
但是之前在8G上正常运行的EEP读写却失效了,有点莫明其妙.


乘风飞扬 发表于 2023-9-8 17:06:49

烧录附件例程到芯片里测一下试试看

zealot 发表于 2023-9-11 17:02:01

莫名其妙的解决了,虽然仍然运行不稳定,但是初步解决了,
原因是IAP操作后要2个nop,1个nop不行,原因不明

神农鼎 发表于 2023-9-11 21:42:18

你程序贴出来大家看看,没这个要求啊

zealot 发表于 2023-9-12 10:27:09

本帖最后由 zealot 于 2023-9-12 10:37 编辑

读eep用的movc,这基本没有什么可以说,出问题的可能也不大,忽略.
主要是写和擦的部分吧.

擦:
// void erase_page(u8 Addr);    // Addr是地址,要清除第一页,Addr为第一页内任意地址(原则上可以随意指定,实际上必须页头00位)
void erase_page(void){
    IAP_CONTR = 0b10000000; // IAPEN x x CMD_FAIL x x x x
    IAP_TPS = 24;            // system on 24M.
    IAP_ADDRL = 0; IAP_ADDRH = 0;
    IAP_CMD = 3;            // 00 nop; 01 read(movc更好); 10Write; 11Erase;
    IAP_TRIG = 0x5A; IAP_TRIG = 0xA5;
    __asm
    nop
    nop                   // 2nop系统正常,删除第2nop,eep就崩了
    __endasm;
}

数据写入eep:
void SaveData2EEP(void){
    // 此子程序耗时超长,甚至到xx ms(毫秒)的程度,
    // 保存所有数据从Xram(或者全局变量设置等)到EEP, 包括xxxx 总之就是保存数据到EEP的意义.
    EA=0;// TPOff(); //Disable_accessEXxram();
    erase_page();       // 清除所有数据
    __asm
// 这里和eep无关,删除了.基本是数据处理
    // 数据都在Xram里面了,循环写到EEP里面.
    mov   r0, #0
    mov   r1, #16
1$:
    movx    a, @r0
    mov   _IAP_CONTR, #0x80
    mov   _IAP_TPS, #24
    mov   _IAP_DATA, a
    mov   _IAP_ADDRL, r0
    mov   _IAP_ADDRH, #0
    mov   _IAP_CMD, #2
    mov   _IAP_TRIG, #0x5A
    mov   _IAP_TRIG, #0xA5
    nop
    nop                   // 2nop系统正常,删除第2nop,eep就崩了
    inc   r0
    djnz    r1, 1$
    __endasm;
    IAP_DATA=0; IAP_ADDRL=0; IAP_ADDRH=0x80; IAP_CMD=0; IAP_CONTR=0; IAP_TRIG=0;      // set IAP system to Idle.
    EA=1;
}



zealot 发表于 2023-9-12 10:36:14

注意,这里的C和asm都是sdcc风格,不是kali风格,因为我这里编译是通过,并且连警告都没有的,基本上领会思想就好,格式问题忽略掉吧.

zealot 发表于 2023-9-13 16:00:32

读eep的部分,不过应该没有用

void ReadEEPdata(void){
        EA=0;// TPOff(); //Disable_accessEXxram();

        // 直接汇编写,省的概念混淆.
        // 从EEP到XRAM
        __asm

        // eep地址0,对应movc其实是0x2000
        mov                dptr, #0x2000
        mov                r0, dpl
        // Xram地址正常
        mov                r1, #0
        // 总共16个数据,其实没有那么多,但是先多预一点
        mov                r3, 16
1$:
        mov                dpl, r0
        clr                a
        movc        a, @a+dptr
        movx        @r1, a
        inc                r0
        inc                r1
        djnz        r3, 1$

        // 读EEP完成,开始解析XRAM中的数据
        mov                r0, #a1
        movx        a, @r0
        mov                _a1, a
        inc                r0
        movx        a, @r0
        mov                _a1+1, a
        mov                r0, #a2
        movx        a, @r0
        mov                _a2, a
        inc                r0
        movx        a, @r0
        mov                _a2+1, a
        mov                r0, #addr_a3bit
        movx        a, @r0
        mov                c, acc.0
        mov                _a3bit, c
        mov                r0, #a4
        movx        a, @r0
        mov                _a4, a
        __endasm;
        EA=1;
}
页: [1]
查看完整版本: 奇怪,stc8g1k08的程序到了stc8h1k08上面,EEP相关程序不动了