Как пересчитать мили в километры.

Дата последнего изменения документа - 7 февраля 2009г.

Да что тут сложного, скажете Вы! Умножить на 1609,344. Я тоже так думал, пока не приобрел в магазине подозрительно дешевую беговую дорожку. В процессе ее сборки дома, отметил, что сама дорожка сделана вполне добротно, чего нельзя было сказать о входящем в ее комплект "бортовом" компьютере. Этот самый компьютер представлял из себя пластмассовую коробочку черного цвета без опознавательных знаков. На индикаторе он отображал время "гонки", текущую скорость, пройденное расстояние. Радостно прыгнув на дорожку я побежал, нет - лучше сказать понесся со всей мочи, но почему-то "бортовому" компьютеру так не казалось, или он сознательно занижал мою скорость? В мою дотошную душу закралось сомнение в объективности компьютера, я сполз с дорожки, замерил рулеткой длину резинового ремня дорожки, и, уже спокойно шагая по дорожке, отсчитал энное количество пройденных мною метров. Так и есть - компьютер был наверняка американский - он считал пройденный путь в милях!

Можно было, конечно, смириться, можно было сделать новый компьютер :), но ведь мы с Вами простых путей не ищем, правда? Вот и я решил, "обрусить", так сказать, американский компьютер. На обдумывание идеи ушло пол-дня, в результате родилась вот эта архи-сложная схема:

Схема

Получился своего рода "переходник", который включается между герконовым датчиком дорожки и входом датчика компьютера. Сразу скажу, что контроллер я выбрал "нерачительно" только потому, что такой контроллер был под рукой. Здесь гораздо уместнее использовать контроллер попроще, подешевле и с меньшим количеством выводов. Конденсатор нужен для подавления дребезга контактов, без него компьютер будет считать неправильно. На порт B контроллера включены внутренние подтягивающие резисторы, генератор использован тоже внутренний. Контроллер с буквой L в обозначении может работать при пониженном напряжении, так что вся конструкция питается от двух штатных батареек самого компьютера. Программа была написана на языке C, компилятор HI-TECH lite (свободно распространяемый). А вот, собственно, сама программа:

#include <htc.h>
unsigned int Buf;
void init(void)
{
// port directions: 1=input, 0=output
TRISB = 0b11111111;
TRISA = 0b00000000;
OPTION = 0b00000000; //Прерывание по заднему фронту, резисторы на порту В включены !!
INTCON = 0b11010000; //Разрешение прерывания от INT
PORTA = 0;
PORTB = 0;
}

void main(void)
{
char counter;
init();
for(counter=1; counter<=3; counter++){ //Этот цикл нужен только для отладки
RA2=1;                                //чтобы понять, что мк включился
RA3=0;                               //моргнет светодиодами, если их подключить
_delay(190000);                     //к RA2 и RA3
_delay(190000);
RA2=0;
RA3=1;
_delay(190000);
_delay(190000);
}
RA2=1;
while (1){  //Основной цикл программы
          if (Buf >= 1000) {
                            Buf=Buf-1000;
                            RA2=0;
                            RA3=0;
                            _delay(10000); //задержка нужна для формирования
                            RA2=1;         //прямоугольного импульса на выходе
                            RA3=1;
                            _delay(10000);
                            }
          }

}
void interrupt isr(void)
{
Buf=Buf+1609; //В принципе, этой константой можно управлять погрешностью +-
INTF=0; // Сбросить флаг прерывания
}

Как видите, программа получилась тоже необыкновенно сложной :). Идея такая: по приходу импульса с герконового датчика в подпрограмме прерывания к переменной Buf прибавляем 1609, а в основном цикле программы постоянно проверяем, если Buf больше или равно 1000, то вычитаем 1000 и формируем импульс, который подаем на выход (на компьютер). Таким образом, работа устройства не зависит от количества импульсов на метр (километр) пути, а импульсов на выходе нашего "переходника" всегда будет больше, чем на входе.

Два слова об отладке программы. Мне пришлось подбирать временные задержки в основном цикле программы. Дело в том, что, если они будут слишком большие, то при быстрых скоростях переменная Buf будет переполняться, а если будет слишком маленькая, то "бортовой" компьютер не будет успевать обрабатывать приходящие на него импульсы. В том и в другом случае компьютер будет показывать неверные результаты. Подбирал я эти задержки чисто экспериментальным методом, потому что не знал параметры моего "бортового" компьютера.

Здесь прошивка в HEX-формате.

Буду рад, если Вы пришлете мне свои отзывы и предложения на gsmhorn@narod.ru.

И последнее:
Автор не несет никакой ответственности за возможную порчу Вашего автомобиля или беговой дорожки, и за любые другие негативные последствия, возникшие вследствие Вашего необдуманного решения повторить данную конструкцию.

(C) Ilya Permyakov, 2009

Вернуться на главную страницу .

Hosted by uCoz