Зато ты не поленился по флудить)
Ну не надо... Выше приведённый способ мне знаком... У баскома всё таки интересная функция и я такой в CVAVR не знаю...
Я говорю всё таки об эффективном коде и в плане кол-во итераций и размера программы. Не против даже ассемблерной вставки... А вот изучать команды и регистры ради одной функции... как то наверное лениво... согласен...
Суть в управлении внешним сдвиговым регистром...
Есть какие то "красивые" решения? В том плане чтобы не было затратно для МК и в плане скорости и в плане размера кода?
Приходится выбирать между скоростью и размером кода. Для повышения скорости выполнения подпрограммы делают разворачивание цикла в линейный код.
Самое нормальное решение здесь - использовать SPI(или USART в режиме SPI) если конкретная AVR-ка позволяет.
Конечно не поленился
Вопрос в том, зачем встраивать какие-то функции, когда они пишутся за время меньшее, чем нужно для поиска их в документации.
Насчет скорости работы - быстрее не получится. Только если использовать аппаратные возможности какого-нибудь SPI. Но думаю что за глаза хватит
Вот в этом массиве и описывается. Каждый бит отвечает за свой сегмент, если бит установлен - сегмент горит, например цифра 1 установлены 1 и 2 биты - горят два сегмента, которые подключены к этим битам.
Сегменты подключены к порту D и как я уже говорил каждый пин (бит регистра PORTD) это отдельный сегмент. Включение первого разряда - строка 23, второго - строка 26 и т.д. Где какой сегмент легко вычисляется.
По юарту приходит байт данных. Он же и должен выводиться в PORTx. Но в Меге8 , к сожалению, при использовании юарта и внешнего кварца не остается ни одного целого порта.
Аlex писал(а):Что значит "не работает" ? Объясняйте проблемы подробнее, мы не экстрасенсы.
По юарту приходит байт , нужно его вывести в порт
#define pin_1 PORTC.1
#define pin_2 PORTC.2
#define pin_3 PORTC.3
#define pin_4 PORTC.4
#define pin_5 PORTC.5
#define pin_6 PORTC.6
#define pin_7 PORTC.7
#define pin_0 PORTC.0
getchar (byte) ;
PORTC = byte; - работает.
С макросом
#define getbit(reg, bit) (reg&(1<<bit)!=0)
getchar (byte) ;
pin_1 = getbit(byte, 1); //
pin_2 = getbit(byte, 2); //
pin_3 = getbit(byte, 3); //
и т.д.
Не работает - постоянно весь порт в одном состоянии, т.е. горят все подключенные к нему светодиоды
С цоколевкой все правильно, сейчас все pin подключены к одному порту, т.к. на макетной плате стоит мега 16, а не мега 8.
Т.е. состояние PORTC не меняется в соответствии с пришедшим байтом.