Зеркало сайта: vivacious-stockings-frog.cyclic.app

STM8S + SDCC: Программирование БЕЗ SPL, система тактирования

разделы: STM8, дата: 11 апреля 2018г.

Систему тактирования я уже бегло рассматривал в случае использования SPL. Стандартная периферийная библиотека, на мой взгляд, предлагается фирмой STM в качестве инструмента для быстрого освоения семейства микроконтроллеров STM8, программистами ранее не работавшими с ними. Сейчас я считаю, что она совершенно лишняя. Хотя, в примерах я использую именованные константы взятые из заголовочных файлов SPL.

Документация которая понадобится для прочтения статьи: Reference Manual STM8S - RM0016, глава 9. В качестве целевого микроконтроллера я буду использовать 20-пиновый STM8S103F3P6.

    Содержание:
  1. Система тактирования STM8S, ключевые особенности;
  2. Подключение и отключение периферии к шинам тактирования. Регистры CLK_ICKR, CLK_PCKENR1 и CLK_PCKENR2;
  3. Внутренний высокочастотный генератор HSI. Регистр CLK_CKDIVR;
  4. Подключение внешнего кварца к HSE генератору тактовой частоты. Регистры CLK_ECKR, CLK_CMSR, CLK_SWR и CLK_SWCR;
  5. Модуль безопасности системы тактирования CSS. Регистр CLK_CSSR;
  6. Тактирование микроконтроллера от низкочастотного внутреннего генератора LSI;
  7. Тактирование микроконтроллера от внешнего часового генератора DS3231;

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

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

STM8S + SDCC: Программирование на связке языков Си и ассемблер

разделы: STM8, АССЕМБЛЕР, дата: 13 марта 2018г.

В данной статье я попытался рассмотреть вопрос использования ассемблера в Си-программах для компилятора SDCC. Данный компилятор часто подвергается критике по качеству кода, однако он является единственным Open Source компилятором для архитектуры STM8, и единственным компилятором доступным в Linux. Поэтому данная статья может рассматриваться как HowTo по выжимании максимума возможного из SDCC.

Когда я пытался в прошлый раз (почти два года назад) подружиться с SDCC у меня оказалось большое количество вопросов к нему, что вылилось в метания между SDCC, IAR и Cosmic. Была даже идея отказаться от STM8 в пользу Cortex-M0. Однако теперь для Linux появился отладочный интерфейс, что побудило меня еще раз взглянуть на SDCC и попытаться найти к нему подход.

Статья построена аналогично предыдущей: ATtiny13a: использование ассемблера GNU-AS в программах на Си с той разницей, что вместо ATtiny13a будет использоваться 20-пиновый STM8S103F3P6, а вместо GCC - SDCC.

В качестве операционки при написании использовался Slackware GNU/Linux (русские физики рекомендуют), но теоретически, все должно работать и в Windows при условии использования CYGWIN.

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

    Содержание:
  1. Создание Си - проекта Blink для SDCC.
  2. Создание проекта Blink на ассемблере SDCC.
  3. Добавление ассемблерной функции в Си-программу.
  4. Передача параметров из Си в ассемблерную функцию.
  5. Задержка по таймеру TIM4, с обработчиком прерывания на ассемблере.
  6. Счетчик на 4-x разрядном семисегментном индикаторе.
  7. Переписывание драйвера индикатора на ассемблере STM8.
  8. Использование аппаратного SPI-интерфейса в режиме мастера.
  9. Счетчик импульсов, вариант на Си.
  10. Счетчик импульсов, вариант на ассемблере.

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

Примечание от 01.09.2022г. В SDCC версии 4.2 поменялся формат передачи аргументов функций. Если раньше все аргументы передавались через стек, то теперь они передаются через регистры. Поэтому для совместимости со старым кодом следует добавлять опцию компиляции "--sdcccall 0".

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

3-х уровневый конвейер STM8: перевод глав 3, 4, 5 руководства по программированию микроконтроллеров STM8 (PM0044)

разделы: STM8, АССЕМБЛЕР, дата: 4 марта 2018г.

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

Наибольшие вопросы в STM8 у меня вызывал 3-уровневый конвейер, поэтому в основу перевода легла глава, рассмативающая работу этого конвейера.

Если сравнивать систему команд STM8 с ассемблером AVR, то здесь имеется большое количество 16-битных команд, целочисленное умножение и деление, условные переходы объединены с проверками, не надо вечно перепрыгивать через команду. Имеются полноценные битовые команды, которые выполняются за один цикл. В целом, мне показалась, что писать на ассемблере STM8 можно также легко как на Си.

    Содержание::
  1. Описание ядра STM8
    1. Введение
    2. Регистры ЦПУ
  2. Интерфейс памяти STM8
    1. Программное пространство
    2. Пространство данных
    3. Архитектура интерфейса памяти
  3. Принципы работы конвейера
    1. Описание уровней конвейера
    2. Этап выборки (fetch)
    3. Декодирование и вычисление адреса
    4. Этап исполнения
    5. Конфликты на шине данных
    6. Примеры работы конвейера
    7. Предварительное соглашение
    8. Пример оптимизированной работы конвейера - выполнение программы из флеш-памяти
    9. Пример оптимизированной работы конвейера - выполнение программы из ОЗУ
    10. Пример работы конвейера с инструкциями перехода JP и CALL
    11. Приостановка конвейера
    12. Работа конвейера с ожиданием в один цикл

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

ATtiny13a: использование ассемблера GNU-AS в программах на Си

разделы: AVR, АССЕМБЛЕР, дата: 17 февраля 2018г.

То, что Arduino очень медленно обрабатывает внешние прерывания, я заметил еще осенью прошлого года, когда разбирался с RTC. Тогда я пытался тактировать счетчик часов Arduino от 32кHz вывода DS3231, но такие часы у меня отставали секунд на десять в минуту. Для 16 МГц микроконтроллера, это было абсолютное фиаско.

В следующий раз я столкнулся с проблемой на ATtiny13, когда делал счетчик импульсов. В этот раз Arduino досталась роль передатчика, а ATtiny13a работающей на частоте 9.6 МГц был в роли счетчика. Но несмотря на то, что прошивка была написана на чистом Си, а обработчик внешнего прерывания прерывания состоял всего из одной строчки: "value++;", максимальная рабочая частота счетчика достигала всего 200кГц.

Такой результат меня тоже не устроил, и я решил, что обработчик прерывания нужно писать на ассемблере. Забегая вперед, скажу, что это дало мне прирост по максимальной частоте в три раза т.е. до 600кГц.

Ок, ассемблер это хорошая штука в плане скорости, но полностью прошивку писать на нем довольно тоскливое занятие. В AVR нет даже целочисленного деления. Выходом может стать написание смешанного кода на ассемблере и Си, т.к. gnu ассемблер по сути является бэкендом gcc-компилятора.

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

    Содержание статьи:
  1. Blink на ассемблере GNU-AS, создание проекта.
  2. Использование в ассемблерной программе мнемоники из Си для портов и регистров.
  3. Добавление таблицы векторов.
  4. Смешивание Си и ассемблерного кода в одной программе.
  5. Передача и получение параметров из Си-программы в ассемблерную функцию.
  6. Переписываем с Си на ассемблер функцию wait_ms() на прерывании таймера.
  7. Линковка проекта.
  8. Счетчик на 4-x разрядном семисегментном индикаторе.
  9. Счетчик импульсов на ассемблерном прерывании.

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

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

MSP430FR2433 Launchpad: быcтрый старт

разделы: MSP430, дата: 6 февраля 2018г.

Под новый год компания Texas Instruments удачно напомнила о себе устроив распродажу своих новых Launchpad'ов по символической цене в 4.30$. В сочетании с бесплатной доставкой занявшей, в моем случае, всего девять дней со склада в США, получился вполне себе такой приятный подарок. Для сравнения, на "Мышаке" Launchpad MSP430FR2433 стоит сейчас 18$ со сроком доставки в три недели. Так что, как говорится, приобретайте у производителя.

Launchpad MSP430FR2433 занял меня на пару дней, но вот только сейчас дошли руки написать об этой новинке. Я хотел бы рассказать, что это вообще за плата такая, для чего ее можно использовать(как оказалось не только для программирования), и как ее программировать. Я буду говорить в основном об Linux, так как именно здесь кроется большинство проблем. О Windows буду говорить по необходимости, там все делается по аналогии, т.к. весь используемый софт является кроссплатформенным. Так же, я иногда буду сравнивать этот Launchpad с более ранним MSP-EXP430G2.

    Содержание статьи:
  1. Краткий обзор оценочного модуля MSP430FR2433 Lanchpad;
  2. Energia IDE & Linux, или как убить Launchpad за 5 секунд;
  3. Работа с Energia IDE и MSP430FR2433 из под виртуальной машины с Windows 7;
  4. Компиляция тестовой прошивки;
  5. Флешер MSPFlasher;
  6. Использование MSPDebug в качестве флешера;
  7. Отладка Launchpad MSP430FR2433 через MSPDebug;
  8. Code Composer Studio и инструмент EnergyTrace;
  9. CCS Cloud - среда программирования на облаке;

1) Краткий обзор оценочного модуля MSP430FR2433 Lanchpad

Launchpad MSP430FR2433 можно мысленно разделить на три отдельных модуля: модуль программатора eZ-FET, модуль подсчета энергопотребления EnergyTrace, модуль с микроконтроллером MSP430FR2433.

    Микроконтроллер, MSP430FR2433 относится к семейству свехдешевых чипов Value Line Sensing MSP430FR2xxx/MSP430FR4xxx, и имеет следующие характеристики:
  1. 16-битная RISC архитектура;
  2. Рабочая частота до 16 МГц включительно;
  3. Диапазон напряжений питания от 1.8 до 3.6 Вольт;
  4. 8-канальный 10-битный АЦП;
  5. Внутренний источник опорного напряжения на 1.5 Вольт;
  6. Максимальная частота преобразований АЦП - 200 kSPS;
  7. Два расширенных USCI модуля: eUSCI_A c поддержкой режимов UART, IrDA и SPI и один eUSCI_B с поддержкой режимов: SPI, I2C;
  8. Всего четыре таймера:
  9. Два 16-битных трех-канальных таймера Timer_A3;
  10. Два 16-битных двух-канальных таймеров Timer_A2;
  11. Так же имеется еще один 16-битный таймер для RTC;
  12. Аппаратное вычисление 16-битного циклического избыточного кода CRC;
  13. Оперативной памяти - 4 КБайта;
  14. Энергонезависимой FRAM памяти с побайтовым и побитным доступом - 15.5 кБайта
  15. Защита от записи энергонезависимой FRAM памяти;
  16. Коэффициент пропорциональности скорости доступа к FRAM относительно SRAM-памяти составляет 4:1;
  17. Сенсор температуры FRAM памяти;
  18. Чип MSP430FR2433 поддерживает аппаратное умножение реализованное в 32-битном умножителе MPY32;
  19. Дополнительные режимы сбережения LPM 3.5 и LPM 4.5;
  20. Корпус микросхемы - VQFN-24.

На мой взгляд, чип MSP430FR2433 является прямым конкурентом семейству STM8, по перечню периферии и характеристикам они примерно на одном уровне.

Посмотрим более внимательно на дизайн платы Launchpad'а:

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

Связь двух микроконтроллеров на примере подключения 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 + PCD8544: работа с графическим дисплеем от телефонов Nokia 5110/3310

разделы: AVR, SPI, PCD8544, дата: 23 ноября 2017г.

Дисплей от мобильного телефона Nokia 5110/3310 - это довольно известный графический дисплей начального уровня на управляющем контроллере pcd8544. Цена на него колеблется в пределах ста рублей, что сделало его широко распространенным "народным" дисплеем, наряду со знакогенерирующим LCD1602. Несмотря на широкое распространение, имеющаяся информация по этому дисплею или противоречива, или обрывочна(например). Ниже приводится лог недельного изучения девайса с примерами кода от простого к сложному. Вначале я пытался использовать Proteus для большей наглядности, но его возможностей, увы, хватило только на три примера. Поэтому остальные примеры идут для реальной связки ATmega8+дисплей. Так или иначе примеры с Proteus работают и на настоящем устройстве. Ко всем примерами, исходники к ним, скомпилированные прошивками и сборочные Makefile можно скачать здесь https://gitlab.com/flank1er/pcd8544_atmega8.

Должен сразу сказать, что для русификации дисплея я использовал кодировку CP866, и сделал я это удобным для Linux-пользователей способом. В Windows это получится использовать разве что из CYGWIN (понадобится утилита iconv).

Также должен упомянуть, что у меня были сложности с управлением дисплеем через аппаратный SPI. Она заключается в том, что и USBasp, и дисплей используют SPI порт ATmega8, и чтобы загрузить прошивку в микроконтроллер, дисплей приходится отключать. Это просто неудобно. Поэтому почти во всех примерах используется подключение дисплея по программному SPI. Подключение через аппаратный SPI используется только во втором и в последнем (финишном) примере (там не сложно, лишь нужно поменять пару строчек в коде и переподключиться к нужным пинам).

В целом, говоря про графические дисплеи, скажу, что эти штуки быстро "съедают" оперативную и флеш память и легко занимают всю пропускную способность SPI шины ;)

    Содержание статьи:
  1. Основные характеристики дисплея на контроллере pcd8544;
  2. Подключение дисплея к Arduino;
  3. Пишем HelloWorld для ATmega8+PCD8544 в Proteus;
  4. Переподключение дисплея на аппаратный SPI в Proteus;
  5. Функции масштабирование шрифта в два и три раза;
  6. Создание проекта для реального микроконтроллера ATmega8, чтение таблицы ASCII из флеш-памяти;
  7. Добавляем кириллицу в кодировке CP866
  8. Добавление фреймбуфера. Программа рисования фрактала.
  9. Делаем скринсейвер "сквозь звездное небо"
  10. Функции рисования прямых линий, и окружностей
  11. Интерфейс для метеостанции
  12. Интерфейс для FM-радиоприемника
  13. Финальная версия библиотеки на аппаратном SPI

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

ATmega8 + PCF8574: 8-битный расширитель портов на I2C интерфейсе

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

Статья правилась 5-го августа 2022г. Было испрвлено неверное определение: "сдвиговый регистр pcf8574" на правильное: "расширитель портов pcf8574". Добавлено оглавление. Также поправлена битая ссылка на datasheet.

Этот расширитель портов наиболее известен по китайским драйверам дисплея 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".

Содержание:

I. Общие сведения

  1. Немного справочной информации
  2. Подключение LCD HD44780 к Arduino через модуль драйвера на PCF8574
  3. Подключение LCD HD44780 к STM32duino через модуль драйвера на PCF8574
  4. Подключение LCD HD44780 к MSP430 Launchpad через модуль драйвера на PCF8574
  5. Arduino библиотека PCF8574

II. Работа PCF8574 + ATmega8

  1. Сканер I2C шины
  2. Бегущий огонь на расширителе портов PCF8574
  3. Управление семисегментным индикатором через расширитель портов PCF8574
  4. Чтение из расширителя портов PCF8574
  5. Подключение LCD HD44780 через расширитель портов PCF8574

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

ATmega8 + Proteus: входной сдвиговый регистр 74HC165, совместная работа с 74hc595

разделы: AVR, SPI, Proteus, HD44780, дата: 13 октября 2017г.

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

Вначале я хотел дополнить предыдущую статью входным регистром 74hc165, но потом понял понял, что он заслуживает "свои пять минут славы". Сложности возникают при подключении входного регистра совместно с выходным 74hc595 на один SPI порт. Кроме того, как оказалось, организация работы по SPI в ATmega8 имеет свои интересные особенности.

Итак, сдвиговый регистр 74hc165 преобразует параллельную шину в последовательную, работает только на вход, и имеет разрядность 8-бит. Их так же можно подключать цепочкой из n-элементов, которая даст 8^n - входов.

Руководство на SN74HC165N можно скачать например с сайта Texas Instruments.

    Оглавление:
  1. Чтение сдвигового регистра 74hc165 через программный SPI интерфейс;
  2. Чтение сдвигового регистра 74hc165 через аппаратный SPI ATmega8;
  3. Ретранслятор параллельной шины;
  4. LCD дисплей HD44780 и сдвиговый регистр 74HC165(вариант для Proteus);
  5. LCD дисплей HD44780 и сдвиговый регистр 74HC165(вариант для реального устройства);

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