Базовое двоичное преобразование завершается неудачно на PIC - PullRequest
0 голосов
/ 19 ноября 2010

У меня есть следующий код, преобразующий дек. в двоичный файл (хранится как int), и он прекрасно работает в C :: B:

 for(i=0;i<8;i++)
   {
    carry = start_value%2;
    tab[bla] = carry;
    bla++;
    start_value = start_value/2;
   }

for(i=bla; i>0; i--)
       {
       binary = binary + tab[i]*pow(10,i);
       }

Но когда я пытаюсь сделать то же самое на PIC18F4550 с MikroC, это просто не получается! Я включил 'pow' и соблюдал объявления для переменных, которые я использую. Независимо от того, что, вывод неправильный (-62053 вместо 110110 например).

Спасибо, что заглянули в него :) Хорошего дня

Ответы [ 4 ]

0 голосов
/ 20 ноября 2010

jmpcm: На моем PIC18F значение int составляет 16 бит (2 байта). Но проблема в том, что код отлично работает на моем компьютере, но не на PIC, тогда как переменные, которые я использую, имеют одинаковый размер.

Филипп: У меня такое чувство, что вы можете быть правы насчет того, что стол не будет очищен! Пока не могу проверить это.

Жанна Пиндар: Нет. Я храню массив битов, с которыми мне нужно взаимодействовать, в int (необходимо сэкономить место в ОЗУ), поэтому мы все еще работаем над окончательным сохранением base10.

Все: Я справился с этим со структурой, для которой я определил все биты:

struct {
unsigned int bit0: 1;
unsigned int bit1: 1;
...

Таким образом, я могу хранить 1 бит в группе из 8 битов и рассматривать его как int в основных вычислениях и получать к нему доступ в матрице Nx1.

Спасибо за вашу помощь, тем не менее!

0 голосов
/ 19 ноября 2010

Проверьте размер типа int (sizeof(int)) для этой архитектуры PIC. Например, если int равен 16 битам, максимальное значение, которое он может содержать, составляет 65535 (для unsigned int) или от -32768 до 32767 (для int). Возможно, проблема в том, что вычисляемое вами значение слишком велико для используемого вами типа.

0 голосов
/ 19 ноября 2010

Чтобы получить десятичное значение из массива двоичных цифр, вы должны умножить их на соответствующие степени 2, а не 10. Предполагая, что pow () является тем, чем оно является, pow (base, exponent), вы нужно использовать pow (2, i) вместо.

0 голосов
/ 19 ноября 2010

Второй цикл следует начинать с i = bla - 1, поскольку он был увеличен на один раз больше, чем двоичные цифры.Также может быть, что tab[] не инициализируется в 0.

И второй цикл должен содержать первый элемент табуляции: tab [0]:

for(i = bla - 1; i >= 0; i--)
{
    binary += tab[i] * pow(10, i);
}
...