Содержание
- Q0…Q7 – выходы которыми будем управлять. Могут находится в трёх состояниях: логическая единица, логический ноль и высокоомное Hi-Z состояние
- GND – земля
- Q7′ – выход предназначенный для последовательного соединения регистров.
- MR – сброс регистра.
- SH_CP – вход для тактовых импульсов
- ST_CP – вход «защёлкивающий» данные
- OE – вход переводящий выходы из HI-Z в рабочее состояние
- DS – вход данных
- VCC – питание 5 вольт
Осваивая работу с незнакомой микросхемой часто бывает полезна работа в лоб, тоесть прямое дергание ногами управления, это позволяет лучше понять принципы работы с подопытным. Итак следуя логике работы, написал программу которая должна будет вывести на выход регистра бинарное число 10010010
$regfile = "attiny2313.dat"
$crystal = 1000000
Config Portb = Output
Sh_cp Alias Portb . 3 ‘нога для тактовых импульсов
Ds Alias Portb . 2 ‘нога для вывода данных
St_cp Alias Portb . 0 ‘нога для "защелкивания" данных в регистр хранения
‘вывод через регистр числа 146 (в бинарном представлении 10010010)
St_cp = 0 ‘выставляем ногу в режим записи данных
Ds = 1 ‘выставляем первый бит
Sh_cp = 0 ‘даем импульс на тактовый выход
Sh_cp = 1
Ds = 0 ‘выставляем второй бит
Sh_cp = 0
Sh_cp = 1
Ds = 0 ‘выставляем третий бит
Sh_cp = 0
Sh_cp = 1
Ds = 1 ‘выставляем четвертый бит
Sh_cp = 0
Sh_cp = 1
Ds = 0 ‘выставляем пятый бит
Sh_cp = 0
Sh_cp = 1
Ds = 0 ‘выставляем шестой бит
Sh_cp = 0
Sh_cp = 1
Ds = 1 ‘выставляем седьмой бит
Sh_cp = 0
Sh_cp = 1
Ds = 0 ‘выставляем восьмой бит
Sh_cp = 0
Sh_cp = 1
St_cp = 1 ‘защелкиваем введенные данные
End
SHIFTOUT Datapin , Clockpin , var , option
Для того чтобы защелкнуть данные в регистре, применим команду PulseOut. Эта команда выводит импульс на ногу микроконтроллера с заданной длительностью. Конфигурация команды выглядит следующим образом:
Pulseout Portb , 0 , 5
здесь выводится импульс на PortB.0 длительностью 5 микросекунд (при частоте работы мк 4 МГц)
Как говорилось ранее, регистры могут легко состыковаться друг с другом, тем самым давая возможность увеличить количество портов вывода практически до бесконечности.
Для того чтобы добавить дополнительный регистр, необходимо соединить вместе выводы для тактовых импульсов SH_CP и выводы для защелкивания данных ST_CP. Вход данных первого регистра подключается к микроконтроллеру и туда мы будем гнать данные, а вход второго регистра соединяется к выводу Q7’ первого регистра.
В программе управления необходимо изменить тип переменной, которую будем выводить через регистры. Так как соединив вместе два регистра мы получили в управление 16 ножек, то переменная должна хранить 16 бит данных (или 2 байта). Такой объем данных хранит переменная типа Word. Этот тип мы и будем использовать, и для примера выведем число 1111001001001100 (в десятичном виде это будет число 62028).
Dim A As Word ‘выбираем 2х байтный тип переменной
–>Категория : Как подключить | –>Добавлено : 20.08.2011
–>Всего комментариев : 42 | 1 2 » |
yorx выдалось немного свободного времени, проверил в симуляторе. Проблема была в массиве данных, при использовании целочисленных значений, после цифр необходимо ставить знак %. Теперь все работает 200?’200px’:”+(this.scrollHeight+5)+’px’);"> $regfile = "m8def.dat" ‘Мега8 Do Shiftout Datapin , Clockpin , A For I = 16 To 0 Step – 1 Shiftout Datapin , Clockpin , A Num:
yorx, вывод Q7 ‘ первой микросхемы соединен с DS второй микросхемы? Суть в том что соединяя два регистра, мы увеличиваем разрядность и должны уже передавать не 8, а 16 бит данных. надо просто взять код для одного регистра и дописать данные А вот с двумя регистрами, не получается они работают не по очереди, а одновременно оба. Привожу пример: 200?’200px’:”+(this.scrollHeight+5)+’px’);"> $regfile = "m328pdef.dat" ‘Мега8 Pulseout Latch , 0 , 5 Pulseout Latch , 0 , 5 Pulseout Latch , 0 , 5 Pulseout Latch , 0 , 5 В Q7 ‘ данные лезут в след за Q7, сразу автоматом. защелкивать данные после того как загружены во все регистры (защелкиваем же все регистры одновременно) Заметил ошибку в подсчёте значения "А", проверьте весь подсчёт. при подсчёте выходит А=65536, а у Вас чтобы выйти из цикла Loop Until A = 65535. Вам нужно изменить на Loop Until A = 65536. Проверьте остальные подсчёты. Во втором цикле нет выхода из Do Loop: Или может Я чего-то не понял? $regfile = "attiny2313.dat" If Pind.2 = 0 Then Один контакт кнопки подключён к земле (-), а другой к порту МК. Здравствуйте. Написал код для автоматического включения подсветки на лестнице (по 1 ступеньке) при приближении человека. $regfile = "attiny2313.dat" If Pind.2 = 1 Then Для мигания разрядов есть такой пример Number(1) = 36 ‘ на индикацию выводим -tESt- Blink_flag(1) = 1 ‘ мигаем первым и шестым разрядом 200?’200px’:”+(this.scrollHeight+5)+’px’);"> $regfile = "attiny13.dat" Config Pinb.1 = Input Dim A As Word Config Debounce = 10 Enable Interrupts Do Tir: Toch: Блог о электроникеИногда требуется ОЧЕНЬ много выходных портов. Особенно если хотим сделать что нибудь на светодиодах. Гирлянду какую-нибудь навороченную. Что делать? Брать под это дело ATMega128 с ее полусотней выводов? Избыточно — для ламеров. Ставить i 2 с расширитель портов? Дорого. Для мажоров. Тут на помощь из вековых глубин выплывает старая добрая дискретная логика. На этот раз нас выручит грошовый сдвиговый регистр. Возьму, для примера, 74HC164 он же, для любителей совковых трешевых микросхем в неубиваемом каменном корпусе, наш КM555ИР8. |
![]() |
У него есть 8 выходов и четыре входа. R-сброс, С-тактовый, А1 и А2 вход. На самом деле, внутри они заведены через логический элемент 2И-НЕ и идут на D триггеры. D — это такой тип триггера, который по тактовому импульсу схватывает и отправляет на выход то, что у него на входе. Как видишь, тут они цепью стоят ,передавая бит от одного к другому и нет принципиальной разницы сколько их тут будет, восемь штук или восемь миллиардов. Но чем больше, тем дольше по этой эстафете гнать данные до конца. Поэтому мы смело можем эти регистры соединять последовательно.
Получается вот такая схема:
От МК, как видно, требуется только четыре выхода. Одним (RESET) мы сбрасываем состояние регистра. Из второго (Data) побитно вылазит байтик, а тактовый CLC обеспечивает продвижение битов по регистру. Самих регистров тут три. Они сцеплены паровозом. Когда переполняется первый, то биты из него вылазят во второй, потом в третий. Итого, 24 вывода.
Катоды диодов подключены все вместе через транзистор и как только будет слово мы подаем сигнал Ready и зажигаем всю эту ботву.
Наполнять регистр просто:
1) Поднимаем и держим RESET в 1
2) Выдаем первый (старший) бит на Data.
3) Опускаем в 0 и поднимаем в 1 тактовый выход. На восходящем фронте происходит занос в регистр и сдвиг всей цепочки на один шаг.
4) Повторить со второго пункта пока все биты не выдадим.
А для сброса достаточно уронить Reset в ноль на пару микросекунд.
Все просто 🙂
З.Ы.
Кружок на входе регистра означает, что вход инверсный. Т.е. подал ноль — сработало
Треугольник на входе показывает по какому фронту произойдет срабатывание. Запомнить просто: _/ \_ — это, типа, импульс. А треугольник, как стрелочка, указывает на нужный фронт. ->_/ \_ передний (восходящий фронт) и _/ \_ ИнтерфейсЦифра
119 thoughts on “Сдвиговый регистр”
mc14094 получше
я управлял 3мя индикаторами по 2м проводам
Блог о электронике
Иногда требуется ОЧЕНЬ много выходных портов. Особенно если хотим сделать что нибудь на светодиодах. Гирлянду какую-нибудь навороченную. Что делать? Брать под это дело ATMega128 с ее полусотней выводов? Избыточно — для ламеров. Ставить i 2 с расширитель портов? Дорого. Для мажоров. Тут на помощь из вековых глубин выплывает старая добрая дискретная логика. На этот раз нас выручит грошовый сдвиговый регистр. Возьму, для примера, 74HC164 он же, для любителей совковых трешевых микросхем в неубиваемом каменном корпусе, наш КM555ИР8.
![]() |
У него есть 8 выходов и четыре входа. R-сброс, С-тактовый, А1 и А2 вход. На самом деле, внутри они заведены через логический элемент 2И-НЕ и идут на D триггеры. D — это такой тип триггера, который по тактовому импульсу схватывает и отправляет на выход то, что у него на входе. Как видишь, тут они цепью стоят ,передавая бит от одного к другому и нет принципиальной разницы сколько их тут будет, восемь штук или восемь миллиардов. Но чем больше, тем дольше по этой эстафете гнать данные до конца. Поэтому мы смело можем эти регистры соединять последовательно.
Получается вот такая схема:
От МК, как видно, требуется только четыре выхода. Одним (RESET) мы сбрасываем состояние регистра. Из второго (Data) побитно вылазит байтик, а тактовый CLC обеспечивает продвижение битов по регистру. Самих регистров тут три. Они сцеплены паровозом. Когда переполняется первый, то биты из него вылазят во второй, потом в третий. Итого, 24 вывода.
Катоды диодов подключены все вместе через транзистор и как только будет слово мы подаем сигнал Ready и зажигаем всю эту ботву.
Наполнять регистр просто:
1) Поднимаем и держим RESET в 1
2) Выдаем первый (старший) бит на Data.
3) Опускаем в 0 и поднимаем в 1 тактовый выход. На восходящем фронте происходит занос в регистр и сдвиг всей цепочки на один шаг.
4) Повторить со второго пункта пока все биты не выдадим.
А для сброса достаточно уронить Reset в ноль на пару микросекунд.
Все просто 🙂
З.Ы.
Кружок на входе регистра означает, что вход инверсный. Т.е. подал ноль — сработало
Треугольник на входе показывает по какому фронту произойдет срабатывание. Запомнить просто: _/ \_ — это, типа, импульс. А треугольник, как стрелочка, указывает на нужный фронт. ->_/ \_ передний (восходящий фронт) и _/ \_ ИнтерфейсЦифра
119 thoughts on “Сдвиговый регистр”
mc14094 получше
я управлял 3мя индикаторами по 2м проводам