Сидел я и читал прошивку. Осознавал как она работет и что делает. На почве предыдущего поста напридумывал что туда вставить... Ну не об этом речь. Что я тут нашёл. По коду есть функция
Код: Выделить всё
ISR(SIG_INTERRUPT0)
//void Crossing_interrupt(void)
{
static uint16_t LastCount;
static uint16_t TotalCount;
static uint16_t Latch;
static uint8_t Lap;
Latch = TCNT1;
TotalCount = Latch - LastCount;
LastCount = Latch;
Lap++;
if (Lap > 250) {
Adder = TotalCount / 378;
Lap = 0;
}
WeelPosition = 0;
OCR1 = Latch + Adder;
TIFR |= 0x80;
Display();
}
Вызываемая раз в оборот по спаду логического уровня на INT0.
Так вот. Я тут читал, что ротор у нас вращается с частотой, где-то, 1500 оборов в минуту, что есть 1500/60 = 25 оборотов в секунду. Если с датчиком оборота всё в порядке, то импульс мы получаем 25 раз в секунду. Это я сам для себя определил "хардварные" условия.
Теперь поехали по функе. Функция на каждый импульс снимает показания таймера, тем самым "замеряя" в таймерх aka попугаях время оборота. А как это устроено? Таймер щёлкает себе импульсы в щётчик и мы их от туда переодически выгребаем.
В самом начале прпограммы автор взвёл скорость таймера на F_CPU/8, т.е. таймер прибавляет еденичку в счётчик каждые 8 тактов процессора. А такты процессора определяются кварцем. Таким образом при кварце 10MHz таймер насчитывает со скоростью 1250 kHz или другими словами за 1 оборот ротора при скорости 1500 RPM таймер насчитает 50000 отсчётов из 65536 возможных, потом будет переполнение таймера и срыв синхры. Как видим значение у нас граничное, и может в лёгкую переполняться, когда ротор крутится медлее чем 1145 RPM мы имеем срыв. Что скорее всего и получается.
При кварце 16MHz мы даже в 1500 RPM не укладываемся, минимум в 2150 RPM.
Поэтому я думаю стоит уменьшить скорость наращивания таймера, что конечно вызовет уменьшение разрешающей способности "дисплея" и может повлечь "дражание" картинки относительно центра. Но стОит попробовать.
Уменьшить скорость можно уменьшив таймер минимум в 8 раз. Тем самым адекватная рекция допустима аж на 144 RPM и, мне кажеться, максимум на 5000 RPM при кварце 10MHz.
Ещё меня смутило то, что синхронизация происходит не каждый оборот, а раз в 250 штук. Ну наверное так удобнее, другими словами каждые 10 секунд.
Так же не понятно почему развертка имеет 378 кадров

Ну наверное, чтобы в аналоговом режиме, не получались дробные кадры для каждой 1/4 позиции стрелки (3 - 6 - 9 - 12 часов).
Итак, подведём черту. т.к. тестер и обладатель железа видать живёт в сильно другом часовом поясе от меня (во сказанул-то), то я пишу прошивки в слепую, на одной теории.
Данная прошивка пытается работать на основнии этой теории.
И ещё я попытался вывести над часами частоту вращения, меняющуюся опять же раз в 250 оборотов.
Пробуем и критикуем. Принимаю сдравую критику по всему сказаному. Ибо сам могу ошибаться.
PS. Пока всё это писал Koss и объявился.