Страница 4 из 6
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вс июл 05, 2026 08:49:01
Rapra
ejsanyo писал(а): Вс июл 05, 2026 01:33:40
выкрутасы на +1 контроллере, а потом ещё их подружить между собой.
А че их "дружить"? Тот же самый слейв I2C, как и в PCF. Или слейв SPI, у топикстартера он уже есть в контроллере. Написать простецкую прошивку - ну че там сложного то? Тем более, что топикстартер сказал, что это не его задача.
Придумывать какие-то свои хитрозамудренные интерфейсы не нужно - "всё уже
украдено придумано до вас". SPI - простой, понятный и надежный интерфейс.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вс июл 05, 2026 11:39:29
Zapolyarny
ejsanyo писал(а): Вс июл 05, 2026 02:49:49
И +1 прошивка, не забывайте.
Это модульная архитектура, она больше удобна, чем нет. Кроме того, в этой прошивке можно реализовать много чего ещё. Например, дополнительный контроль состояния основного мк и выдача сигнала аварии.
ejsanyo писал(а): Вс июл 05, 2026 02:49:49
Одну линию хотите? А вы помните, что автор хочет будить свой "ОМК" прерываниями? После чего уже опрашивать кнопки. Просто пнуть в одну сторону и прерывание и данные, безо всякой обратной связи? Как-то слишком смело.
Помню. И это реализуется настолько просто и банально, что даже объяснять не нужно. Этот "смелый" режим используется производителями готовых контроллеров, выше приводил ссылки.
ejsanyo писал(а): Вс июл 05, 2026 02:49:49
Кроме того, придётся ставить кварцы и там и там, чтобы не было разбега скоростей передачи. Или молиться на точность RC-генератора в контроллере-слэйве? (AT90, как мы помним, в любом случае работает только с кварцем)
А контакты не нужно синхронизировать?

Даже USB может работать без кварцевого резонатора и привлечения высших сил, такие решения есть у WCH.
ejsanyo писал(а): Вс июл 05, 2026 02:49:49
Полностью синхронный I2C в этом плане заморочек не имеет.
Разве I2C может работать на абсолютно любой скорости? Производитель контроллера а-ля PCF8574 может не согласиться с таким. И есть USART, который всё равно проще, сравним с SPI, предложенным
Rapra
ejsanyo писал(а): Вс июл 05, 2026 02:49:49
мой встроенный визионер подсказывает, что у него там аппаратный UART может быть уже чем-то занят. А делать второй программный - это ой как сложнее чем I2C!
Да. Или I2C. Или SPI. Задача не решаема, мы просто болтаем о вариантах, а применительно к проблеме ТС нет смысла: он скрывает информацию. Программный синхронный UART проще любого I2С, хоть программного, хоть аппаратного.
ejsanyo писал(а): Вс июл 05, 2026 02:49:49
по энергопотреблению. А вы точно уверены, что ваш контроллер-слэйв будет в этом плане хорош? Особенно в руках такого себе погромиста? PCF, с другой стороны, пока к ней нет обращения, жрёт практически ничего. Да и в динамике потребление мизерное.
Во-первых, этим специалистом и то и другое может быть сделано тяп-ляп. Во-вторых, свобода в выборе микроконтроллера позволяет варианты с таким ультранизким потреблением, что PCF8574 почувствует себя обжорой. В-третьих, можно сделать потребление в простое 0: питание будет обеспечиваться теми самыми же контактами, которых надо и опрашивать. В том числе и у PCF8574.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июл 07, 2026 12:56:07
Призрачный Суслик
Написано много, к сожалению, ответить каждому не смогу, но вижу повторяются одни и те-же советы по кругу, как будто никто не читает предыдущие сообщения. Отвечу в третий уже раз.
1) Применить любые микросхемы расширения интерфейса с протоколом I2С не выйдет. Программист не справится, а я ввиду слабого знания этого интерфейса ему не смогу написать нормально ТЗ. Это поднималось в самом начале темы.
2) Второй ОМК тоже не желательно. Причин очень много. Основная - объяснить эту необходимость начальству. Плюсом крайне узкий диапазон "разрешенных" ОМК и средств отладки.
3) "Кнопки" это не кнопки, а некие контактные группы. Одновременно могут быть замкнуты от одной до 12 "кнопок".
Нужно решения "из говна и палок" простое и дешевое. Пока склоняюсь к матрице 4х3 "кнопок" с диодом последовательно с каждой "кнопкой". Опрос "бегущей 1" с выводов данных индикатора. Резисторы больших номиналов. с объединительных шин на "землю", с нис съем данных на 3 входа. Плюсом диодно-резистивный элемент 3ИЛИ на вывод прерывания. Одного опасаюсь, что прямого падения на двух, последовательно соединённых, диодах шоттки будет слишком много, для того, что бы дотянуть "лог. 1" на выводе прерывания, с учётом питания в 3 вольта.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июл 07, 2026 13:51:11
Rapra
Эт что ж там за погромист, что с I2C не справится?

И с SPI тоже не справится? И микроконтроллер тоже нельзя? Разрешено только говно и палки? Оу щит, что у вас там за гестапо то?
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июл 07, 2026 14:35:19
veso74
Призрачный Суслик писал(а): Вт июл 07, 2026 12:56:07
... Программист не справится ... не смогу написать нормально ТЗ ... объяснить эту необходимость начальству ... Нужно решения "из говна и палок" простое и дешевое
Призрачный Суслик, неплохо было бы изложить эти истины в качестве параметров и требований в самом начале.
(Уверен, после этого не было бы ни одного ответа/предложения -> желание помочь мгновенно испарится).
Все простое: объясните начальству: "Невозможно сделать". И все.
Личное мнение.

Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июл 07, 2026 14:50:33
akl
AT90S2313 не имеет встроенного SPI для обмена данными и выход из SLEEP POWER DOWN возможен только по низкому уровню на лапах INT0 или INT1.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июл 07, 2026 16:04:48
Starichok51
Призрачный Суслик писал(а): Вт июл 07, 2026 12:56:07Нужно решения "из говна и палок" простое и дешевое. Пока склоняюсь к матрице 4х3 "кнопок" с диодом последовательно с каждой "кнопкой". Опрос "бегущей 1" с выводов данных индикатора. Резисторы больших номиналов. с объединительных шин на "землю", с нис съем данных на 3 входа. Плюсом диодно-резистивный элемент 3ИЛИ на вывод прерывания. Одного опасаюсь, что прямого падения на двух, последовательно соединённых, диодах шоттки будет слишком много, для того, что бы дотянуть "лог. 1" на выводе прерывания, с учётом питания в 3 вольта.
схему изобрази, как это ты представляешь. никто не согласится гадать по этому твоему словесному описанию.
а по твоей схеме могут появится улучшения схемы и другие идеи.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июл 07, 2026 16:20:06
Призрачный Суслик
Rapra писал(а): Вт июл 07, 2026 13:51:11
Эт что ж там за погромист, что с I2C не справится?
Студент.
Rapra писал(а): Вт июл 07, 2026 13:51:11
И с SPI тоже не справится?
Читайте тему, там написано про SPI.
Rapra писал(а): Вт июл 07, 2026 13:51:11
Разрешено только говно и палки? Оу щит, что у вас там за гестапо то?
Извините, тут не "гугол" и не "спейсикс". Начальству надо отчитываться перед вышестоящим, что "решили проблему за 5 копеек с помощью говна и палок". Как будто не в России живёте.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июл 07, 2026 16:39:36
Призрачный Суслик
Starichok51 писал(а): Вт июл 07, 2026 16:04:48
схему изобрази, как это ты представляешь. никто не согласится гадать по этому твоему словесному описанию.
а по твоей схеме могут появится улучшения схемы и другие идеи.
Изобразить я её изобразил, но никакой файл отправить сюда не могу пока.
В любом случае уже макет делают. Получится или не получится, не знаю.
В кратце так:
1) с линий РB0-РВ3 подключены аноды диодов по три штуки к трём кнопкам с каждой линии. Туда же подключены выводы индикатора D4-D7. Катоды диодов, соответственно к кнопкам.
2) с каждых четырёх кнопок, по одной с каждой линии порта В идёт сборная шина к выводам PD0,PD1,PD4, которые являются входами. С каждого входа к "земле" резистор в 100 кОм , для обеспечения открывания диодов. Надеюсь, что 100 кОм не непомерная нагрузка для выходов индикатора.
3) С каждой сборной шина идёт по диоду к входу INT1. Анодом к шине, катодом к входу INT1. С входа на землю 330 ком для обеспечения открывания диодов. Может даже 470 кОм.
После всего, перед переходом в режим SLEEP выставляем на выходах РB0-РВ3 "лог 1" и переходим в режим SLEEP/
Если нажата хоть одна "кнопка" то через диод на одну из сборных шин пойдёт высокий потенциал, а с неё через второй диод на вход запроса прерывания. Надеюсь уровня хватит, или придётся ставить транзистор. По фронту напряжение должно генерироваться прерывание, отключаться режим SLEEP и на выходах РB0-РВ3 выставляется "лог. 0", контролируем отсутствие "1" на входах PD0,PD1,PD4. Если это так, то начинаем опрос, выдавая на РB0-РВ3 по очереди "лог. 1" и контролируя состояние PD0,PD1,PD4.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июл 07, 2026 18:22:45
Rapra
Как раз в России и живу. И обычно отвечаю, что из говна и палок и получается говно и палки. Главное, аргументировано ответить, и желательно показать это говно. Нормальный начальник понимает, что репутация компании стоит дороже, чем экономия нескольких рублей.
У вас, как вижу, экономят даже на сотрудниках, поручая разработку слабо разбирающемуся студенту. Пичалька конечно, это неправильно.
Так что, из говна и палок получится именно говно и палки. Нормальное решение стоит недорого, просто надо аргументировано убедить начальство.
Хотя вобсчем то, лет 20 назад, когда микроконтроллеры были маленькими, мы как-то умудрялись впихивать в них и клавиатуру, и дисплей-двустрочник 1602.
Но сейчас, в 2026 году, можно взять именно подходящий микроконтроллер с нужным числом ног. При этом, его цена будет даже ниже, чем имеющегося микроконтроллера. Нужно просто хоть немного следить за актуальным ассортиментом компонентов, а не сидеть на том, что давно устарело.
Призрачный Суслик писал(а): Вт июл 07, 2026 16:39:36
Получится или не получится, не знаю.
ух ё, как же всё неправильно у вас делается. Хотябы вначале для теста в Протеусе прогнали бы, там видно было бы хоть что-то. Протеус же позволяет симулировать цифровые и смешанные схемы, проверять работу программы в первом приближении.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июл 07, 2026 18:45:32
Призрачный Суслик
Rapra писал(а): Вт июл 07, 2026 18:22:45
Как раз в России и живу. И обычно отвечаю, что из говна и палок и получается говно и палки.
Не всегда - уже много лет делаем из говна и палок. Просто решил спросить, вдруг, кто то "красивую" идею подкинет. Тут дали ссылочку на одну книгу, но скачать с нынешним интернетом нереально.
Rapra писал(а): Вт июл 07, 2026 18:22:45
Главное, аргументировано ответить, и желательно показать это говно. Нормальный начальник понимает, что репутация компании стоит дороже, чем экономия нескольких рублей.
Я не умею. Уж извините. За многие годы усвоил, что перечить начальству не стоит, коль не умеешь "отмазываться", изволь трудится.
Rapra писал(а): Вт июл 07, 2026 18:22:45
Но сейчас, в 2026 году, можно взять именно подходящий микроконтроллер с нужным числом ног. При этом, его цена будет даже ниже, чем имеющегося микроконтроллера. Нужно просто хоть немного следить за актуальным ассортиментом компонентов, а не сидеть на том, что давно устарело.
Это готовые изделия, которые надо переделать в другие изделия. Есть и другие ограничения, обсуждение которых выходит за рамки темы.
Призрачный Суслик писал(а): Вт июл 07, 2026 16:39:36
Хотябы вначале для теста в Протеусе прогнали бы, там видно было бы хоть что-то
В "Протеусе" проверил, вроде работает. Но с сильно ограниченной программой в силу уровня программиста. Но там дребезга нет. Установки порогов переключения входов нет.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июл 07, 2026 19:06:26
Rapra
В Протеусе надо проверять не дребезг контактов, а саму концепцию.
Пороги переключения, они заданы логическими уровнями, и в Протеусе так же отрабатывают, как и в железе.
Если я правильно "на слух" понял схему по описанию, то работать должно.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июл 07, 2026 19:09:42
Призрачный Суслик
Такое ощущение, что нет. Как такового "порогового" свойства входы не имеют. Если на вход подавать пилу, амплитудой в питание, то бывают непонятные реакции модели компонента. Или постоянно "лог. 1" или , чаще "лог. 0". Вплоть до того, что приходится по входу компаратор добавлять с цепями гистерезиса.
Как вариант, не умею пользоваться. Версия 8.х
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июл 07, 2026 19:13:10
Rapra
Если входное напряжение находится между порогами лог.уровней, то и в железе возможны ложные определения лог.уровня.
Re: Подключить многог кнопок на мало выводов.
Добавлено: Вт июл 07, 2026 22:23:53
ejsanyo
Призрачный Суслик писал(а): Вт июл 07, 2026 12:56:07
Программист не справится, а я ввиду слабого знания этого интерфейса ему не смогу написать нормально ТЗ. Это поднималось в самом начале темы.
О-ох, ну давайте поможем
Даше прокачать скиллы в I2C!

В чём там ваш коллега кодит? Под AVRGCC небось? Тогда вот:
Файл SoftI2C.h
Код: Выделить всё
#ifndef SOFTI2C_H
#define SOFTI2C_H
#include <avr/io.h>
#include <stdint.h>
#include <stdbool.h>
#include <util/delay.h> //это всё по жизни есть в AVRGCC
//дефайны для функций софтового I2C
//сюда забить конкретные пины вашего I2C
#define PI2C_SDA PB1
#define PI2C_SCL PB0
//сюда забить регистры порта, где эти пины висят
#define OUT_REG PORTB
#define IN_REG PINB
#define SW_REG DDRB
void setup(void);
bool PCF8574_read(uint8_t, uint8_t *);
bool PCF8574_write(uint8_t, uint8_t);
#endif
Файл SoftI2C.c
Код: Выделить всё
#include "SoftI2C.h"
//дрыгаем ногами переключая режим ног то на вход, то на выход
#define SDA_OFF (SW_REG |= (1 << PI2C_SDA))
#define SDA_ON (SW_REG &= ~(1 << PI2C_SDA))
#define SCL_OFF (SW_REG |= (1 << PI2C_SCL))
#define SCL_ON (SW_REG &= ~(1 << PI2C_SCL))
#define SDA_READ (IN_REG & (1 <<PI2C_SDA))
#define SCL_READ (IN_REG & (1 <<PI2C_SCL))
#define I2C_READ 0x01
#define I2C_WRITE 0x00
//устанавливает начальное состояние регистров ног для I2C
void setup()
{
SDA_ON;
SCL_ON;
OUT_REG &= ~((1 << PI2C_SCL) | (1 << PI2C_SDA)); //в вых. регистре заранее забиваем нужные биты нулями
}
//Формирует состояние шины "старт"
void start()
{
SDA_ON;
_delay_us(50);
SCL_ON;
_delay_us(50);
SDA_OFF;
_delay_us(50);
SCL_OFF;
_delay_us(50);
}
//Формирует состояние шины "стоп"
void stop()
{
SDA_OFF;
_delay_us(50);
SCL_ON;
_delay_us(50);
SDA_ON;
_delay_us(50);
}
//прокачивает 8 бит. возвращает true = был ACK от слэйва, false = было молчание в ответ
bool Tx(uint8_t dat)
{
for(uint8_t i = 0; i < 8; i++)
{
(dat & 0x80) ? SDA_ON : SDA_OFF;
dat <<= 1;
_delay_us(50);
SCL_ON;
_delay_us(50);
SCL_OFF;
_delay_us(50);
}
SDA_ON;
SCL_ON;
_delay_us(50);
bool ack = !SDA_READ; // читаем ACK-бит
SCL_OFF;
return ack;
}
//принимает 8 бит от слейва. параметр - true = наш мастер отвечатет ACK, false = отвечает NACK
uint8_t Rx(bool ack)
{
uint8_t dat = 0;
SDA_ON;
for(uint8_t i = 0; i < 8; i++)
{
dat <<= 1;
do
{
SCL_ON;
}
while(SCL_READ == 0); //ждём пока освободится линия SCL (поддержка "растяжки" SCL)
_delay_us(50);
if(SDA_READ) dat |= 1;
_delay_us(50);
SCL_OFF;
}
ack ? SDA_OFF : SDA_ON;
SCL_ON;
_delay_us(50);
SCL_OFF;
SDA_ON;
return(dat);
}
//чтение регистра чипа по I2C
//возвращает true если успешно прочиталось. Данные будут лежать по ссылке dat
bool PCF8574_read(uint8_t addr, uint8_t *dat)
{
start();
if (Tx((addr << 1) | I2C_READ) == false)
return false;
*dat = Rx(false);
stop();
return true;
}
//запись в регистр чипа по I2C
//возвращает true если успешно записалось.
bool PCF8574_write(uint8_t addr, uint8_t dat)
{
start();
if (Tx((addr << 1) | I2C_WRITE) == false)
return false;
if (Tx(dat) == false)
return false;
stop();
return true;
}
Скопипастить-то к себе он это хотя бы в состоянии? Вот ему кусок
main-а для примера:
Код: Выделить всё
#include <avr/io.h>
#include <stdint.h>
#include <stdbool.h>
#include <util/delay.h>
#include "SoftI2C.h"
//адресы чипов
#define ADDR1 0x20
#define ADDR2 0x21
int main(void)
{
uint8_t data1, data2;
setup();
PCF8574_write(ADDR1, 0xFF); //сделали все входо-выходы единицами. Чисто на всякий случай
PCF8574_write(ADDR2, 0xFF);
while (true)
{
PCF8574_read(ADDR1, &data1); //читаем первый ряд "кнопок"
PCF8574_read(ADDR2, &data2); //второй ряд "кнопок"
_delay_ms(1000);
}
}
Вот это всё скомпилялось у меня в 436 байт. Уверен, другие юзвери могут предложить код покрасивее и эффективнее. Но вот вопрос: у вас там хотя бы места во флэхе ещё остаётся, для всяких доработок? 2 кБ это не так уж много!
Спойлер
Вас ведь уже предупреждали, что если будете делать с гомен и палок, то получите в результате лишь гомна и палки, а не работающий прибор? Мой вам совет - либо делайте с адекватной для поставленной задачи надёжностью и гарантией, либо не делайте вообще. Иначе будет только хуже.
Re: Подключить много кнопок на мало выводов.
Добавлено: Ср июл 08, 2026 12:47:39
Призрачный Суслик
"Пишет" на ассемблере естественно. Во первых изначальная программа на нём, во вторых, иначе не уместить код.
Но, как говориться, процесс запущен. Всем спасибо за бессодержательные советы по 5 штук подряд и отдельное тому, кто порекомендовал книгу и "ejsanyo" за код, который, возможно, пригодится в будущем.
Re: Подключить много кнопок на мало выводов.
Добавлено: Ср июл 08, 2026 13:55:23
ejsanyo
О боже, "давайте ещё сильнее усложним себе жизнь"!

На самом деле современные и не очень сишные компиляторы уже давно стали очень эффективны, а AVR-овский асм не настолько многогранен и не напичкан хитрыми командами. Так что с ручной оптимизацией места особо не выиграете, а вот времени и сил потратите дофига. Тем не менее, на худой конец сами Atmel в своё время сделали библиотеку на асме для этого:
. Вот её описание:
С ней правда, пишут,
есть небольшой баг (сам не проверял), который, впрочем, при чтении лишь одного байта (как сейчас и требуется) мешать не должен. Предлагаемый патч я в исходник скопировал. Так понимаю, надо будет заменить все PORTD, PIND, DDRD если захотите пользовать порт B. SCLP, SDAP тоже назначить надо будет.
Там в файле есть секция main, в ней пример, как всем этим пользоваться: "**** Write data => Adr(00) = 0x55 ****" - например так пишем по адресу 0x00 код 0x55. "**** Read data => i2cdata = Adr(00) ****" - читаем по адресу 0x00. Байт читается в регистр, назначенный на i2cdata.
И ещё: будете читать/писать PCF8574, эту вещь:
Код: Выделить всё
ldi i2cdata,$00 ; Write word address (0x00)
rcall i2c_do_transfer ; Execute transfer
делать не нужно, это если вы пишете/читаете какой-нибудь чип eeprom, вроде 24LC01. У PCF8574 же адресов регистров или типа того нет, регистр всего один и читается/пишется напрямую. Только адрес чипа задать не забудьте:
Re: Подключить много кнопок на мало выводов.
Добавлено: Ср июл 08, 2026 14:56:47
Призрачный Суслик
Спасибо. Сохранил на всякий случай.
Как уже говорил, я не программист. Но коли он прибежит ко мне, я ему эти файлы на изучение отдам. В любом случае пока пошла в дело схема на диодах, она дешевле.
Re: Подключить много кнопок на мало выводов.
Добавлено: Чт июл 09, 2026 12:32:22
BOB51
Чем дальше в дебри....
Ежли уже захотелось в sleep поиграться, то хоть согласование с режимами выхода из него надо учитывать...
Да и в какой из двух (для AT90S2313) видов Idle Mode или Power-down Mode будет загоняться МК ?
Выход из сна правда в выбранном случае все равно длительным нулем на любом из внешних прерываний...
А сие как то ближе к сканированию клавиатуры "бегущим нулем", а не "бегущей единицей"...
Да и каким образом позиционные ключи индикатора смогут работать при останове МК?...
Вот кстати весьма полезная книжа с русским переводом на те старые МК:
Спойлер
Евстифеев А.В.
Е263 Микроконтроллеры AVR семейства Classic фирмы ATMEL —
33е изд., стер. — М.: Издательский дом «ДодэкаXXI», 2006. —
288 с.: ил. (Серия «Мировая электроника»)
ISBN 5594120012773
в сундуке явно была, но пока сундук кота ...

УВЫ...
Родной даташит надеюсь на тот МК имеется...

Как дополнительный источник литературы могу указать вот это
https://elektromehanika.org/
раздел
https://elektromehanika.org/load/serii_tekh_lit_ry/10
там начиная с конца где то может быть в подборках или в разделе справочной литературы.
Или тут чего накопать в соответствующих разделах:
https://publ.lib.ru/publib.html

Re: Подключить много кнопок на мало выводов.
Добавлено: Чт июл 09, 2026 14:10:12
Rapra
Просто перед переходом в sleep выставить на всех выходах лог.1.