Умная баня!

AVR
У тестя на даче есть баня это отдельно стоящие здание на крыше которого бак. Насос стоит отдельно на расстояние 100м. Т.к. люди уже старые и часто забывают то воду включить то отключить то тен. Сами понимаете тен без воды… или вода через край… Решено было автоматизировать данную проблему. Врезали концевики герконовые в бак, терморезистор, заказал чехол для термопары из нержавейки (на тен смахивает) и вставил в него терморезистор. Заказал из поднебесной терморегулятор за 500 р. и регулятор уровня, бп 12в какой то китай. Собрал все. Релюхи взял от автоматизации станков 10А.


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

Делаем float из строки

Сегодня мы продолжим наши упражнения с плавающей точкой, и попробуем сделать её из текстовой строки. Как мы будем это делать?


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

Избранные места из библиотеки float

Как-то вот потребовалось кое-что сделать с использованием FLOAT, начал я рыть интернет. И тут со всей своей кристалльной ясностью вскрылся факт, что хороших руководств относительно FLOAT и ASSEMBLER для AVR нет.

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

Электронный термометр на Attiny 2313 с LCD дисплеем

Статья будет короткой, так как ничего особенного в этом девайсе нет, разве что удалось засунуть работу с датчиком DHT22 и LCD дисплеем в 2 Кб памяти. Устройство было собрано прошлой зимой, статью писал в личном блоге в это же время, но решил выложить и здесь.

Началось все с того, что на работе мы постоянно спорили по поводу температуры и влажности в комнате, а от этого зависело включение отопительных приборов, так как аргументировать без измерительного прибора было невозможно, я решил его собрать для лагеря «мерзляков», к которым относился и я. Сидеть зимой при температуре в помещении ниже 19 градусов было совсем не комфортно.

Звезды совпали для создания устройства выходного дня, новогодние праздники на носу, в загашнике лежит новая Attiny 2313 в DIP корпусе, DHT — 22 и 8×2 LCD 1602 дисплей. Взял я breadboard, быстро все соединил и принялся писать прошивку. Кстати для отладки я использовал LCD 16 x 2, так как у него пины расположены в один ряд и его проще соединять на монтажной плате. Я изначально хотел сделать работу от двух сенсоров внутренний — DHT22, внешний DS18B20, но памяти программ катастрофически не хватало, пришлось отказаться от идеи с внешним датчиком. В итоге написана прошивка только для работы с DHT — 22. Микроконтроллер тактируется от внутреннего осциллятора на 8МГц, но кто же запрещает внешний кварцевый резонатор? Фьюз биты по умолчанию, главное выбрать осциллятор и частоту 8МГц. Вот так выглядела отладочная модель:




Читать дальше
  • +1
  • 17 ноября 2020, 09:26
  • Jman

SI7021 и asm

AVR
Всем добра!
Долго у меня руки не доходили закончить этот проект. Много видел всяких библиотек, но проект задумывался на asm, был отложен на год или два. И вот руки дошли его закончить.
Работать на asm c этим датчиком никаких сложностей нет. Всё, что не поддерживается набором команд AVR, было отброшено за ненадобностью.
В итоге, что получилось, можно посмотреть в приложенных файлах. Я не делал перевод температуры в BCD, т.к. в моём проекте это не требуется.
Ну и несколько коротеньких функций в качестве бонуса:

Такое я использовал в программах МЕНЮ или если что-то уже получаешь в ASCII

                Ld       temp,Y		;* Берем  цифру в BCD 
                subi	temp,(-0x67)    ;* Переводим в HEX, сразу добавляем (1)
                brhc    ADD_6	  	;* Проверяем младшую тетраду на ноль
Sub_66:
                subi     temp,0x66      ;* И обратно в BCD
ADD_6:
                subi	temp,-6         ;- Если в младшей тетраде (0) добавл. (6)
                rjmp    Sub_66

Это функция поиска кнопки, при использовании ADC

KNOB:
		cbi	Flags,fl_Key_CODE  ;= Сбрасываем флаг кода, что-то там ADC насчитало
		ldi	temp1,0x20	   ;= Загружаем регистр для сдвига (1) (0010 0000)
		ldwi	Z,TAB_KEY*2	   ;= и он же счетчик обработанных  кнопок
NEW_KEY_VALUE:
		lpm	temp,Z+	           ;= извлекаем максимально возможный код кнопки из таблицы.
                ldi	count,3		   ;= На это число, в итоге, уменьшим код , чтобы определить кнопку т.к. значение может отличаться         
                (+/-) 1 от табличного.
CheckTabADC:		
		cp	CODE_KEY,temp	   ;= Сравниваем полученное с данными в таблице
		breq	EXIT_KNOB	   ;+ Равны - уходим 
		dec	temp		   ;= Вычитаем из полученного кода (1) 
		dec	count		   ;= Соответственно и уменьшаем счётчик возможностей
		brne	CheckTabADC	   ;= И снова проверяем. ;= Достанем следующий код кнопки , для проверки с полученным, при этом передвинув
		lsr	temp1		   ;= флажок , указывающий какой код кнопки мы будем обрабатывать ;= В итоге temp1 всегда ==0x01, что соответствует коду 0xFF - не нажата.
;| 0x02 - SW5, 0x04 - SW4,0x08 - SW3, 0x10 - SW2, 0x20 - SW1
		brne	NEW_KEY_VALUE
;		nop	;= а сюда все равно не попадём никогда , так что похрен;= что тут можно понаписать
EXIT_KNOB:
		mov	Flags_KEY,temp1	    ;= Переносим в регистр флагов
		ret

AtMega1284p/644p и W5500 Ethernet

AVR

Множество тестовых примеров использующих ATMEGA 1284p/644p и Ethernet контроллер W5500.

Собственно выкладываю ссылку на «распатроненный» мной Ethernet-стек для дешевого Ethernet контроллера на Wiznet 5500 SPI: m1284p_wiz5500
Основано на примерах для W5500 EVB (LCP13xx + W5500). Не Arduino С-код, довольно серьезно модифицировано(по причинам различий в архитектуре процессоров ARM и AtMega, a также немалого количества багов в коде приложений для W5500 EVB). Собиралось при помощи Eclipse Kepler с плагином AVR-Eclipse и тулчейном avr-gcc 4.9.2 (посредством самописного Makefile, думаю тоже соберется при желании).


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

attiny817 twi manual

AVR

Как работать с TWI новых тинь?


К сожаленю, даташит на процессоры стеснительно умалчивает об этой мелочи. Немного описаны биты в регистрах, состояния интерфейса — и всё. Стартовые решения по этой теме тоже отсутствуют, в аппликешн нотах — гордо перемаркированные старые атмеловские аппноты, совершенно неподходящие к новой аппаратуре.
Наверное, в Микрочипе ждут, пока Горнист за них мануал напишет.

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

Машина времени для крошек.

AVR
При программировании микроконтроллеров часто требуется отслеживать временные промежутки. Даже банальное «помигать светодиодом» требует учета времени погашенного состояния и времени светимости.

В Си есть функция delay_ms(X), которая выполняет пустой цикл X ms, то есть по сути вешает проц на X*fcpu/1000 тактов, так как ничего иного в это время он делать не может.

Многие прогеры, намучившись с этой функцией (или ей подобными), переходят на использование прерываний и аппаратных таймеров, но тут другая засада — их всегда мало.

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

Пройдя все эти стадии, я наконец-то дорос до понимания, что «что-то тут не так». Нарисовалась необходимость диспетчеризации задач по таймеру.
Прочитав AVR. Учебный Курс. Архитектура Программ Часть 2 в очередной раз убедился, что изобрел велосипед… ну и пусть, это просто еще один вариант решения.


Читать дальше
  • +2
  • 24 января 2018, 13:02
  • iva
  • 1

Среднечастотный частотомер на AVR. Часть 3, + милливольтметр.

  Это продолжение предыдущих частей "Часть1, динамическая индикация" и "Часть2, статическая индикация".
  В первой части я посетовал, что в ATmega8A при занятой памяти менее 10% почти не осталось свободных ножек. Во второй части я эту проблему решил с помощью внешнего контроллера дисплея. Осталось придумать, куда использовать освободившиеся ножки и неиспользованную память.
  Для измерительного генератора эти ресурсы могут быть применены при осовременивании схемы. Например замены переменного резистора настройки на инкрементальный энкодер, замены механических переключателей на управление реле или бесконтактными ключами и т.д. Это все индивидуально для каждой схемы. Но как правило измерительный генератор имеет регулируемый по напряжению выход. Контролировать уровень напряжения на нем также желательно. А у нас как раз остались незадействованными 6 каналов ADC (для PDIP, в корпусе TQFP их 8). Поэтому введем в программу второй канал измерения, измерять будем напряжение на входе ADC.


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