2016-02-12 3 views
1

Я использую компилятор CC5X. Я пишу радиолюбителя по радио для речи и морзе с 16F628 ПОС. Моя программа отлично работает от A до 9 (128 - или.), Но не работает после 9 до конца. Я знаю, что это должен быть размер указателя, но он не может его решить. Я положил -mc2, чтобы назначить 16-битные указатели для доступа к const, но это то же самое. Если у вас есть совет.PIC 16F628 Структура CC5X

У меня есть-структуру для Морзе:

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; 
     } 
    } 
} 
+0

Я думаю, что код также подходит для 0. – LPs

+0

Просто удалил мой ответ, поскольку он кажется неправильным .. Как определяется «code_morse»? –

+0

Не знаю о CC5X, сравнивая указатель 'j' с целым числом' 46' является плохим в нормальном C. – MikeCAT

ответ

0

я скомпилированный код с несколькими модифицирования CC5X Version 3.5c Free Edition с опцией -a -mc2 -p16F628, и увидел, что 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-происхождения), поскольку каждый элемент потребляет 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(;;); 
} 

(компилируется, но не тестировалось)

0

Как вы сказали, это проблема размера. Структура декларация должна быть

struct MorseMapEntry{ 
    const uns8 letter; 
    const uns8 code[7]; 
} 

первая строка после 0 является

{ ',', "--..--" }, 

, который, в том числе нулевой терминатор 7 символов. Вы выделяете только 6. Это означает, что вам также придется добавить один дополнительный символ в кодировку.