Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Страница 5 из 5 ПерваяПервая ... 2345
Показано с 41 по 43 из 43

Тема: вопрос по СИ

  1. #41
    Всем GD!
    To VOVA080808 .
    Владимир, у Вас ошибки начинаются с самой первой операции с массивом.
    MP[15]=S/0x8000 ; Результат этой операции будет всегда 0.


    Вам Геннадий уже указал на то, что во всех операциях происходит переполнение разрядной сетки. И именно по этой причине результат того, что он предложил, тоже всегда будет равен 0.
    MP [15] = (S & 0x8000) != 0; MP [15] будет всегда 0, потому, что результат логического умножения 0b11111111 & 0b1000000000000000=0 ;


    Z5=0b001000010000000 0;
    Результат этой операции совсем не тот, что Вы хотите, у Вас все переменные объявлены как unsigned short (unsigned char или 8 бит).
    После этой операции будет Z5=0b00000000; , потому что Z5 объявлена как 8-битная переменная, компилятор под эту переменную выделит только ОДИН байт в памяти переменных, и старшие биты 0b00100001 первоначального значения при присваивании будут потеряны - надо разместить 16 бит, а места только под 8 выделено;

    Все переменные у Вас объявлены как unsigned short Z1 , Z2 , Z3 , Z4 , Z5 , MP[16];Это значит что значения , которые они могут принимать лежат между 0 и 255. Если в результате операции над этими числами будет получено число более 255, то все значащие разряды старше 8-го в (в двоичной системе исчисления) будут потеряны. Если образно — то это выглядит как мультик у дяди билла, когда удаляешь файл — летит и испаряется в воздухе.
    К точно такому же результату приведет попытка операций когда идет арифметика 16 битных чисел с 8 битными числами (если компилятор не предусматривает автоматическое преобразование типов).
    MP[15]=S/0x8000 ;
    Именно поэтому, когда даже S=255 (максимальное значение) делить на 0х8000(32768d) получим число меньше 1, в целочисленной арифметике это 0.
    Поэтому, первое, что Вам надо сделать, это разобраться с ТИПАМИ целых переменных и преобразованием одного типа в другой. Всегда следить за возможностью переполнения разрядной сетки.
    В Шпаке это все есть, прочтите раз 30, на 31 раз наступит прояснение. Пока не наступит прояснение, дальнейшие действия будут напоминать блуждание в потемках.
    Для начала попробуйте все переменные объявить как unsigned int. Правда это не исключит возможность переполнения, т.к. у Вас числа очень большие, да и потом, когда наступит необходимость посылки в порт, который обычно в контролёре 8 бит, придется чтобы компилятор не ругался, делать преобразование типов:

    PORTC= (unsigned short) MP[k];
    Либо, если хотите работать в пределах unsigned short, то следите, чтобы на любом этапе вычислений операнды и результат не превышал 255d (0xFF).
    Изучите операции выделения отдельных битов (логическое умножение в Булевой алгебре, в СИ оператор &). Похоже, Вам именно эти операции так необходимы в Ваших исканиях.
    Николай.


  2. #42
    Cпасибо за советы !
    самое странное что эта "байда" работала внутри главной функции , но как отдельная ни в какую .

  3. #43
    //Если нужно побитно вывести двоичные числа в порт по SPI
    //Я бы сделал так:

    unsigned int Z1 , Z2 , Z3 , Z4 , Z5;
    unsigned int mask;
    //-------------------------------------------
    // вывод слова в порт В по SPI
    void raz(unsigned int data)
    { mask=0x8000; // set mask
    while(mask)
    {
    if (data&mask) // check bit
    PORTB.F0=1; // set data
    else
    PORTB.F0=0;
    Delay_ms(1);
    PORTB.F1=1; //
    Delay_ms(1);
    PORTB.F1=0;
    Delay_ms(1);
    mask>>=1; // shift mask
    };
    }
    //-------------------------------------------

    void main ()
    {
    Z5=0b101010101010101 0;
    //Z5=0b001000010000000 0;
    Z4=0b010100001100011 1;
    Z3=0b010000000000000 0;
    Z2=0b110000000000000 0;
    Z1=0b001000000000000 0;
    TRISB=0; // all PORTB output
    PORTB.F0=0; // PORTB0 SDATA
    PORTB.F1=0 ; // PORTB1 SCLK
    PORTB.F2=0 ; // PORTB2 FSYNC
    raz(Z5); // word 5 out
    raz(Z4); // word 4 out
    raz(Z3); // word 3 out
    raz(Z2); // word 2 out
    raz(Z1); // word 1 out
    PORTB.F2=1;
    Delay_ms(1);
    PORTB.F2=0;
    while(1)
    {
    };
    }
    //числа выводятся начиная со старшего бита.

Страница 5 из 5 ПерваяПервая ... 2345

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •