LINUX.ORG.RU

сдвиговой регистр и lpt

 ,


0

1

здравствуйте

затянула тема управлениями через лпт, давно сделал переключалку через оптопары (оптроны), т.е. подаю питание через лпт и все пошло...

но недавно нагуглил применение сдвиговых регистров, т.к. первым способом можно только 8 нагрузок подключить, а через сдвиговой регистр 300 (пример http://cxem.net/comp/comp85.php)

со схемой и паяльником проблем нет, но вот что надо в лпт писать, чтобы управлять этой штуковиной? примеров кода даже по оффтопик не нагуглил (желательно пример на питоне)

п.с. модель сдвигового регистра 13cnonk e4 SN74HC595N


Нашел где спрашивать... Тут кроме как ставить арч по манам и убунту из гуисетапа, а потом выкладывать скрины обоев, никто ничего делать не умеет. Хотя вру... Есть тут одна прекрасная Женщина... Ждите.

anonymous
()

открываете даташит и курите его внимательно.

там на первый взгляд по дерганью SHCP пропихиваются биты из DQ по сдвиговому регистру временного хранения, а по дерганью STCP - биты переносятся в выходные регистры. MR обнуляет все.

ну а дальше - дергаете ногами лпт сообразно подключению выводов к порту, чтобы сформировать нужные сигналы на лапах. ну т.е. поставить все лапы в ноль - дернуть MR - установить первый бит - поднять SHCP - опустить SHCP - установить второй бит - .... - установить N-й бит (8 * кол-во последовательно включенных регистров) - дернуть SHCP - дернуть STCP.

NiTr0 ★★★★★
()
Ответ на: комментарий от NiTr0

то есть мне не надо секретную информацию слать (типо 0x00000001), а дергать питанием сигнальные входы, но с определенной последовательностью?

milka
() автор топика
Ответ на: комментарий от anonymous

через юсб темный лес, с контроллерами возиться, шить их

milka
() автор топика
Ответ на: комментарий от milka

слать нолики-единички - это и есть «дергать питанием сигнальные входы».

NiTr0 ★★★★★
()
Ответ на: комментарий от milka

подключаете к D0...D7 выводы регистров. потом - шлете байты в лпт порт.

ну к примеру подключили D0 - DQ, D1 - SHCP, D2 - STCP, D3 - MR - для сброса надо заслать 0x0, 0x8 (дернуть MR в 0 и обратно); для записи бита B (0 или 1) - (0x8 + B), (0xA + B); переноса накопленного на выходы - 0xC, 0x8

NiTr0 ★★★★★
()
Ответ на: комментарий от NiTr0

не особо понимаю, как оно на практике выглядит, как писать 1 или 0

мне надо слать так?

import parallel
p=parallel=Parallel()
p.setData(0x8) #вкл 8й
p.setData(0xa) #и т.д.

или просто давать питание (аналогично из примеров по зажиганию диодов)

import parallel, time
p=parallel=Parallel()
p.setData(1) #дать питание на 1й вывод
time.sleep(0.1)
p.setData(0) #снять со всех

и таким образом дергать этот сдвиговой регистр?

milka
() автор топика

Там эти регистры один за другим подцеплены. Так что если вдруг решишь включить устройство номер 251, придётся все 300 бит прокачать заново. И в это время устройства будут включаться-выключаться, в зависимости от того, что прокачивается. Тебе оно такое надо?

Взял бы какой-нибудь I²C GPIO. Сходу нагуглась микросхема поддерживающая 24 выхода. Есть один пин для выбора адреса, так что на одной шине можно одновременно установить две таких. Это уже 48 gpio.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

как я понял из картинок, данные в сдвиговом регистре записываются последовательно, ,а применяются одновременно (это в одном регистре, а как в несколько - не знаю)

300 мне не надо, но пару десятков предостаточно, они долго будут выполняться?

с интерфейсом i2c не знаком совсем

купил такой регистр с i2c, в надежде подключить к телефону jolla 1, у него такой разъем есть, но не взлетело что-то (весь мой опыт i2c)

да и тут не столько потребность, сколько интерес процесса

milka
() автор топика

ну и где ты сейчас в современных компах LPT найдёшь, сейчас полон алиэкспресс всяких одноплатников, релешек и прочих дистанционно управляемых девайсов, надо за прогрессом следить :)

Harald ★★★★★
()
Ответ на: комментарий от milka

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

Да, действительно, там две цепочки.

300 мне не надо, но пару десятков предостаточно, они долго будут выполняться?

Видимо, со скоростью один за такт. :-)

И я неправильно сказал. Там на схеме цепочки из 40 бит (5 * 8) вешаются на отдельные пины с данными. Странно, что автор схемы не добил до 320 выходов.

Если я правильно понимаю, в схеме RCLK у всех регистров подключен к LPT «autofeed». Без понятия, что это за выход, и как он включается.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

И в это время устройства будут включаться-выключаться, в зависимости от того, что прокачивается

Выходы «защёлкнуты». Пока сигнал не дашь, ноги будут висеть с прошлого раза. Так что минус только в прокачивании на каждое изменение кучи бит.

anonymous
()
Ответ на: комментарий от Harald

у меня есть лпт, да и можно серез ком порт, разница не велика

сдвиговой регистр стоит копейки, и как еще всякие резисторы, оптроны

а блок реле, управляемый через юсб или ви-фи стоят значительно дороже, да и нет острой необходимости, чтобы покупать, но сделать интересно

milka
() автор топика
Ответ на: комментарий от i-rinat

меня не пугает запись 10-30 бит, ведь это компуктер делать будет, а не я в ручную)

milka
() автор топика

MR можешь сразу к плюсу питания подключить. Для управления регистрами используй три бита. Пускай первый бит будет отвечать за данные (DS, data), второй — за сдвиг данных (SHCP, shift), а третий (STCP, store) — за вывод сдвинутых данных на ноги микросхем. Линия data должна соединяться только с DS первой микросхемы, остальные микросхемы должны брать дату из выхода (D7S) предыдущих. SHCP и STCP можно параллелить (если это то, что тебе нужно).

DATA_BIT = 1  # первый бит
SHIFT_BIT = 2 # второй бит
STORE_BIT = 4 # третий бит

def send_one_byte(b, store=False):
    p.setData(0)
    for i in range(8):
       one_bit = bool(b & 0x80)   # берём старший разряд, 1 или 0
       b = b << 1                 # и сдвигаем по одному битику
       p.setData(one_bit*DATA_BIT + 0*SHIFT_BIT)
       p.setData(one_bit*DATA_BIT + 1*SHIFT_BIT)
    if store:                     # выводим данные, если надо
        p.setData(1*STORE_BIT)
        p.setData(0*STORE_BIT)

# а так можно переслать два байта в два регистра:
send_one_byte(0x55)              # во втором регистре будет 0x55
send_one_byte(0xaa, store=True)  # в первом — 0xaa

если это не будет работать, то, надеюсь, что станет хотя бы немного яснее

anonymous
()

скачайте книжку: «разработка устройств сопряжения для персонального компьютера типа IBM PC» автор Новиков, Калашников, Гуляев. Там подробно и с примерами все есть.

Хотя судя по вопросам, вам бы начать с какого-нидь Хоровица-Хила с раздела цифровая электроника.

yax123 ★★★★★
()
Ответ на: комментарий от anonymous

спасибо за пример, приступлю к пайке

только вот я не очень понял, какие выводы в результате должны зажечься?

milka
() автор топика
Ответ на: комментарий от yax123

признаться честно, не люблю подобную литературу: мне удобней по примерам и схемам познавать подобные вещи, а знать, кто когда и как это придумал, не особо интересно

milka
() автор топика
Ответ на: комментарий от milka

Зажгутся те, которые будут установлены в 1. Да, не забудь про OE, их можно сразу к земле припаять.

>>> f'{0x55:08b}, {0xaa:08b}'
'01010101, 10101010'

Вместо 0x55, например, можно написать 0b01010101, чтобы понятнее было. 0x и 0b — префиксы шестнадцатеричного и двоичного литералов.

send_one_byte(0b01010101) 
anonymous
()
Ответ на: комментарий от anonymous

стесняюсь спросить, а землю куда? землю и 5В, допустим, на юсб посажу (образно говоря, отдельный источник питания), а землю с лпт никуда не надо сажать (19-25 пины)?

milka
() автор топика
Ответ на: комментарий от milka

Если у тебя усб в этом же компьютере, то никуда не надо, в нём все земли связаны. А если совсем отдельный источник, тогда надо землю источника связать с землёй компа.

anonymous
()
Ответ на: комментарий от anonymous

пока что навесным монтажом 1 подцепил, 2 не пробовал, и оно заработало! спасибо тебе огроменное, все досканально разжевал

еще небольшой вопрос, питание подается на выводы с юсб? оптроны могут не выдержать, но это дело десятое

milka
() автор топика
Ответ на: комментарий от milka

Да, с юсб. Оптроны разные бывают. Без ограничения да, можно всё попалить. Если не уверен, то подключай оптроны через килоомные сопроивления. У регистров ограничение по току такое же, как и у LPT, что-то около 20 миллиампер на ногу.

На большинство устройств можно найти даташиты.

Пожалуйста, очень рад, что всё получилось :)

anonymous
()
Ответ на: комментарий от milka

Я понимаю у каждого свой путь познания, но ваш путь лишен системности.

При системном подходе, у вас бы даже вопроса не возникло: открыли даташит на 595 , распиновку и направление линий в centronicse, схему какой бит какой линии соответствует и все.

Радует конечно, что молодежь пытлива, но вот подход к получению знаний печалит. Ладно, больше не буду вас своим брюзжанием раздражать.

yax123 ★★★★★
()
Ответ на: комментарий от yax123

я даже с неадекватной критики не злюсь (не обращаю внимания), а к подобным словам отношусь нормально

даташитами умею пользоваться, если радиодеталь не особо сложная (сдвиговой регистр 1й раз в руках держу), а вот программную часть я не осилил бы, чего в даташите нет

milka
() автор топика
Ответ на: комментарий от milka

ну как-то же с LPT порта оптопарой управляете?
Значит знаете куда прицепить вход оптопары, знаете распиновку, понимаете, что есть там входы, а есть выходы. Уже поняли что есть 3 байтовых порта, поняли как туда записать байт, поняли какой бит байта соответствует какой ноге.
Значит должны уже понимать, что ногодрыжеством путем записи байтов с нужными битами в нужные адреса lpt-порта можно сварганить любою комбинацию сигналов на выходе.
А повторяя это во времени можно организовать протокол обмена.
В целом, это вполне стандартная практика называется «bit bang». Можно хоть на LPT, хоть на rs232, хоть через usb подключить ft232rl там организовать бит банг. И соответственно любой протокол.
У меня младший колега, сбацал так SPI через ft232, туда же прицепил 595 регистр, чтобы было не 8 выходов, а 12.

При системном подходе это будет очевидно, даже не зная как программировать и паять.

yax123 ★★★★★
()
Ответ на: комментарий от yax123

в первом случае я подцепил оптрон через резистор 100 Ом, и давал на его вывод питание

# заголовок
import parallel
p=parallel.Parallel()
# потом просто давал питание на выводы
# 1 - 1й вывод 
# 2 - 2й вывод
# 4 - 3й вывод
# 8 - 4й вывод
# 16 - 5й вывод
# 32 - 6й вывод
# и так до 128 - 8й вывод
# дать питание на 1й м на 5й вывод это 1+16=17
# вот я и писал 17 в порт
p.setData(17)

этот пример я нагуглил, ибо ранее не пробовал лпт на практике, и тут все просто, на деле лпт на данные выводы дает питание, где подцеплен оптрон, где идет развертка до реле (это все я тоже нагуглил, но в принципе реально сообразить)

а со сдвиговым регистром я бы долго голову ломал, около месяца

но что плохого в том, что мне объяснил это человек на доступном мне языке, в качестве диалога, отвечая на вопросы? а не в виде монолога, т.е. книги

2й абзац про bit bang, ft232rl, spi честно я не понял, пока что не довелось столкнуться)

понимаю, что вы старше и знаете много из этой области, поэтому не воспримите за хамство, ни капли сарказма в моих словах

milka
() автор топика
Ответ на: комментарий от milka

Я все понимаю. Хочется всего и сразу и с минимальными усилиями. Это здорово, что вы вообще в это полезли.

Я лишь хотел сказать, что на таких описаниях вы далеко не уедете. Потому как, что бы понимать, что происходит, нужен определенный контекст. Нужно понимание как устроено все с чем вы работаете. Вот я вам его и попытался дать. Понятно, что этот путь дольше, но зато есть гарантия, что столкнувшись с проблемой вы сможете ее решить и двигаться дальше, а в противном случае упретесь в элементарщину и забросите вообще. А самое худшее вообще в «напильника» превратитесь, лучше уж в юриста-экономиста.

yax123 ★★★★★
()
Ответ на: комментарий от yax123

хм, справедливое замечание

действительно, есть вещи, которые я изучил не до конца, а какие-то поверхностно (в данной области), надо исправляться

milka
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.