Получил эту фигню, значит. А что с ней дальше делать? Правильно, работать с нею надо. Так вот, завел я Echo на INT0, а Trig-3 бит порта D восьмой меги. Проблема в том,что в терминале-почти рандомные числа. Хотя при отключении дальнометра в терминале ничего не выводится. Вывод INT0 подтянут к земле резистором 2.4КОм. Кварц внешний на 10 МГц. Код в IAR-е:
После долгого мучения дальнометра кое-что выяснилось.... Направил в потолок(метра 2-2.5),в терминалку выводил кол-во переполнений таймера. Хм, оно колебалось от 650 до 100..... Что не так с моим кодом?
_________________ Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
ну так приспособить ардуиновскую иль самому написать
Код:
unsignedlongpulseIn(uint8_t pin, uint8_t state, unsignedlong timeout) { // cache the port and bit of the pin in order to speed up the // pulse width measuring loop and achieve finer resolution. calling // digitalRead() instead yields much coarser resolution. uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); uint8_t stateMask = (state ? bit : 0); unsignedlong width = 0; // keep initialization out of time critical area
// convert the timeout from microseconds to a number of times through // the initial loop; it takes 16 clock cycles per iteration. unsignedlong numloops = 0; unsignedlong maxloops = microsecondsToClockCycles(timeout) / 16;
// wait for any previous pulse to end while ((*portInputRegister(port) & bit) == stateMask) if (numloops++ == maxloops) return0;
// wait for the pulse to start while ((*portInputRegister(port) & bit) != stateMask) if (numloops++ == maxloops) return0;
// wait for the pulse to stop while ((*portInputRegister(port) & bit) == stateMask) { if (numloops++ == maxloops) return0; width++; }
// convert the reading to microseconds. The loop has been determined // to be 20 clock cycles long and have about 16 clocks between the edge // and the start of the loop. There will be some error introduced by // the interrupt handlers. returnclockCyclesToMicroseconds(width * 21 + 16); }
Не стал плодить темы, ситуация следующая: приобрел данный девайс, написал прошивку, подключил, результат нулевой. Стал разбираться. Похоже у меня проблема с центральной микросхемой, это явно какой-то контроллер с затертой маркировкой, но по распиновке я его идентифицировать не смог. Судя по всему он просто не запускается. Подаю импульс 10мкс - на выходе постоянная "1", на ногах которые идут на кварц - на одной всегда четкий меандр, на второй - ноль, ноги идущие на входы MAX3232 и на ключ ее питания - ноль, соответственно передатчик просто не работает. Питание в норме - 5.05В, пульсации 0.5мВ. Заметил что если подергать конденсаторы в цепи питания, например перевернуть керамику 0.1мкФ (на макетке стоит электролит и керамика), то иногда схема начинает работать, на выходе появляется импульс пропорционально расстоянию до препятствия, на второй ноге кварца появляется "1", и видны импульсы управления и питания max3232. В чем глюк? Может есть какая-то хитрая последовательность в запуске дальномера, о которой не написано в даташите?
PS:Схему нашел, оказывается в центре "одноразовый" контроллер...
_________________ Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения