Программная реализация интерфейса управления tm1640 на atmega

Программная реализация интерфейса управления tm1640 на atmega


SPI? Легко!

В одном из предыдущих постов, я рассказывал про подключение термопары к Arduino. Теперь настало время рассмореть подключение к AVR микроконтроллерам на чистом Си, благо, как выяснилось, это совсем не сложно.

Напомню, что термопара подключается через адаптер MAX6675, который в свою очередь подключается к микроконтроллеру через SPI интерфейс.

После I2C, SPI интерфейс скорее всего покажется очень простым. Если расмотреть аппаратную реализацию SPI, то там есть регистр данных SPDR, записью или чтением с которого и осуществляется вся работа c SPI.

Программная реализация, как выяснилось, не намного сложнее, но сначала о том, что такое SPI. Фирменный аппнот к SPI можо найти на сайте Atmel: AVR151: Setup And Use of The SPI

рассмотрим схему подключения взятую оттуда:

  1. К интерфейсу возможно подключение нескольких устройств, но единовременно возможна работа только с одним из них.
  2. Используется концепция master-slave(дирижер оркестр). Мастер генерирует синхроимпульсы и переключает устройства.
  3. В минимальном варианте, имеется две управляющие линии: SCK по которой генерируется синхронизирующие импульсы(она общая для всех), и линия выбора устройства SS(Slave Select). Другое ее обозначение: CS(Chip Select).
  4. Каждое добавленное SPI устройство увеличивает интерфейс на еще одну SS/CS линию.
  5. Интерфейс полнодуплексный, линия MISO (Master In Slave Out) отвечает за прием(относительно мастера), линия MOSI отвечает за предачу.
  6. Имеется четыре режима работы SPI. Фаза SCK изначально имеет низкий уровень в mode 0, и высокий в mode 3. Чтение осуществляется по нарастающему фронту.
  7. В режимах 1 и 3 чтение осуществляется по падающему фронту. Встречаются редко, если верить книге “Практическое программирование микроконтроллеров AVR” Юрия Ревича, глава 11.
  8. Упрощеный вариант SPI состоит из трех линий. В таком случае связь идет только на прием или только на передачу.

Вот именно такой упрощеный режим используется в MAX6675. Документация:MAX6676 datasheet

Предлагаю еще раз взглянуть на формат передачи:

Данные передаются пакетами по два байта. Под температуру отводится 12 бит. 15-й бит, бит знака. LSB – младший значащий бит, MSB – старший значащий бит. Оффициальная легенда:

Значение температуры передается в градусах Цельсия, в диапазоне от 0 до 1024. 1024 – это десять бит, в то время как данные передаются 12-битным форматом. Значит, чтобы получить значение в градусах, нужно будет полученое число разделить на 4. Меня немного смутил второй бит, device ID. В смысле я не очень понимаю как может один бит служить идентификатором. Его скорее можно назвать битом корректности.

Если припомнить, то в случае с Arduino я использовал библиотеку: MAX6675-library

На проверку, там оказался довольно простой код:

Я решил не изобретать велосипед, и переписать код на чистом Си. В качестве шаблона использовал проект из предыдущего поста. Я отбросил файлы относящиеся к TWI, после чего осталось переписать main.c в соответсвии со своими целями:

Результат работы программы:

В данном случае виден результат воздействия горелки на термопару.
Скачать проект вместе со сборочными файлами и прошивкой для ATmega8 можно здесь.
Структура проекта:

Особенности адресации контроллера TM1638 для индикаторов с ОА.

В конце поста приложена более крупная схема из инета.

«JY-LKM1638», имеет 2х4 семисегментных индикатора 0,56″ с ОК (5461AS, 14.20mm), 8 двухцветных светодиодов, 8 кнопок, габариты 102x50x10;

В конце поста приложена более крупная схема из инета.
Основное отличие от «LED&KEY» — более крупные индикаторы и двухцветные светодиоды. Также он сделан как проходной модуль, для облегчения соединения до 6 модулей в цепочку.

«QYF-TM1638», имеет 2х4 семисегментных индикатора 0,36″ с ОА (3461BS, 9.14mm), 16 кнопок, отдельные светодиоды отсутствуют, габариты 68х69х9;

Схемы не нашел, основное отличие от «LED&KEY» — применение индикаторов с ОА. Я думал, что практически это означает, что выводимые знаки на нем будет необходимо инвертировать. Все оказалось гораздо хуже…

Подключение индикаторов

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

Схемы подключения индикаторов с ОК и ОА также присутствуют:

Судя по схемам подключения чип может обслуживать не более 8 индикаторов с ОК, и до десяти индикаторов с ОА.
То же самое написано в даташите:

Чип имеет 16 регистров для хранения кодов отображаемых символов. Причем в 8 четных хранятся полноценные байты для отображения символов, в нечетных для отображения используются только два младших бита.
Это применимо только к индикаторам с ОК, управление индикаторами с ОА может кому то напомнить удаление аденоидов через задний проход. Подробнее:

Адресная табличка для управления индикаторами с ОК:
Здесь SEG1-SEG8 обозначают сегменты индикатора, GRID1-GRID8 разряды.

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

Адресная табличка для управления индикаторами с ОА:
Здесь GRID1-GRID8 обозначают сегменты индикатора, SEG1-SEG10 разряды.

Сначала я составил ее в уме, не поверил, перерисовал на твердой копии, перепроверил, офигел…
Даже на контроллере, имеющем битовый процессор вывод одного. знакоместа займет не менее 16/24 ассемблерных команд ((установка адреса + битовая операция) * 8 (кол-во бит в байте)).
Если говорить о контроллере его не имеющем (AVR, Arduino), то битовая операция превратится в чтение-модификацию-запись, т.е. не менее 32+ ассемблерных команд.

Для чего я вообще занялся адресацией индикатора с ОА, ведь у меня на модуле индикаторы с ОК?

Для одного проекта у меня применен 10-разрядный семисегментный индикатор. Сейчас в нем прописаны ЖКИ на 2xML1001 или на HD44780. Но ЖКИ при всем удобстве не сравнить с крупным LCD индикатором.
Переделать модуль «LED&KEY» в 10-разрядный теоретически несложно. Тем более я хотел заменить индикаторы 0,36″ на 0,56″. Имеющиеся индикаторы заменить на 5641 (ОК, есть), добавить пару одиночных или двухразрядную сборку ОА (найду).
Практически это будет очень похоже на схему «JY-LKM1638», если двухцветные светодиоды заменить на двухразрядную сборку ОА. Конечно применять в одном дисплее индикаторы с ОК и ОА немного странно, но дома пошла бы.
После просмотра картинки адресации индикаторов с ОА контроллером TM1638, у меня такая крамольная мысль пропала.

P.S. Краткая выжимка из комментариев.

Я сразу, как поглядел на адресацию индикаторов с ОА, понял что это гиблое дело, даже проверочный код не стал писАть. Некоторым это показалось неочевидно. Развязался флейм, для проверки своего предположения я попросил VGA предоставить проверочный код. Код на ассемблере MCS-51 был предоставлен. Приведу результаты тестирования, вырезка, орфография сохранена:

Из за чего все это начиналось — накладные расходы на дебильную адресацию чипом TM1638 индикаторов с ОА. Теперь можно посчитать код от VGA:

Брекпойнты стоят в начале и конце функции преобразования. К ним привязана простейшая функция

Она просто выводит в окно отладчика кол-во выполненных команд на момент вызова.
Итого, 1169 — 31 = 1138 команд потрачено на дебильную адресацию…

Меня тут-же поправили, что речь идет не о командах, а о тактах. Для классических MCS-51 это не совсем так, команда у них выполняется за 1 и более циклов, каждый из них состоит из 12 тактов (периодов тактовой частоты). В новых MCS-51 эти понятия равнозначны. Удачи, читайте комментарии.

Программная реализация интерфейса управления tm1640 на atmega

Arduino TM16xx library for LED & KEY and LED Matrix modules based on TM1638, TM1637, TM1640 and similar chips. Simply use print() on 7-segment displays and use Adafruit GFX on matrix displays.

TM16xx LEDs and Buttons library

This Arduino library facilitates driving LED displays using TM16xx LED driver chips. The TM16xx chip family allows driving 7-segment LED displays or LED matrices. Next to built-in high-frequency LED multiplexing, they offer control of LED brightness. Most TM16xx chips also support reading key-scan data for button presses. Currently this library supports the TM1637, TM1638, TM1640, TM1650 and TM1668 chips. Simply use print() on a 7-segment display and use Adafruit GFX on a LED matrix.

Initial version was based on the TM1638 library by Ricardo Batista. Further inspiration from the TM1637 library by Avishay, the Max72xxPanel library by Mark Ruys and the OneButton library by Matthias Hertel.

Читайте также:  Новогоднее волшебство или магическая коробочка на arduino

Table of contents

TM16xx chip features

Typesegments x digitsbuttonsinterface
TM16378 x 6 (common anode)8 x 2 singleDIO/CLK
TM163810 x 88 x 3 multiDIO/CLK/STB
TM16408 x 16n/aDIN/CLK
TM16508 x 47 x 4 singleDIO/CLK (SDA/SCL)
TM166810 x 7 – 13 x 410 x 2 multiDIO/CLK/STB

See the documents folder for datasheets containing more information about these chips and their pinouts.

This library has a layered structure to simplify the support of multiple TM16xx chips. By using a base class that provides a uniform API, your application doesn’t need chip specific code. Likewise, the library can offer common functionality in display specific classes that support multiple chips.

The figure below illustrates that concept:

To use this library you need to include the class that matches the chip on your module and instantiate the object:

In the setup() function you can set the intensity of the display, but that’s not mandatory:

In the loop() function you can use basic display methods provided by the base class:

For the easy to use print() method and more advance display methods you can use the TM16xxDisplay class.

The TM16xx chip makes it easy to see if a button is pressed. To check if a button was pressed you can use the getButtons() method:

Please note that while you don’t need to write any code for debouncing, the button state may be reset when you display something. For advanced detection of button clicks, double clicks and long presses you can use the TM16xxButtons class.

The TM16xxDisplay class adds some bytes to the memory footprint, but it provides the familiar easy to use print() and println() functions. Next to that it also provides some more advanced display methods. To use that class on top of the base class, all you need to do is instantiate it, refering to the chip specific class:

Simple print example using the TM16xxDisplay class:

See TM16xxDisplay.h for the provided methods.

The TM16xxMatrix class provides basic methods for using a single LED-matrix module. For more advanced graphics use the TM16xxMatrixGFX class. To use the TM16xxMatrix class on top of the base class, all you need to do is instantiate it, refering to the chip specific class:

Note that the TM1640 has sufficient outputs to drive two 8×8 matrices.

These methods can be used to set the pixels of the matrix:

See TM16xxMatrix.h for the provided methods.

The TM16xxMatrixGFX class implements the popular Adafruit GFX interface to drive one or more TM16xx based LED-matrix modules. To use the TM16xxMatrixGFX class you first need to include the proper header files:

Then you can instantiate the TM16xxMatrixGFX class, refering to the chip specific class:

Note that the TM1640 has sufficient outputs to drive two 8×8 matrices. The WeMOS D1 Mini Matrix LED Shield also uses the TM1640, but has only one 8×8 matrix.

These methods can be used to draw on the matrix:

In addition all the Adafruit GFX methods can be used, e.g.:

Multiple identical modules can be combined to form a large matrix. The data line can be shared to reduce the number of pins:

See Adafruit GFX documentation and TM16xxMatrixGFX.h for the provided methods. See the library examples for more information.

The TM16xxButtons class enlarges the footprint a bit, but based on the popular OneButton library library, it adds more advanced methods to use buttons. Next to simply polling the state of each button, you can define callback functions that will be called when a button is released, clicked, double-clicked or long pressed. To use this class on top of the base class, all you need to do is include the proper headers and instantiate the buttons object, refering to the chip specific class, for example:

Then you define the functions you want to use to handle the button events:

In setup() you need to attach the callback function:

(BTW. Besides a click function, you can also attach a function to handle release, doubleclick and longpress events).

In loop() you need to call the tick() function that detects all state changes and calls the callback functions as needed:

To implement a shift key, you can use the isPressed() function. See TM16xxButtons.h for the provided methods and the Button clicks example for more information.

New in this library

Added library functionality:

  • Revised library structure to simplify support of other TM16xx chips.
  • Basic functionality in base class for a uniform API.
  • Support for TM1637. Note: TM1637 does not support simultaneous button presses. (Method derived from TM1637 library but using pins in standard output mode when writing).
  • Support for TM1668. Note: TM1668 can be used in 10×7 – 13×4 display modes. Datasheet partly translated.
  • Support for TM1650. Note: TM1650 can be used in 8×4 or 7×4 display mode. Datasheet fully translated.
  • Reduced required RAM memory by using PROGMEM fonts.
  • Support for ATtiny44A and ESP8266 in addition to regular Arduinos.
  • Separate classes for LED matrix and advanced LED display support.
  • Simple display of text and numbers on 7-segment displays using familiar print() and println() methods.
  • Support for the Adafruit GFX graphics library for advanced graphics on a LED matrix.
  • Full support for QYF-TM1638 module (8 digit common anode LED display and 4×4 keypad)
  • Support for combining multiple modules into one large Adafruit GFX matrix.
  • Support for scanning all possible keys (K1, K2 and K3 lines) on TM1638.
  • Support for release, click, doubleclick and long press button detection using callback functions.
  • Added library examples.

Functionality in original library by Ricardo Batista:

  • Support for the TM1638 and TM1640, including common anode TM1638 module;
  • Helper methods for displaying numbers in decimal, hexadecimal and binary;
  • Support for multiple chained TM1638 and for TM1638 in inverted position;
  • Support for dimming the display and LEDs and for writing text;
  • Reading simultaneous button presses on TM1638;
  • The current version of this library supports ESP8266, Atmel ATmega (e.g. ATmega328 and ATmega168) and Atmel ATtiny MCUs. Due to the required memory, the smallest ATtiny MCU supported is the ATtiny44. Please let me know if you’ve successfully used this library with other MCUs.
  • The TM16xx chips offer no support for daisychaining multiple chips, but when separate Clk or Latch lines are used the Din line can be shared for combined displays.
  • The library doesn’t support combining multiple 7-segment modules into one display, but it is possible to define multiple display objects for multiple different modules. See the TM1638_TM1637ex_two_modules example.
  • The TM16xxMatrixGFX >
  • An alternative RAM preserving implementation using dynamic memory allocation is optional, but not suitable for small MCUs as using malloc/free will increase the required FLASH program space by over 600 bytes. Modify the TM16XX_OPT_BUTTONS_. defines in the header file at your own risk.

See the library examples for more information on how to use this library. See also the original examples by Ricardo Batista. Most will still work or only require minor changes.

CAN интерфейс

21.05.2012, 18:41

Iptables, правила, перенаправляющие на интерфейс eth1 все пакеты, приходящие на интерфейс eth0
Добрый день, подскажите, пожалуйста, как Iptables написать правила, перенаправляющие на интерфейс.

Можно ли создать интерфейс, в котором один из методов будет возвращать класс, который реализует интерфейс
Можно ли создать интерфейс, в котором один из методов будет возвращать класс, который реализует.

База данных “учебный план специальности”. GUI. Графический интерфейс. Пользовательский интерфейс
Всем привет. Свалилась на меня, значит, курсовая по прологу. Все бы ничего, да реализовать ее надо.

Узнать имя компонента, реализующего интерфейс и имя категории, в которую этот интерфейс входит
Темы очень близки. Поэтому два в одном решил сделать. Вот я взял у Роджерсона код: HRESULT.

21.05.2012, 19:27221.05.2012, 19:29321.05.2012, 22:51421.05.2012, 22:57522.05.2012, 00:566

тоже немного раскуривал недавно на stm32. вещь прикольная. не сложнее усарта, но вкусностей.

22.05.2012, 01:017

У некоторых PIC уже встроенный CAN есть.
Ну а программно можно почти на любом организовать (кроме, может, 8-ножек).
Например, в компиляторах МикроЭлектраники уже есть готовые библиотеки, примеры, и схемы подключения. Вот кусок HELP МикроПаскаля:

22.05.2012, 01:04822.05.2012, 01:089

программно реализовывать можно, но нафиг нужно. ковырял аппаратную часть стм, все вроде без напрягов, но ИМХО лучше использовать Std_lib для этого.

правда пока это были первые шаги. попинал с МК на МК пакеты, фильтры проверил. все очень красиво. впечатлило.

22.05.2012, 01:191022.05.2012, 10:201122.05.2012, 11:2712

Да мне тоже эти интерфейсы не нравятся. Всегда хватало RS232. Ну, на крайняк, (для сложных и тяжелых условий), – RS485.

Все же меньше всего мороки – с RS232. Кинул байт в буфер передатчика или считал с приемника, – и свободен, до следующего. А I2C я решил использовать только для общения с микросхемами, в которых он уже железно реализован. Часами, EEPROM.
I2C слэв на микроконтроллере – морока еще та. Особенно в многозадачном режиме, когда нет возможности только им постоянно заниматься.

22.05.2012, 11:331322.05.2012, 11:421422.05.2012, 11:501522.05.2012, 12:131622.05.2012, 18:091722.05.2012, 20:1118

Вы про USORT?
Он хорош тем, что полностью аппаратный. Да еще и буферированный.
То есть с ним – минимум лишней работы. Достаточно проинициализировать (задать скорость и режимы работы), и он все остальное делает автономно. Если прием разрешен, он следит за входом, получив стартовую посылку, проверяет ее по определенным критериям на достоверность, и начинает принимать информационные биты. По окончании приема проверяет наличие стопа (и паритет, если используется), помещает принятый символ в буфер и выставляет соответствующие флаги. Регистр приемника освобождается и может принимать уже следующий, не дожидаясь считывания предыдущего (в отличие, например, от SPI, где буфера нет).
Если разрешена передача, то, как только поступит очередной байт на передачу, он начинает его передавать, при этом в буфер передатчика уже можно класть следующий. Передатчик будет передавать байты, пока они есть у него в регистре передатчика или в буфере. Соответственно выставляет флаги готовности передатчика и очистки буфера. Допустимо небольшое несовпадение скоростей USORT между собой. В зависимости от скорости и режима работы – от 1-1,5 до 5%.

Работать с USORT можно как по прерываниям, так и (при скоростях примерно до 9600 бод) путем опроса флагов приемника и передатчика (я часто проверяю их, например, в прерывании системного таймера 1 мс).

В зависимости от скорости, и наличия согласования с линией (например через МАХ232), USORT позволяет работать с линией (например, витой парой или телефонной “лапшой”) от десятков до сотен метров. Например, по аналогичному протоколу, (5 или 7 бит + 1,5 стартовых), телеграфные сети Союза работали внутри городов на скоростях 50, 100, или 200 бод, по телефонным линиям на расстояниях до нескольких километров от телеграфа до отделения связи. При напряжении в линии +-20v, и токе +-20мА.

При больших расстояниях использовалась каналообразующая аппаратура, и те же телефонные каналы (до 12 и более телеграфных в одном телефонном, в зависимости от скорости).

Я около 20 лет (с 76 по 96г) проработал в лаборатории телеграфа, и хорошо прочувствовал последовательные асинхронные протоколы и коды (МТК-5, МТК-7, X.25, X.28, ИРПС, RS232).
Поэтому и сейчас в своих поделках использую USORT с большим удовольствием. И в компе по прежнему COM порты вовсю использую.

Примитивы для реализации 1-Wire master при помощи PWM и ICP на микроконтроллерах AVR AtMega

Если кто-нибудь использовал linux-драйвер шины 1-Wire на основе GPIO, то наверняка замечал, что в момент выполнения обмена данными загрузка SY% подскакивает чуть ли не до ста 100% (что вполне логично для bitbang-реализации). Конечно, можно поставить специализированный контроллер шины 1-Wire с подключением через I2C DS28E17 или использовать UART, но… Все-таки использовать linux для приложений реального времени не лучшая идея. Пусть контроллер на нем занимается высокоуровневой логикой, а весь реалтайм можно вынести на отдельный процессор. Тем более, что задач для этого отдельного процессора в моем проекте более чем достаточно.

Нет, я не буду брать распиаренные сейчас STM32 (все-таки сделал реализацию для STM8). Возьмем старую добрую AtMega328P (ну или какую-нибудь Arduino, если так станет кому-либо легче) и соберем все на ней. Вот только делать все будем «по-взрослому», с работой в режиме разрешенных прерываний и с расчетом на последующую реализацию более высоких уровней при помощи protothreads (о самих protothreads см. оригинал и разжеванные примеры на русском языке). Т.е. от bitbang-а отказываемся сразу и бесповоротно.

Также сохраним UART для будущего использования под другую периферию. Ибо он в нашем случае один, а мне бы еще протокол eBus сюда запихнуть. Ибо это тоже реалтайм.
I2C хорошо, но это еще один не самый дешевый кристалл с обвязкой, а оно нам надо? Итак, из интересного остается PWM и ICP.

Что такое PWM, я думаю, объяснять не надо. Это просто генерация импульсов заданной фазы и длительности, которая производится аппаратно (т.е. с точки зрения программы «в фоновом режиме»), но параметры которой можно изменять программно. А вот ICP достаточно интересная вещь: она позволяет аппаратно сохранять значение таймера в момент изменения уровня сигнала на определенном выводе микроконтроллера. Таким образом возможно достаточно точно получить момент возникновения события (изменения состояния вывода микроконтроллера) и/или измерить его продолжительность.

Итак, будем использовать аппаратный TIMER1 ATmega328 (таймеры 0 и 2 у меня используются для других целей). Для PWM можно использовать выводы OC1A и OC1B. Однако OC1B также используется в качестве сигнала SS, а подключать ATmega328 к целевому устройству я планировал именно по шине SPI. Это удобно с точки зрения апгрейда прошивок ATmega — делаем их при помощи целевого устройства, только один из CE-сигналов с его контроллера SPI заведем на контакт SS Atmega, а другой CE-сигнал заведем на контакт RESET. Да и с согласованием скоростей обмена возиться не нужно. Ну и в качестве еще одного довода против использования OC1B является то, что на плате Arduino MEGA 2560 этот сигнал вообще не выведен во внешний мир.

Итак, для генерации PWM используем контакт OC1A. Для ICP вариантов вообще нет — вывод такого типа у этой микросхемы только один. Для режима «ACTIVE PULLUP» используем любой свободный IO port и настроим его на работу в режиме «OUT».

Так, со схемотехникой разобрались. Теперь освежим в памяти физику работы шины 1-wire. В двух словах ее можно описать так:

  • Прием и передача тактируется master-устройством (т.е. нами)
  • Временной интервал между передаваемыми и/или принимаемыми битами не критичен (главное, чтобы он был не меньше минимально допустимого)
  • Критичным является длительность передаваемого импульса и длительность принимаемого (измеряемого) сигнала

Отлично, тогда выбираем режим работы Phase Correct PWM Mode (счетчик сначала считает «вверх» от значения BOTTOM до значения TOP, а после достижения значения TOP начинает считать «вниз» до значения BOTTOM). При этом значение BOTTOM фиксировано и всегда равно 0, а значение TOP может быть как одним из фиксированных значений (0xFF, 0x1FF, 0x3FF), так и значением из регистров OCR1A или ICR1. Два последних варианта нам не подходят, т.к. OCR1A мы будем использовать для формирования импульсов на выводе OC1A, а регистр ICR1 будет использоваться для измерения длительности низкого уровня на шине 1-Wire. Т.е. остается только использовать вариант с фиксированными значениями TOP, благо временной интервал между битами для нас не критичен.

В соответствии со схемой выход OC1A включен в инверсном режиме (т.е. установка на нем высокого уровня приведет к установке низкого уровня на шине 1-Wire и наоборот), будем использовать следующий режим PWM:

    когда таймер считает «вниз» и его значение совпало со значением из регистра OCR1A, установим сигнал на выводе OC1A в высокий уровень (на шине 1-Wire будет низкий уровень).

когда таймер считает «вверх» и его значение совпало со значением из регистра OCR1A, установим сигнал на выводе OC1A в низкий уровень (и, возможно, начнем измерять момент перехода сигнала на выводе ICP с низкого уровня на высокий).


Остальное все просто. Новое значение (длительность следующего передаваемого бита) в регистр OCR1A мы будем загружать по прерыванию TIMER1_OVF (в данном режиме оно генерируется при достижения счетчиком значения BOTTOM а активируется затем после достижения значения TOP), а по прерыванию TIMER1_ICP будем вычислять длительность нахождения шины 1-Wire в состоянии низкого уровня и, в зависимости от этого, делать вывод о принятии бита «1» или бита «0».

Таким образом, на каждую операцию приема или передачи одного бита у нас будут генерироваться одно прерывание OVF и одно прерывание ICP. Соответственно их ISR лучше бы оптимизировать, но пока пусть они будут написаны на языке C.

Ну а операцию RESET для шины 1-Wire будем выполнять, перепрограммировав TIMER1 в режим NORMAL (т.к. длительность импульса RESET и последующего возможного импульса PRESENCE достаточно большая, нам необходимо расширить «динамический диапазон» работы таймера. В режиме NORMAL он составляет значение 0xFFFF, чего вполне достаточно в нашем случае. Более того, мы его даже специально ограничим значением из регистра OCR1B, чтобы в случае отсутствия подключенных к шине 1-Wire устройств не ждать, пока таймер дойдет до 0xFFFF, а прервать операцию сразу после достижения максимального критического временного интервала).

Вручную считать параметры настройки таймера в зависимости от тактовой частоты ATmega это моветон (да и лениво проверять все граничные условия), поэтому заставим это делать preprocessor компилятора C воспользовавшись тем фактом, что у нас должна быть определенная константа F_CPU, значение которой равно используемой тактовой частоте в герцах (unsigned long, т.е. константа должна быть определена как 8000000UL либо 16000000UL, иначе preprocessor будет считать ее как int и потеряет значащие разряды).

STM32 – микроконтроллер для начинающих после Arduino

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

Что такое STM32

STM32 – это платформа, в основе которой лежат микроконтроллеры STMicroelectronics на базе ARM процессора, различные модули и периферия, а также программные решения (IDE) для работы с железом. Решения на базе stm активно используются благодаря производительности микроконтроллера, его удачной архитектуре, малом энергопотреблении, небольшой цене. В настоящее время STM32 состоит уже из нескольких линеек для самых разных предназначений.

История появления

Серия STM32 была выпущена в 2010 году. До этого компанией STMicroelectronics уже выпускались 4 семейства микроконтроллеров на базе ARM, но они были хуже по своим характеристикам. Контроллеры STM32 получились оптимальными по свойствам и цене. Изначально они выпускались в 14 вариантах, которые были разделены на 2 группы – с тактовой частотой до 2 МГц и с частотой до 36 МГц. Программное обеспечение у обеих групп одинаковое, как и расположение контактов. Первые изделия выпускались со встроенной флеш-памятью 128 кбайт и ОЗУ 20 кбайт. Сейчас линейка существенно расширилась, появились новые представители с повышенными значениями ОЗУ и Flash памяти.

Достоинства и недостатки STM32

  • Низкая стоимость;
  • Удобство использования;
  • Большой выбор сред разработки;
  • Чипы взаимозаменяемы – если не хватает ресурсов одного микроконтроллера, его можно заменить на более мощной, не меняя самой схемы и платы;
  • Высокая производительность;
  • Удобная отладка микроконтроллера.
  • Высокий порог вхождения;
  • На данный момент не так много литературы по STM32;
  • Большинство созданных библиотек уже устарели, проще создавать свои собственные.

Минусы STM32 не дают пока микроконтроллеру стать заменой Ардуино.

Сравнение STM32 с Arduino

По техническим характеристикам Ардуино проигрывает STM32. Тактовая частота микроконтроллеров Ардуино ниже – 16 МГц против 72 МГц STM32. Количество выводов GRIO у STM32 больше. Объем памяти у STM32 также выше. Нельзя не отметить pin-to-pin совместимость STM32 – для замены одного изделия на другое не нужно менять плату. Но полностью заменить ардуино конкуренты не могут. В первую очередь это связано с высоким порогом вхождения – для работы с STM32 нужно иметь базис. Платы Ардуино более распространены, и, если у пользователя возникает проблема, найти решение можно на форумах. Также для Ардуино созданы различные шилды и модули, расширяющие функционал. Несмотря на преимущества, по соотношению цена/качество выигрывает STM32.

Семейство микроконтроллеров STM32 отличается от своих конкурентов отличным поведением при температурах от -40С до +80 С. Высокая производительность не уменьшается, в отличие от Ардуино. Также можно найти изделия, работающие при температурах до 105С.

Обзор продуктовых линеек

Семейство STM32 имеет широкий ассортимент изделий, различающихся по объему памяти, производительности, потреблению энергии и другим характеристикам.

Серии STM32F-1, STM32F-2 и STM32L полностью совместимы. Каждая из серий имеет десятки микросхем, которые можно без труда поменять на другие изделия. STM32F-1 была первой линейкой, ее производительность была ограничена. Из-за этого по характеристикам контроллеры быстро догнали изделия семейства Stellaris и LPC17. Позднее была выпущена STM32F-2 с улучшенными характеристиками – тактовая частота достигала 120 МГц. Отличается высокой процессорной мощностью, которая достигнута благодаря новой технологии производства 90 нм. Линейка STM32L представлена моделями, которые изготовлены по специальному технологическому процессу. Утечки транзисторов минимальны, благодаря чему приборы показывают лучшие значения.

Важно отметить, что контроллеры линейки STM32W не имеют pin-to-pin совместимости с STM32F-1, STM32F-2 и STM32L. Причина заключается в том, что линейку разрабатывала компания, которая предоставила радиочастотную часть. Это наложило ограничения на разработку для компании ST.

STM32F100R4

Микросхема STM32F100R4 имеет минимальный набор функций. Объем флэш памяти составляет 16 Кбайт, ОЗУ – 4 Кбайт, тактовая частота составляет 12 МГц. Если требуется более быстрое устройство с увеличенным объемом флэш-памяти до 128 Кбайт, подойдет STM32F101RB. USB интерфейс имеется у изделия STM32F103RE. Существует аналогичное устройство, но с более низким потреблением – это STM32L151RB.

Программное обеспечение для работы с контроллером

Для ARM архитектуры разработано множество сред разработки. К самым известным и дорогостоящим относятся инструменты фирм Keil и IAR System. Программы этих компаний предлагают самые продвинутые инструментарии для оптимизации кода. Также дополнительно существуют различные системы – USB стеки, TCP/IP-стеки и прочие. Применяя системы Keil, пользователь получает хороший уровень технической поддержки.

Также для STM32 используется среда разработки Eclipse и построенные на ней системы Atollic TrueStudio (платная) и CooCox IDE (CoIDE) (бесплатная). Обычно используется последняя. Ее преимущества перед другими средами разработки:

  • Свободно распространяемое программное обеспечение;
  • Удобство использования;
  • Имеется много примеров, которые можно загрузить.

Единственный недостаток среды разработки CooCox IDE – сборка есть только под Windows.

STM32 Discovery

Начать изучение микроконтроллера STM32 лучше с платы Discovery. Это связано с тем, что на этой плате есть встроенный программатор. Его можно подключить к компьютеру через USB кабель и использовать как в качестве программируемого микроконтроллера, так и для внешних устройств. Плата Discovery имеет полную разводку пинов с контроллера на пины платы. На плату можно подключать различные сенсоры, микрофоны и другие периферийные устройства.

Что потребуется для подключения STM32 к компьютеру

Чтобы начать работу, потребуются следующие компоненты:

  • Сама плата STM32 Discovery;
  • Datasheet на выбранную модель;
  • Reference manual на микроконтроллер;
  • Установленная на компьютер среда разработки.

В качестве примера первая программа будет рассмотрена в среде CooCox IDE.

Первая программа

Обучение следует начинать с простейшего – с Hello World. Для начала нужно установить CooCox IDE на компьютер. Установка стандартная:

  • Скачивается программа с официального сайта;
  • Там нужно ввести адрес своей электронной почты и начать загрузку файла с расширением .exe;
  • Нужно открыть CooCox IDE вкладку Project, Select Toolchain Path;
  • Указать путь к файлу;
  • Снова открыть среду разработки и нажать View -> Configuration на вкладку Debugger;
  • Теперь можно записывать программу.

Когда программа установлена, ее нужно открыть. Следует перейти во вкладку Browse in Repository и выбрать ST – свой микроконтроллер.

Далее на экране появится список библиотек, которые можно подключить. Для первой программы потребуются системные CMSIS core и CMSIS Boot, библиотека для работы с системой тактирования RCC, GPIO для работами с пинами.

Сама программа пишется как и для Ардуино, нужно знать основы языка Си.

В окошке Project следует открыть main.c. В коде в самом начале следует подключить библиотеки кроме CMSIS (они уже автоматически подключены). Добавляются они следующим образом:

Затем добавляется тактирование порта в главной функции main. Какой контакт за что ответственен, можно просмотреть в даташите к микроконтроллеру.

Для настройки параметров выводов следует прописать ее название и поставить точку. Во всплывающем меню будут указаны все характеристики. Их можно исправлять.

После этого нужно сделать зацикливание в while, чтобы светодиод мигал, пока не отключится питание.

Когда программа написана, ее можно загружать в контроллер. Если есть отладочная плата, ее нужно подключить через USB кабель и нажать Download Code To Flash. Если плата отсутствует, потребуется переходник, который нужно подключить к порту компьютера. Контакт BOOT 0 подключается к плюсу питания контроллера, а затем включается само питание МК. После этого начнется прошивка.

Чтобы загрузить программу в микроконтроллер, нужно следовать указаниям от приложения. Сначала прописывается код порта, к которому подключен микроконтроллер. Также указывается скорость. Советуется брать небольшое значение, чтобы не было сбоев. Программа найдет микроконтроллер, и нужно будет нажать кнопку «далее». Во вкладке Download to device нужно в поле Download from file выбрать написанную программу и нажать «далее».

После этого нужно отключить питание контроллера STM32, закрыть Flash Loader Demonstrator, выключить переходник. Теперь можно снова включить микроконтроллер в обычном режиме. Когда программа будет загружена, светодиод начнет мигать.

Работа в других программах проходит подобным образом. Также выбираются нужные библиотеки, и прописывается код. У платных утилит функционал больше, и можно создавать более сложные проекты.

Рейтинг
( Пока оценок нет )
Загрузка ...
Adblock
detector