Урок 21
Часть 1
Управление DS1307 кнопками
Сегодня мы продолжаем работать с любимой нами микросхемой DS1307, и теперь наша задача, научиться управлять данной микросхемой с помощью кнопок, то есть устанавливать начальные показания не прошивкой, а интерактивно. Это очень важная задача, и для того, чтобы её решить, придется поработать и одной или двумя частями тут не отделаешься.
Для этого мы создадим проект с именем MyButtonClockLCD, подключим к нему все файлы кроме главного модуля из проекта предыдущего занятия My1820LCD, а код в главный модуль скопируем также весь из файла главного модуля того же урока.
Начнём теперь потихонечку в наш код вживлять код отслеживания того, какая из кнопок в определённый момент будет нажата.
Чтобы нам заниматься отслеживанием состояний кнопок, нам нужно их ещё и подлкючить. У нас будет задействовано 3 кнопки, у них будет один общий провод, а остальными контактами мы их подтянем к 1, 2 и 3 ножкам порта C вот таким вот образом. Всё остальное в схеме не трогаем, всё оставляем как и в предыдущем занятии.
Вернёмся в код. В пршлом занятии я писал, что мне очень не нравится, что когда мы снимаем показания с цифрового термометра, у нас получается очень огромная задержка, и, если мы расположим отслеживание состояния кнопок в бесконечный цикл, то мы их рискуем вообще не отследить из-за большой суммароной задержки практически в секунду. Да ещё и биты считанные мы используем далеко не все. Просто код писался идеальный в учебных целях именно под 12-битный режим. А теперь нам уже нужна оптимизация. Поэтому зайдём в файл DS18B20.c и подумаем над величиной нашей задержки в функции dt_check. Заглянув в таблицу, которую мы видели в предыдущем уроке и оценив то, что мы вобще не используем доли, то нам подойдёт задержка в 97 милисекунд. Поставим 100 на всякий случай и перепишем комментарий
dt_sendbyte(T_CONVERT);//измеряем температуру
_delay_ms(100); //в 9битном режиме преобразования — 93.75ms (tCONV/8)
Вернёмся в главный модуль.
Чтобы нам было проще и комфортабельнее работать с портами и их ножками, а также в целях их замены на другие в любой момент напишем определённые макросы
#include «main.h»
//—————————————-
#define BUTTONPORT PORTC
#define BUTTONPORT1 PORTC1
#define BUTTONPORT2 PORTC2
#define BUTTONPORT3 PORTC3
#define BUTTONPIN PINC
#define BUTTONPIN1 PINC1
#define BUTTONPIN2 PINC2
#define BUTTONPIN3 PINC3
#define BUTTONDDR DDRC
#define BUTTONDDR1 DDRC1
#define BUTTONDDR2 DDRC2
#define BUTTONDDR3 DDRC3
Теперь напишем макросы ещё для режимов, чтобы у нас программа в каждый конкретный момент находилась в определённом режиме, и уже зависимости от того, какой у нас в данный момент режим, код у нас выполнялся как-то по особенному для каждого режима.
#define BUTTONDDR3 DDRC3
#define CLOCKMODE0 0
#define CLOCKMODEDATE 1
#define CLOCKMODEMONTH 2
#define CLOCKMODEYEAR 3
#define CLOCKMODEDAY 4
#define CLOCKMODEHOUR 5
#define CLOCKMODEMIN 6
#define CLOCKMODESEC 7
//—————————————-
То есть у нас будут каждому режиму соответствовать числа. У нас будет обычный режим нулевой, а также режимы соответствующие каждому показанию датчика.
В бесконечном цикле убавим также задерку, так как кода у нас и так много и на время его выполнения уже уходит много времени, а будет ещё больше
I2C_SendByteByADDR(0,0b11010000); //переходим на адрес 0
_delay_ms(50);
Также в функцию main() добавим ещё несколько определённых переменных, которые нам пригодятся в дальнейшем, а также все их сразу проинициализируем нулями
unsigned int tt=0; //переменная для хранения температуры
unsigned char button1state=0;//статус кнопки 1
unsigned char clockmode=CLOCKMODE0;//обычный режим показаний дисплея
char blinkstate=0;//переменная для мигания определенным показателем на дисплее
Писать дальнейший код мы продолжим в следующей части нашего занятия.
Предыдущий урок Программирование МК AVR Следующая часть
Программатор, модуль RTC DS1307 с микросхемой памяти и дисплей можно приобрести здесь:
Программатор USBASP USBISP с адаптером USBASP USBISP 3.3 с адаптером
Модуль RTC DS1307 с микросхемой памяти
Смотреть ВИДЕОУРОК (нажмите на картинку)
AVR studio при компиляции ругается на #define BUTTONDDR1 DDRC1 и т.д.
Пишет: 'DDRC1' undeclared (first use in this function).
В чем может быть проблема?
Сам разобрался. Согласно даташиту нужно писать не DDRC1, а DDC1. Так же и с конфигурацией резисторов не PORTC1,а PC1 и т.д.