c - PIC 16F628 CC5X结构

标签 c pic

我使用 CC5X ​​编译器。 我用 16F628 PIC 写了一个用于语音和莫尔斯的业余 radio 鹦鹉。 我的程序从 A 到 9(128 - 或。)工作正常,但在 9 到结束后不工作。 我知道这一定是指针大小的问题,但无法解决。 我把 -mc2 分配给 const 访问的 16 位指针,但它是一样的。 如果您有什么建议。

我有一个莫尔斯码结构:

static const struct {
    const uns8 letter;
    const uns8 code[6];
}
MorseMap[] =
{
    { 'A', ".-" },
    { 'B', "-..." },
    { 'C', "-.-." },
    { 'D', "-.." },
    { 'E', "." },
    { 'F', "..-." },
    { 'G', "--." },
    { 'H', "...." },
    { 'I', ".." },
    { 'J', ".---" },
    { 'K', ".-.-" },
    { 'L', ".-.." },
    { 'M', "--" },
    { 'N', "-." },
    { 'O', "---" },
    { 'P', ".--." },
    { 'Q', "--.-" },
    { 'R', ".-." },
    { 'S', "..." },
    { 'T', "-" },
    { 'U', "..-" },
    { 'V', "...-" },
    { 'W', ".--" },
    { 'X', "-..-" },
    { 'Y', "-.--" },
    { 'Z', "--.." },
    { ' ', "x" }, // 

    { '1', ".----" },
    { '2', "..---" },
    { '3', "...--" },
    { '4', "....-" },
    { '5', "....." },
    { '6', "-...." },
    { '7', "--..." },
    { '8', "---.." },
    { '9', "----." }, // 128  car . and - OK to here
    { '0', "-----" }, // Here starts the bug

    { ',', "--..--" },
    { '?', "..--.." },
    { '!', "-.-.--" },
    { ':', "---..." },
    { ';', "-.-.-." },
    { '(', "-.--." },
    { ')', "-.--.-" },
    { '"', ".-..-." },
    { '@', ".--.-." },
    { '&', ".-..." },
    { '.', "·–·–·–" },
};

uns8 *j;    // my pointer to the structure

/*And a function to associate the code
void encode(uns8 lettre)     // encode la lettre à envoyer en morse*/
{
    uns8 a;
    for(j = 0; j < 46; j++)
    {
        a = MorseMap[j].letter;
        if(lettre == a)
        {
            code_morse[0] = MorseMap[j].code[0];
            code_morse[1] = MorseMap[j].code[1];
            code_morse[2] = MorseMap[j].code[2];
            code_morse[3] = MorseMap[j].code[3];
            code_morse[4] = MorseMap[j].code[4];
            code_morse[5] = MorseMap[j].code[5];
            code_morse[6] = '\0';
            break;
        }
    }
}

最佳答案

我使用选项 -a -mc2 -p16F628 使用 CC5X ​​Version 3.5C FREE edition 编译代码,并看到 ADDWF 用于计算MorseMap 的索引偏移量如下:

                        ;    {
                        ;        a = MorseMap[j].letter;
        CLRF  ci+1
        MOVF  j,W
        MOVWF ci
        ADDWF ci,W
        ADDWF ci,1
        ADDWF ci,1
        ADDWF ci,1
        CALL  _const1
        BCF   0x03,RP0
        BCF   0x03,RP1
        MOVWF a

当偏移量超过 256 时,这将导致溢出(回绕),并且它会发生在第 36 个元素(0-origin)上,因为每个元素占用 7 个字节。

此外,当我将 j 的类型更改为 uns8 时,出现“无法生成代码”错误。

将表拆分为大小为 256 字节或更小的两个表似乎是解决此问题的方法之一。

static const struct MorseMapEntry {
    const uns8 letter;
    const uns8 code[6];
}
MorseMap0[] =
{
    { 'A', ".-" },
    { 'B', "-..." },
    { 'C', "-.-." },
    { 'D', "-.." },
    { 'E', "." },
    { 'F', "..-." },
    { 'G', "--." },
    { 'H', "...." },
    { 'I', ".." },
    { 'J', ".---" },
    { 'K', ".-.-" },
    { 'L', ".-.." },
    { 'M', "--" },
    { 'N', "-." },
    { 'O', "---" },
    { 'P', ".--." },
    { 'Q', "--.-" },
    { 'R', ".-." },
    { 'S', "..." },
    { 'T', "-" },
    { 'U', "..-" },
    { 'V', "...-" },
    { 'W', ".--" },
    { 'X', "-..-" },
    { 'Y', "-.--" },
    { 'Z', "--.." },
    { ' ', "x" }, // 

    { '1', ".----" },
    { '2', "..---" },
    { '3', "...--" },
    { '4', "....-" },
    { '5', "....." },
    { '6', "-...." },
    { '7', "--..." },
    { '8', "---.." },
    { '9', "----." }
};

static const struct MorseMapEntry MorseMap1[] =
{
    { '0', "-----" },

    { ',', "--..--" },
    { '?', "..--.." },
    { '!', "-.-.--" },
    { ':', "---..." },
    { ';', "-.-.-." },
    { '(', "-.--." },
    { ')', "-.--.-" },
    { '"', ".-..-." },
    { '@', ".--.-." },
    { '&', ".-..." },
    { '.', ".-.-.-" },
};

uns8 j;    // my pointer to the structure
uns8 code_morse[7]; // buffer to store the result

/*And a function to associate the code*/
void encode(uns8 lettre)     // encode la lettre à envoyer en morse
{
    uns8 a;
    for(j = 0; j < 36; j++)
    {
        a = MorseMap0[j].letter;
        if(lettre == a)
        {
            code_morse[0] = MorseMap0[j].code[0];
            code_morse[1] = MorseMap0[j].code[1];
            code_morse[2] = MorseMap0[j].code[2];
            code_morse[3] = MorseMap0[j].code[3];
            code_morse[4] = MorseMap0[j].code[4];
            code_morse[5] = MorseMap0[j].code[5];
            code_morse[6] = '\0';
            break;
        }
    }
    // note: there are actually 48 elements in total, so 10 here should be 12 to scan all elements
    for(j = 0; j < 10; j++)
    {
        a = MorseMap1[j].letter;
        if(lettre == a)
        {
            code_morse[0] = MorseMap1[j].code[0];
            code_morse[1] = MorseMap1[j].code[1];
            code_morse[2] = MorseMap1[j].code[2];
            code_morse[3] = MorseMap1[j].code[3];
            code_morse[4] = MorseMap1[j].code[4];
            code_morse[5] = MorseMap1[j].code[5];
            code_morse[6] = '\0';
            break;
        }
    }
}

void main() {
    encode('?');
    for(;;);
}

(已编译,但未测试)

关于c - PIC 16F628 CC5X结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35364422/

相关文章:

c - 哪个c方言可以让GCC编译一些fun(...)?

c - 将c代码执行结果写入txt

embedded - 一根线问题

c - mikroc 中是否存在 rand() 函数?

c - eeprom 空间中的变量地址作为 C 中的函数参数

assembly - PIC16F887 Timer0计数溢出

embedded - 用于微芯片 pic32 的 Node.js

C 到 Delphi 翻译

c - 在 LLVM pass 中获取变量名

计算c char中每个单词的长度