|
|
  |
SONAR, Как избавится от ... |
|
|
|
Aug 15 2012, 20:41
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
этой хрени. Всем добрый вечер! Вот уже неделю борюсь с этим датчиком. До сего момента никак не мог понять , почему в отладчике все замечательно. Прошиваю , запускаю в "свободное плавание"- он чётко определяет только одну дистанцию т.е. выдает 51см , хотя у него в прямой видимости только звёздное небо . Подключил осцил и в момент подачи питания увидел длинейшую пачку импульсов , аж в 100 ms. Что в переводе оказалось Цитата HRLV-MaxSonar-EZ0 PN:MB1003 Copyright 2011-2012 MaxBotix Inc. RoHS 1.3c006 0512 TempI R1000 R1000 R1000 R1001 R1001 R1005 R Т.е выделенное , выдается всегда при вкл питания, о чём скромно умалчивает DS. Прога настроена на отлавливание R и 0D он есть хоть его и не видно. Так не хочется запускать таймер .... или крутить тупую задержку. Чего бы ещё придумать?
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Aug 15 2012, 22:27
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(ILYAUL @ Aug 15 2012, 23:41)  Т.е выделенное , выдается всегда при вкл питания, о чём скромно умалчивает DS. Прога настроена на отлавливание R и 0D он есть хоть его и не видно. Так не хочется запускать таймер .... или крутить тупую задержку. Чего бы ещё придумать?  Что-нибудь типа такого: Код #define SENSOR_MAX_BYTE_QTY 12 struct TSonarData { unsigned char RxState; volatile unsigned char RxCounter; volatile unsigned char Received; unsigned char RxBuffer[SENSOR_MAX_BYTE_QTY]; } SonarData; void RxCompleteInterrupt() { unsigned char new_byte=UDR; switch (SonarData.RxState) { case 0: if (new_byte=='R' && Received==0) { SonarData.RxState++; SonarData.RxCounter=0; } break; case 1: if (new_byte>='0' && new_byte<='9') { SonarData.RxBuffer[SonarData.RxCounter]=new_byte; if (++SonarData.RxCounter>=SENSOR_MAX_BYTE_QTY) SonarData.RxState=0; } else { if (new_byte==0x0D) { SonarData.Received=1; } SonarData.RxState=0; } break; } } Цитата(ILYAUL @ Aug 15 2012, 23:41)  Так не хочется запускать таймер .... P.S. Дополнительно по приёму первого символа строки ® можно бы запустить таймер на N миллисекунд, в прерывании которого сбросить приём, если байты почемуто перестали приходить.
|
|
|
|
|
Aug 16 2012, 13:17
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(_Артём_ @ Aug 16 2012, 15:47)  Или 0x49,0x52? Именно так , они так и идут Цитата TempIR1000 0х0D и т.д.
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Aug 27 2012, 14:44
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Возвращаюсь к нему , но только с новой задачкой. Надо бы мне теперь кнопку обработать, но условия всё теже , без таймера и программной задержки. Дело в том , что посылки по USART идут чётко через 98ms , что очень комфортное время для определения состояний кнопки. И удачно я ее так развёл на INT0. Но кнопка вещь не предсказуемая и нажимаемая когда кому-то стало необходимо прервать чётко отлаженный монотоный процесс . Что бы такое придумать , что бы "засинхронизировать" нажатие кнопки с периодичностью USART? Правда я ущё могу , подёргать ножкой запуска самого sonara, но пока мне такой вариант не нравится.
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|