STM8S + SDCC: Программирование БЕЗ SPL. Интерфейсы: UART в режиме передатчика, АЦП в режиме однократного замера, I2C в режиме мастера

разделы: STM8, UART, I2C, дата: 5 мая 2018г.

В этот раз разговор пойдёт про аппаратные интерфейсы STM8S: UART, АЦП и I2C. Каждый их этих интерфейсов поддерживает несколько режимов работы, но сейчас мне хотелось бы сфокусироваться на наиболее типовых, на мой взгляд, примерах их использования: а)организация передатчика на UART, б) режим однократного замера АЦП, в) использование I2C в режиме мастера. Напомню, что вариант использования SPI в режиме мастера я приводил на примере драйвера для 4-x разрядного семисегментного индикатора .

Документация которая понадобится для прочтения статьи: Reference Manual STM8S - RM0016, главы: 22 (UART), 24 (АЦП), 21 (I2C). В качестве целевого микроконтроллера я буду использовать 20-пиновый STM8S103F3P6.

Так же как и в прошлый раз, упор будет делаться на "чистом" программировании на Си и Ассемблере без использования сторонних библиотек. В качестве компилятора используется open-source SDCC версии 3.7. Справедливости ради замечу, что я ввёл макросы для прямого доступа к битовым инструкциям, что бы хоть как-то оптимизировать код.

Скачать полные исходники со сборочными файлам и скомпилированными прошивками, можно по ссылке в конце статьи.

В статье используются формулы в формате MathML который поддерживается браузером Firefox, для браузеров Chrome и Opera потребуется установить одноимённое расширение MathML.

    Содержание:
  1. UART1 передатчик со скоростью 921600 baud;
  2. АЦП в режиме однократного замера;
  3. I2C в режиме мастера, на примере RTC DS1307/DS3231. Инициализация.
  4. I2C в режиме мастера, на примере RTC DS1307/DS3231. Функция передачи адреса и данных.
  5. I2C в режиме мастера, на примере RTC DS1307/DS3231. Функция чтения данных.

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

Связь двух микроконтроллеров на примере подключения 4-х разрядного семисегментного индикатора к Arduino через вспомогательный микроконтроллер ATtyny13a

разделы: Arduino, AVR, UART, I2C, дата: 29 января 2018г.

Если под вашу задачу требуется большее число пинов/портов/мегагерц/памяти, чем имеется в используемом вами микроконтроллере, то в ответ на эту проблему обычно советуют взять микроконтроллер "покрупнее". Ответ не лишенный смысла, однако мне удалось найти задачку, от которой так просто не отмахнешься. Героем сегодняшней статьи будет 4-х разрядный семисегментный индикатор с динамической индикацией.

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

В модуле меня привлекла его компактность. К примеру, для приборной панели паяльной станции, где место сильно ограничено, это то что надо. После некоторого размышления я решил, что в целом модуль неплох, но... для него требуется отдельный управляющий микроконтроллер, сопроцессор, на котором будет крутиться динамическая индикация.

Индикатор не содержит подтягивающих резисторов(!), возможно здесь используются сдвиговые регистры с подтяжкой? Так или иначе, я замерял потребление модуля через EnargyTrace и получил значение около 23mA при питании 3.3 Вольт, что для такой "гирлянды" вполне нормально.

Китайские ATtiny13a в SO-8 корпусе стоят около 15₽, они имеют пять рабочих выводов, три из которых нужно будет отдать на индикатор, остаются два вывода для организации линии связи, что более чем достаточно, но простенький SPI сюда не посадишь, т.к. тот SPI который будет использоваться для управления индикатором, работает мастером, а для связи с "главным" микроконтроллером нужен будет слейв( запускать слейв на главном микроконтроллере - это не вариант). К сожалению или к счастью(смотря как посмотреть), АTtiny13a не поддерживает аппаратно абсолютно никаких протоколов.

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

    Оглавление статьи:
  1. Счетчик на ATiny13a и 4-х разрядном семисегментном индикаторе
  2. Простой протокол на счетчике импульсов
  3. Пакетная передача данных с использованием буфера
  4. Программный UART для ATtiny13a
  5. Программный I2C Slave на ATtiny13a

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

Полные исходники вместе со сборочными файлами и скомпилированными прошивками можно скачать по ссылке к конце статьи.

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

MSP430G2452: USI модуль в режиме I2C как конечный автомат

разделы: MSP430, I2C, дата: 10 декабря 2017г.

USI модуль в MSP430x2xx описывается как простое устройство основанное на управляемом сдвиговом регистре. Однако простота этого модуля оборачивается сложностью в его использовании. То, что в полноценном I2C модуле будет "спрятано под капотом" в виде незримой автоматики, здесь придется делать вручную.

В официальной библиотеке Texas Instruments для использования USI модуля в I2C режиме: slaa368.zip и документации к ней: slaa368.pdf алгоритм работы с USI представлен как конечный автомат. Мне показалось это интересным и я решил разобрать его работу в этой статье. Сама библиотека написана на ассемблере для IAR компилятора, и в так виде лично для меня она была бесполезна. Поэтому в процессе изучения библиотеки я портировал ее на mspgcc, правда не всю, а только работу в режиме мастера.

Статью условно можно разделить на три части. Вначале идет программная реализация I2C для MSP430, которая в дальнейшем будет использоваться как эталонная, т.е. с ней будут сравниваться остальные варианты. Затем будет рассмотрена аппаратная реализация I2C для USI MSP430, и закончим мы конечным автоматом(Finite-State Machine). В итоге у нас будет три драйвера I2C шины: один программный и два аппаратных.

В качестве микроконтроллера я буду использовать MSP430G2452 который шел в комплекте c MSP-EXP430G2 Launchpad. Данный микроконтроллер имеет два порта GPIO, один "А"-таймер, один USI-модуль, 8Кб флеш-памяти и 128 байт оперативной памяти. Т.е. это что-то вроде ATtiny84 по возможностям. Для обкатки драйверов I2C шины, в качестве целевого устройства я буду использовать RTC DS3231, для которого я портировал на Си свою Arduino-библиотеку DS3231SQW.

Так как программного кода в статье много, полные исходники и скомпилированные прошивки я выложил на gitlab.com https://gitlab.com/flank1er/msp430_usi_i2c

Для простоты будем считать, что вы работаете в Linux или в CYGWIN под Windows, используете компилятор mspgcc из комплекта Energia IDE, а в качестве программатора используется MSP-EXP430G2 Launchpad.

    Содержание статьи:
  1. Основные характеристики USI модуля в режиме I2C;
  2. Создание базового проекта для Sublime Text 3: "Программный UART передатчик для MSP430G2452";
  3. Добавление в проект программной реализации I2C и библиотеки DS3231;
  4. Аппаратный драйвер I2C шины для USI модуля;
  5. USI модуль в I2C режиме как конечный автомат;
  6. Работа USI модуля в режиме I2C.

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

ATmega8 + PCF8574: 8-битный сдвиговой регистр на I2C интерфейсе

разделы: AVR, Arduino, I2C, HD44780, дата: 24 октября 2017г.

    Сдвиговые регистры, оглавление:
  1. ATmega8 + Proteus: работа со сдвиговыми регистром 74HC595
  2. ATmega8 + Proteus: входной сдвиговый регистр 74HC165, совместная работа с 74hc595
  3. ATmega8 + PCF8574: 8-битный сдвиговой регистр на I2C интерфейсе

Этот сдвиговый регистр наиболее известен по китайским драйверам дисплея HD44780, которые можно приобрести на али или ибэе. Сам регистр довольно подробно был разобран здесь: "Сообщество EasyElectronics.ru: I2C расширитель портов PCF8574". Я в свою очередь, попытаюсь сосредоточиться на программировании микроконтроллера ATmega8 для работы с этим регистром. Впрочем, начну я все же с Arduino и имеющегося у меня зоопарка: ATmega328/MSP430G2553/STM32F103C8.

Сдвиговый регистр PCF8574 может выпускаться разными фирмами, мне попались чипы с суффиксом "T", что обозначает производителя как "NXP Semiconductor". Руководство на pcf8574t можно скачать с официального сайта NXP: "PCF8574; PCF8574A Remote 8-bit I/O expander for I2C-bus with interrupt".

    Основные особенности сдвигового регистра PCF8574:
  1. Регистр 8-битный, псевдо-двунаправленный;
  2. Регистр работает на "медленной" I2C шине - 100 kHz;
  3. Рабочее напряжение от 2.5 до 6.0 Вольт;
  4. Регистр выпускается в двух вариантах: с суффиксом "A" и без него. Эти варианты различаются I2C адресам 0х3F для чипов с "A" и 0х27 для чипов без А.
  5. На шину можно ставить до восьми чипов одного варианта или шестнадцать чипов обоих вариантов.
  6. Регистры не соединяются последовательно в "паровозик" как 74HC595, они независимы друг к другу.

На мой взгляд, штука идеальная для подключения дисплея HD44780. Если сравнивать с драйвером на 595-м регистре, то вариант с pcf8574 будет немного дороже, но разница чисто условная: 25р за готовую плату на pcf8574 и ~19р за самодельный вариант на 595-м(3р за чип + 11р за плату + 5р за подстроечный резистор). Сам дисплей HD44780 не слишком скоростной, необходимости в скоростях SPI интерфейса нет. С другой стороны, драйвер на 595-м собирается из рассыпухи "на коленках" за полчаса-час, а посылка из Китая идёт от пары недель в лучшем случае.

Но внешне, готовый вариант все же будет выглядеть более культурно:

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

Proteus8.x + MSP430x2xx: программная реализация I2C интерфейса, подключение устройств: RTC DS1307/DS3231, EEPROM AT24C512/AT24C32

разделы: MSP430, Proteus, I2C, RTC, дата: 5 апреля 2017г.

Полтора года назад я уже бегло рассматривал протокол I2C, теперь же настало время изучить его более подробно.

Попробуем написать программную реализацию протокола, рассмотрим "подводные камни" такой реализации, а также способы отладки шины I2C. Для обкатки алгоритма попробуем подключить следующие устройства на шине I2C: RTC DS1307/DS3231 и EEPROM AT24C512/AT24C32.

Для проектирования будет использована CAD Proteus_8.5. Для проверки на реальном железе будет использован чип MSP430G2453.

Часы реального времени на микросхеме DS1307

Итак, тренироваться будем на RTC DS1307, но здесь должен заметить, что данный чип относиться к 5-вольтовой логике поэтому с 3.3-вольтовым MSP430 он работать не будет. Заставить работать данную связку можно только в Proteus. Для тестирования на реальном железе я буду использовать DS3231 модуль. Однако для того чтобы понять I2C не нужен готовый модуль, он будет только мешать.

Суть проблемы

Когда не очень опытный радиолюбитель берет устройство на I2C, ему надо его как-то проверить, убедиться что оно хотя бы в принципе работает. Как это сделать? Обычно делается это на Arduino (я по крайней мере так делаю). Находится какой-нибудь скетч для проверки, и на нем проверяется.

Однако, при наличии проблем, как узнать в чем кроется загвоздка: в "косячной" библиотеке или в железке? Например, если мы загрузим этот скетч для работы с DS1307, и запустим его БЕЗ всякого модуля, то получим такую картинку:

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

И здесь проблема здесь не в низком качестве кода скетча. Если посмотрим API References:

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

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 представлена ниже:

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

Введение в 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 будет считываться ноль, в остальное время будет считываться единица.

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

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