ATmega8 + аппаратный TWI модуль: "делаем распечатку памяти RTC DS1307"

разделы: I2C, RTC, AVR, дата: 27 сентября 2015г.

После UART, реализация TWI модуля на AVR кажется довольно корявой и без понимания I2C протокола будет не просто его освоить. Однако, если разобраться с "софтовой" эмуляцией протокола, то работа с TWI модулем уже не составит труда.

    Подробнейшие руководства по работе с TWI можно почитать здесь:
  1. chipenable.ru записи по тегу TWI
  2. AVR. Учебный Курс. Использование AVR TWI для работы с шиной IIC (i2c)

Не последне место в этом списке должно быть у официального аппнота: AVR315: Using the TWI module as I2C master

Если открыть руководство для ATmega8, на странице 156 раздел "Two-Wire Serial Interface", то там даже будет примерный набросок программы для работы с TWI:

Читать дальше

Bit-banging AVR: делаем сканер TWI шины

разделы: I2C, дата: 26 сентября 2015г.


bit-banging - это тоже, что
дерганье за ниточки

Используя познания из предыдущего поста: "Введение в Bit-banging: "режимы работы GPIO микроконтроллеров AVR, организация последовательной шины" можно сделать что нибудь полезное. "Софтовая" реализация I2C шины будет не зависеть от модели микроконтроллера, будет работать на тех пинах которые вы зададите, и на мой взгляд, что самое важное, может служить примером протокола для взаимодействия между несколькими различными микроконтроллерами.

Иллюстрация I2C протокола, взятая из AppNoteAVR315: Using the TWI module as I2C master представлена ниже:

Читать дальше

UART+AVR: функция форматного вывода printf()

разделы: AVR, UART, дата: 23 сентября 2015г.

Функция форматного вывода printf довольно мощное средство языка Си. Приминительно к микроконтроллерам, возможно, сначала не совсем понятно, что там считать за стандарный поток вывода и как здесь может работать printf(). Библиотека avr-libc содержит файл stdio.h которая включает реализацию стандарных функций ввода-вввода.

<stdio.h>: Standard IO facilities

Я взял оттуда ХеллоВорлд:

#include <stdio.h>

static int uart_putchar(char c, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);

static int uart_putchar(char c, FILE *stream)
{
	if (c == '\n')
		uart_putchar('\r', stream);
	loop_until_bit_is_set(UCSRA, UDRE);
	UDR = c;
	return 0;
}

int main(void)
{
	init_uart();
	stdout = &mystdout;
	printf("Hello, world!\n");
	return 0;
}

И модифицировал пример из поста ATmega8: работа на Си с USART/UART через прерывание заменив функцию writeSerial(char* str) на printf. Получилась такая штука:

Читать дальше

Введение в Bit-banging: "режимы работы GPIO микроконтроллеров AVR, организация последовательной шины

разделы: I2C, дата: 20 сентября 2015г.


pull-up c английского
переводится как подтягивание

Когда речь шла об управлении дисплеем HD44780, то там все было относительно ясно. Напрямую соединялось два устройства, одно работало только на прием, другое только на передачу. Поэтому достаточно было выставить нужный логический уровень на выводах GPIO микроконтроллера, чтобы все работало.

Несколько сложнее обстоят дела, когда нужно организовать обмен данными между несколькими устройствами. Выводы устройств имеют два состояния: логичская единица т.е. +5 или +3 Вольта и логический ноль, когда контакт соединен с "землей". Если начать соединять их напрямую, то произойдет короткое замыкание. Bit-banging это та тема, где нужно четко представлять, что происходит.

    Рассмотрим режимы работы GPIO в AVR микроконтроллерах:
  1. Push-pull режим. Режим на передачу, когда вывод GPIO подключен либо к Vcc либо GND. Задается записью единицы в соответствующий бит DDR(data direction register) регистра. Состояние GPIO меняется записью в соответствующий бит регистра PORT нуля или единицы. Должно быть понятно, что прямые соединения типа: {(GPIO=1) <==> GND} или {(GPIO=0) <==> Vcc} приведут к короткому замыканию!
  2. Высокоимпедансное состояние. Это когда GPIO не подключен ни к Vcc ни к GND. Это состояние по умолчанию для всех GPIO микроконтроллера. Задается записью нулей в соответствующие биты регистров DDR и PORT. В этом состоянии доступен только на чтение регистр PIN, который выдаст единицу если на GPIO подать высокий потенциал и ноль, если потонциал будет ниже трех вольт. В случае, если вывод GPIO никуда не подключен, т.е. "болтается в воздухе". т.е. состояние соответствующего бита регистра PIN считается неопределенным, т.е. лишино всякого смысла.
  3. Pull-up состояние, когда, GPIO подключен через подтягивающий резистор(pull-up) к Vcc. Задается записью в соответствующие биты: ноль в DDR, единица в PORT. В этом состоянии, на GPIO будет высокий потенциал, но прямое соединение GPIO с землей не приведет к короткому замыканию. В этом состоянии, при замыкании GPIO на землю, с регистра PIN будет считываться ноль, в остальное время будет считываться единица.

На основе этих трех состояний можно постоить последовательную шину вида:

Читать дальше

Leaf Maple: введение в STM32

разделы: STM32, STM32duino, дата: 17 сентября 2015г.

Проект Leaf Maple призван стать аналогом Arduino для микроконтроллеров STM32. Пока нельзя сказать, что проект "выстрелил", но на мой взгляд достоин внимания. Заказать китайский клон Maple Mini можно всего за 4USD.

 

    На борту чип STM32F103CBT6, содержащий множество интересных штук:
  1. ядро ARM CortexM3;
  2. 32-разрядность;
  3. частота 72 МГц;
  4. 128 кБайт встроенной флеш памяти;
  5. 20 кБайт оперативки;
  6. 12-битный АЦП;
  7. семь DMA каналов;
  8. аппаратные USB2.0, CAN, USART, I2C, SPI интерфейсы.

Полную спецификацию можно посмотреть на официальном сайте фирмы STMicroelectronics: STM32F103x8 STM32F103xB datasheet

Читать дальше

RTC модули DS1307 и DS3231 на I2C шине

разделы: Arduino, RTC, дата: 16 сентября 2015г.


модули ds1307 и ds3231

Модули реального времени на DS1307 и DS3231 изготовлены в связке c EEPROM AT24 на 32Кбайта. Все эти устройства работают на I2C/TWI шине и работа с ними рассмотрена в книге Юрия Ревича "Практическое программирование микроконтроллеров AVR" в главе двенадцатой.

I2C шина позволяет на свои два провода подключить множество устройств, но это довольно медленный интерфейс, который, к тому же, еще и ограничен максимальной скоростью самого медленного устройства на шине. Для DS1307 это 100кГц. TWI интерфейс Atmel соответствует первой спецификации I2C, который был принят в начале 80-х фирмой Philips.

    Т.е. имеем ограничения:
  1. максимальное количество устройств - 127,
  2. максимальная скорость шины 400кГц.

Это если использовать аппаратный TWI. Если делать программную эмуляцию интерфейса, как рассмотрено в книге Юрия Ревича, то таких ограничений конечно же не будет.

Связка RTC модуля c EEPROM насколько понимаю довольно распространенное схемотехническое решение. Вариантов использования - множество. Например, контроллер сигналов домофона: нужно сделать так, что бы ночью он не трезвонил. Добавление EEPROM позволит вести вести логирование вызовов домофона. Повторюсь, вариантов множество.

Итак, рассмотрим DS1307 поподробнее:

Читать дальше

HD44780 + ATmega8: таймер с крупными цифрами

разделы: AVR, HD44780, дата: 15 сентября 2015г.


макет цифр

Небольшая демо-программа, таймер для ATmega8 с дисплеем HD44780. В качестве отправной точки использовал исходник из предыдущего поста. Идея была почерпнута здесь: LCD "Bigfont" Numbers over 2 or 4 lines".

Исходник:

Читать дальше

ATmega8: простая программа управления ЖК-дисплеем HD44780

разделы: AVR, HD44780, дата: 9 сентября 2015г.


Управление ЖК-дисплеем HD44780 довольно простое. Он имеет параллельную шину на 8 пин и три управляющих линии.

  1. Контакты D0-D7 это 8-битная шина. Может работать как в 8-битном режиме, так и в 4-битном. В последнем случае задействуются "старшие" пины D4-D7.
  2. RS выбор регистра. В контроллере дисплея имеется два регистра: регистр команд IR и регистр данных DR. В зависимости от того, что мы пишем в контроллер данные или подаем команды, с помощью RS линии мы выбираем "адресата". При RS равном нулю посылаются команды, при RS равном единице пишутся данные.
  3. E выполняет роль клавиши "Enter". Можно в каком угодно порядке и последовательности менять значения пинов контроллера дисплея, но когда управляющий пин E устанавливается в единицу, то всё, данные уходят в контроллер дисплея. Чтобы записать очередные данные следует E вновь сбросить в ноль.
  4. RW не используемый в данном случае пин, который переключает режимы дисплея с чтения на запись и обратно. В данном примере RW запитан на массу(землю), т.е. установлен в ноль, что означает работу дисплея только на прием, на получение и отображение данных и команд. При RW равном единице дисплей переводится в режим передачи, и тогда возможно прочитать BF(busy flag) - флаг занятости. Дело в том, что дисплей довольно медлительное устройство, и при записи в него команд или данных он становится на некоторое время недоступен. Чтобы понять, когда в него снова можно писать следует ждать когда сбросится BF. В данном примере вместо опроса BF используются задержки с гарантированным временем готовности дисплея. С опросом BF флага, программа работала бы конечно быстрее, но это, как говорится, палка о двух концах. Усложнение ради упрощения.

Читать дальше

Введение в STM8: программирование и прошивка с помощью клона ST-Link v2, версия для Linux.

разделы: STM8, Программаторы, дата: 5 сентября 2015г.

Работая с AVR и PIC можно чувствовать себя довольно уверенно. Тут и обширная документация, множество книг, большое комьюнити, изделия в "любительских" DIP корпусах... всего этого этого в STM8 нет.

Так стоит ли связываться с этой серией микроконтроллеров? Вопрос ни разу не праздный, и ответ на него должен знать каждый, кто собирается заниматься микроконтроллерами STM8.

В статье "Восемь преимуществ STM8", на этот вопрос пробует ответить сама компания STMicroelectronics. Я же немного выжму воду и перепечатаю резюмирующую картинку:

Читать дальше

Подключение термопары К-типа к Arduino используя модуль на MAX6675

разделы: Arduino, MAX6675, дата: 3 сентября 2015г.

Подключение термопары К-типа(далее просто термопары) к Arduino довольно тривиально, но чтобы не было путаницы, решил написать краткий мануалЪ.

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

Работа термопары основана на термоэлектрическом эффекте, когда на спайке разнородных металлов образуется ЭДС, которая прямо пропорциональна температуре окружающей среды. Эту ЭДС возможно измерить, но она настолько маленькая, что так просто ее на вход микроконтроллера не подашь. На помощь приходит ИС от фирмы Maxim - MAX6675. Она измеряет ЭДС термопары и через SPI интерфейс выдает в виде готового числа. Документацию на микросхему можно найти например здесь: https://www.sparkfun.com/datasheets/IC/MAX6675.pdf

Документация содержит всего 8 страниц, предлагаю пробежаться глазами по основным моментам:

Читать дальше