LCD дисплей на Ибее. Подключив стандартно — понял что это не то, что нужно. Масса проводов — занимает кучу ножек, хаос и беспорядок. Погуглил, понял что есть дисплеи с интерфейсами, упрощающие подключение. Внутричерепные Отогенные Осложнения Реферат подробнее. Месяц ожидания, ура- ура, подключил. Выглядит гораздо интереснее! Проблема возникла на этапе поиска рабочих библиотек и примеров.
Как оказалось потом — в основной наиболее известной библиотеке bitbucket. Это заняло некоторое время и силы=)Конкретно вот тут лежат рабочие примеры и ссылка на библиотеку. Новичку понять суть и забить необходимые данные — сложно! Все что выше — рабочий вариант.
Он, наверняка, даже лучше той библиотеки, которую я сейчас использую. Но он показался мне чересчур избыточным и громоздким. Вторая библиотека заработала сразу. Примеры для одной библиотеки не работают с другой.
Нижеследующий код будет относиться к последней указанной библиотеке для работы с I2. C LCD. После подключения экрана, захотелось что- то на него выводить. Просто цифры не интересно. Пусть будут часы=)) Наверное, все проходят этот путь, включая меня. Софтовые часы Ардуины вполне себе позволяют показывать время, но проблема в сбросе данных при отключении. А так как кнопок у меня нет, устанавливать часы приходится через кабель по COM порту через консоль.
Вообщем, надоело мне это очень быстро. Часы реального времени RTC1. Плюсов много — отдельная микросхема, независима от основного питания Ардуино при наличии батарейки, не зависима от основной программы — время считает точно! Преимущество часов на базе 1. I2. С. При этом никаких дополнительных выходов задействовать не нужно — управляется все по тем же 2м проводам как и LCD.
Библиотека для работы с часами по I2c заработала сразу, примеры рабочие. Цифры создаются функциями, в которых отдельными блоками выводится цифра. Блоки по 5x. 8 точек задаются в пользовательских символах, максимально их может быть 8.
Пример взят с форума arduino. Отрисовка происходит в отдельной функции, цифры выводятся по одной. Бегающие крестики — прихоть автора, т. Кажется, есть масса возможностей для оптимизации однотипных данных, но не знаю как это реализовать.
Видел примеры на том же форуме arduino. Что- то там было связано с памятью контроллера LCD/ Буду признателен за комментирование кода. UPD: пока заметка лежала в песочнице, сделал еще несколько вариантов часов. Кому- то это интересно? Сделал псевдо 3d шрифт из 3х. Сделал тонкий шрифт из 2х.
Тонкий шрифт — нарисовал сам по какой- то случайной картинке — в виде кода не нашел. Еще добавил бипер + RGB светодиод, который меняет оттенок каждую секунду. Вообщем, все что было — все прикрутил)).
Интерфейсная шина IIC (I2. C) . Разработан в компании Philips и право на его использование стоит денег, но все на это дружно положили и пользуют в свое удовольствие, называя только по другому. В Atmel его зовут TWI, но от этого ничего не меняется : ) Обычно при разборе IIC во всех книгах ограничиваются примером с EEPROM на этом и ограничиваются. Да еще юзают софтверный Master. Не дождетесь, у меня будет подробный разбор работы этой шины как в режиме Master так и Slave, да еще на аппаратных блоках с полным выполнением всей структуры конечного автомата протокола. Но об этом после, а сейчас основы.
Физический уровень. Данные передаются по двум проводам — провод данных и провод тактов.
Есть ведущий(master) и ведомый (slave), такты генерирует master, ведомый лишь поддакивает при приеме байта. Всего на одной двупроводной шине может быть до 1. Схема подключения — монтажное И. Инструкция Мопеду Верховина. Передача/Прием сигналов осуществляется прижиманием линии в 0, в единичку устанавливается сама, за счет подтягивающих резисторов. Их ставить обязательно всегда! Резисторы на 1. 0к оптимальны.
Чем больше резистор, тем дольше линия восстанавливается в единицу (идет перезаряд паразитной емкости между проводами) и тем сильней заваливаются фронты импульсов, а значит скорость передачи падает. Именно поэтому у I2.
C скорость передачи намного ниже чем у SPI. Обычно IIC работает либо на скорости 1. Но в реальности можно плавно менять скорость вплоть до нуля. Можно запросто словить КЗ и пожечь либо контроллер либо какой- нибудь девайс на шине. Мало ли кто там линию придавит. Вся передача данных состоит из Стартовой посылки, битов и стоповой посылки.
Порядок изменения уровня на шинах задает тип посылки. То есть когда линия SCL в нуле master или slave выставляют бит на SDA (прижимают — если 0 или не прижимают — если 1 линию SDA) после чего SCL отпускается и master/slave считывают бит. Таким образом, у нас протокол совершенно не зависит от временных интервалов, только от тактовых битов. Поэтому шину I2. C очень легко отлаживать — если что то не так, то достаточно снизить скорость до байта в минуту и спокойно, обычными вольтметрами, смотреть что у нас происходит.
Правда это не прокатит с железным I2. C, там нет таких низких скоростей. Но что нам мешает затактовать микроконтроллер от ОЧЕНЬ медленного тактового генератора и отладить все по шагам?
Которые ведомый считывает когда SCL становится 1. При передачи информации от Slave к Master, ведущий генерирует такты на SCL и смотрит что там ведомый творит с линией SDA — считывает данные. А ведомый, когда SCL уходит в 0, выставляет на SDA бит, который мастер считывает когда поднимет SCL обратно. Заканчивается все STOP последовательностью. Когда при высоком уровне на SCL линия SDA переходит с низкого на высокий уровень. Когда SCL вверху то идет чтение.
Если же у нас SDA меняется при высоком SCL, то это уже служебные команды START или STOP. Мастер должен это понять и дать слейву прожевать байт.
Так что нельзя тупо генерить такты, при отпускании SCL надо следить за тем, что линия поднялась. Если не поднялась, то надо остановиться и ждать до тех пор, пока Slave ее не отпустит. Потом продолжить с того же места. Логический уровень. Как передаются отдельные биты понятно, теперь о том что эти биты значат. В отличии от SPI тут умная адресная структура.
Данные шлются пакетами, каждый пакет состоит из девяти бит. Первый пакет шлется от ведущего к ведомому это физический адрес устройства и бит направления. Сам адрес состоит из семи бит (вот почему до 1. Slave на следующем байте — принимать или передавать данные. Девятым битом идет бит подтверждения ACK. Если Slave услышал свой адрес и считал полностью, то на девятом такте он придавит линию SDA в 0, сгенерировав ACK — то есть Понял!
Мастер, заметя это, понимает, что все идет по плану и можно продолжать. Если Slave не обнаружился, прозевал адрес, неправильно принял байт, сгорел или еще что с ним случилось, то, соответственно, SDA на девятом такте будет прижать некому и ACK не получится. Мастер с горя хлопнет водки и прекратит свои попытки до лучших времен. После адресного пакета идут пакеты с данными в ту или другую сторону, в зависимости от бита RW в заголовочном пакете. Вот, например, Запись.
В квадратиках идут номера битов. W=0. Чтение практически также, но тут есть одна тонкость из- за которой я когда то убил кучу времени. При приеме последнего байта надо дать ведомому понять, что в его услугах больше не нуждаемся и отослать NACK на последнем байте. Если отослать ACK то после стопа Master не отпустит линию — такой уж там конечный автомат. Так что прием двух байтов будет выглядеть так (R=1): Есть еще одно состояние, как повторный старт.
После него мы можем обратиться к другому устройству не освобождая шину. Но чаще идет обращение к тому же самому устройству и это связано с особенностями организации памяти. Организация памяти. Это относится уже не столько к самому протоколу I2.
C, сколько к заморочкам создателей разных EEPROM и прочих I2. C устройств. Но встречается это повсеместно, поэтому я расскажу про этот момент. Но, повторюсь, это не аксиома, не стандарт и вообще зависит от конкретного Slave устройства. Так что датит в зубы и вкуривать, но обычно так принято. Итак, о чем речь. Как видно из протокола, в первом байте мы адресовываем само устройство, а их может быть до 1.
Но в самом устройстве вполне может быть очень сложная структура, с кучей ячеек. Например EEPROM с килобайтами данных внутри. Как обращаться с этими данными? Не считывать же все по очереди от нуля до конца — это долго.
Поэтому приняли хитрый формат. Это не стандарт, но юзается повсеместно. Поясню на примере: Есть микросхема часов реального времени PCF8. I2. C. Внутри нее ячейки памяти, в которых хранятся часы, минуты, секунды, дата, состояние флагов и куча еще всего.
До кучи там еще 2. Карта адресов этой микросхемы выглядит так.
И вот надо мне установить дату. Для этого надо мне записать две ячейки памяти с адресами 0х. Как это сделать? Из даташита я узнаю, что первый байт данных это адрес куда мы будем обращаться, а потом уже идут данные и со следующим байтом счетчик адреса увеличивается на 1. Там же, в даташите, написано что эти часы откликаются на Slave- адрес 1.
А0 микросхемы. Я эту ногу сразу посадил на 0 так что Slave- адрес у меня 1. Очевидно, что на одной шине может быть не более двух экземпляров этой микросхемы с адресами 1. Задача решается так: Вот и славно. Часы установлены и начали тикать. Но вот надо нам считать те же данные, а вдруг изменились? А умная микросхема все прекрасно поняла и рассовала по ячейкам. А с чтением? А с чтением все через задницу, в смысле через запись.
То есть, мы, вначале, записываем один байт — адрес. Потом делаем повторный старт, затем снова обращаемся к часам по ее Slave- адресу, но уже с битом R, на чтение. И умная микруха выдает нам байты с адреса который мы в нее вот только что записали. Выглядит это так: В этих часах так, у других микрух может быть все по другому, но в 9. Адрес, например, может быть двухбайтным или страницу надо будет указать, но сути это не меняет. Цепочка запись- повстарт- чтение это повсеместно.
Тут не полная посылка (все 5 байт просто не влезли в экран), но тут четко видно запись начального адреса, потом повторный старт, и чтение из девайса. Скриншот с осциллографа RIGOL 1. CDАрбитраж шины I2. C. Почему то все мануалы для начинающих в которых рассматривалась тема протокола IIC как то ссыкливо замалчивают возможность работы двух ведущих на линии. Master- Slave и все тут. А если у нас демократия? И каждый сам себе Master и сам себе Slave?
Согласен, редкий случай, но тем не менее, описывать так описывать. Короче, в случае подобного садо- мазо варианта действует железное правило — кто раньше встал того и тапки. В смысле кто первый начал вещать тот и текущий Master. Но вот случилось вообще невероятное — два Ведущих начали вещать одновременно. Прям совсем одновременно.
А тут нам поможет свойство монтажного И — где против лома нуля нет приема. Короче, оба мастера бит за битом играют в простую игру ножик- камень(1 и 0 соответственно).