Сдвиговый регистр на 4 бита

  • 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

–>Просмотров : 117893 | –>Комментарии : 42 | –>Теги : Логика, 74HC595 | –>Рейтинг : 4.5 / 25
–>Всего комментариев : 42 1 2 »

yorx выдалось немного свободного времени, проверил в симуляторе. Проблема была в массиве данных, при использовании целочисленных значений, после цифр необходимо ставить знак %.

Теперь все работает


200?’200px’:”+(this.scrollHeight+5)+’px’);"> $regfile = "m8def.dat" ‘Мега8
$crystal = 16000000 ’16МГц
$baud = 19200
config portb=output
Clockpin Alias Portb.2 ‘нога для тактовых импульсов SH_CP
Datapin Alias Portb.1 ‘нога для вывода данных DS
Latch Alias Portb.0 ‘нога для "защелкивания" данных в регистр хранения ST_CP
Dim A As Word, I As Byte

Do
For I = 0 To 16
A = Lookup(i , Num)
Waitms 200
print i; " ";a

Shiftout Datapin , Clockpin , A
Pulseout Latch , 0 , 10
Next I

For I = 16 To 0 Step – 1
A = Lookup(i , Num)
Waitms 200
print i; " ";a

Shiftout Datapin , Clockpin , A
Pulseout Latch , 0 , 5
Next I

Num:
Data 1% , 2% , 4% , 8% , 16% , 32% , 64% , 128% , 256%, 512%, 1024%, 2048%, 4096%, 8192%, 16384%, 32768%

yorx, вывод Q7 ‘ первой микросхемы соединен с DS второй микросхемы? Суть в том что соединяя два регистра, мы увеличиваем разрядность и должны уже передавать не 8, а 16 бит данных.

надо просто взять код для одного регистра и дописать данные


А вот с двумя регистрами, не получается они работают не по очереди, а одновременно оба. Привожу пример:

200?’200px’:”+(this.scrollHeight+5)+’px’);"> $regfile = "m328pdef.dat" ‘Мега8
$crystal = 16000000 ’16МГц
$baud = 19200
Ddrb = 11111111
Clockpin Alias Portb.2 ‘нога для тактовых импульсов SH_CP
Datapin Alias Portb.1 ‘нога для вывода данных DS
Latch Alias Portb.0 ‘нога для "защелкивания" данных в регистр хранения ST_CP
Dim A As Byte , I As Byte
A = 0 : I = 0
Do
For I = 0 To 7
A = Lookup(i , Num)
Waitms 200
Shiftout Datapin , Clockpin , A , 1

Pulseout Latch , 0 , 5
Next I
For I = 0 To 7
A = Lookup(i , Num)
Waitms 200
Shiftout Datapin , Clockpin , A , 1

Pulseout Latch , 0 , 5
Next I
Waitms 200
For I = 7 To 0 Step – 1
A = Lookup(i , Num)
Waitms 200
Shiftout Datapin , Clockpin , A , 1

Pulseout Latch , 0 , 5
Next I
For I = 7 To 0 Step – 1
A = Lookup(i , Num)
Waitms 200
Shiftout Datapin , Clockpin , A , 1

Pulseout Latch , 0 , 5
Next I
Waitms 200
Num:
Data 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , 255
Loop

В Q7 ‘ данные лезут в след за Q7, сразу автоматом.

защелкивать данные после того как загружены во все регистры (защелкиваем же все регистры одновременно)

Заметил ошибку в подсчёте значения "А", проверьте весь подсчёт.
Из ходя из первого:
Do
If Pind.1 = 1 Then
B = 32768
A = 32768
Do
B = B / 2
A = A + B
Shiftout Portb.2 , Portb.3 , A , 1
Pulseout Portb , 0 , 5
Waitms 100
Loop Until A = 65535

при подсчёте выходит А=65536, а у Вас чтобы выйти из цикла Loop Until A = 65535. Вам нужно изменить на Loop Until A = 65536. Проверьте остальные подсчёты.

Во втором цикле нет выхода из Do Loop:
Waitms 700
A = 65535
B = 32768 * 2
Do
B = B / 2
A = A – B
Shiftout Portb.2 , Portb.3 , A , 1
Pulseout Portb , 0 , 5
Waitms 100
Loop (Чтобы выйти нужно Loop Until A = "значение")
Loop
End If

Или может Я чего-то не понял?

$regfile = "attiny2313.dat"
$crystal = 1000000
Dim A As Long
Dim B As Long
Config Portb = Output
Config Pind.1 = Input : Pind.1 = 1
Config Pind.2 = Input : Pind.2 = 1
Do
If Pind.1 = 0 Then
.
.
end if

If Pind.2 = 0 Then
.
.
end if

Один контакт кнопки подключён к земле (-), а другой к порту МК.
Добавлю: для кнопок лучше использовать Debounce Pind.1 , 0 , K1 , Sub
подробно можно прочитать тут: http://avrhelp.mcselec.com/debounce.htm

Здравствуйте. Написал код для автоматического включения подсветки на лестнице (по 1 ступеньке) при приближении человека.
Но программа не реагирует на внешние сигналы вход Д1 и Д2.
Это мой первый опыт в программировании, оцените код пожалуйста)

$regfile = "attiny2313.dat"
$crystal = 1000000
Dim A As Long
Dim B As Long
Config Portb = Output
Config Pind.1 = Input
Config Pind.2 = Input
Do
If Pind.1 = 1 Then
B = 32768
A = 32768
Do
B = B / 2
A = A + B
Shiftout Portb.2 , Portb.3 , A , 1
Pulseout Portb , 0 , 5
Waitms 100
Loop Until A = 65535
Waitms 700
A = 65535
B = 32768 * 2
Do
B = B / 2
A = A – B
Shiftout Portb.2 , Portb.3 , A , 1
Pulseout Portb , 0 , 5
Waitms 100
Loop
Loop
End If

If Pind.2 = 1 Then
B = 2
A = 1
Shiftout Portb.2 , Portb.3 , A , 1
Pulseout Portb , 0 , 5
Waitms 100
Do
A = A + B
Shiftout Portb.2 , Portb.3 , A , 1
Pulseout Portb , 0 , 5
Waitms 100
B = B * 2
Loop Until A = 65535
Waitms 700
A = 65534
Shiftout Portb.2 , Portb.3 , A , 1
Pulseout Portb , 0 , 5
Waitms 100
A = 65532
Shiftout Portb.2 , Portb.3 , A , 1
Pulseout Portb , 0 , 5
Waitms 100
B = 2
Do
B = B * 2
A = A – B
Shiftout Portb.2 , Portb.3 , A , 1
Pulseout Portb , 0 , 5
Waitms 100
Loop
End If
End

Для мигания разрядов есть такой пример Number(1) = 36 ‘ на индикацию выводим -tESt-
Number(2) = 29
Number(3) = 16
Number(4) = 5
Number(5) = 29
Number(6) = 36

Blink_flag(1) = 1 ‘ мигаем первым и шестым разрядом
Blink_flag(6) = 1
Полная ссылка здесь http://www.edm2007.narod.ru/startavr8.html

200?’200px’:”+(this.scrollHeight+5)+’px’);"> $regfile = "attiny13.dat"
$crystal = 4800000
$hwstack = 32
$swstack = 8
$framesize = 16

Config Pinb.1 = Input
Config Portb.2 = Output
Config Pinb.3 = Input
Config Pinb.4 = Input
Config Pinb.5 = Input

Dim A As Word
Dim B As Word
Dim C As Byte

Config Debounce = 10

Enable Interrupts
Enable Int0
On Int0 Vrem

Do
M1:
Debounce Pinb.3 , 0 , Tir
Debounce Pinb.4 , 0 , Toch
Loop

Tir:
Pulseout Portb , 2 , 300
Goto M1

Toch:
Set Portb.2
Waitms 100
Reset Portb.2
Goto M1

Блог о электронике

Иногда требуется ОЧЕНЬ много выходных портов. Особенно если хотим сделать что нибудь на светодиодах. Гирлянду какую-нибудь навороченную. Что делать? Брать под это дело 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м проводам

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>