Сегодня я закончил прошивку для нагревателя, который будет устанавливаться в аквариумы.
Он имеет шину 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.