AVR assembler, прошивка нагревателя ATtiny45, I2C slave, DS18B20 на базе core5277

Nov 04, 2024 03:46

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

Он имеет шину I2C(работает в режиме ведомого) и датчик температуры DS18B20.
По шине мастер может задать порог для поддержания температуры, и получить состояние нагревателя.
Изначально порог выставлен в 25 градусов Цельсия. После получения порога по I2C новое значение фиксируется в EEPROM, и в дальнейшем используется при включении МК.
Если по какой-то причине порог не задан, или не удалось считать показание с DS18B20, то нагревательный элемент отключается.
При запросе состояния мастеру сообщается время с момента старта МК(uptime), температура полученная с датчика и заданный порог, а также CRC8 MAXIM.

Прошивка создавалась для ATtiny45, ниже пример для ATtiny85. Она на 10 слов больше чем флеш 45-го, но я уже знаю, что можно оптимизировать в ядре, это не проблема.
Кстати говоря, мне пришлось потрудиться, для этой прошивки. Так как чаще всего я использую ATmega168 на 16МГц и давно не актуализировал ядро для других чипов и частот.
Зато теперь у меня есть драйвер I2C slave by USI. А еще я не плохо оптимизировал работу с портами. И даже кое-что убрал из основного кода ядра.
А еще наконец-то у меня дошли руки до реализации режима ОС без диспетчера. Т.е. тот вариант, когда у нас только одна задача и мало ресурсов.

В общем все это можно увидеть в моем проекте на GitHub'е в ветке devel: https://github.com/w5277c/core5277/tree/devel
Вот сурс прошивки: https://github.com/w5277c/core5277/blob/devel/examples/other/heater/main.asm

Я использую табуляцию в  3 символа, вот так мой код выглядит в немного модифицированном Geany:



Вот не большой лог отладки:



А вот лог анализатора







Можно заметить, что при получении Setup read по I2C образовалась пауза где-то в 3 миллисекунды.
Здесь МК был занят, он логировал отладочную информацию.
Что примечательно, эта пауза не повлияла на работу I2C, потому что мой I2C slave умеет притягивать SCL шину к земле.
Что не делают различные Си реализации, которых не так уж и мало в этих ваших тырнетах.
И авторы которых, за бездумное слизывание, явно не понимая что они делают, имеют не иллюзорные звезды на всяческих GitHub'ах.

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

А еще я хотел обратить ваше внимание еще раз на сурс прошивки https://github.com/w5277c/core5277/blob/devel/examples/other/heater/main.asm
Посмотрите как именно я пишу на ассемблере.
Согласитесь, этот код отличается от обычного классического ассемблера.
Здесь я работаю с драйверами, у меня куча унифицированных процедур.
В некоторых местах работа с ресурсами настолько проста, что даже чем-то напоминает BASIC, разве не здорово?

Жаль, в этом проекте не нужна мультизадачность, покажу в следующий раз.
Я люблю работать с многопоточностью в высокоуровневых языках, это пожалуй одна из основных причин разработки своей realtime OS.

avr assembler core5277 attiny i2c slave

Previous post Next post
Up