Page 1 of 1

Обработчик ДПКВ

Posted: 21 Sep 2015, 10:18
by KOT
В общем ситуация такая:
В релизе за 14 год в файле CKPS.c имитация пропущенных зубьев делается на таймере 0.
Есть там вот такие строки:

Code: Select all

void set_timer0(uint16_t value)
{
 TCNT0_H = _AB(value, 1);
 TCNT0 = ~(_AB(value, 0));  //One's complement is faster than 255 - low byte
Так вот если значение low byte = 0, т.е в TCNT0 записывается значение 255, то у меня протеус 7,7 моделирует срабатывание прерывания по переполнению аж на следующий раз, т.е через 256 тиков таймера 0.
Если TCNT0 = 254; - то все нормально.

Написал уже прошивку на асме для тестирования таймера - в АВР студии такого пропуска нет. В протеусе есть.

Вот не совсем пойму документацию, вроде как если писать в TCNT0, то сравнения по следующему такту игнорируется:
All CPU write operations to the TCNT0 Register will block any compare match that occur in the
next timer clock cycle, even when the timer is stopped. This feature allows OCR0 to be initialized
to the same value as TCNT0 without triggering an interrupt when the Timer/Counter clock is
enabled.

Еще не ясен мне момент - зачем обнулять таймер если он и так только что обнулился аппаратно?

Code: Select all

ISR(TIMER0_OVF_vect)
{
 if (TCNT0_H!=0)  //Did high byte exhaust (ñòàðøèé áàéò íå èñ÷åðïàí) ?
 {
  TCNT0 = 0; // кажись лишнее?
  --TCNT0_H;
 }

Re: Обработчик ДПКВ

Posted: 21 Sep 2015, 12:31
by STC
Интересный вопрос. Сам несколько раз сталкивался с тем, что в документации поведение не описано полностью. Искал в разной документации, ничего не нашел и забыл про это. Поведение проверял осциллографом, но мог проскочит 255. Думаю можно попробовать проверить. Нпример зажигать СЕ если значение таймера равно 255 и в этот момент следить за импульсами (вывести импульсы восстановленных зубьев на какой-нибудь выходюд).

Code: Select all

TCNT0 = 0; // кажись лишнее?
Похоже что да, перестарался ).

Re: Обработчик ДПКВ

Posted: 21 Sep 2015, 12:59
by KOT
STC wrote:Интересный вопрос. Сам несколько раз сталкивался с тем, что в документации поведение не описано полностью. Искал в разной документации, ничего не нашел и забыл про это. Поведение проверял осциллографом, но мог проскочит 255. Думаю можно попробовать проверить. Нпример зажигать СЕ если значение таймера равно 255 и в этот момент следить за импульсами (вывести импульсы восстановленных зубьев на какой-нибудь выходюд).
Как руки дойдут до железа то попробую посмотреть осцилофом, я делаю частоту, чтоб время мужду зубьями было приблизительно 1 мс, а в таймер0 пишу в младший регистр 255, в старший = 1. (значение между забьями = 256 тиков таймера)

Заметил что при эмуляции второго зуба, прерывание, когда в TCNT0 пишется 254 тоже не всегда срабатывает, похоже все таки протеус.

Re: Обработчик ДПКВ

Posted: 21 Sep 2015, 15:25
by STC
:) В 2007 году, когда я начинал писать первую прошивку SECU-3, тоже столкнулся с глюком протеуса. Были перепутаны половинки регистр ICR.

Re: Обработчик ДПКВ

Posted: 26 Dec 2015, 00:30
by KOT
Ну наконец-то дошли руки проверить, мега 88 протеус глючит, в живую нет.
Но прошу помощи по алгоритму:
Я так понял данные об расчетном угле из ignlogic в ckps.с передаются раз в 1 такт двигателя?
И расчет времени для заряда катушки производится раз в пол оборота после зажигания?, входные данные для последнего это время потраченное на пол оборота и время задержки на искру OCR1A ?

А как быть в таком случае с ускорением / замедлением двигателя - какая погрешность получается для времени заряда катушки?

Re: Обработчик ДПКВ

Posted: 26 Dec 2015, 00:55
by STC
Да, данные передаются 1 раз за такт, из основного цикла (secu3.c)
C зарядом катушки сложней. Там рассчитывается время, но на каждом зубе оно корректируется, и таким образом достигается достаточно высокая точность.

Re: Обработчик ДПКВ

Posted: 26 Dec 2015, 01:05
by KOT
Понял, спс, буду разбираться.

Re: Обработчик ДПКВ

Posted: 26 Dec 2015, 19:27
by KOT
чет не приходит в голову идельный алгоритм расчета и начала заряда катушки и формирования искры, где-то но точность обязательно потеряется, если будут резкие изменения скорости коленвала.

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

Формула для расчета для шкива 60-2, для точности 0,1 градус.
задержка = старшие два байта 32 битной переменной из (последние значение таймера * кол оставшихся градусов * 1092)
Все равно что задержка = последние значение таймера * кол оставшихся градусов / 60;