Электронные часы для автомобиля ВАЗ-2106
- Dr. Alex
- Это не хвост, это антенна
- Сообщения: 1438
- Зарегистрирован: Вт окт 28, 2008 09:00:18
- Откуда: Украина, Харьков
- Контактная информация:
Да идейка прикольная. Я вот подумал о том, что бы между знаками часо в минут поставить СМД светодиоды, которые индицируют секундные импульсы, ну как в электронных наручных часах. Только тогда прийдётся маленько печатку перерисовывать.
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
- Yarst
- Родился
- Сообщения: 10
- Зарегистрирован: Пт ноя 28, 2008 01:12:46
- Откуда: Москва
- Контактная информация:
Re: Электронные часы для автомобиля ВАЗ-2106
Всем привет!
Говорит создатель тех самых часов для ВАЗ-2106, с которых, собственно, тема началась...
Вот это не совсем правда. Прошивку вышлю бесплатно.
Почему фото прошу - потому что хочу убедится в том, что имею дело с народными умельцами, которые действительно своими руками разные вещи для себя делают, а не с фирмой какой-нибудь, которая затем начнет штамповать эти часы тысячами, забыв, естесственно, про гонорар разработчика...
Вообще, многие обрашаются с вопросом типа: "Сколько возьмешь за изготовление?". Отвечаю всегда: 2000руб. Еще никто не согласился
. Но мне-то тоже за 100руб два дня тратить не весело...
Что касается убыстрения изменения какого-либо параметра при нажатой кнопке - все очень просто. Есть некий регистр, который хранит период между изменениями настраиваемого парамтра (например, в единицах - прерваниях от какого-либо таймера). С каждым периодом (т.е. с каждым изменением настраиваемого параметра), пока кнопка нажата, значения этого периода все уменьшается и умешьнается (не обязательно на единицу, может быть, сразу на 10, напрмер). Уменьше ниепроисходит до определенного предела - это есть минимальный период изменения (т. е. максимальная его скорость). При отпускании кнопки значение нашего периода инициализируется максимальным значением к следующему разу. Выбирая начальное (максимальное) значение, конечное (минмальное) значение, а также то, сколько будем отнимать от этого периода при каждом изменении настраиваемого параметра, можно подобрать любые желаемые характеристики этого процесса.
И еще. Зачем мой рисунок платы куда-либо переносить? Почему бы его не открыть, скажем в стандартном "Microsoft Office Picture Manager", добавить контрасности да и распечать сразу в нужном размере (для этого, как раз, линейка), чтобы сделать по нему плату?
С уважением, Ярослав.
Говорит создатель тех самых часов для ВАЗ-2106, с которых, собственно, тема началась...
Секретный кот писал(а):Garic33 писал(а):в ответ получил чертеж платы рисунком, и то что прошивку он вышлет только тогда когда увидит готовую плату.
При таком раскладе вместо прошивки он скорее всего вышлет её стоимость и порядок оплаты
Вот это не совсем правда. Прошивку вышлю бесплатно.
Почему фото прошу - потому что хочу убедится в том, что имею дело с народными умельцами, которые действительно своими руками разные вещи для себя делают, а не с фирмой какой-нибудь, которая затем начнет штамповать эти часы тысячами, забыв, естесственно, про гонорар разработчика...
Вообще, многие обрашаются с вопросом типа: "Сколько возьмешь за изготовление?". Отвечаю всегда: 2000руб. Еще никто не согласился
Что касается убыстрения изменения какого-либо параметра при нажатой кнопке - все очень просто. Есть некий регистр, который хранит период между изменениями настраиваемого парамтра (например, в единицах - прерваниях от какого-либо таймера). С каждым периодом (т.е. с каждым изменением настраиваемого параметра), пока кнопка нажата, значения этого периода все уменьшается и умешьнается (не обязательно на единицу, может быть, сразу на 10, напрмер). Уменьше ниепроисходит до определенного предела - это есть минимальный период изменения (т. е. максимальная его скорость). При отпускании кнопки значение нашего периода инициализируется максимальным значением к следующему разу. Выбирая начальное (максимальное) значение, конечное (минмальное) значение, а также то, сколько будем отнимать от этого периода при каждом изменении настраиваемого параметра, можно подобрать любые желаемые характеристики этого процесса.
И еще. Зачем мой рисунок платы куда-либо переносить? Почему бы его не открыть, скажем в стандартном "Microsoft Office Picture Manager", добавить контрасности да и распечать сразу в нужном размере (для этого, как раз, линейка), чтобы сделать по нему плату?
С уважением, Ярослав.
yarst.org - сайт о том, что можно сделать своими руками
- sheva_s
- Грызет канифоль
- Сообщения: 256
- Зарегистрирован: Пт апр 27, 2007 14:32:48
- Откуда: Украина Кривой Рог
- Контактная информация:
Re: Электронные часы для автомобиля ВАЗ-2106
Yarst писал(а):Всем привет!
Говорит создатель тех самых часов для ВАЗ-2106, с которых, собственно, тема началась...
С уважением, Ярослав.
Здраствуйте Ярослав немогли бы Вы написать как правильно построить алгоритм работы программы по аналогу выших часов.
Подскажите как правильно расчитать значение для таймера при частоте процессора 1 мГц что бы срабатывало прерывание 100 раз в секунду. Как вобще расчитывать прерывание таймера хочу забить в эксель формулу что бы была всегда под рукой просто ввести в нее значение и получить результат может у кого уже есть такая табличка выложите.
- Goodefine
- Держит паяльник хвостом
- Сообщения: 906
- Зарегистрирован: Ср апр 16, 2008 13:22:54
- Откуда: Приднестровье, Тирасполь
Re: Электронные часы для автомобиля ВАЗ-2106
Yarst писал(а):...Прошивку вышлю бесплатно. Почему фото прошу - потому что хочу убедится в том, что имею дело с народными умельцами, которые действительно своими руками разные вещи для себя делают, а не с фирмой какой-нибудь, которая затем начнет штамповать эти часы тысячами, забыв, естественно, про гонорар разработчика...
Оно то вроде так... Но фирме способной наладить выпуск подобных изделий, разработать прошивку часов труда не составит. Согласитесь, она не настолько сложна. Не говоря уже о том, чтобы сделать один экземпляр печатной платы для получения прошивки. Главное - это идея, именно ее нужно защищать. А народному умельцу прошивка может пригодиться еще до изготовления платы, на этапе эмуляции устройства - ведь не всегда есть указанные компоненты. Либо печатка нужна отличная от Вашей. В, общем, вариантов много...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
- Yarst
- Родился
- Сообщения: 10
- Зарегистрирован: Пт ноя 28, 2008 01:12:46
- Откуда: Москва
- Контактная информация:
По поводу таймеров...
Добрового времени суток!
Начнем с того, что если Вы имеете кварц на котором написано 1МГц, это еще вовсе не значит, что там действительно 1Мгц. Для обычных кварцев допустимое отклонение составляет +/- 0.005%. Это значит, что у одного кварца частота может быть 999950Гц, а у другого, внешне точно такого же - 1000050Гц. Нетрудно подсчитать, что если за эталон мы возьмем ровно 1Мгц, то отклонение частоты на те самые 0.005% приведет к погрешности хода часов в 4.3сек в день, или более чем на 2 минуты в месяц!
Это значит, что для того, чтобы часы ходили точно, надо настраивать каждый экземпляр ИНДИВИДУАЛЬНО!
sheva_s - зачем Вам 100 прерываний в секунду? Что Вы хотите сделать с этой частотой?
Для отсчета секунд, очевидно, надо 1 раз в секунду, а для осуществления динамической индикации на светодиодных индикаторах - как минимум 300...400Гц, иначе Ваши индикаторы будут мерцать и на них смотреть противно будет...
Чтобы задать достаточно точное количество прерываний от таймера за секунду (что тоже самое, достаточно точный перод прерываний - т. е. время между соседними прерываниями) можно поступить так.
Пусть нам необходима частота прерываний 100Гц. Это значит, что нам нужен период прерываний 0.01сек. Предположим, мы хотим для этого использовать 8-ми битный таймер №0 микроконтроллера. Предположим также, что частота кварца у нас 1Мгц.
Тогда, нам следует выбрать делитель для таймера №0 так, чтобы время между прерываниями от таймера было ПЕРВЫМ БЛИЖАЙШИМ БОЛЬШИМ от нашего перода 0.01сек. В нашем случае это СК/64. При этом, таймер будет переполнятся каждые 0.016сек. Как получена эта цифра? Один "тик" таймера есть 0.00001 х 64 (где 0.00001 - период кварца, что есть 1/1000000Гц, 64 - тот самый наш коэфф. деления). Теперь, т. к. таймер №0 - 8-ми битный, значит он будет переполняться при достижении значения 256. Для этого ему потребуется совершить как раз 256 "тиков", а каждый "тик" - это 0.000064сек, т. е. общее время переполнения - 256 х 0.000064 = 0.016384сек.
Но нам ведь надо именно 0.01сек!
Но кто сказал, что таймер должен после обнуления (т.е. после выполнения прервания по переполнению) начинать счет именно с нуля?
Давайте зададим ему начальное значение. Как его определить?
Нам надо 0.01сек, а "тик" таймера есть 0.000064сек. Делим 0.01 на 0.000064 - получаем примерно 156. Значит, между прерываниями таймер должен успевать насчитать только 156 "тиков", о не 256! И значит начальное значение ему надо задать 256 - 156 = 100.
Таким образом, в начале обработки прерывания от этого таймера мы берем и записываем в него 100, например так: 100 -> TCNT0 (для Algorithm Builderа). Вот тогда мы и получим приблизительно 100 прерываний в секунду. Почему приблизительно? Потому что:
1. 0.01/0.000064 = 156.25 а не ровно 156 (но это еще пол-беды);
2. Потому что обработка прерывания от таймера может начинаться не как только произойдет переполнение этого таймера, а как только процессор освободится (например, от обработки какого-либо другого прерывания, которое, по стечению обстоятельств, может произойти как раз в рассматриваемый нами момент времени). Тогда за это время таймер может уже успеть насчитать несколько "тиков", и лишь затем, когда мы всетаки перейдем к обработке прерывания от нашего таймера, мы этот таймер инициализируем значением 100. Реальное количество "тиков", которые успеет насчитать наш таймер до переполнения, будет не 156 - как нам надо, а 156 + то самое количество, которое он уже успел насчитать до начала обработки прерывания (и которое нам неизвестно). Значит, мы получим в этот раз не 0.01сек, а 0.01сек + сколько-то еще.
Поэтому этот способ можно применять только там, где нет слишком жестких требований к точности периодов переполнения (например, для тактирования динамической индикации).
Как же быть, если мы хотим отмерять отрезки времени точно?
В своих часах я использовал в качестве секундного, а точнее, пол-секундного генератора таймер №1 микроконтроллера (16-ти битный). Ясно, что пол-секунды это есть 0.5сек. Именно такое время надо получить между его переполнениями, причем точно.
Как это сделать?
У таймера №1 есть прекрасная функция счета не до максимума - т.е. до 65536, а до значения в регистре OCR1A (при соответствующих настройках таймера). В этот регистр следует изначально загнать нужное число, и мы, тем самым, получим точное (и независимое от случайных совпадений) значение периода между прерываниями.
Посмотрим, какое оно должно быть для требуемого значения периода прерываний 0.5сек и частоте кварца - 8Мгц.
В этом случае, если мы выберем коэфф. деления для этого таймера - 64, то мы получим перод "тика" 8мкс (= 1/8000000 х 64). Значит, для получения 0.5сек нам надо 0.5 / 0.000008 = 62500 "тиков". Вот именно это значение и следует забить в регистр OCR1A и именно оно будет являтся максимальным значением для таймера.
Единственное, в этом случае надо будет использовать не прерывание по переполнению (т.к. оно никогда не наступит, потому что таймер никогда не достигнет значения 65536), а прерывание по совпадению с регистром OCR1A.
Меняя значение 62500 можно сделать так, что часы будут спешить или отсавать. Как показал эксперимент, для того, чтобы конкретный экземпляр моих часов "ходил" максимально точно, в OCR1A надо забивать не 62500, а 62532 (кто-нибудь может определить, какая при этом была реальная частота кварца, на котором было написано 8Мгц?).
А какой максимальной точности можно достичь таким способом?
Изменение начального значения 62500 на единицу приводит к изменению длины половины скунды на 1 "тик" таймера или, в нашем случае, 8мкс. За одну секунду это будет уже в 2 раз больше, т. е. 16мкс. За сутки - 1.38сек. За месяц - 42сек.
Таким образом, при данном программном решении, если эти часы будут отствать или спешить менее чем на 42 секунды в месяц, исправить это будет невозможно. Любое изменение начально значения регистра OCR1A хотя бы даже на 1 приведет к еще большей погрешности.
Что касается конструкции моего алгоритма - я использую оба таймера - №0 и №1. Таймер №0 работает с частотй прерваний примерно 500Гц, обеспечивая работу динамической индикации, периодический опрос состояния кнопки и сигнала "ГАБАРИТЫ", а также тактирование алгоритмов установки времени в процессе этой самой установки.
Таймер №1 используется для генерирования пол-секундных прерываний. Почему именно пол-секундынх, а не секундных - чтобы обеспечить мигание точки-разделителя. После одного прерывания от таймера №1 она загорается, после следующего - гаснет, и т. д.
А вот батарейка - для сохранения хода времени - это классная идея и работает на ура! Правда, вместо батарейки я использовал маленький аккумулятор на 3.6В 270мАч (в других часах, не для ВАЗ-2106). Если гасить индикаторы во время отсутствия энергии (т.е. не питать их от этого аккумулятора), то его емкости достаточно для обеспечения работы самого контроллера более чем на сутки (насколько боллее - не проверял, но на сутки хватало точно). Когда энергия появлялась - начинали работать индикаторы, а аккумулятор восстанавливал свой заряд.
С уважением, Ярослав.
Начнем с того, что если Вы имеете кварц на котором написано 1МГц, это еще вовсе не значит, что там действительно 1Мгц. Для обычных кварцев допустимое отклонение составляет +/- 0.005%. Это значит, что у одного кварца частота может быть 999950Гц, а у другого, внешне точно такого же - 1000050Гц. Нетрудно подсчитать, что если за эталон мы возьмем ровно 1Мгц, то отклонение частоты на те самые 0.005% приведет к погрешности хода часов в 4.3сек в день, или более чем на 2 минуты в месяц!
Это значит, что для того, чтобы часы ходили точно, надо настраивать каждый экземпляр ИНДИВИДУАЛЬНО!
sheva_s - зачем Вам 100 прерываний в секунду? Что Вы хотите сделать с этой частотой?
Для отсчета секунд, очевидно, надо 1 раз в секунду, а для осуществления динамической индикации на светодиодных индикаторах - как минимум 300...400Гц, иначе Ваши индикаторы будут мерцать и на них смотреть противно будет...
Чтобы задать достаточно точное количество прерываний от таймера за секунду (что тоже самое, достаточно точный перод прерываний - т. е. время между соседними прерываниями) можно поступить так.
Пусть нам необходима частота прерываний 100Гц. Это значит, что нам нужен период прерываний 0.01сек. Предположим, мы хотим для этого использовать 8-ми битный таймер №0 микроконтроллера. Предположим также, что частота кварца у нас 1Мгц.
Тогда, нам следует выбрать делитель для таймера №0 так, чтобы время между прерываниями от таймера было ПЕРВЫМ БЛИЖАЙШИМ БОЛЬШИМ от нашего перода 0.01сек. В нашем случае это СК/64. При этом, таймер будет переполнятся каждые 0.016сек. Как получена эта цифра? Один "тик" таймера есть 0.00001 х 64 (где 0.00001 - период кварца, что есть 1/1000000Гц, 64 - тот самый наш коэфф. деления). Теперь, т. к. таймер №0 - 8-ми битный, значит он будет переполняться при достижении значения 256. Для этого ему потребуется совершить как раз 256 "тиков", а каждый "тик" - это 0.000064сек, т. е. общее время переполнения - 256 х 0.000064 = 0.016384сек.
Но нам ведь надо именно 0.01сек!
Но кто сказал, что таймер должен после обнуления (т.е. после выполнения прервания по переполнению) начинать счет именно с нуля?
Давайте зададим ему начальное значение. Как его определить?
Нам надо 0.01сек, а "тик" таймера есть 0.000064сек. Делим 0.01 на 0.000064 - получаем примерно 156. Значит, между прерываниями таймер должен успевать насчитать только 156 "тиков", о не 256! И значит начальное значение ему надо задать 256 - 156 = 100.
Таким образом, в начале обработки прерывания от этого таймера мы берем и записываем в него 100, например так: 100 -> TCNT0 (для Algorithm Builderа). Вот тогда мы и получим приблизительно 100 прерываний в секунду. Почему приблизительно? Потому что:
1. 0.01/0.000064 = 156.25 а не ровно 156 (но это еще пол-беды);
2. Потому что обработка прерывания от таймера может начинаться не как только произойдет переполнение этого таймера, а как только процессор освободится (например, от обработки какого-либо другого прерывания, которое, по стечению обстоятельств, может произойти как раз в рассматриваемый нами момент времени). Тогда за это время таймер может уже успеть насчитать несколько "тиков", и лишь затем, когда мы всетаки перейдем к обработке прерывания от нашего таймера, мы этот таймер инициализируем значением 100. Реальное количество "тиков", которые успеет насчитать наш таймер до переполнения, будет не 156 - как нам надо, а 156 + то самое количество, которое он уже успел насчитать до начала обработки прерывания (и которое нам неизвестно). Значит, мы получим в этот раз не 0.01сек, а 0.01сек + сколько-то еще.
Поэтому этот способ можно применять только там, где нет слишком жестких требований к точности периодов переполнения (например, для тактирования динамической индикации).
Как же быть, если мы хотим отмерять отрезки времени точно?
В своих часах я использовал в качестве секундного, а точнее, пол-секундного генератора таймер №1 микроконтроллера (16-ти битный). Ясно, что пол-секунды это есть 0.5сек. Именно такое время надо получить между его переполнениями, причем точно.
Как это сделать?
У таймера №1 есть прекрасная функция счета не до максимума - т.е. до 65536, а до значения в регистре OCR1A (при соответствующих настройках таймера). В этот регистр следует изначально загнать нужное число, и мы, тем самым, получим точное (и независимое от случайных совпадений) значение периода между прерываниями.
Посмотрим, какое оно должно быть для требуемого значения периода прерываний 0.5сек и частоте кварца - 8Мгц.
В этом случае, если мы выберем коэфф. деления для этого таймера - 64, то мы получим перод "тика" 8мкс (= 1/8000000 х 64). Значит, для получения 0.5сек нам надо 0.5 / 0.000008 = 62500 "тиков". Вот именно это значение и следует забить в регистр OCR1A и именно оно будет являтся максимальным значением для таймера.
Единственное, в этом случае надо будет использовать не прерывание по переполнению (т.к. оно никогда не наступит, потому что таймер никогда не достигнет значения 65536), а прерывание по совпадению с регистром OCR1A.
Меняя значение 62500 можно сделать так, что часы будут спешить или отсавать. Как показал эксперимент, для того, чтобы конкретный экземпляр моих часов "ходил" максимально точно, в OCR1A надо забивать не 62500, а 62532 (кто-нибудь может определить, какая при этом была реальная частота кварца, на котором было написано 8Мгц?).
А какой максимальной точности можно достичь таким способом?
Изменение начального значения 62500 на единицу приводит к изменению длины половины скунды на 1 "тик" таймера или, в нашем случае, 8мкс. За одну секунду это будет уже в 2 раз больше, т. е. 16мкс. За сутки - 1.38сек. За месяц - 42сек.
Таким образом, при данном программном решении, если эти часы будут отствать или спешить менее чем на 42 секунды в месяц, исправить это будет невозможно. Любое изменение начально значения регистра OCR1A хотя бы даже на 1 приведет к еще большей погрешности.
Что касается конструкции моего алгоритма - я использую оба таймера - №0 и №1. Таймер №0 работает с частотй прерваний примерно 500Гц, обеспечивая работу динамической индикации, периодический опрос состояния кнопки и сигнала "ГАБАРИТЫ", а также тактирование алгоритмов установки времени в процессе этой самой установки.
Таймер №1 используется для генерирования пол-секундных прерываний. Почему именно пол-секундынх, а не секундных - чтобы обеспечить мигание точки-разделителя. После одного прерывания от таймера №1 она загорается, после следующего - гаснет, и т. д.
А вот батарейка - для сохранения хода времени - это классная идея и работает на ура! Правда, вместо батарейки я использовал маленький аккумулятор на 3.6В 270мАч (в других часах, не для ВАЗ-2106). Если гасить индикаторы во время отсутствия энергии (т.е. не питать их от этого аккумулятора), то его емкости достаточно для обеспечения работы самого контроллера более чем на сутки (насколько боллее - не проверял, но на сутки хватало точно). Когда энергия появлялась - начинали работать индикаторы, а аккумулятор восстанавливал свой заряд.
С уважением, Ярослав.
yarst.org - сайт о том, что можно сделать своими руками
- sheva_s
- Грызет канифоль
- Сообщения: 256
- Зарегистрирован: Пт апр 27, 2007 14:32:48
- Откуда: Украина Кривой Рог
- Контактная информация:
Ярослав возник такой вопрос если делать так как вы по прерыванию таймера №0 динамическую индикацию, а по прерыванию таймера №1 секундные импульсы то может возникнуть погрешность в ходе часов по причине если совпадут оба прерывания в одно и то же время то будет выполняться стоящее первое в списке векторов прерываний, прерывание таймера №0, а прерывание секундного таймера станет в очередь до окончания обработки прерывания нулевого таймера или я что то не так понял в даташите. Подскажите пожалуста.
- Yarst
- Родился
- Сообщения: 10
- Зарегистрирован: Пт ноя 28, 2008 01:12:46
- Откуда: Москва
- Контактная информация:
sheva_s - если Вы будете использовать таймер №1 так, как я описал ранее (с использованием регистра OCR1A), то все у Вас будет в порядке!
Само время, которое будет отсчитывать Таймер №1, будет абсолютно точно (насколько это вообще возможно), без всяких задрежек и погрешностей, т. к. он работает НЕЗАВИСИМО ни от чего, в том числе независимо от обработки прерываний, которые он сам генерирует. Этот таймер всегда будет считать одни и те-же интервалы времени.
Другое дело, что тот случай, который Вы описали, может привести к некоторой задержке В ОБРАБОТКЕ КОНКРЕТНОГО ПРЕРЫВАНИЯ от этого таймера в данной секунде. НУ И ЧТО? Вы просто получите информацию о текущей секунде с некоторым опозданием, которое никогда не заметите. Важно то, что это опопздание только в получении "результата", но не в его "подготовке". Эта погрешность одноразовая, они не накапливается в таймере и не повлияет на следующие прерывания или на общий ход времени.
Само время, которое будет отсчитывать Таймер №1, будет абсолютно точно (насколько это вообще возможно), без всяких задрежек и погрешностей, т. к. он работает НЕЗАВИСИМО ни от чего, в том числе независимо от обработки прерываний, которые он сам генерирует. Этот таймер всегда будет считать одни и те-же интервалы времени.
Другое дело, что тот случай, который Вы описали, может привести к некоторой задержке В ОБРАБОТКЕ КОНКРЕТНОГО ПРЕРЫВАНИЯ от этого таймера в данной секунде. НУ И ЧТО? Вы просто получите информацию о текущей секунде с некоторым опозданием, которое никогда не заметите. Важно то, что это опопздание только в получении "результата", но не в его "подготовке". Эта погрешность одноразовая, они не накапливается в таймере и не повлияет на следующие прерывания или на общий ход времени.
yarst.org - сайт о том, что можно сделать своими руками
Yarst писал(а):Само время, которое будет отсчитывать Таймер №1, будет абсолютно точно (насколько это вообще возможно), без всяких задрежек и погрешностей, т. к. он работает НЕЗАВИСИМО ни от чего, в том числе независимо от обработки прерываний, которые он сам генерирует.
Напрашивается еще сделать корректировку. Например каждый час подводим часы на один или несколько перидов таймера. Правда для дискретности 0,1с/сутки нужно иметь частоту тиков 240 Гц. Стабильность хода приличная или смысла нет усовершенствовать?
- Yarst
- Родился
- Сообщения: 10
- Зарегистрирован: Пт ноя 28, 2008 01:12:46
- Откуда: Москва
- Контактная информация:
Очень грамотная мысль!
Я делал корректировку на заданную величину каждые 10 мин. (в других часах, не для ВАЗ). Т. е. в начале каждых 10 минут первая секунда удлинялась на определенное количество "тиков" определенного таймера. Это "определенное количество" можно устанавливать также как и время (т. е. с кнопок, без перепрошивки микроконтроллера) с тем отличием, что это значение сохраняется в энергонезависимой памяти. Работает безотказно. В этом случае можно достичь какой угодно точности хода, а стабильность этой точности определяется только стабильностью применяемого кварцевого резонатора.
Я делал корректировку на заданную величину каждые 10 мин. (в других часах, не для ВАЗ). Т. е. в начале каждых 10 минут первая секунда удлинялась на определенное количество "тиков" определенного таймера. Это "определенное количество" можно устанавливать также как и время (т. е. с кнопок, без перепрошивки микроконтроллера) с тем отличием, что это значение сохраняется в энергонезависимой памяти. Работает безотказно. В этом случае можно достичь какой угодно точности хода, а стабильность этой точности определяется только стабильностью применяемого кварцевого резонатора.
yarst.org - сайт о том, что можно сделать своими руками
- sheva_s
- Грызет канифоль
- Сообщения: 256
- Зарегистрирован: Пт апр 27, 2007 14:32:48
- Откуда: Украина Кривой Рог
- Контактная информация:
Фух спаял макетку теперь можно экспериментировать.
Помогите создать начальный код с настройкой таймеров, а то никак немогу разобраться в них . Пишу в кодвижен.
Нужно настроить 2 таймера для мега8 Т0 и Т1 :
- Т0 настроить что бы выдавал прерывание с частотой в 400 гц
- Т1 настроить на прерывание по совпадению с регистром OCR1A с частотой 2 гц
частота МК 8 мГц.
Если можно сделать скрины где и как нужно ставить галочки в настройках таймеров при генерации начального кода в кодвижен для этого случая.
P.S может у кого-то есть толковый английский словарь для технического перевода что бы перевести слова, а то в настройках на английском, а с этим у меня тяжело.
Помогите создать начальный код с настройкой таймеров, а то никак немогу разобраться в них . Пишу в кодвижен.
Нужно настроить 2 таймера для мега8 Т0 и Т1 :
- Т0 настроить что бы выдавал прерывание с частотой в 400 гц
- Т1 настроить на прерывание по совпадению с регистром OCR1A с частотой 2 гц
частота МК 8 мГц.
Если можно сделать скрины где и как нужно ставить галочки в настройках таймеров при генерации начального кода в кодвижен для этого случая.
P.S может у кого-то есть толковый английский словарь для технического перевода что бы перевести слова, а то в настройках на английском, а с этим у меня тяжело.
- Yarst
- Родился
- Сообщения: 10
- Зарегистрирован: Пт ноя 28, 2008 01:12:46
- Откуда: Москва
- Контактная информация:
К сожалению, с кодвижен я не работал, поэтому по конкретно этой среде программирования ничего подсказать не могу.
Что касается таймеров, то для Т0 при данной частоте кварца и желаемой частоте прерываний надо задать следующие параметры:
Коэффициент предварительного делителя СК/256;
Начальное значение для самого таймера, которым надо инициализировать сам Т0 в начале обработки каждого его прерывания: 178
Для Т1 - коэфф. деления СК/64;
Установить режим СТС (см. регистр TCCR1B);
В OCR1A следует записать 62500 (затем необходимо будет подобрать для максимальной точночти хода);
Использовать прерывание не по переполнению, а "Output_Compare_1A".
Что касается таймеров, то для Т0 при данной частоте кварца и желаемой частоте прерываний надо задать следующие параметры:
Коэффициент предварительного делителя СК/256;
Начальное значение для самого таймера, которым надо инициализировать сам Т0 в начале обработки каждого его прерывания: 178
Для Т1 - коэфф. деления СК/64;
Установить режим СТС (см. регистр TCCR1B);
В OCR1A следует записать 62500 (затем необходимо будет подобрать для максимальной точночти хода);
Использовать прерывание не по переполнению, а "Output_Compare_1A".
yarst.org - сайт о том, что можно сделать своими руками
Yarst писал(а):Я делал корректировку на заданную величину каждые 10 мин.
Кажется я в начале немного иначе чем ты пытался сделать. В результате получилась програмка задающая ход часов трехбайтным делителем.
Код: Выделить всё
.def temp1 =r16
.def snt =r17
.def t1 =r14
.def t2 =r13
.def t3 =r12
; трехбайтный делитель определяющий скорость хода
div:
.db 0,1
.dw 62500
; установка стека
Reset:
ldi temp1,high(RAMEND)
out SPH,temp1
ldi temp1,low(RAMEND)
out SPL,temp1
;выставляем режим работы таймера
;делитель на 64, обнуление при совпадении
ldi temp1,$40
out tccr1a,temp1
ldi temp1,$0b
out tccr1b,temp1
;разрешаем прерывания по совпадению
ldi temp1,$10
out timsk,temp1
;обнуляем счетчик поправок
ser snt
;загоняем в регистры делитель
ldi zh,high(div*2+1)
ldi zl,low(div*2+1)
lpm t1,z+
lpm t2,z+
lpm t3,z
;переписываем в счетчик
out ocr1ah,t3
out ocr1al,t2
sei
main:
nop
nop
rjmp main
;обработка прерывания, выполняется 2 раза в секунду
tim_compa:
;сохраняем регистры
push t2
push t3
;увеличиваем счетчик проходов
inc snt
cp snt,t1
brcc new_div
;из 256 проходов t1 будут на 1 тик длиннее
inc t2
brne new_div
inc t3
;грузим текущее значение
new_div:
out ocr1ah,t3
out ocr1al,t2
;восстанавливаем регистры
pop t3
pop t2
;место для дополнительной обработки
reti
- sheva_s
- Грызет канифоль
- Сообщения: 256
- Зарегистрирован: Пт апр 27, 2007 14:32:48
- Откуда: Украина Кривой Рог
- Контактная информация:
Разобрался с одним таймером для динамической индикации разобрался с куском кода подсчета времени , с независемым управлением разделительной точкой .
Идем дальше Ярослав возник такой вопрос как вы делаете опрос кнопок можно подробнее как это происходит вы писали что опрос происходит в прерываниях таймера для динамической индикации, а как с обработкой она производиться в программе основной или в прерываниях запутался что то.
Идем дальше Ярослав возник такой вопрос как вы делаете опрос кнопок можно подробнее как это происходит вы писали что опрос происходит в прерываниях таймера для динамической индикации, а как с обработкой она производиться в программе основной или в прерываниях запутался что то.
- Yarst
- Родился
- Сообщения: 10
- Зарегистрирован: Пт ноя 28, 2008 01:12:46
- Откуда: Москва
- Контактная информация:
sheva_s, у меня в "основной" программе всего два оператора:
1. SLEEP;
2. Безусловный переход на оператор 1.
Можно и без SLEEP, вот так:
1. Безусловный переход на оператор 1.
Однако SLEEP позволяет экономить потребление энергии в случае батарейного питания от встроенного аккумулятора (не для часов ВАЗ, для часов с резервным питанием от аккумулятора, при пропадании основно питания, что обсуждалось выше).
Опрос кнопок, равно как и сигнала "ГАБАРИТЫ" - для программы это такая же кнопка, а также обработка результатов этого опроса, все это происходит по таймеру №0 с частотой примерно 500Гц (в котором и динамическая индикация тоже).
Теперь подробнее про кнопки.
Однажды я принял для себя некую концепцию и теперь придерживаюсь ее во всех своих разработках.
Концепция применяется для кнопок и прочих сигналов, которые относительно медленно меняются во времени (медленно по сравнению со скростью работы контроллера, конечно), и для которых возможен дребезг (хаотичное переключение в момент подхода контактов кнопки друг к другу до того момента пока они ни будут прижаты друг к другу окончательно).
Суть концепции: Для каждого входа (кнопки) пишется специальный драйвер (подпрограмма), которая вызывается из программы более высокого уровня В МОМЕНТ, КОГДА ЭТО ДЕЙСТВИТЕЛЬНО НЕОБХОДИМО, но не при каждом прерывании от таймера.
Эти драйверы кнопок расположены на отдельной странице (модуле) в программе - чтобы удобнее потом было в ней разбираться.
В этом модуле для каждой кнопки выделен отдельный регистр в ОЗУ, который имеет смысл ЗАРЕГИСТРИРОВАННОГО РАНЕЕ состояния этой кнопки (0 или не 0) (в принцепе, для этого достаточно только одного бита этого регистра, но при этом усложняется сама программа).
Подпрограмма драйвера возвращает 1 байт данных (в одном из рабочих регистров), который может принимать следующие значения:
0 - кнопка давно отпущена;
1 - кнопка нажата прямо сейчас;
2 - кнопка давно нажата;
3 и др. - кнопка отпущена прямо сейчас.
Получение этих данных в драйвере происходит так:
Получаем состояние кнопки;
Сравниваем его со значением регистра ОЗУ для этой кнопки, в котором хранится предыдущее зарегистрированное состояние этой кнопки, делаем выводы;
Сохраняем новое состояние кнопки в регистре ОЗУ.
Вот такой простой драйвер.
Теперь, в прерывании по таймеру №0 у меня есть подпрограммка, которая производит настройку времени, если нажата кнопка.
Работает эта программа так:
В начале мы вызываем драйвер кнопки (ту самую подпрограммку для данной кнопки) и смотрим, какое он вернет значение.
Если кнопка "нажата прямо сейчас", т. е., по сути, она была нажата где-то между последним и предпоследним вызовом драйвера, т. е. где-то за время между последним и предпоследним прерыванием от таймера №0, то мы инициализируем задержку перед началом изменения времени (3сек).
Если кнопка уже "давно нажата", то мы отсчитываем время задержки, а если оно уже истекло, начинаем изменение времени и т. п.
Вот так. Все просто.
1. SLEEP;
2. Безусловный переход на оператор 1.
Можно и без SLEEP, вот так:
1. Безусловный переход на оператор 1.
Однако SLEEP позволяет экономить потребление энергии в случае батарейного питания от встроенного аккумулятора (не для часов ВАЗ, для часов с резервным питанием от аккумулятора, при пропадании основно питания, что обсуждалось выше).
Опрос кнопок, равно как и сигнала "ГАБАРИТЫ" - для программы это такая же кнопка, а также обработка результатов этого опроса, все это происходит по таймеру №0 с частотой примерно 500Гц (в котором и динамическая индикация тоже).
Теперь подробнее про кнопки.
Однажды я принял для себя некую концепцию и теперь придерживаюсь ее во всех своих разработках.
Концепция применяется для кнопок и прочих сигналов, которые относительно медленно меняются во времени (медленно по сравнению со скростью работы контроллера, конечно), и для которых возможен дребезг (хаотичное переключение в момент подхода контактов кнопки друг к другу до того момента пока они ни будут прижаты друг к другу окончательно).
Суть концепции: Для каждого входа (кнопки) пишется специальный драйвер (подпрограмма), которая вызывается из программы более высокого уровня В МОМЕНТ, КОГДА ЭТО ДЕЙСТВИТЕЛЬНО НЕОБХОДИМО, но не при каждом прерывании от таймера.
Эти драйверы кнопок расположены на отдельной странице (модуле) в программе - чтобы удобнее потом было в ней разбираться.
В этом модуле для каждой кнопки выделен отдельный регистр в ОЗУ, который имеет смысл ЗАРЕГИСТРИРОВАННОГО РАНЕЕ состояния этой кнопки (0 или не 0) (в принцепе, для этого достаточно только одного бита этого регистра, но при этом усложняется сама программа).
Подпрограмма драйвера возвращает 1 байт данных (в одном из рабочих регистров), который может принимать следующие значения:
0 - кнопка давно отпущена;
1 - кнопка нажата прямо сейчас;
2 - кнопка давно нажата;
3 и др. - кнопка отпущена прямо сейчас.
Получение этих данных в драйвере происходит так:
Получаем состояние кнопки;
Сравниваем его со значением регистра ОЗУ для этой кнопки, в котором хранится предыдущее зарегистрированное состояние этой кнопки, делаем выводы;
Сохраняем новое состояние кнопки в регистре ОЗУ.
Вот такой простой драйвер.
Теперь, в прерывании по таймеру №0 у меня есть подпрограммка, которая производит настройку времени, если нажата кнопка.
Работает эта программа так:
В начале мы вызываем драйвер кнопки (ту самую подпрограммку для данной кнопки) и смотрим, какое он вернет значение.
Если кнопка "нажата прямо сейчас", т. е., по сути, она была нажата где-то между последним и предпоследним вызовом драйвера, т. е. где-то за время между последним и предпоследним прерыванием от таймера №0, то мы инициализируем задержку перед началом изменения времени (3сек).
Если кнопка уже "давно нажата", то мы отсчитываем время задержки, а если оно уже истекло, начинаем изменение времени и т. п.
Вот так. Все просто.
yarst.org - сайт о том, что можно сделать своими руками
-
serpa
- Открыл глаза
- Сообщения: 51
- Зарегистрирован: Чт апр 14, 2011 15:42:10
- Откуда: РФ Йошкар-Ола
- Контактная информация:
Re: Электронные часы для автомобиля ВАЗ-2106
вопрос автору. а нельзя ли доработать прошивку под индикаторы с общим анодом. буду ну очень благодарен.
