Atmega8. Нужна помощь.
Использование одного вывода для чтения
и записи одновременно, другими словами,
быстрое переключение из режима чтения
в режим записи и наоборот.
Есть схема. На порт D подключены кнопки
клавиатуры, 4 шт. Эти же выводы порта D
используются как выходы на семисегментный индикатор
E40561.
Исходники. В исходнике htr03.c в обработчике прерывания
таймера2 есть функция DynSwitch(). В ней происходит
чтение клавиатуры и динамическая индикация. По отдельности
чтение и индикация работают нормально. Вместе не работают,
чтение кнопок не происходит.
Для выяснения причин делал упрощенный исходник kb10.c.
В нем вывод на индикаторы через порт D не используется,
используется только переключение порта C, т.е. переключаются
только номера 4-х индикаторов, сегменты не используются.
Клавиатура проверяется звучанием саунда.
При этом выяснилось, путем добавления в программу по одной
строчке, что, когда переключается только один первый индикатор,
то клавиатура считывается и саунд работает(саунд работает
через порт C), при переключении только двух индикаторов,
первого и второго, частота саунда меняется. При добавлении
третьего индикатора саунд отключается. При этом непонятно,
чтение клавиатуры не работает, или клавиатура работает,
а саунд не работает.
Больше всего интересует в этой ситуации, есть ли какое-либо
каноническое программное решение на языке C для быстрого переключения
режима порта с чтения на запись и наоборот.
Схема и исходники в приложении.
htr03.c
kb10.c