Главная » Статьи » Как подключить

Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
 

 В прошлый раз был рассмотрен вариант увеличения выходов микроконтроллера при помощи микросхемы – дешифратора 1533ИД3, сегодня рассмотрим более продвинутый вариант на сдвиговом регистре 74HC595. Использовав всего одну микросхему можно заиметь в свое распоряжение дополнительно 8 выходов, использовав всего 3 ноги микроконтроллера. А благодаря возможности расширения, добавив вторую микросхему, количество выходов можно увеличить до 16. Если мало, можно добавить третью и получить в пользование уже 24 выхода и такой трюк можно повторять сколько угодно раз. При этом количество занимаемых ног микроконтроллера так и останется 3, красота! 
 Итак, рассмотрим более подробно назначение выводов микросхемы и научимся управлять сдвиговым регистром 74hc595 в Bascom-AVR.
 
 Для начала ознакомимся с выводами микросхемы, а точнее с их функциональностью. Ниже представлена вырезка из даташита на 74hc595 с обозначением выводов микросхемы:



  • Q0…Q7 – выходы которыми будем управлять. Могут находится в трёх состояниях: логическая единица, логический ноль и высокоомное Hi-Z состояние
  • GND – земля
  • Q7′ – выход предназначенный для последовательного соединения регистров.
  • MR – сброс регистра.
  • SH_CP – вход для тактовых импульсов
  • ST_CP – вход «защёлкивающий» данные
  • OE – вход переводящий выходы из HI-Z в рабочее состояние 
  • DS – вход данных
  • VCC – питание 5 вольт

 Логика работы с регистром

 Когда на тактовом входе SH_CP появляется логическая единица, бит находящийся на входе данных DS считывается и записывается в сдвиговый регистр. Этот бит записывается в самый младший разряд. При поступлении на тактовый вход следующего импульса высокого уровня, в сдвиговый регистр записывается следующий бит со входа данных. А тот бит который был записан ранее сдвигается на один разряд влево, а его место занимает вновь пришедший бит. Следующий тактовый импульс запишет третий бит, а два предыдущих сдвинутся дальше. Когда все восемь бит заполнились и приходит девятый тактовый импульс то регистр снова начинает заполнятся с младшего разряда и всё повторятся вновь. Что бы данные появились на выходах Q0…Q7 нужно их «защёлкнуть». Для этого необходимо подать логическую единицу на вход ST_CP

 - MR осуществляет сброс регистра, устанавливая все выходы Q0…Q7 в состояние логического нуля. Для осуществления сброса нужно подать логический ноль на этот вход и подать положительный импульс на вход ST_CP. Очень полезная функция, так как при подаче питания на микросхему на выходе появляется некое произвольное значение. При работе с регистром на этом выводе должна находится логическая единица. 
 - OE (output enable) если подать сюда логическую 1, то выходы будут находится в высокоомном HI-Z состоянии. Когда подаем на этот вход логический 0, выходы будут находится в рабочем состоянии.
 - Q7′  предназначен для последовательного соединения сдвиговых регистров.

 Но лучше один раз увидеть, чем два раза прочитать =) поэтому смотрим на анимацию:





 Работа с регистром в лоб

 Осваивая работу с незнакомой микросхемой часто бывает полезна работа в лоб, тоесть прямое дергание ногами управления, это позволяет лучше понять принципы работы с подопытным. Итак следуя логике работы, написал программу которая должна будет вывести на выход регистра бинарное число 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


компилируем, зашиваем в микроконтроллер или смотрим в симулятор и видим на выходе нашу комбинацию.



Работает, на выходе регистра появилось отправленное число!

Работа с регистром таким образом хоть и возможна но слишком громоздка и занимает много программной памяти. Но зато наглядно демонстрирует всю методику работы с данной микросхемой. Рассмотрим более подходящий метод.


Управление регистром 74HC595 в Bascom через команду ShiftOut

 В Bascom-AVR для работы со всевозможными последовательными интерфейсами есть замечательная команда SHIFTOUT
 Эта команда сама разложит число на битовые составляющие и последовательно выведет их на любой пин микроконтроллера, заодно она может выдавать тактовые импульсы. Для работы со сдвиговыми регистрами самое то! Синтаксис команды:

SHIFTOUT Datapin , Clockpin , var , option


Datapin – порт микроконтроллера для вывода данных

Clockpin – порт микроконтроллера для вывода тактовых импульсов
Var – данные которые хотим отправить в регистр

Option – число от 0 до 3, этим параметром выбирается в каком порядке будут вводиться данные в регистр и активный уровень на линии Clock при котором происходит запись бита:
option=0 – старший бит идет первым,
 Clock активный уровень низкий
option=1 –
старший бит идет первым, Clock активный уровень высокий
option=2 –
младший бит идет первым, Clock активный уровень низкий
option=3 –
младший бит идет первым, Clock   активный уровень высокий

В нашем случае для работы с регистром 74HC595 параметр option нужно ставить 1 или 3.

 Для того чтобы защелкнуть данные в регистре, применим команду PulseOut. Эта команда выводит импульс на ногу микроконтроллера с заданной длительностью. Конфигурация команды выглядит следующим образом:

Pulseout Portb , 0 , 5

здесь выводится импульс на PortB.0 длительностью 5 микросекунд (при частоте работы мк 4 МГц)



 Теперь давайте выведем число 10010001 (145 в десятичной системе) на выход регистра, подключенному к микроконтроллеру по вышеприведенной схеме:

$regfile = "attiny2313.dat"
$crystal = 1000000

Dim A As Byte
Config Portb = Output

= 145

Gosub Hc595                                 'уходим на подпрограмму отправки данных

End

Hc595:                                      'подпрограмма отправки данных

Shiftout Portb., Portb., A , 1          'отправляем данные в регистр
Pulseout Portb , 0 , 5                      'защелкиваем данные
Return


 Прошив микроконтроллер можно увидеть аналогичную картину, на выходе сдвигового регистра выставлена отправленная комбинация битов. 




Как видно управление сдвиговым регистром 74HC595 в Bascom состоит всего из двух строк кода, и не представляет никаких сложностей.


Увеличение разрядности

 Как говорилось ранее, регистры могут легко состыковаться друг с другом, тем самым давая возможность увеличить количество портов вывода практически до бесконечности.
 Для того чтобы добавить дополнительный регистр, необходимо соединить вместе выводы для тактовых импульсов SH_CP и выводы для защелкивания данных ST_CP. Вход данных первого регистра подключается к микроконтроллеру и туда мы будем гнать данные, а вход второго регистра соединяется к выводу Q7’ первого регистра.
 В программе управления необходимо изменить тип переменной, которую будем выводить через регистры. Так как соединив вместе два регистра мы получили в управление 16 ножек, то переменная должна хранить 16 бит данных (или 2 байта). Такой объем данных хранит переменная типа Word. Этот тип мы и будем использовать, и для примера выведем число 1111001001001100 (в десятичном виде это будет число 62028). 

$regfile = "attiny2313.dat"
$crystal
 = 1000000

Dim A As Word                                     'выбираем 2х байтный тип переменной

Config Portb = Output

= 62028                                         'выведем вот это число
Shiftout Portb.2 , Portb., A , 1                'отправляем данные в регистр
Pulseout Portb , 0 , 5                            'защелкиваем данные

End



соединение двух регистров 74HC595


 Старший байт (левая часть 11110010) выводится через второй регистр (IC2), а младший байт (01001100) выводится через первый регистр, соединенный к микроконтроллеру напрямую (IC1).
 
 Думаю проблем с подключением 3, 4, 5 регистров в ряд возникнуть не должно ;)

Удачи!

Категория: Как подключить | Добавлено: 20.08.2011
Просмотров: 130749 | Комментарии: 42 | Теги: Логика, 74HC595 | Рейтинг: 4.5/25
Всего комментариев: 421 2 »
42 yorx   (13.12.2016 15:12) [Материал]
Доброго времени суток, уважаемый exersizze спасибо за помощь Вам, все работает, а то не мог понять что не так я делаю , уже и через сдвиг бита делал влево-вправо , уже думал через массив выводить значение , оказалось все просто . Спасибо огромное.

0  
41 exersizze   (08.12.2016 20:53) [Материал]
yorx выдалось немного свободного времени, проверил в симуляторе. Проблема была в массиве данных, при использовании целочисленных значений, после цифр необходимо ставить знак %.

Теперь все работает
 
Код
$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

   Loop

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




архив c исходником и файлом протеуса

40 yorx   (01.12.2016 19:24) [Материал]
Доброго времени суток, exersizze попробовал Ваш код все равно не работает как надо, схема соединения правильная , проверял на Pic. Светики не бегают поочередно , при симуляции в протеусе , в переменную А записываются другие значения, не те что я прописал (Data 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , и т.д)не могу понять почему. Если по отдельности выводить значение переменной А = 32768 то выводит правильно, но когда в цикле пытаюсь белеберда в регистрах получается. Спасибо за направление которое подсказали . С Уважением, Владимир.

0  
39 exersizze   (29.11.2016 09:54) [Материал]
yorx, вывод Q7 ' первой микросхемы соединен с DS второй микросхемы? Суть в том что соединяя два регистра, мы увеличиваем разрядность и должны уже передавать не 8, а 16 бит данных.

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

Код
$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 Word, I As Byte  
  A = 0 : I = 0  
  Do  
   For I = 0 To 16  
   A = Lookup(i , Num)  
   Waitms 200  
   Shiftout Datapin , Clockpin , A  
   Pulseout Latch , 0 , 5  
   Next I  
   Waitms 200  
   For I = 16 To 0 Step - 1  
   A = Lookup(i , Num)  
   Waitms 200  
  Shiftout Datapin , Clockpin , A  
  Pulseout Latch , 0 , 5  
  Next I  
  Num:  
  Data 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , 255, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65535
  Loop

38 yorx   (28.11.2016 19:25) [Материал]
Доброго времени суток, коллеги помогите пожалуйста, как вывести бегущий огонек на 2 регистра . С одним регистром проблем не возникло, привожу пример:
Код
$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
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
Pulseout Latch , 0 , 5
Next I
Num:
Data 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , 255
Loop


А вот с двумя регистрами, не получается они работают не по очереди, а одновременно оба. Привожу пример:
Код
$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

Как упорядочить регистры не пойму , подскажите пожалуйста.

0  
37 exersizze   (20.09.2015 22:39) [Материал]
Не люблю отвечать ссылками но задача тривиальная. В поиске выдает кучу результатов, например вот http://we.easyelectronics.ru/Soft/8-kanalnyy-shim-na-attiny13.html

36 Leosix   (16.09.2015 20:27) [Материал]
Приветствую Товарищи эксперты!
Подскажите пожалуйста как через сдвиговик гнать ШИМ?
Допустим 6 светодиодов (бегущий огонек) должны загораться и гаснуть плавно
как это реализовать?

0  
35 exersizze   (09.09.2014 01:37) [Материал]
Ev3658, для визуального понимания советую поставит протеус и помоделировать в нем каждый такт. Сразу большинство вопросов отпадут, можно будет своими
глазами наблюдать за логикой.
Цитата
Вот это не ясно, почему в одной строке два порта - Shiftout Portb.2 , Portb.3 , A , 1
читаем внимательно: команда SHIFTOUT может выводить тактовые импульсы на ножку Clockpin, в данном случае это и есть  PortB.3

Цитата
Вообщем Q7' как открывается?

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


Цитата
Если много использовать регистров сдвига, защёлкивать каждый раз данные на регистре или после посылки во все регистры?
защелкивать данные после того как загружены во все регистры (защелкиваем же все регистры одновременно)


Цитата
Посылаемые данные как попадают в регистры?
последовательно, от первого регистра до последнего.

34 Ev3658   (06.09.2014 22:37) [Материал]
Блин, честно, чайник я ещё, можно чуток обчайниковать статейку?
Вот это не ясно, почему в одной строке два порта - Shiftout Portb.2 , Portb.3 , A , 1
Понимаю, что переменная двухбайтная, но если взглянуть на картинку, хотелось бы в коде послать двоичное и на картинке его увидеть.
И ещё, так как уже всё спаял, начинаю алхимичить. Вообщем Q7' как открывается? После 8го такта забитого в регистр автоматом? Или после защёлкивания?
Если много использовать регистров сдвига, защёлкивать каждый раз данные на регистре или после посылки во все регистры?
Посылаемые данные как попадают в регистры? По очереди или пока до последнее не дойдёт и так конечные данные окажутся на первом регистре?

33 exersizze   (23.12.2013 18:02) [Материал]
Так он не в адрес статьи, а товарищу Leosix отписал.

32 Oboltus   (23.12.2013 12:03) [Материал]
31 Valera18, а зачем? Честь Вашей внимательности, конечно, но цель статьи - научить работать со сдвиговыми регистрами и конкретно с командой SHIFTOUT. Ну есть там ошибка, и что? Вы будете ставить свои значения и считать для своего проекта. Все предельно понятно и четко рассказано.

31 Valera18   (29.09.2013 20:35) [Материал]
Для Leosix

Заметил ошибку в подсчёте значения "А", проверьте весь подсчёт.
Из ходя из первого:
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

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

30 Valera18   (29.09.2013 11:39) [Материал]
Для Leosix

Лучше так:

$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   Спам
29 Leosix   (29.09.2013 10:55) [Материал]
Здравствуйте. Написал код для автоматического включения подсветки на лестнице (по 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

28 exersizze   (19.09.2012 14:29) [Материал]
Для вывода большого кол-ва бит, просто пропихиваем их все по одному, и когда закончили даем импульс на ногу SТ

27 Misha555   (18.09.2012 18:45) [Материал]
$regfile = "m32def.dat" '
$crystal = 16000000
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portd.7
Config Lcd = 16 * 2
Wait 1
Cursor Off
Cls
Locate 1 , 5
Lcd "ZHARKOFF"
Locate 2 , 6 '
Lcd " test"
Wait 2
Config Portc = Input
Config Portc.0 = Input : Di1 Alias Portc.0
'Set Portc.0 '
Config Portc.1 = Input : Di2 Alias Portc.1
'Set Portc.1 '
Config Portc.2 = Input : Di3 Alias Portc.2
'Set Portc.2 '
Config Portc.3 = Input : Di4 Alias Portc.3
'Set Portc.3 '
Config Portc.4 = Input : Di5 Alias Portc.4
'Set Portc.4 '
Config Portc.5 = Input : Di6 Alias Portc.5
'Set Portc.5 '
Config Portc.6 = Input : Di7 Alias Portc.6
'Set Portc.6 '
Config Portc.7 = Input : Di8 Alias Portc.7
'Set Portc.7
Config Porta = Output
Config Porta.0 = Output : Do1 Alias Porta.0
Config Porta.1 = Output : Do2 Alias Porta.1
Config Porta.2 = Output : Do3 Alias Porta.2 '
Config Porta.3 = Output : Do4 Alias Porta.3
Config Porta.4 = Output : Do5 Alias Porta.4
Config Porta.5 = Output : Do6 Alias Porta.5
Config Porta.6 = Output : Do7 Alias Porta.6
Config Porta.7 = Output : Do8 Alias Porta.7
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Sh_cp Alias Portd.5
Ds Alias Portd.4
St_cp Alias Portd.6
St_cp = 0
Ds = Di1
Sh_cp = 0
Sh_cp = 1
Ds = Di2 '
Sh_cp = 0 '
Sh_cp = 1
Ds = Di3 '
Sh_cp = 0 '
Sh_cp = 1
Ds = Di4 '
Sh_cp = 0 '
Sh_cp = 1
Ds = Di5 '
Sh_cp = 0 '
Sh_cp = 1
Ds = Di6
Sh_cp = 0
Sh_cp = 1
Ds = Di7
Sh_cp = 0 '
Sh_cp = 1
Ds = Di8
Sh_cp = 0 '
Sh_cp = 1
Ds = Do1 '
Sh_cp = 0 '
Sh_cp = 1
Ds = Do2 '
Sh_cp = 0 '
Sh_cp = 1
Ds = Do3 '
Sh_cp = 0
Sh_cp = 1
Ds = Do4 '
Sh_cp = 0 '
Sh_cp = 1
Ds = Do5 '
Sh_cp = 0
Sh_cp = 1
Ds = Do6 '
Sh_cp = 0 '
Sh_cp = 1
Ds = Do7 '
Sh_cp = 0 '
Sh_cp = 1
Ds = Do8 '
Sh_cp = 0 '
Sh_cp = 1
St_cp = 1
End

26 Misha555   (18.09.2012 18:44) [Материал]
В принципе я понял. Но та написана только на первые 8-бит (1 сдвиговый регистр). А как ввести данные на следующий регистр (следующие 8 бит)? Или я что-то не правильно понял? Может полученое 8+8=16 битное число нужно перевести в десятичное и потом вложить в последний пример програмки
Вот что у меня вышло. Но увы в Протеусе оно не работает

25 exersizze   (18.09.2012 09:45) [Материал]
А из чего формируется результат который нужно вывести? Можно эти биты поочереди засовывать в регистр, как в первом примере (с простым ножкодрыганием)

24 Misha555   (17.09.2012 21:01) [Материал]
Считывать состояние регистра на выходе регистра мне и не нужно. Вы меня не поняли. Попробую обьяснить свой вопрос по другому.
В примере программы уже есть 16-битный код, исходя из которого каждая бита управляет своим светодиодом, тобиш он статический. А в моем случае 16 битный код динамический, и должен формироваться из состояния переменных, которые управляют входом/выходом. Исходя из этого кода будет видно состояние входа или выхода (1 или 0). Переменные уже есть в программе. Нужно только создать механизм создания 16-битного кода для сдвигового регистра

23 exersizze   (17.09.2012 20:11) [Материал]
Считать состояние на выходе регистра никак не получиться, он работает только на вывод.

22 Misha555   (17.09.2012 17:19) [Материал]
Здравствуйте уважаемые форумчане. Очень интересная тема. И как раз кстате. Сейчас разрабатываю устройство на базе Atmega32. Свободные есть только три порта. Нужно обеспечить контроль 16 портов (8 входов и 8 выходов)( (0 или 1), но с помощью сдвигового регистра. Я использую вторую схемку из двух сдвиговых регистров. Первый будет индицировать состояние входов, а второй - выходов. Но вот вопрос в том, каким образом вычислить состояние переменной А, исходя из состояния входов-выходов?

21 exersizze   (12.09.2012 19:54) [Материал]
С учетом того что входы микросхемы имеют очень большое сопротивление (порядка сотен кОм), а выход микроконтроллера может потянуть до 20мА, можно подключать очень много микросхем, сотню-другую думаю потянет.

20 mm   (12.09.2012 15:45) [Материал]
" Как говорилось ранее, регистры могут легко состыковаться друг с другом, тем самым давая возможность увеличить количество портов вывода практически до бесконечности."
Вопрос а выходы ATTINY 2313 сколько могут "потянуть" 5 ? 10? штук. Спасибо

19 exersizze   (20.05.2012 14:16) [Материал]
С той библиотекой что уже написана не получится, придется много чего переделывать в коде, хотя это и реально.

18 amv2000   (20.05.2012 14:04) [Материал]
Появилась мысль совместить 2 светодиодных (3 разрядных) индикатора и дисплей Nokia 3310, я так понимаю 3310 не получится подключить через 74HC595 ибо выводится будет графика?

17 amv2000   (29.01.2012 16:23) [Материал]
Для мигания разрядов есть такой пример 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

16 exersizze   (27.01.2012 18:47) [Материал]
Можно организовать цикл в котором в регистр будут отправляться то полезные данные, то нули. Цикл естественно должен быть с условием входа и выход. Вообще алгоритмов можно придумать кучу чтобы организовать мигание цифр..

15 Алексей_bird   (27.01.2012 14:55) [Материал]
А как сделать чтобы индикатор моргал, т.е. все цифры одновременно гасли и зажигались с интервалом 0,5-1 сек?? т.е это используется тогда, когда есть несколько индикаторов с разными устанавливаемыми величинами, и при выборе определенной величины мигает тот индикатор, на котором выбран для изменения

14 exersizze   (21.11.2011 19:25) [Материал]
попробуй поменять алгоритм, если исключить переход по GOTO то все работает.

13 Aleks8383   (20.11.2011 13:00) [Материал]
Подскажите чего я не так делаю.Делаю простенький телеграфный ключик,а вот команда pulseout не как не хочет работать.В Tir как раз пытаюсь высести импульс требуемой длительности , не выходит вообще тишина,а в toch как щас сделано у меня ,всё работает но хотелось понять почему не идёт pulseout.
Code
$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

Vrem:
Incr C
Return

1-30 31-42
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






авторизация
Логин:
Пароль: