Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите разобраться с кодом для 74HC595
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
lol483
Здравствуйте, прошу помощи в следующей проблеме: написал кусочек кода для будущих часов на газоразрядных индикаторах с применением регистра последовательного сдвига 74HC595
и столкнулся с непонятным моментом, на осциллографе на соответствующих ножках МК: DS-постоянно 1, SH_CP-постоянно 1, ST_CP-постоянно 0. В соответствии с прикрепленной прошивкой там должны быть определенные колебания. Расскажите что в коде не так, в чем проблема?
Genadi Zawidowski
В строке
Цитата
выводим "текущий бит" в линию DS

1) попробуйте вот так: PORTD.0=(bin_digits[dig] & 1<< i) != 0;
2) Выводятся числа 0..8, а не 0.9
lol483
Цитата(Genadi Zawidowski @ May 8 2012, 17:01) *
В строке

1) попробуйте вот так: PORTD.0=(bin_digits[dig] & 1<< i) != 0;
2) Выводятся числа 0..8, а не 0.9


1) - не помогло, всё так же.
2) - там идет перебор с нулевого элемента строки по девятый, то есть всего 10 чисел (0-9). Разве не так ?

В обоих случаях в итоге на выходах Q0-Q3 74HC595 постоянно логические 1.
ILYAUL
Интересно , а что на OE?
lol483
Цитата(ILYAUL @ May 9 2012, 00:06) *
Интересно , а что на OE?

OE постоянно и намертво присоединена к 0.
MR постоянно присоединена к 1 (5 v).

У меня осциллограф до 7 МГц берет, так что я фьюзы поставил на тактирование от внутреннего генератора на 1 МГц, так что должен видеть уж точно колебания хотя бы на SH_CP и ST_CP но их нет :-(
ILYAUL
Код
{
        PORTD.0=bin_digits[dig] & 1<<i;         //выводим "текущий бит" в линию DS
        PORTD.1=0;                              //выводим "0" в линию SH_CP
        PORTD.1=1;                              //выводим "1" в линию SH_CP
    }

Не нравится мне это . Я бы между этими действиями задержки хотя бы по микросекунде добавил. А то он может и сообразить ничего не успевает .
Ну и конечно далее по тексту
lol483
Цитата(ILYAUL @ May 9 2012, 00:26) *
Код
{
        PORTD.0=bin_digits[dig] & 1<<i;         //выводим "текущий бит" в линию DS
        PORTD.1=0;                              //выводим "0" в линию SH_CP
        PORTD.1=1;                              //выводим "1" в линию SH_CP
    }

Не нравится мне это . Я бы между этими действиями задержки хотя бы по микросекунде добавил. А то он может и сообразить ничего не успевает .
Ну и конечно далее по тексту

Это не имеет значения так как считывание бита в регистр происходит по переднему фронту импульса на SH_CP.
И к тому же частота работы 74HC595 по моему около 100 МГц.
ILYAUL
Цитата(lol483 @ May 9 2012, 01:29) *
Это не имеет значения так как считывание бита в регистр происходит по переднему фронту импульса на SH_CP.
И к тому же частота работы 74HC595 по моему около 100 МГц.

Т.е абсолютно наплевать когда возникает этот самый фронт , так? И весь раздел DS Waveforms дан что бы заполнить пустые страницы.
Кстати там и указана максимально возможная частота , и она несколько ниже Вашей
lol483
Я думаю что по сути всё равно когда возникает импульс на SH_CP, главное что бы синхронно с ним на DS подавались нужные данные (вернее что бы бит там уже был раньше чем возникнет 1 на SH_CP). В даташите указана частота 100МГц. Сейчас попробую переделать так что бы с некой задержкой дергалась SH_CP.
lol483
Ну значит так: после добавления задержек в код на осциле стали видны колебания, но газоразрядный индикатор подключенный при помощи К155ИД1 ничего не показывает.
Схема и код прилагается.
CODE
#include <mega16.h>
#include <delay.h>

unsigned char dig;
unsigned char bin_digits[10]=
{
0b11111111, //0
0b11111110, //1
0b11111101, //2
0b11111100, //3
0b11111011, //4
0b11111010, //5
0b11111001, //6
0b11111000, //7
0b11110111, //8
0b11110110, //9
};

void HC595_write(unsigned char dig)
//функция записи данных в регистр 74HC595 (используя PORTD.0=DS, PORTD.1=SH_CP, PORTD.2=ST_CP)
{
unsigned char i;
for(i=0; i<7; i++) //цикл для последовательного вывода 8 бит данных из массива
{
PORTD.0=bin_digits[dig] & 1<<i; //выводим "текущий бит" в линию DS
PORTD.1=0; //выводим "0" в линию SH_CP
delay_ms(5);
PORTD.1=1;
//выводим "1" в линию SH_CP - считываем бит на входе регистра
//(считывание происходит по переднему фронту импульса на SH_CP)
delay_ms(5);
}
PORTD.2=1;
//выводим "1" в линию ST_CP - "защелкиваем данные"
// ("защелкивание" происходит по переднему фронту импульса на ST_CP)
delay_ms(5);
PORTD.2=0; //выводим "0" в линию ST_CP
}

void main()
{
DDRD=0xFF; //конфигурируем порт "D" на вывод
while(1)
{
for(dig=0; dig<9; dig++)
//цикл для чередования числел (0-9) записываемых в регистр 74HC595
{
HC595_write(dig); //функция записи данных в регистр 74HC595
delay_ms(500);
}
}
}
zombi
Цитата(lol483 @ May 9 2012, 00:13) *
У меня осциллограф до 7 МГц берет, так что я фьюзы поставил на тактирование от внутреннего генератора на 1 МГц, так что должен видеть уж точно колебания хотя бы на SH_CP и ST_CP но их нет :-(

А они должны быть!!! И Вы их должны видеть!!!
И до тех пор пока Вы их не увидите дальнейшие движения бессмысленны.
Ищите косяк.
Код
delay_ms(5);

После добавления задержки 5000 тактов Вы заметили колебания!? Какие частоты? Длительности? Действительно ли 5ms?

Цитата(lol483 @ May 9 2012, 00:29) *
И к тому же частота работы 74HC595 по моему около 100 МГц.

Зависит от питания и температуры. При 5В и 25С я бы больше 25MHz не подавал (для серийного изделия).

Цитата(lol483 @ May 9 2012, 11:49) *
unsigned char bin_digits[10]=
{
0b11111111, //0
0b11111110, //1
0b11111101, //2
0b11111100, //3
0b11111011, //4
0b11111010, //5
0b11111001, //6
0b11111000, //7
0b11110111, //8
0b11110110, //9
};

А почему инверсные значения 0-9?

Цитата(lol483 @ May 9 2012, 11:49) *
PORTD.0=bin_digits[dig] & 1<<i; //выводим "текущий бит" в линию DS

В СИ не силён, но чтото мне это не нравится.
adnega
Цитата(zombi @ May 9 2012, 13:06) *
В СИ не силён, но чтото мне это не нравится.


PORTD.0= (bin_digits[dig] >> i) & 1;

А так?
zombi
Цитата(adnega @ May 9 2012, 13:29) *
PORTD.0= (bin_digits[dig] >> i) & 1;

А так?

Так нравится.

Код
PORTD.0=bin_digits[dig] & 1<<i;
PORTD.0=(bin_digits[dig] >> i) & 1;

А что на СИ эти строки дают абсолютно одинаковый результат?
_Артём_
Цитата(zombi @ May 9 2012, 14:06) *
Код
PORTD.0=bin_digits[dig] & 1<<i;
PORTD.0=(bin_digits[dig] >> i) & 1;

А что на СИ эти строки дают абсолютно одинаковый результат?

А что - нет?
zombi
Цитата(_Артём_ @ May 9 2012, 15:28) *
А что - нет?

А я не знаю, вот и спрашиваю.
_Артём_
Цитата(zombi @ May 9 2012, 16:03) *
А я не знаю, вот и спрашиваю.

Разный.
pavel-pervomaysk
CODE
// Internal SPI
.equ spi_ddr = DDRB //
.equ spi_port = PORTB //
.equ spi_p = PINB //
.equ ss = PB0 //
.equ sck = PB1 //
.equ mosi = PB2 //
.equ miso = PB3 //

// SPI Master Init // Set MOSI and SCK output, all others input
ldi tmp,(0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(0<<SPR1)|(0<<SPR0)
// DORD=1 lsb first DORD=0 msb first
// MSTR=1 SPI master mode MSTR=0 SPI slave mode
// CPOL=1 SCK по спаду CPOL=0 SCK по фронту
// SPR1 SPR0 0 0 (F/4) 0 1 (F/16) 1 0 (F/64) 1 1 (F/128)
out SPCR,tmp // Enable SPI, Master, set clock rate fck/16
ldi tmp,(1<<SPI2X) // SPI freq * 2
out SPSR,tmp //



;Запись байта в регистр с помощью апаратного SPI

74HC595:
sbi d_port,EN //
out SPDR,xh // OUT anod_m
wt_stx1: // Wait for transmission complete
in tmp1,SPSR //
sbrs tmp1,SPIF //
rjmp wt_stx1 //
cbi d_port,EN //
ret

;Запись байта в регистр с помощью програмного SPI




74HC595:
sbi d_port,en // Переводим выходы регистров в третье состояние
rcall out_byte //
cbi d_port,en // Включаем выходы 74НС595
ret

out_byte: // Вывод байта в 74HC595
ldi loop,8 // Счетчик битов
otd: // Cycle
clc // Очищаем CARY Flag
rol data // Сдвигаем данные в лево на 1 (data<<1)
brcc d_z // Если CARY Flag сброшен , идем сюда -----|
sbi d_port,dat // Если CARY Flag установлен то DATA=1 |
rjmp d_ok // |
d_z : // Data zero <----|
cbi d_port,dat // Если CARY Flag сброшен то DATA=0
d_ok: // Импульс CLK
sbi d_port,clk // CLK -> 1
cbi d_port,clk // CLK -> 0
dec loop // Счетчик битов - 1
brne otd // Если счетчик не равен 0 то переходим кциклу otd
ret // Выход из подпрограммы


zombi
Цитата(_Артём_ @ May 9 2012, 17:36) *
Разный.

ОК.
А то я интуитивно чувствую что то-то не так.
lol483
Цитата(Павлик @ May 9 2012, 18:09) *

Это походу ассемблер, я в нём очень плохо разбираюсь к сожалению, не понял от куда берется "Data". Это в роли функции здесь? Совсем ничего не понял(
_Артём_
Цитата(lol483 @ May 9 2012, 22:57) *
Это в роли функции здесь? Совсем ничего не понял(

Да это функция посылки байта по пррограммному spi.
Вызывать нужно так (как вариант):
Код
    call out_byte


Цитата(lol483 @ May 9 2012, 22:57) *
от куда берется "Data".


Учитывая
Код
rol     data

можно заключить что data - регистр.

P.S.
Код
out_byte:              // Вывод байта в 74HC595
ldi     loop,8         // Счетчик битов
otd:                   // Cycle
clc                    // Очищаем CARY Flag
rol     data           // Сдвигаем данные в лево на 1 (data<<1)

Непонятно зачем делать clc, если следующая команда rol data заполняет CARRY новым значением.
lol483
Ребята, кажется я понял в чем дело. Оказывается работа с 74HC595 была правильной, весь ступор был с К155ИД1. Вот опытным путём составил его таблицу истинности, отличается от даташита, не пойму в чем дело опять, но работает. (Проверял на трёх К155ИД1 - всё одинаково).
zombi
Цитата(lol483 @ May 10 2012, 00:28) *
Вот опытным путём составил его таблицу истинности, отличается от даташита, не пойму в чем дело опять, но работает.

Фантастика biggrin.gif
Genadi Zawidowski
Цитата(lol483 @ May 10 2012, 01:28) *
Ребята, кажется я понял в чем дело. Оказывается работа с 74HC595 была правильной, весь ступор был с К155ИД1. Вот опытным путём составил его таблицу истинности, отличается от даташита, не пойму в чем дело опять, но работает. (Проверял на трёх К155ИД1 - всё одинаково).

Ссылочку на даташит... просто ради того чтобы посмотреть...
lol483
Цитата(Genadi Zawidowski @ May 10 2012, 09:46) *
Ссылочку на даташит... просто ради того чтобы посмотреть...

Например вот - http://www.chipinfo.ru/dsheets/ic/155/id1.html
Я сам не знаю как так получается, много раз перепроверил. Вот ещё - http://cxem.net/beginner/beginner19.php
hd44780
Вы смотрели, что появляется на ноге PD0?

Конструкция

PORTD.0=bin_digits[dig] & 1<<i; //выводим "текущий бит" в линию DS

слишком сложная. CvAVR часто на таких спотыкается. Да и не только он. Я когда-то такими наворотами ухитрился и VC6 в ступор загнать. В итоге у меня простейший if вообще не отрабатывал - было вечно ложное условие. А ведь VC6 на порядки мощнее этого CvAVR....
Это раз.

Второе. Вы наверное имели в виду PORTD.0=bin_digits[dig] & (1<<i);

Не поленитесь, раздробите это, например, так:
unsigned char c, mask;
.......

mask=0x01<<i;
c=bin_digits[dig];
c&=mask;
if (c!=0)
PORTD.0=1;
else
PORTD.0=0;

Если заработает, группируйте операции.

И ещё.
Корявая она какая-то эта К155ИД1. Там надо сигналы инвертировать, и ещё какой-то элемент ИЛИ добавлять - см. вложение.
Это скан книжки Бирюкова 1991 года выпуска. Могу всю книжку дать, может ещё чего-то полезного найдёте.
Советские инженеры, видать плохо её ободрали с чего-то забугорного, либо не сумели её до ума довести, если сами разрабатывали biggrin.gif .
И даташиты не ищите, ну не было в СССР такого понятия ...

PS. Ну не работает у меня кнопка CodeBox -

Сведения об ошибке на веб-странице

Агент пользователя: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
штамп времени: Thu, 10 May 2012 07:56:33 UTC


Сообщение: Недопустимый аргумент.
Строка: 1225
Символ: 3
Код: 0
URI-код: http://electronix.ru/forum/jscripts/ips_text_editor.js


Сообщение: Недопустимый аргумент.
Строка: 1225
Символ: 3
Код: 0
URI-код: http://electronix.ru/forum/jscripts/ips_text_editor.js
lol483
Вообщем попробовал так: подключил К155ИД1 (с газоразрядным индикатором ИН-14) напрямую к порту С (от 74HC595 - отрезал дорожки управления К155ИД1) и согласно выше приведенной таблице истиности изменил прошивку (конкретнее - массив чисел и кое что в цикле что бы через порт С всё выводилось) и всё работает - на индикаторе последовательно от нуля и до девяти выводятся числа. Подозреваю что Q3 у регистра последовательного сдвига перестала работать. Наверное придется перепаивать новый и снова проверять. Возможно ли что так могло случиться ? Буду пробовать отладить как то функцию для работы с 74HC595.
Вот ссылка на видео: Видео
Код
#include <mega16.h>
#include <delay.h>

unsigned char dig;
unsigned char bin_digits[10]=
                             {
                                 0b10000000,    //0
                                 0b00000000,    //1
                                 0b10010000,    //2
                                 0b00010000,    //3
                                 0b11100000,    //4
                                 0b01100000,    //5
                                 0b10100000,    //6
                                 0b00100000,    //7
                                 0b11000000,    //8
                                 0b01000000,    //9
                             };

void HC595_write(unsigned char dig)             //функция записи данных в регистр 74HC595 (используя PORTD.0=DS, PORTD.1=SH_CP, PORTD.2=ST_CP)
{
    unsigned int i;
    for(i=0; i<7; i++)                          //цикл для последовательного вывода 8 бит данных из массива
    {
        PORTD.0=bin_digits[dig] & (1<<i);       //выводим "текущий бит" в линию DS
        PORTD.1=1;                              //выводим "0" в линию SH_CP
        PORTD.1=0;                              //выводим "1" в линию SH_CP - считываем бит на входе регистра (считывание происходит по переднему фронту импульса на SH_CP)
    }
    PORTD.2=1;                                  //выводим "1" в линию ST_CP - "защелкиваем данные" ("защелкивание" происходит по переднему фронту импульса на ST_CP)
    PORTD.2=0;                                  //выводим "0" в линию ST_CP
}

void main(void)
{
    DDRD=0xFF;                                  //конфигурируем порт "D" на вывод
    DDRC=0xFF;
    while(1)
    {
        for(dig=0; dig<10; dig++)                //цикл для чередования числел (0-9) записываемых в регистр 74HC595
        {
            PORTC=bin_digits[dig];              //подключаю К155ИД1 напрямую к порту C в обход регистра последовательного сдвига
            //HC595_write(dig);                   //функция записи данных в регистр 74HC595
            delay_ms(400);
        }
    }
}
hd44780
А 74HC595 вообще зачем? Ноги проца экономишь sm.gif ?

Регистр можно проверить просто записывая в него цифры 0000..1111 по какой-то кнопке и смотреть обычным вольтметром, что вылезает у него на выходах.
lol483
Цитата(hd44780 @ May 10 2012, 13:34) *
А 74HC595 вообще зачем? Ноги проца экономишь sm.gif ?

Регистр можно проверить просто записывая в него цифры 0000..1111 по какой-то кнопке и смотреть обычным вольтметром, что вылезает у него на выходах.

Честно говоря сейчас тоже сижу и думаю нужно ли мне использовать 74HC595. Делать часы хочу на ATmega16, будут 6 ламп - то есть нужно будет занять два порта чисто на индикацию. Один порт для I2C DS1307 и на этот же порт можно управление временем на кнопки посадить, остается один порт. Хз хватит ли для всего остального.
hd44780
Про 2 порта я не понял sad.gif . 4 ноги - код цифры, а остальное куда?
И как у тебя задаётся в какой разряд индикации какая цифра выводится? Прости, я с газоразрядными дисплеями не работал, только о светодиодными.

C регистром у тебя 3 ноги занято (судя по последней версии кода), без регистра - 4. Выгадал немного, зато куча заморочек в коде. - циклы, маски и пр.

И зачем для I2C один порт? У этого интерфейса всего 2 ноги. Остаётся ещё 6.
И что у тебя "всё остальное"?
gerber
Код
PORTD.0=bin_digits[dig] & 1<<i;

Скобок не хватает. Первой будет выполнена операция &, а автор, видимо, ожидает, что первой выполнится <<.
Правильно так:
Код
PORTD.0=bin_digits[dig] & (1<<i) ? 1 : 0;
lol483
Цитата(hd44780 @ May 10 2012, 14:38) *
Про 2 порта я не понял sad.gif . 4 ноги - код цифры, а остальное куда?
И как у тебя задаётся в какой разряд индикации какая цифра выводится? Прости, я с газоразрядными дисплеями не работал, только о светодиодными.

C регистром у тебя 3 ноги занято (судя по последней версии кода), без регистра - 4. Выгадал немного, зато куча заморочек в коде. - циклы, маски и пр.

И зачем для I2C один порт? У этого интерфейса всего 2 ноги. Остаётся ещё 6.
И что у тебя "всё остальное"?

у газоразрядного индикатора в общем случае 11 ног (общий анод и катоды-цифры от 0 до 9), если всего будет 6 ламп (часы, минуты, секунды) то через что бы управлять всеми шестью через К155ИД1 нужно будет задействовать 4*6 ног. (Кстати я ошибся написав что два порта, на самом деле целых три, только сейчас понял). По любому надо будет разбираться с 74HC595, так как их можно соединить последовательно, очень сэкономив ноги МК. "И как у тебя задаётся в какой разряд индикации какая цифра выводится?" - просто в цепочку последовательно соединенных 74YC595 - проталкивается число времени, например, 234002 - (23:40:02).
hd44780
Понятно. Фактически классическая статическая индикация sm.gif .
Тогда да, придётся разбираться с регистрами sad.gif .
ILYAUL
Можно начать экономить отказавшись от секунд. Баловоство это.
lol483
Цитата(ILYAUL @ May 10 2012, 20:59) *
Можно начать экономить отказавшись от секунд. Баловоство это.

Тоже правда.

А кто нибудь знает различия во внешнем виде между динамической и статической индикацией газоразрядных индикаторов. И есть ли они ? По идее их использовали со статической индикацией.
hd44780
Не знаю.
Когда-то давно, когда я ещё был маленьким, и на эти вещи смотрел исключительно как на красивые игрушки, мне в руки попал некий блок индикации на каких-то лампах. Одна лампа-одна цифра. Там было порядка 20 таких ламп. И куча каких-то микросхем (сколько именно, не помню). Но, как мне теперь кажется, это была статическая индикация (по воспоминаниям, исходя из равного (или примерно равного) кол-ва микросхем и ламп).

Вообще, для динамической индикации цифры надо всё время включать-выключать (как минимум раз 20-25 в секунду). Газовые лампы, по-моему, очень инерционная штука для подобных вещей.

А зачем именно газовые лампы?
GDI
Цитата(hd44780 @ May 11 2012, 12:41) *
Вообще, для динамической индикации цифры надо всё время включать-выключать (как минимум раз 20-25 в секунду). Газовые лампы, по-моему, очень инерционная штука для подобных вещей.

Так это же очень хорошо, что инерционные, Вы уже питаете следующую лампу, а предыдущая все еще светится. Мне кажется, что раньше не применяли динамическую индикацию исключительно из соображений сложности реализации на простой логике. Сейчас же в век дешевых микроконтроллеров нет причин не использовать.
Цитата(hd44780 @ May 11 2012, 12:41) *
А зачем именно газовые лампы?

Это нынче модный тренд. Из разряда "теплый ламповый звук", Steam Punk и т.д.
sKWO
Цитата(hd44780 @ May 11 2012, 11:41) *
Вообще, для динамической индикации цифры надо всё время включать-выключать (как минимум раз 20-25 в секунду). Газовые лампы, по-моему, очень инерционная штука для подобных вещей.

нету времени, посмотрите здесь
lol483
Всё, я разобрался! Оказалось что я не правильно работал с регистром последовательного сдвига, а именно он смещал всё на бит в сторону. Вот поправил функцию и всё поехало как надо:
Код
void HC595_write(unsigned char dig)             //функция записи данных в регистр 74HC595 (используя PORTD.0=DS, PORTD.1=SH_CP, PORTD.2=ST_CP)
{
    unsigned int i;
    for(i=0; i<=7; i++)                         //цикл для последовательного вывода 8 бит данных из массива
    {
        PORTD.0=bin_digits[dig] & (1<<i);       //выводим "текущий бит" в линию DS
        PORTD.1=1;                              //выводим "0" в линию SH_CP
        PORTD.1=0;                              //выводим "1" в линию SH_CP - считываем бит на входе регистра (считывание происходит по переднему фронту импульса на SH_CP)
    }
    PORTD.2=1;                                  //выводим "1" в линию ST_CP - "защелкиваем данные" ("защелкивание" происходит по переднему фронту импульса на ST_CP)
    PORTD.2=0;                                  //выводим "0" в линию ST_CP
}


Вот что именно изменил: "for(i=0; i<=7; i++)" , а вот как было "for(i=0; i<7; i++)".
GDI
Ничего себе заявочки!
Цитата
регистр последовательного сдвига неправильно работал
, Вы бы еще написали что нашли "баг в компиляторе". Как Вы думаете, сколько раз будет выполнен код
Код
for(i=0; i<7; i++)
и какой будет подставлен последний индекс в Вашу конструкцию по выводу бита в порт?
lol483
Цитата(GDI @ May 12 2012, 15:49) *
Ничего себе заявочки! , Вы бы еще написали что нашли "баг в компиляторе". Как Вы думаете, сколько раз будет выполнен код
Код
for(i=0; i<7; i++)
и какой будет подставлен последний индекс в Вашу конструкцию по выводу бита в порт?

По идее всего 6 раз и как раз последний бит не дописывался. Так ?
_Артём_
Цитата(lol483 @ May 12 2012, 16:23) *
По идее всего 6 раз и как раз последний бит не дописывался. Так ?

Нет не так. 7 раз.
lol483
Цитата(_Артём_ @ May 12 2012, 16:28) *
Нет не так. 7 раз.

Да, точно 7, всего то их восемь, вот последний то и не дописывался. Но сейчас всё отлично.
_Артём_
Ещё сомнительная конструкция:
Код
PORTD.0=bin_digits[dig] & (1<<i);

Лучше как-то так:
Код
PORTD.0= (bin_digits[dig] & (1<<i)) ? (1) : (0);


или
прочитать bin_digits[dig] в байт и сдвигать его:
Код
tmp=bin_digits[dig];

for(.....
PORTD.0= (tmp&1) ? (1) : (0);
....
tmp>>=1;
....
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.