首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >图16F628 CC5X结构

图16F628 CC5X结构
EN

Stack Overflow用户
提问于 2016-02-12 21:58:48
回答 2查看 195关注 0票数 1

我使用CC5X编译器。我用16F628的PIC写了一个用于语音和摩尔斯电文的业余无线电鹦鹉。我的程序从A到9 (128或.)运行良好。但是在9点之后就不工作了。我知道这一定是一个大小的指针问题,但解决不了它。我将-mc2分配给常量访问的16位指针,但这是相同的。如果你有什么建议。

我有一个摩尔斯电码的结构:

代码语言:javascript
运行
复制
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;
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2016-02-13 00:38:18

我使用带有选项-a -mc2 -p16F628的CC5X版本3.5C免费版编译了代码,只做了一些修改,发现ADDWF用于计算MorseMap索引的偏移量,如下所示:

代码语言:javascript
运行
复制
                        ;    {
                        ;        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时,我得到了"Unable to generate code“错误。

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

代码语言:javascript
运行
复制
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(;;);
}

(已编译,但未测试)

票数 0
EN

Stack Overflow用户

发布于 2016-02-20 22:47:01

正如你所说,这是一个大小问题。结构声明应该是

代码语言:javascript
运行
复制
struct MorseMapEntry{
    const uns8 letter;
    const uns8 code[7];
}

0之后的第一个字符串是

代码语言:javascript
运行
复制
{ ',', "--..--" },  

包括空终止符在内是7个字符。您只分配了6个字符,这意味着您还必须在编码中添加一个额外的字符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35364422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档