2 630 сообщений в этой теме

Я думал не увеличивать обвязку и тем более программу привязавшись к спидометру

просто думал ввести еще две величины,

заполнил в меню расход по трассе, и расход по городу

и добавилось еще два отображаемых параметра (два по очереди отоброжаемых прогноза)

:unsure: на это наверное уйдет меньше памяти если допустим еще привязаться к спидометру

у меня стоит на спидометре тросик, к чему там привязаться? :huh:

пластиковая шестеренка в коробке --тросик---и магнит создает магнитное поле в котором поднимается стрелка спидометра если я ничего не напутал,да и в спидометр лезть ,нет желания, хотелось обойтись малой кровью без этих усложнений)

поэтому и просил еще немного дописать программу, если это возможно?

одометр - конечно есть, их даже 2 ;)

общий пробег, и тот который сбрасывается, как называется незнаю

но это надо умножать остаток на расход и в голове считать

а тут сразу все на экране маршрутного компьютера

Изменено пользователем Жендос

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
STRELEC    1

Собрал прибор, прошивал мегу8 программатором PoniProg. Заливал прошивку lcd. Вроде все работает на дисплее в первой и второй строчке с лева температура кажет, с права в верхней строчке (0 л) а в нижней строчке напряжение (12.0 в). Вхожу в меню калибровки все работает видно как изменяются цифры при перемещении реостата, вот только при пустом баке показание (680) а при полном баке меньшее, ближе к нулю гдето так (17).

Приступаю к калибровке как оговаривает автор, все делаю точно как сказано не забываю записовать (ОК) до 39 литров. Выхожу из калибровки. (0 л) ни сместа, устанавливаю инерционность (2) ноль ни сместа.

Что делаю не так понять не могу?

При открытие PoniProg-ом прошивки NEX, EEPROM остается пустым.

Загружаю в PoniProg EEPROM и зашиваю. Все работает но показывает литры все на оборот да и с количеством врет.

Файл EEPROM для демо или он нужен в прошиве?

Пытаюсь откалибровать, опять проклятый (0 л).

Где моя ошибка понять не могу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
motori    0

Была такая-же проблема, при уменьшении сопротивления к полному баку- прибор не калибровался, только когда перепаял контакт на датчике(наоборот). Бак пустой- сопротивление мин, бак полный- макс. тогда все откалибровалось. Но у меня другая проблема вылезла. Все окалибровал, на трассе бак "пустел" правильно, четко по литрам, но когда дошло до 20л, зависло, после выкл.-вкл. питания значение замерло на 8л и больше не менялось, даже при отключении датчика :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Блуд    0

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

может быть, кто-то меня даже поддержит, есть смысл сделать переключатель, в одном положении с датчика уровня идёт на ОУ, в другом положении стандартно, как в конструкции машины. можно ли сделать отдельные версии прошивки так, чтобы

1) если показания больше 45 литров - чтобы они (показания литров) прятались, ведь всё равно никакой информации не несут

2) то же самое, но включая показания нуля литров. (то есть если ноль литров, то показания скрываются)

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

и у всех прыгают показания АЦП при ВКЛЮЧЕНИИ АВАРИЙКИ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Юрец    7
Выхожу из калибровки. (0 л) ни сместа, устанавливаю инерционность (2) ноль ни сместа.

похоже, что нет записи в еепром. войдите в меню калибровки датчика, кнопками +/- погоняйте литраж от 0 до 39л. значение в скобках (в нижней строке слева) есть данные, которые записанны в еепром для каждого калиброванного значения. проверьте правильность калибровки.

Файл EEPROM для демо или он нужен в прошиве?

файл lcd.нех - полный дамп памяти (программа + еепром). не знаю причины, но иногда возникают ошибки (особенности понипрога, микропроцессора): приходится зашивать еепром ОТДЕЛЬНО от нех файла. поэтому я его и выложил.

но когда дошло до 20л, зависло, после выкл.-вкл. питания значение замерло на 8л и больше не менялось, даже при отключении датчика

интересно... померьте напряжение с выхода LM-ки при изменении сопротивления датчика.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

так какое всетаки конечное решение, примет автор

на тему "прогоз остатка по городу и трассе"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Блуд    0

автор, можно ли попросить версию с маленьким мягким знаком и дробной температурой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
STRELEC    1

Автору. Уважаемый Юрий проблема с калибровкой.

Если перевернуть реостат поплавок в баке ВАЗ21063 то тогда сопротивление будет при пустом баке возрастать от (0) пустого до (330 ом) полного и прибор начинает работать правильно но проблема с точной калибровкой.

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

Чтобы можно было бы калибровать от 330 к 0.

Может ктото решил такую проблему или знает как ее решить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Блуд    0

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

или в чём-то трудность?

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

Изменено пользователем Блуд

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    154

Я вообще не понимаю почему автор схемы не предусмотрел калибровочный режим, как особый режим схемы...

Я, например, всегда в таких случаях предусматриваю вход в такой режим удержанием одной из кнопок при включении питания. А после этого функциональность всех органов управления и индикации становится иной. Тогда обычным потенциометром на входе АЦП контроллера и ОДНОЙ (максимум двух) кнопки можно производить калибровку бензобака (и вообще всего чего угодно, например датчика скорости при смене колес).

Процедура. Наливаем в ПУСТОЙ бензобак 1 литр топлива из мерного стакана. Выставляем потенциометром показание дисплея "1", кнопкой заносим позицию во флеш данных, доливаем еще один литр - повторяем действие. Можно делать не по литру, а по пять, а потом при работе интерполировать точки, только нужно понять, что при произвольной форме баков разных машин нарастет ошибка.

Для тех, кто желает определять уровень топлива точнее 1 литра. Это глупость. В топливной системе автомобиля и на дне бака есть неснижаемый остаток, а так же при изменении температуры объем топлива заметно меняется. Поэтому рыть в поисках миллилитров задача бессмысленная. Особенно в условиях теоретичности предсказаний пути на остатке топлива в МК - никто не может знать режима движения в дальнейшем и скорее всего он будет отличаться от предыдущего режима... При заправке конечно полезная фича, однако аппелировать к АЗС по поводу недолива на основании такого метода измерений наивно... Да и стоимость топлива нынче рыночная, т.е. важнее не уплаченная сумма, а качество этого топлива, а с этим и есть засада... А недолив нынче редок и опасен для АЗС...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Юрец    7
Я вообще не понимаю почему автор схемы не предусмотрел калибровочный режим, как особый режим схемы...

Наливаем в ПУСТОЙ бензобак 1 литр топлива из мерного стакана. Выставляем кнопками +/- показание дисплея "1", кнопкой заносим позицию во флеш данных, доливаем еще один литр - повторяем действие.

именно по такому алгоритму работает калибровка в этом устройстве.

ЭТО написано в описании к схеме.

Чтобы можно было бы калибровать от 330 к 0.

разницы в калибровке (от 330 к 0, или 0 к 330) никакой нет. данные значения АЦП записываются в массив энергонезависимой памяти.

имеет место алгоритм проверки в программе.

можно ввести еще один пункт настройки ( "0" при пустом / "0" при полном баке).

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

именно так и работает.

Изменено пользователем Юрец

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
STRELEC    1

Автору.

Пробовал калибровать от 330ом в сторону уменьшения к 0ом, ничего не получается программа не понимает такого калибра и 0 л ни с места.

Но если откалибровать в обратном порядке тоесть от 0ом к 330ом тогда все в норме.

Как все же сделать? Чтобы программно можно было бы калибровать при начальном сопротивление 330ом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Юрец    7
Но если откалибровать в обратном порядке тоесть от 0ом к 330ом тогда все в норме.

Как все же сделать? Чтобы программно можно было бы калибровать при начальном сопротивление 330ом.

в протеусе работает (откалибровать в обратном порядке).

в железе - пока не имею возможности. заказал индикатор в chipdip. как придет - проверю, в чем грабли. подождите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
motori    0

У меня такая-же проблема. "Пробовал калибровать от 330ом в сторону уменьшения к 0ом, ничего не получается программа не понимает такого калибра и 0 л ни с места."

Выше писал, что бак застыл на 8 литрах. Померил напряжение с оу, все меняется, также меняются литры от 0 до 8, на 8 замирает, хотя в калибровке значения идут дальше(в соответствии с записью).

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

У меня старнный глюк при прошивке мк. После каждой перепрошивки точки в меню и мягкий знак то отображаются в черном квадрате, то вообще произвольные значки. И регулировка подсветки становится на уровень 254, пока не уменьшишь значение до 5- яркость не начинает менятся, а от 5 до 0 все четко. Пользуюсь ponyprog- ом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Юрец    7
Автору.

Пробовал калибровать от 330ом в сторону уменьшения к 0ом, ничего не получается программа не понимает такого калибра и 0 л ни с места.

Но если откалибровать в обратном порядке тоесть от 0ом к 330ом тогда все в норме.

Как все же сделать? Чтобы программно можно было бы калибровать при начальном сопротивление 330ом.

to STRELEC,motori,Блуд

вот измененная прошивка. изменения:

калибровка такая- "0" литров при максимальном сопротивлении датчика уровня топлива (330ом).

симулировал в протеусе. нашел проблему. исправил.

далее (как придет индикатор) введу доп. пункт меню (0 при пустом / 0 при полном баке).

пробуйте!

lcd3.rar

Изменено пользователем Юрец

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
STRELEC    1

Автору.

Опробовал прошиву lcd3, с ней полная засада :blink: теперь температура без десятых и инерционность только в минус а в плюс не переходит сигнал нажатия кнопки есть. (-1; -2; -3; и т.д.) куда исчезло ( 1; 2; 3 и т.д.)

Соответственно вся калибровка без инерционности бесполезна. :angry:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Юрец    7
теперь температура без десятых и инерционность только в минус а в плюс не переходит сигнал нажатия кнопки есть

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

p.s. да, эта прошивка с температурой без десятых.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

:blink: Автор так и не дал исчерпывающий ответ по прогнозу трасса/город

это все без наездов, просто уже 2 раза мои посты просто проигнорировали?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Юрец    7
ответ по прогнозу трасса/город

это все без наездов, просто уже 2 раза мои посты просто проигнорировали?

извиняюсь...

думал, как это можно реализовать. все-таки придется привязываться к

1.тахометру (импульсы на катушку, для проверки запущенного двигателя).

2. спидометра (для контроля хотя-бы уровня скорости 60км/ч и более).

3. угол наклона дроссельной заслонки вторичной камеры .

третий пункт самый сложный в плане расчетов. можно ездить в экономичном режиме (плавный разгон; педаль газа не "резко топтать"), так и в "скоростном".

как это все завязать в одну кучу - пока не знаю. даже если в железе что-то и получится, то придется делать кучу экспериментов в реальных условиях.

p.s. как узнать частоту с датчика скорости при 60км/ч? (предложения типа "прицепить частотомер" не принимаются.). кстати, датчики ведь разные ?

p.p.s. добавить доп. меню и вывод остатка километража на количестве топлива в баке - несложно. если устроит только это, то изменения в программу внесу тогда, когда пришлют жк. индикатор (свой разбил по неаккуратности). привык проверять все в железе, а сейчас приходится симулировать в протеусе. (ввиду неопытности работы с протеусом пока не все получается так, как хотелось).

Изменено пользователем Юрец

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Юрец    7

STRELEC:

Опробовал прошиву lcd3, с ней полная засада

изменил только строки контроля уровня топлива. инерционность не трогал...

Изменено пользователем Юрец

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
STRELEC    1

:rolleyes: Спасибо за пояснение, наберусь терпения и буду ждать конкретных решений.

Девайс очень интересен, и уже в железе собран.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ph()enix    0

Может у кого-то есть печатка в спринт-лайоуте? Или расскажите как напечатать плату через PCAD вювер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Goodefine    92
p.s. как узнать частоту с датчика скорости при 60км/ч? (предложения типа "прицепить частотомер" не принимаются.). кстати, датчики ведь разные ?

А какой автомобиль? Инфу, как правило, легко нагуглить.... Вообще-то имея этот девайс на борту (миникомп), определить частоту следования импульсов не проблема - достаточно написать тестовую прошивку в пару строчек, которая эту частоту измеряет и выводит. Работы на полчаса, зато потом этот вопрос полностью отпадет...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот плата в 5 спринте, только резисторы и конденсаторы там smd?

выведены пятачки для ISP програмирования, там мало что подписано,

при желании разберетесь, если нет то выложу где больше пояснений

(В файле, после скачивания

нужно расширение тхт изменить на lay, иначе мне не удается его сюда залить :angry: )

Автору, меня 100% устроит вариант, без завязывания с лишними датчиками,

у меня их просто нет, тахометра нет, спидометр на тросике,

вобщем если можно то сделайте вариант, с дополнительными менюшками

за все время у меня вырабатался свой стил езды,

и я бы ввел средний расход по городу и трассе и наслаждался бы предполагаемым остатком :rolleyes:

555.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Юрец    7
определить частоту следования импульсов не проблема - достаточно написать тестовую прошивку в пару строчек, которая эту частоту измеряет и выводит. Работы на полчаса, зато потом этот вопрос полностью отпадет...

Приветствую!

интересное предложение. можно ввести это измерение (калибровку частоты датчика скорости в основную прошивку девайса).

есть варианты? (пример или кусок кода).

p.s. TIMER_0 уже использован. привязывать нужно к TIMER_1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: Atreides
      Добрый день. Мне требуется реализовать программный юарт на атмеге16. Он нужен для того, чтобы принятые по нему данные отправить на аппаратный юарт. В интернете нашел примеры кода, но понять его мне трудно. Прошу вас словами в общих чертах объяснить принцип реализации программного юарта. Буду рад примерам, которые, на ваш взгляд, являются наиболее простыми и понятными. Заранее спасибо.
    • Автор: olezka18
      Здравствуйте!
      Быстрым поиском не нашел по крайней мере тут.
      В общем нужна звуковая оповещалка , вернее примерная простая схема для оповещения о невыключеном свете в авто, т.к сейчас по правилам нужно ездить с включеным ближним светом и часто бывает забываю отключить, нужно если собрался выходить из машины, а свет не выключил она срабатывала, но только если зажигание выключено.
      для работы логики сего девайса планируется взять:
      1. напряжение от кнопки включения света в салоне.
      2. напряжение питания с включеного зажигания.
      3. напряжение на габаритных огнях.
      если первый и третий будет 12 вольт, а на 2 будет ноль, то включается сигнал,  других случаях сигнал не подается.
      Простота приветсвуется  т.е 315 и 361 транзисторы и желательно всё  баззер могу с материнки сковырнуть
    • Автор: Роман22211
      у меня усилитель для авто PROLOGY Club CA-200, двухканальный, и не работает левый канал, звук появляется в определённом положении регулятора громкости, но сам переменный резистор я поменял на новый, на правом канале звук нормальный, при мостовом включении (на 200W) звук намного меньше чем должен быть. Был сгоревший конденсатор C10, 2200мкф 25в- заменил на 16 вольт.. визуально всё в порядке, в чём может быть причина поломки? 
       

    • Автор: EugenArt
      Всем доброго времени суток!
      в поиске не смог найти инфо, поэтому создал тему, не ругайте, если ошибся с веткой.
      Идея следующая, есть автомагнитола deh-3600MP c выходом Ip-bus.Хочу подружить магнитофон с мп3 плеером (есть от фм-трансмиттера, завтра куплю платку отдельного мп3). Сразу подчеркну, что хочу управление плеером (треки, теги, пауза и т.д) с головного устройства.
      предполагаю схему так:  ip-bus - avr - mp3 player.
      алгоритм avr-mp3 несложен и открыт, а вот описание протокола ip-bus нигде нет, форум витат.спб уже изучил, есть кусок кода работы авр и ip-bus, но не очень понятно, может подскажете набор команд ip-bus или что происходит по событию нажатию кнопки вперед/назад.
      Заранее благодарен.
    • Автор: balistik
      Всем доброго времени суток. Я реальный нуб в ATMEGA. Могу более-менее понять чужой код и из кусков сделать целое. Вопрос такой: реально ли на ATMEGA8 сделать 2 ШИМ (таймер 1 и2) и внутреннее прерывание (по таймеру 0) для чтения данных с DS18B20 на 8Мгц чтобы еще осталось на опрос кнопок и небольшую логику? Я выложу пример кода. По отдельность: ШИМ, прерывания, логика, запись в ЕПРОМ работает. Собираю все вместе - не работает. Пробовал в Протеусе, тоже глючит, да и протеус тормозит. Может кто чего подскажет.
      //#define F_CPU 8000000UL // устанавливаем рабочую частоту контроллера #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <avr/eeprom.h> #include "ds18x20.h" #include "onewire.h" #define MAXSENSORS 1 unsigned int tempint = 0; // переменная для целого значения температуры unsigned int subzero = 0; // переменная отрицательных значений температуры unsigned int clock = 0; //задержка для опроса датчика температуры unsigned int termo_error = 0; //флаг ошибки термодатчика unsigned char regim, R1_SHIBER, R1_VENT, R2_SHIBER, R2_VENT, R3_SHIBER, R3_VENT; //переменные режимов работы volatile char press = 0, pr = 0, pr1 = 0, set = 0; //дополнительные переменные для кнопок #define SHIBER_PB 1 //шибер подачи топлива #define SHIBER_PWM OCR1A #define VENT_PB 2 //вентилятор подачи воздуха #define VENT_PWM OCR1B #define LED1_ON PORTD |= _BV(PD3) // светодиод режим 1 #define LED1_OFF PORTD &= ~_BV(PD3) #define LED2_ON PORTD |= _BV(PD4) // светодиод режим 2 #define LED2_OFF PORTD &= ~_BV(PD4) #define LED3_ON PORTD |= _BV(PD6) // светодиод режим 3 #define LED3_OFF PORTD &= ~_BV(PD6) #define LED4_ON PORTD |= _BV(PD7) // светодиод 4 программирование #define LED4_OFF PORTD &= ~_BV(PD7) #define BUT_M PIND & (1 << PD1) // кнопка MENU #define BUT_U PIND & (1 << PD2) // кнопка UP #define BUT_D PIND & (1 << PD0) // кнопка DOWN unsigned char eep1 EEMEM; // режим работы unsigned char eep2 EEMEM; // режим 1 ШИМ вентилятор unsigned char eep3 EEMEM; //режим 1 ШИМ шибер unsigned char eep4 EEMEM; // режим 2 ШИМ вентилятор unsigned char eep5 EEMEM; // режим 2 ШИМ шибер unsigned char eep6 EEMEM; // режим 3 ШИМ вентилятор unsigned char eep7 EEMEM; // режим 3 ШИМ шибер unsigned char eep8 EEMEM; // флаг первого запуска uint8_t Temperature, szero; //-255 uint8_t nSensors, j; uint8_t cel_frac_bits; uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE]; uint8_t search_sensors(void) // поиск DS18B20 { uint8_t i; uint8_t id[OW_ROMCODE_SIZE]; uint8_t diff, nSensors; nSensors = 0; for( diff = OW_SEARCH_FIRST; diff != OW_LAST_DEVICE && nSensors < MAXSENSORS ; ) { DS18X20_find_sensor( &diff, &id[0] ); if( diff == OW_PRESENCE_ERR ) { Temperature = 255; szero = 1; break; } if( diff == OW_DATA_ERR ) { Temperature = 255; szero = 1; break; } for (i=0; i<OW_ROMCODE_SIZE; i++) gSensorIDs[nSensors][i]=id[i]; nSensors++; } return nSensors; } void get_temp(int sensor){ // получаем температуру с датчиков DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); j = gSensorIDs[0][sensor]; // family-code for conversion-routine if (DS18X20_read_meas_single(j, &szero, &Temperature, &cel_frac_bits) != DS18X20_OK) { //если не прочиталось то -255 Temperature = 255; szero = 1; } if (DS18X20_read_meas_single(j, &szero, &Temperature, &cel_frac_bits) != DS18X20_OK) { //если не прочиталось то -255 Temperature = 255; szero = 1; } tempint=(int)Temperature; subzero=(int)szero; } void pin_init(void) { //инициализация портов ШИМ DDRB |= (1<<SHIBER_PB) | (1<<VENT_PB); PORTB &= ~((1<<SHIBER_PB) | (1<<VENT_PB)); } void timer0_init(void) { //инициализация таймера для термодатчика TCCR0 |= (1<<CS00); TIMSK |= ( 1 << TOIE0); TCNT0 = 0xFF; } void timer1_init(void) { //инициализация таймера ШИМ шибера TCCR1A |= (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11); TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS10); TCNT1 = 0x00; ICR1 = 0xFF; OCR1A = 0x00; OCR1B = 0x00; } void timer2_init(void) { //инициализация таймера ШИМ вентилятора TCCR2 |= (1 << COM21) | (1 << WGM21) | (1 << WGM20) | (1 << CS20); TCNT2 = 0x00; OCR2 = 0x00; } ISR(TIMER0_OVF_vect){ //прерывание таймера 0 для термодатчика if (clock != 4294967295){_delay_us(50);clock++;}else{get_temp(0);clock=0;} } //***************** обработка нажатия кнопок ********************** void buttons(){ if(~BUT_U){if(set == 0)pr++; // кнопка UP if(pr == 10){ // долгое нажатие } _delay_ms(100); }else{ if(pr >= 1 && pr < 10){ // короткое нажатие regim++; if (regim>3){regim=0;} eeprom_write_byte(&eep1, regim); // сохранение настройки в eeprom set = 0; pr = 0; } pr = 0; } if(~BUT_D){if(set == 0)pr1++; // кнопка DOWN if(pr1 == 10){ // длинное нажатие } _delay_ms(100); }else{ if(pr1 >= 1 && pr1 < 10){ // короткое нажатие. //set = 20; regim--; if (regim<0){regim=3;} eeprom_write_byte(&eep1, regim); // сохранение настройки в eeprom _delay_ms(100); set = 0; pr1 = 0; } pr1 = 0; } if(~BUT_M){ // кнопка MENU press++; if(press == 1 && set != 0){set++;} // переход по настройкам if(press >= 100 && set == 0){set = 1; _delay_ms(200);} // ход в настройки if(set == 1) eeprom_write_byte(&eep2, R1_VENT); if(set == 2) eeprom_write_byte(&eep3, R1_SHIBER); if(set == 3) eeprom_write_byte(&eep4, R2_VENT); if(set == 4) eeprom_write_byte(&eep5, R2_SHIBER); if(set == 5) eeprom_write_byte(&eep6, R3_VENT); if(set == 6) eeprom_write_byte(&eep7, R3_SHIBER); if(set > 6){ _delay_ms(100); set = 0; press = 0;} // если включена настройка даты, }else{ if(set == 0 && press >= 1){ // если не вошли в настройки regim++; if (regim>3){regim=0;} eeprom_write_byte(&eep1, regim); // сохранение настройки в eeprom } press = 0; } } //*****************режим настроек******************** void settings(){ //визуальное подтверждение настроек if(press >= 1 && set == 1) { LED1_ON; LED2_OFF; LED3_OFF; LED4_ON; SHIBER_PWM = R1_VENT;} //ШИМ шибер 0-255 if(press >= 1 && set == 2) { LED1_ON; LED2_OFF; LED3_OFF; LED4_ON; VENT_PWM = R1_SHIBER;} //ШИМ вентилятор 0-255 if(press >= 1 && set == 3) { LED1_OFF; LED2_ON; LED3_OFF; LED4_ON; SHIBER_PWM = R2_VENT;} //ШИМ шибер 0-255 if(press >= 1 && set == 4) { LED1_OFF; LED2_ON; LED3_OFF; LED4_ON; VENT_PWM = R2_SHIBER;} //ШИМ вентилятор 0-255 if(press >= 1 && set == 5) { LED1_OFF; LED2_OFF; LED3_ON; LED4_ON; SHIBER_PWM = R3_VENT;} //ШИМ шибер 0-255 if(press >= 1 && set == 6) { LED1_OFF; LED2_OFF; LED3_ON; LED4_ON; VENT_PWM = R3_SHIBER;} //ШИМ вентилятор 0-255 switch(set) // включена настройка { case 1: // настройка R1_VENT if(~BUT_U){R1_VENT++; if(R1_VENT > 254) R1_VENT = 0; _delay_ms(100);} if(~BUT_D){R1_VENT--; if((~BUT_D) && R1_VENT == 0) R1_VENT = 254; _delay_ms(100);} break; case 2: // настройка R1_SHIBER if(~BUT_U){R1_SHIBER++; if(R1_SHIBER > 254) R1_SHIBER = 0; _delay_ms(100);} if(~BUT_D){R1_SHIBER--; if((~BUT_D) && R1_SHIBER == 0) R1_SHIBER = 254; _delay_ms(100);} break; case 3: // настройка R2_VENT if(~BUT_U){R2_VENT++; if(R2_VENT > 254) R2_VENT = 0; _delay_ms(100);} if(~BUT_D){R2_VENT--; if((~BUT_D) && R2_VENT == 0) R2_VENT = 254; _delay_ms(100);} break; case 4: // настройка R2_SHIBER if(~BUT_U){R2_SHIBER++; if(R2_SHIBER > 254) R2_SHIBER = 0; _delay_ms(100);} if(~BUT_D){R2_SHIBER--; if((~BUT_D) && R2_SHIBER == 0) R2_SHIBER = 254; _delay_ms(100);} break; case 5: // настройка R3_VENT if(~BUT_U){R3_VENT++; if(R3_VENT > 254) R3_VENT = 0; _delay_ms(100);} if(~BUT_D){R3_VENT--; if((~BUT_D) && R3_VENT == 0) R3_VENT = 254; _delay_ms(100);} break; case 6: // настройка R3_SHIBER if(~BUT_U){R3_SHIBER++; if(R3_SHIBER > 254) R3_SHIBER = 0; _delay_ms(100);} if(~BUT_D){R3_SHIBER--; if((~BUT_D) && R3_SHIBER == 0) R3_SHIBER = 254; _delay_ms(100);} break; } } int main(){ /*******************************настройка переферии******************************/ cli(); ow_set_bus(&PIND, &PORTD, &DDRD, PD5); // иництализация протокола 1-wire nSensors = search_sensors(); // поиск датчиков DS18B20 DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); //включаем преобразование температуры pin_init(); //timer0_init(); timer1_init(); timer2_init(); _delay_ms(5); if(eeprom_read_byte(&eep8) != 1){ // читаем eeprom, если там мусор (первый запуск), пишем свои данные eeprom_write_byte(&eep1, 0); // режим работы eeprom_write_byte(&eep2, 150); // режим 1 ШИМ вентилятор eeprom_write_byte(&eep3, 100); //режим 1 ШИМ шибер eeprom_write_byte(&eep4, 200); //режим 2 ШИМ вентилятор eeprom_write_byte(&eep5, 150); //режим 2 ШИМ шибер eeprom_write_byte(&eep6, 230); //режим 3 ШИМ вентилятор eeprom_write_byte(&eep7, 200); //режим 3 ШИМ шибер eeprom_write_byte(&eep8, 1); // флаг первого запуска } //читаем настройки из памяти regim = eeprom_read_byte(&eep1); // читаем режим работы из eeprom R1_VENT = eeprom_read_byte(&eep2); // читаем режим 1 ШИМ вентилятор из eeprom R1_SHIBER = eeprom_read_byte(&eep3); //читаем режим 1 ШИМ шибер R2_VENT = eeprom_read_byte(&eep4); //читаем режим 2 ШИМ вентилятор R1_SHIBER = eeprom_read_byte(&eep5); //читаем режим 2 ШИМ шибер R3_VENT = eeprom_read_byte(&eep6); //читаем режим 3 ШИМ вентилятор R1_SHIBER = eeprom_read_byte(&eep7); //читаем режим 3 ШИМ шибер sei(); _delay_ms(5); /**********************************инициализация ШИМ*************************************/ while(1){ //if (tempint=255) {LED1_ON;LED2_OFF;LED3_ON;termo_error=1;} else {termo_error=0;}//выводим код ошибки датчика темппературы buttons();//обработик нажатия кнопок if (termo_error == 0){//блокировка по термодатчику if(set == 0) { //нормальный режим работы if (regim == 0){ //режим работы 0 LED1_OFF; LED2_OFF; LED3_OFF; LED4_OFF; SHIBER_PWM = 0; //ШИМ шибер 0-255 VENT_PWM = 0; //ШИМ вентилятор 0-255 } if (regim == 1){ //режим работы 1 LED1_ON; LED2_OFF; LED3_OFF; LED4_OFF; VENT_PWM = R1_VENT; //ШИМ вентилятор 0-255 if (tempint >=40) { //блокировка по температуре SHIBER_PWM = 0; //ШИМ шибер 0-255 }else{ SHIBER_PWM = R1_SHIBER; //ШИМ шибер 0-255 } } if (regim == 2){ //режим работы 2 LED1_OFF; LED2_ON; LED3_OFF; LED4_OFF; VENT_PWM = R2_VENT; //ШИМ вентилятор 0-255 if (tempint >=60) { //блокировка по температуре SHIBER_PWM = 0; //ШИМ шибер 0-255 }else{ SHIBER_PWM = R2_SHIBER; //ШИМ шибер 0-255 } } if (regim == 3){ //режим работы 3 LED1_OFF; LED2_OFF; LED3_ON; LED4_OFF; VENT_PWM = R3_VENT; //ШИМ вентилятор 0-255 if (tempint >=80) { //блокировка по температуре SHIBER_PWM = 0; //ШИМ шибер 0-255 }else{ SHIBER_PWM = R3_SHIBER; //ШИМ шибер 0-255 } } } }else{ SHIBER_PWM=0; VENT_PWM=0; } if(set != 0) settings();//вход в настройки } //return 0; }