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 ★
() автор топика
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.