我使用CC5X编译器。我用16F628的PIC写了一个用于语音和摩尔斯电文的业余无线电鹦鹉。我的程序从A到9 (128或.)运行良好。但是在9点之后就不工作了。我知道这一定是一个大小的指针问题,但解决不了它。我将-mc2分配给常量访问的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;
}
}
}发布于 2016-02-13 00:38:18
我使用带有选项-a -mc2 -p16F628的CC5X版本3.5C免费版编译了代码,只做了一些修改,发现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时,我得到了"Unable to generate code“错误。
将表拆分为两个大小为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(;;);
}(已编译,但未测试)
发布于 2016-02-20 22:47:01
正如你所说,这是一个大小问题。结构声明应该是
struct MorseMapEntry{
const uns8 letter;
const uns8 code[7];
}0之后的第一个字符串是
{ ',', "--..--" }, 包括空终止符在内是7个字符。您只分配了6个字符,这意味着您还必须在编码中添加一个额外的字符。
https://stackoverflow.com/questions/35364422
复制相似问题