реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> SONAR, Как избавится от ...
ILYAUL
сообщение Aug 15 2012, 20:41
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 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 он есть хоть его и не видно. Так не хочется запускать таймер .... или крутить тупую задержку. Чего бы ещё придумать? smile3046.gif twak.gif help.gif


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 15 2012, 22:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ILYAUL @ Aug 15 2012, 23:41) *
Т.е выделенное , выдается всегда при вкл питания, о чём скромно умалчивает DS. Прога настроена на отлавливание R и 0D он есть хоть его и не видно. Так не хочется запускать таймер .... или крутить тупую задержку. Чего бы ещё придумать? smile3046.gif twak.gif help.gif


Что-нибудь типа такого:
Код
#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 миллисекунд, в прерывании которого сбросить приём, если байты почемуто перестали приходить.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 16 2012, 11:04
Сообщение #3


Профессионал
*****

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



Артём, спасибо!
Но я пошёл таким путём , отлавливаю символы IR (0x49,0x52) - конец этой ..... Всё по одному прерыванию USART только обработка разная по его флагу.
Всё можно работать.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 16 2012, 11:47
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ILYAUL @ Aug 16 2012, 14:04) *
отлавливаю символы IR (0x49,0x52)

0x49, 0x0D, 0x52?
Или 0x49,0x52?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 16 2012, 13:17
Сообщение #5


Профессионал
*****

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



Цитата(_Артём_ @ Aug 16 2012, 15:47) *
Или 0x49,0x52?

Именно так , они так и идут
Цитата
TempIR1000
0х0D и т.д.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 27 2012, 14:44
Сообщение #6


Профессионал
*****

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



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


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 27 2012, 17:36
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ILYAUL @ Aug 27 2012, 17:44) *
Что бы такое придумать , что бы "засинхронизировать" нажатие кнопки с периодичностью USART? Правда я ущё могу , подёргать ножкой запуска самого sonara, но пока мне такой вариант не нравится.


Код
volatile unsigned char InputLevel;
volatile unsigned char InputTimer;
void INT0_Isr()
{
    InputLevel=ReadInputState();
    InputTimer=0;
}

unsigned char InputLevelFixed=ReadInputState();;// устаявшееся значение входа
void StringReceiveHandler()
{
    if (InputTimer<2) {
        // уровень недавно изменился
        if (++InputTimer==2) {
            // запоминание нового уровеня на входе
            InputLevelFixed=InputLevel;
            // какие-то действия по изменению входа
        }
    }
    // обработка строки
}
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 02:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01404 секунд с 7
ELECTRONIX ©2004-2016