AVR Урок 21. Управление DS1307 кнопками. Часть 1



 

Урок 21

Часть 1

 

Управление DS1307 кнопками

 

Сегодня мы продолжаем работать с любимой нами микросхемой DS1307, и теперь наша задача, научиться управлять данной микросхемой с помощью кнопок, то есть устанавливать начальные показания не прошивкой, а интерактивно. Это очень важная задача, и для того, чтобы её решить, придется поработать и одной или двумя частями тут не отделаешься.

Для этого мы создадим проект с именем MyButtonClockLCD, подключим к нему все файлы кроме главного модуля из проекта предыдущего занятия My1820LCD, а код в главный модуль скопируем также весь из файла главного модуля того же урока.

Начнём теперь потихонечку в наш код вживлять код отслеживания того, какая из кнопок в определённый момент будет нажата.

Чтобы нам заниматься отслеживанием состояний кнопок, нам нужно их ещё и подлкючить. У нас будет задействовано 3 кнопки, у них будет один общий провод, а остальными контактами мы их подтянем к 1, 2 и 3 ножкам порта C вот таким вот образом. Всё остальное в схеме не трогаем, всё оставляем как и в предыдущем занятии.

 

image00

 

Вернёмся в код. В пршлом занятии я писал, что мне очень не нравится, что когда мы снимаем показания с цифрового термометра, у нас получается очень огромная задержка, и, если мы расположим отслеживание состояния кнопок в бесконечный цикл, то мы их рискуем вообще не отследить из-за большой суммароной задержки практически в секунду. Да ещё и биты считанные мы используем далеко не все. Просто код писался идеальный в учебных целях именно под 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 с микросхемой памяти

Дисплей LCD 16×2

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

AVR Управление DS1307 кнопками

2 комментария на “AVR Урок 21. Управление DS1307 кнопками. Часть 1
  1. Jawas:

    AVR studio при компиляции ругается на #define BUTTONDDR1 DDRC1 и т.д.
    Пишет: 'DDRC1' undeclared (first use in this function).
    В чем может быть проблема?

  2. Jawas:

    Сам разобрался. Согласно даташиту нужно писать не DDRC1, а DDC1. Так же и с конфигурацией резисторов не PORTC1,а PC1 и т.д.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*