andy8mm Пост: 297408 От 26.Mar.2011 (15:33) ДедИван, да, пора наступить на мк-грабли.
Надеюсь подключатся спецы по контроллерам, живее будет и всем интереснее.
Давайте отделим котлеты от мух.
По контроллеру все сюда.
В конце исходника написано, как обычно v 2.2 !
Если совсем по правильному, надо-бы "пересортировать" прерывание от ДХ, т.к. запуск таймеров поздновато делается, и доработать прерывание часиков, что-бы не стреляло в карб на высоких оборотах, т.е. не искрить более положенного времени.
До окончательной версии ещё далековато, но запускать движок уже будет можно, на ХХ и средних оборотах.
По ВТОРОМУ ДХ, который подкючен к 11-й ноге 4052. Этот ДХ является датчиком 1-го цилиндра, и используется всего 1 раз при запуске, а дальше только переключение цилиндров по ПЕРВОМУ ДХ.
Хороший вариант. Как частный случай - в качестве подпрограммы.
Ведь в рельном блоке сотня килобайт кода- на все случаи отказа датчиков.
Допустим отказал один из ДХ- можно ехать и на одном, чих-пых- но поедет.
Но все таки два - лучше. И нормально использовать их оба.
Вот смотри, допустим такая ситуация- прищел сигнал от ДХ первого цилиндра
а потом опять он приходит, а от второго датчика сигнала нет.
Ага- делаем вывод, второй сдох. Надо одним первым обойтись. Как?
Делим время периода сигнала от ДХ1 на 4 - это примерно будут времена срабатывания
второго датчика - записываем в таймер, и по нему сами формируем сигналы второго ДХ.
Понятно что не очень совпадет, но примерно попадем в такт сжатия.
Чих-пых поедет.
При этом не забыть еще выдать водиле чек- неисправность номер 13.
Он потом глянет в справочку- ДХ2 сдох, ну выйдет пошевелит разъем, если не пропала
неисправность- значит надо до станции ехать, но приятнее самому, чем на лямке.
Вот такая диагностикка и запасные варианты и составляют большую часть кода.
dedivan Пост: 408318 От 24.Jan.2013 (04:28)
Хороший вариант. Как частный случай - в качестве подпрограммы.
Ведь в рельном блоке сотня килобайт кода- на все случаи отказа датчиков.
... и где-ж мы их "хоронить" будем, эти сотни килобайт, если у нас их только 2 ?!
Эти задачи что ты описал, для главного контроллера, в котором действительно сотни килобайт. Но тогда и функционал нашего таракашки будет са-авсем другой, только исполнение команд от главного и опрос датчиков. А так как сейчас, то у нас 3 в 1 Программно мы должны компенсировать отсутствие главного контроллера, вот и получается, что не совсем это под-программа, а полноценная программа управления движком, дЁшево и сердито. Но только как частный случай, ес-сно ...
Допустим отказал один из ДХ- можно ехать и на одном, чих-пых- но поедет.
...
Вот такая диагностикка и запасные варианты и составляют большую часть кода.
Это сервисные функции, и они у нас в таком дли-инном ящике ...
Сначала запустить-бы движок на НЗ нормально, как ты описывал, а потом уже будем думать о сервисе.
Подправил и дописал код. Новая версия ( 2.30 ) в прицепе.
Переделано INT0 и сделаны часики на 2 мс, что-бы в карб не стреляло на высоких. Время можно менять в заголовке.
dedivan - глянь плз инициализацию Т0. Я подправил. У тебя было 0х63, как в коментарии и осталось.
ldi r16, 0x33 ; set fast PWM
out tccr0a, r16 ; OCRb- output = 0b01100011
биты 6,7 управляют выходом ocrA а биты 4,5 выходом B - в режиме normal
А в режиме fast pwm - бит 6 управляет режимом- переключение вывода на противоположное при совпадении
а биты
5- подключение выхода
4- инверсный шим.
Так что 0х63 правильно.
Тем более что включал- работает.
Хотя вроде и 0х23 должно так же работать.
А 0х33 - инверсный сигнал будет.
Насчет кода - когда уходишь в прерывание- запрещай другие прерывания - cli
иначе могут быть коллизии.
ДедаВаня, в том-то и дело, что выход ocrA у нас НЕ должен быть включен, т.к. по схеме нога используется по ДРУГОМУ назначению, - это у нас адресная линия 4052 ! В этом и была суть вопроса. То что ты включал и работает, это говорит только о том, что в твоей схеме ножка PB0 не задействована. Угадал ?
А по-поводу cli - то вроде-бы при входе в прерывание они и так запрещены, как и у всех проциков. Наоборот, если нужно разрешить вложенные прерывания, тогда в прерывании нужно ставить SEI.
Точно ДедаВаня, 0х23 должно быть ! У нас по осВ должна выключится накачка, без обработки, а в переполнении должна быть обработка. В следующей версии подправлю.
А не понравилось видимо, "штатное" выключение выхода всё-таки в осВ. Угадал ?
Так она сама не работает, ей надо прицеп из датчиков или сигналов.
Это тебе просто- написал датчик первого цилиндра- а где я его возьму?
Ты сам то как думал его прицепить?
Дык элементарно, ДедИван. По схеме он прицеплен на 4-й канал 4052. А если проблема его обойти для программы, - то заремить цикл его ожидания и делов-то ...
... либо симитировать его сигнал.
Вот этот цикл :
;wcyl1: in r16, PINB ; цикл ожидания DX2 1 CYL
; andi r16, 0x10 ; PB4
; breq wcyl1 ; Нет 1 - уходим на метку