Вчера опять сломался самодельный кухонный таймер - тактовая кнопка развалилась. Решил заодно сфотографировать и рассказать про схему и программу.
Это уже второй мой самодельный таймер, первый был на восьминогом ATtiny13A, регистре CD4015 и трёхразрядном семисегментнике с общим катодом. Программу писал на BASCOM-AVR. Но таймер понравился сестре жены, и подарил ей. А себе собрал вот этот на ATtiny2313A.
Индикатор от старого МФУ, с общим анодом. Аноды индикатора подкючены к 6 и 7 выводам МК. Катоды - через резисторы 470 Ом (расположены под индикатором, поэтому на фото не видно) к порту B (ножки 12...19 МК). Вывод 11 МК - к транзисторному ключу, включающему зуммер (со встроенным генератором).
Кнопки подключены к 8 и 9 выводам МК, замыкают на общий провод. Хотя в программе включена подтяжка порта, но практика показала, что лучше поставить и внешние подтягивающие резисторы по 10 Ком.
Вывод 1 (RESET) через резистор 10 кОм соединён с плюсом питания, а с минусом - конденсатором 10 мкФ. Параллельно конденсатору кнопка сброса.
Параллельно питанию тоже конденсатор 100 мкФ. Оба конденсатора на 10 вольт. Питается от зарядки пятью вольтами. Корпус представляет собой деревянный коробок без крышки, склеенный из тарной дощечки, в который плата вставляется с натягом.
Как оказалось, самое "слабое звено" - это кнопки. На кужне часто влажно, контакты окисляются, приходится нажимать сильнее, и в конце концов они разваливаются. Раз в год приходится менять. Герметичных кнопок у меня нет, пробовал ставить микропереключатели из компьютерной мышки - тоже не надолго...
Программу писал на CodeVision AVR. При инициализации (и после сброса) счётчик минут устанавливается в 15. Это в любое время можно изменить нажатием кнопок. Одна кнопка циклически увеличивает значение десятков минут (после 9 будет 0), вторая - аналогично единицы минут. Всё происходит внутри прерывания по таймеру, которое происходит каждую секунду. Обработка кнопок тоже происходит только раз в секунду, поэтому не тыкайте как пулемёт и не вопите, что не работает! Просто нажмите кнопку, и наблюдайте, как раз в секунду меняется значение. Так сделано для упрощения обработки дребезга кнопок.
Внутри прерывания реализована и динамическая индикация (частота 100 Гц). Знаю, что криво, но писалось по-быстрому, главное - работает. Поскольку тактирование от внутреннего RC-генератора, который особой точностью не отличается, хотя с завода он подстраивается калибровочной константой, то была произведена подборка константы, загружаемой в регистр таймера МК. Строка в коде:
TCNT0=0xE2;
Было выставлено 60 минут (3600 секунд), засечено секундомером реальное время, отработанное таймером, и по результату (отстаёт/убегает) константа скорректирована. Как посчитать пропорцию, надеюсь вам объяснили ещё в начальной школе.