andy8mm Пост: 297408 От 26.Mar.2011 (15:33) ДедИван, да, пора наступить на мк-грабли.
Надеюсь подключатся спецы по контроллерам, живее будет и всем интереснее.
Давайте отделим котлеты от мух.
По контроллеру все сюда.
JohnZ Пост: 306384 От 08.May.2011 (17:29)
только сигнал переключающий 1-3 или 2-4 цил. Где его взять ?
Здесь много разных вариантов. Даже в серийных машинах разные подходы. Особенно на Волгах- то один способ
используют, то другой.
Все варианты сводятся к определению фазы- нужно знать какая пара цилиндров находится в ВМТ , на ту пару и подавать зажигание.
Обычно используют датчик фазы- его ставят на распредвал, поэтому иногда называют ДПРВ - датчик положения РВ.
Иногда вычисляют из сигнала датчика коленвала.
Но если у нас нет ни того ни другого, а есть только сигнал от трамблера, - тут тоже варианты.
Либо ставить датчик на коленвал- чтобы он давал сигнал когда пара 1-4 вверху, либо переделывать шторки трамблера
чтобы сигналы на разные пары цилиндров отличались.
Но это все механические работы.
Для программиста- это западло.
Что тут можно придумать? Есть такой факт при сжатии в цилиндре искра должна иметь порядка 15 кв напряжения,
а если цилиндры внизу- давления нет, то искра имеет напряжение пробоя 2-3 кв.
При этом в первичке трансформатора мы получим импульсы либо 600 в либо 100-200 в.
То есть запуская на пробу искру во все цилиндры сразу- мы можем определить где у нас сжатие,
и от этого цилиндра плясать как от печки.
JohnZ Пост: 306455 От 09.May.2011 (02:25)
Пробуйте, заливайте, критикуйте, ...
Хорошо, когда кто то работает, можно отдохнуть и покритиковать.
Во первых- возвраты у тебя идут не туда. Они опять запускают счетчик.
Выделяем главный модуль программы- своего рода диспетчер.
В это время ЦП отдыхает и следит за прерываниями.
Его надо пометить. И все возвраты из прерываний делать именно сюда.
Во вторых- если уж хочешь использовать память- то гораздо лучше записать туда константы,
например зеро= 0 , тогда не нужна будет команда записи нулей в промежуточный регистр,
а можно просто сразу пересылать его в цель.
У нас есть 15 первых ронов, которые как раз и подходят под это дело.
Вот их надо обозвать- зеро, 5 мс, 30 мс, пуск таймера,
разрешение слипа и т.д. и проинициализировать- записать зараннее константы.
Программа сразу короче будет и нагляднее.
JohnZ, разжуй дедову критику на картинке поподробнее.
Я залью в "Т25", а чего дальше, может макетку-моргалку какую для опытов?
Если надо прикуплю тебе 25-ых, а ты мне 13-ых, потом поменяемся мах-на-мах.
Предложение: присваивать версию прошивке согласно номера поста в котором выложена,
тогда не заплутаем, мабуть(наверное).
Номер дедова факса по секрету написал, а ты раструбил...китайцы телефон оборвут
JohnZ Пост: 306384 От 08.May.2011 (17:29)
только сигнал переключающий 1-3 или 2-4 цил. Где его взять ?
Что тут можно придумать? Есть такой факт при сжатии в цилиндре искра должна иметь порядка 15 кв напряжения,
а если цилиндры внизу- давления нет, то искра имеет напряжение пробоя 2-3 кв.
При этом в первичке трансформатора мы получим импульсы либо 600 в либо 100-200 в.
То есть запуская на пробу искру во все цилиндры сразу- мы можем определить где у нас сжатие, и от этого цилиндра плясать как от печки.
dedivan есть анекдот, про филина и мышей, который заканчивается - "... отстаньте от меня, я занимаюсь стратегией"
Где (или как ?) в таракане УВИДЕТЬ эти "600 в либо 100-200 в.", тем-более этот импульс ДОЛЖЕН ВИСЕТЬ пока МК не увидит его. На что заведён (откуда и как ?) этот сигнал ? На АЦП ? Так там всего-то ДО 5 в. входной сигнал - опять схемка нужна, для сопряжения
JohnZ Пост: 306455 От 09.May.2011 (02:25)
Пробуйте, заливайте, критикуйте, ...
Хорошо, когда кто то работает, можно отдохнуть и покритиковать.
Во первых- возвраты у тебя идут не туда. Они опять запускают счетчик.
НеА... sleep - это ВНУТРЕННИЙ беЗконечный цикл, ... туда и возвращаемся. dedivan, что тогда будет твориться в стэке ? Вызовы прерываний то идут ! А куда пишется адрес возврата и когда ?
Что-бы счётчик НЕ запускался, ему перекрывает кислород out tccr0b, r18 !!! ... а в r18 в это время, как правильно подметил, - ноль !
Выделяем главный модуль программы- своего рода диспетчер.
В это время ЦП отдыхает и следит за прерываниями.
Его надо пометить. И все возвраты из прерываний делать именно сюда.
Дык они туда и БУДУТ идти ... Куды-ж ещё ? Где прерывание застанет, туда и вернёмся, по адресу в стэке ... т.е. опять в sleep.
Во вторых- если уж хочешь использовать память- то гораздо лучше записать туда константы, например зеро= 0 , тогда не нужна будет команда записи нулей в промежуточный регистр,
а можно просто сразу пересылать его в цель.
А где у мну запись нуля и использование ОЗУ ? Нету-ти ...
А то что _образуется_ в рез-те выполнения алгоритма - не в счёт !
И про диспетчер - правильно заметил, вот только при нОнешнем подходе управления (прерывания) МК по питанию, это не подходит. Вот если-бы по класике, через входА прерываний, и без дёрганья по питалову, тогда возможно ...
У нас есть 15 первых ронов, которые как раз и подходят под это дело. Вот их надо обозвать- зеро, 5 мс, 30 мс, пуск таймера, разрешение слипа и т.д. и проинициализировать- записать зараннее константы. Программа сразу короче будет и нагляднее.
НеА дедИван, не так. Пробовали, - знаем В попугаях длиннее ...
Их ведь грузить надо, а потом из них в другой РОН. А так - напрямую, и скорость выполнения не пострадает. Ведь так ?
Да, и ещё - после reti, sei не обязателен. Смотрите в ДШ и егойный АСМ !
JohnZ Пост: 306543 От 09.May.2011 (22:39)
Где (или как ?) в таракане УВИДЕТЬ эти "600 в либо 100-200 в.", тем-более этот импульс ДОЛЖЕН ВИСЕТЬ пока МК не увидит его. На что заведён (откуда и как ?) этот сигнал ? На АЦП ? Так там всего-то ДО 5 в. входной сигнал - опять схемка нужна, для сопряжения
Анекдот хороший !
Делитель. И соотношение 600 и 200 хорошее. Аккурат в уровень 0 и 1
получится и без АЦП, и висеть будет постоянно.
JohnZ Пост: 306543 От 09.May.2011 (22:39)
Ведь так ?
Не так.
Из прерывания по reti МК возвращается на СЛЕДУЮЩУЮ команду из которой был вызван.
Вызов был из слипа. Какая следующая команда? декремент? С какой стати
еще раз вычитать?
Прогони программу в студии. Там все видно.
И по константам - посмотри внимательнее. С ними короче-
их не нужно загружать- они уже загружены при инициализации.
И писать удобнее- винарные коды один раз занес-
и потом пишешь - в рег. управления переслать "пуск таймера".
andy8mm Пост: 306565 От 09.May.2011 (23:27)
для второй тиньки?
Как тут сказать- если у нас два канала зажигания- то две тиньки уже есть.
Так что скорее всего для третьей.
Она уже этими двумя будет управлять.
А может четырехканальный будешь делать- тогда это для пятой.
JohnZ Пост: 306543 От 09.May.2011 (22:39)
и ещё - после reti, sei не обязателен.
Тут все не просто.
Ты понял, что после слипа надо вставить jump -переход на майн.
Тогда если вдруг возникнет прерывание во время выполнения jump,
из этого прерывания МК вернется на команду после джампа- опять
на декремент.
Поэтому нельзя сразу разрешать прерывание , то есть пользуем ret,
а не reti и исполняем всегда джамп
а разрешение даем отдельно, когда уже вошли в нашу майну.
reti нужно использовать когда прерывание возникает по ходу в обычной программе, а не в диспетчере.
JohnZ Пост: 306543 От 09.May.2011 (22:39)
Ведь так ?
Не так.
Из прерывания по reti МК возвращается на СЛЕДУЮЩУЮ команду из которой был вызван.
Вызов был из слипа. Какая следующая команда? декремент? С какой стати
еще раз вычитать?
Прогони программу в студии. Там все видно.
dedivan - помнишь к/ф "Напарник" ?
- Руки ... мыли ?
- Ах да да да ...
Дык вот - "Ах да да да ..."
Исправил, прицепил ... Обошлось "малой" ... кхм. Добавил ещё один rjmp и исправил 2 константы, - обшибся малость
И по константам - посмотри внимательнее. С ними короче-
их не нужно загружать- они уже загружены при инициализации.
И писать удобнее- бинарные коды один раз занес-
и потом пишешь - в рег. управления переслать "пуск таймера".
все понятно и наглядно.
Тут действительно задвоена всего ОДНА константа, счётчик циклов, т.к. есть его _инициализация_ и _пере-инициализация_. Разве в этом проблема ? Оставим эту доработку на следующую версию
JohnZ Пост: 306543 От 09.May.2011 (22:39)
и ещё - после reti, sei не обязателен.
Тут все не просто.
Ты понял, что после слипа надо вставить jump -переход на майн.
Тогда если вдруг возникнет прерывание во время выполнения jump,
из этого прерывания МК вернется на команду после джампа- опять
на декремент.
Почему ? А разве не на ту метку КУДА указывает jump ?
Получается что jump НЕ ВЫПОЛНИТСЯ СОВСЕМ ?
Поэтому нельзя сразу разрешать прерывание , то есть пользуем ret, а не reti и исполняем всегда джамп а разрешение даем отдельно, когда уже вошли в нашу майну.
reti можно и не пользовать. Инкремент стека и sei, - но ведь ОДНА команда короче двух ? А на майн (т.е. reset) оно само заползёт при СЛЕДУЮЩЕМ дёргании проца по питанию. Ведь у нас так МК работает ? Или я ошибаюсь ?
reti нужно использовать когда прерывание возникает по ходу в обычной программе, а не в диспетчере.
ДедИван - Диспетчер применим в класической схеме с прерываниями, а не дёрганьем по питанию... Тут он сам туда попадёт при следующей подаче питания.