Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.68/22: Рейтинг темы: голосов - 22, средняя оценка - 4.68
dsshooozzzi
0 / 0 / 0
Регистрация: 03.01.2011
Сообщений: 250
1

AVRStudio4, ATMega128, GPS EB-500.нашел баг, исправил,делюсь

08.04.2014, 00:46. Просмотров 4036. Ответов 17
Метки нет (Все метки)

Приветствую.
Уже давненько подключил GPS модуль к своему самодельному бортовому.
Все вроде нормально, если не считать, что при больших зумах, были неточности. На 17 зуме вся карта по вертикали занимает 16777216 пикселей, и погрешностью в 40-45 пикселей(на глаз) я решил пренебречь.
Подумал, что микроконтроллер, который из текста получает градусы, градусы переводит в радианы, использует число ПИ, а потом еще и синусячит, имеет право на такую погрешность.
Сегодня было свободное время и я решил подсмотреть, как же это МК там трудиться в этой области, а вдруг багу замечу. Карта у меня порезана кусочками по 47х47пх, может быть где то единичку потерял и вот сразу 47пх погрешности и вылезло...
При внимательном рассмотрении заметил, что разные коды с одинаковым смыслом возвращают разные результаты.
Кусок не рабочего кода// Строка от GPS. Градусы показания изменил, кто хочет в гости - в личку, а не в GPS))))
// GPGGA,075112.000,1210.638167,N,03417.995972,E,1,3,3.21,122.138,M,27.92
double tmp = 0;
// Считываем дробное значение, выделено жирным
tmp = (GPS_GGA[34] - 48) * 10000000;
tmp += (GPS_GGA[35] - 48) * 1000000;

tmp += (GPS_GGA[37] - 48) * 100000;
tmp += (GPS_GGA[38] - 48) * 10000;
tmp += (GPS_GGA[39] - 48) * 1000;
tmp += (GPS_GGA[40] - 48) * 100;
tmp += (GPS_GGA[41] - 48) * 10;
tmp += (GPS_GGA[42] - 48);
// Должно быть: tmp == 17995972
// по дебагингу: tmp == 17822569
Кусок рабочего кода// Строка от GPS. Градусы показания изменил, кто хочет в гости - в личку, а не в GPS))))
// GPGGA,075112.000,1210.638167,N,03417.995972,E,1,3,3.21,122.138,M,27.92
unsykned char i;
double tmp = 0;
// Считываем дробное значение, выделено жирным
tmp = 0;
for(i = 34; i < 43; i++)
{
if(GPS_GGA[i] == .) continue;
tmp *= 10;
tmp += GPS_GGA[i] - 48;
}
// Должно быть: tmp == 17995972
// по дебагингу: tmp == 17995972
Теперь все работает как часики))) Точнее чем смарт у подруги))) Просто у меня GPS антенка немного меньше чем тот смарт-мини-лопата))
Может быть кто то сталкивался с такой проблемой? Поделитесь, из-за чего такое поведение?
Я понял бы, если бы первые два числа, которые множатся на много нулей не совпали, так с ними как раз все норм было.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2014, 00:46
Ответы с готовыми решениями:

GPS модуль EB-500. Работа с UART через AT89C51
помогите разобраться с uart к com port подключаю GPS модуль ранее...

AvrStudio4 и векторы прерывания на ATmega2560
Приветствую господа. Суть вопроса в том, что указываются не те адреса, при...

AtTiny2313 + AvrStudio4 - ошибка при симуляции
Пишу на ASM для AtTiny2313. Простая такая программка:...

Универсальный шаблон проекта на ASM AVRStudio4
Посидел, нацарапал. Покритикуйте пожалуйста. Может, что добавить, может -...

AVRstudio4 ASM. Адресация и инициализация EEPROM.
Есть кусок кода: ===== адреса переменных в EEPROM ===== .ESEG .org 0...

17
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
08.04.2014, 01:08 2
[36] - куда дели?
Первую простыню можно в таблицу засунуть. Недаром даже книжка есть. Алгоритм+структура данных=программа. То есть тут прямая зависимость. Больше данных - меньше программа. Порой структурированные данные упрощают программу до интерпретатора. По сути, бывают куски где программы, как таковой нет.
0
dsshooozzzi
0 / 0 / 0
Регистрация: 03.01.2011
Сообщений: 250
08.04.2014, 01:20 3
[36] - точка. Дальше по тексту идет деление. до вида 17.995972
Какую таблицу? Что то не понял.
Просто я не вижу разницы, взять по отдельности вручную числа или организовать цикл.
Результат то от этого не должен измениться.
Я не о красоте кода, а о том, что это было?
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
08.04.2014, 01:27 4
Цитата Сообщение от dsshooozzzi
[36] - точка. Дальше по тексту идет деление. до вида 17.995972
Какую таблицу? Что то не понял.
Просто я не вижу разницы, взять по отдельности вручную числа или организовать цикл.
Результат то от этого не должен измениться.
Я не о красоте кода, а о том, что это было?
Плюсик добавить?
tmp = (GPS_GGA[34] - 48) * 10000000;
Разница есть. При структуре данных существенно уменьшается размер программы. Если нужна скорость, там особые случаи.
0
dsshooozzzi
0 / 0 / 0
Регистрация: 03.01.2011
Сообщений: 250
08.04.2014, 01:39 5
Это ж первое значение.
Нет же разницы:
tmp = 0;
tmp += 5;
И
tmp = 5
-------------------
Я понимаю о чем Вы говорите, если бы я не продумал структуру, то не смог бы с флешки тягать кусочки 47х47пх.
Представленная стока присылается GPS. Как есть.
Обратите, пожалуйста, внимание, что речь идет не о структуре и представлении данных, не о размере и быстродействии программы, а о том что два простых алгоритма, выдают разные результаты, а не одинаковые, как должно быть.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
08.04.2014, 01:46 6
Запускаете симулятор и вперед, пошаговая отладка. И наблюдаем, в каком месте выдает некорректное значение. Если потребуется, запускаете дизасм.
0
dsshooozzzi
0 / 0 / 0
Регистрация: 03.01.2011
Сообщений: 250
08.04.2014, 01:49 7
При отладке модулей программы - так и делаю.
Сейчас уже симуляторы не тянут этот проект)))
Да и в железе более достоверно.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
08.04.2014, 02:04 8
Что вам мешает отдельно проверить подозрительные куски кода?
0
dsshooozzzi
0 / 0 / 0
Регистрация: 03.01.2011
Сообщений: 250
08.04.2014, 02:14 9
Уже все проверенно и работает, кроме багов, что еще не попались, наверное)))
А этот кусок только в железе + ориентирование на реальной местности)))
Сами смотрите, еще прям в заголовке писал:
GPS -> ATMiko128 -> парсинг, арифметика, вывод графической информации.
Или я должен был пиксели на карте считать сам и смотреть где я нахожусь?

Хочу напомнить, что суть моего поста в том, что в одном случае работает правильно, а в другом - нет.
Может быть кто то знает, что за причуда и кто породил ее, либо же в своих разработках вспомнят о моих граблях и не наступят. Так вот.
0
_pv
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,515
08.04.2014, 02:31 10
с типами данных констант неаккуратно обращаетесь, по умолчанию вроде как int, который в авр обычно 16ти битный.
компилятор где-то результат умножения к 32 разрядному привести не догадался вот и переполнилось.
по шагам пройдитесь или после каждого tmp+=... вывод tmp на печать сделайте и всё увидите.
Ну или ассемблерный листинг в студию
0
dsshooozzzi
0 / 0 / 0
Регистрация: 03.01.2011
Сообщений: 250
08.04.2014, 02:56 11
Цитата Сообщение от _pv
с типами данных констант неаккуратно обращаетесь, по умолчанию вроде как int, который в авр обычно 16ти битный.
компилятор где-то результат умножения к 32 разрядному привести не догадался вот и переполнилось.
по шагам пройдитесь или после каждого tmp+=... вывод tmp на печать сделайте и всё увидите.
Ну или ассемблерный листинг в студию
У меня уже есть рабочий код, мне было интересно, кто из нас: я или компилятор косячит.
Значит я накосячил, исправил, а теперь узнал, причину.

По сути то уже проблема найдена. Остается вопрос: выложить позже отчет после каждого tmp+=, для научного интереса?
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
08.04.2014, 03:10 12
Нам нужна только причина бага.
0
_pv
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,515
08.04.2014, 10:48 13
У меня уже есть рабочий код, мне было интересно, кто из нас: я или компилятор косячит.
Значит я накосячил, исправил, а теперь узнал, причину.
По сути то уже проблема найдена. Остается вопрос: выложить позже отчет после каждого tmp+=, для научного интереса?
Причину вы не узнали.
Исправленный код тоже не фонтан, если посмотреть время выполнения оно раз в 20 должно стать больше. Оно конечно не критично, но использование там плавающей арифметики особенно для преобразования строки в число не нужно совсем.
Ассемблерный листинг этого куска выложите.
0
tsostyk
0 / 0 / 0
Регистрация: 23.04.2013
Сообщений: 66
08.04.2014, 13:20 14
Цитата Сообщение от dymyurk1978
Нам нужна только причина бага.
Да вроде уже сказали - неправильно с типами констант обращаетесь.
Напишите вот так:
Код
// Строка от GPS. Градусы показания изменил, кто хочет в гости - в личку, а не в GPS))))
// GPGGA,075112.000,1210.638167,N,03417.995972,E,1,3,3.21,122.138,M,27.92
double tmp = 0;
// Считываем дробное значение, выделено жирным
tmp = (GPS_GGA[34] - 48) * 10000000.0;
tmp += (GPS_GGA[35] - 48) * 1000000.0;

tmp += (GPS_GGA[37] - 48) * 100000.0;
tmp += (GPS_GGA[38] - 48) * 10000.0;
tmp += (GPS_GGA[39] - 48) * 1000.0;
tmp += (GPS_GGA[40] - 48) * 100.0;
tmp += (GPS_GGA[41] - 48) * 10.0;
tmp += (GPS_GGA[42] - 48);
// Должно быть: tmp == 17995972
// по дебагингу: tmp == 17822569
Скорее всего все заработает после этого.
0
otixdos
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 241
09.04.2014, 00:17 15
Все красиво и всё логично. Но все Ваши вычисления коту под хвост если попадётся модуль EB500 который выдаёт строку в таком виде
Код
$GPGGA,211736.000,4638.0083,N,03227.0087,E,1,6,1.06,16.2,M,29.1,M,,*6B\r\n
0
dsshooozzzi
0 / 0 / 0
Регистрация: 03.01.2011
Сообщений: 250
09.04.2014, 01:17 16
_pv
Дико извиняюсь, подскажите, пожалуйста, как вытянуть кусок ассемблерного листинга из AVRStudyo.

otixdos
Так модуль же не в слоте стоит, как видеокарта в ПК, а является частью целостного устройства и работает совместно с центральным МК.
0
otixdos
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 241
09.04.2014, 03:57 17
Цитата Сообщение от dsshooozzzi
otixdos
Так модуль же не в слоте стоит, как видеокарта в ПК, а является частью целостного устройства и работает совместно с центральным МК.
Я про случай повторения, или использования Вашего куска кода. Сам был напоролся на это, собирал устройства использующие GPS, и в один прекрасный момент, как говорится, "шеф всё пропало", оказалось именно в количестве циферок после точки. Всё съехало, и в данных оказался мусор. Поэтому если в протоколе сказано, что разделение идёт запятыми, во избежания проблем и нужно "выделять" по запятым. И выделенное уже обрабатывать.
0
dsshooozzzi
0 / 0 / 0
Регистрация: 03.01.2011
Сообщений: 250
09.04.2014, 05:40 18
Когда писал этот код сильно переживал за быстродействие, поэтому использовал подход "в лоб".
Вашу мысль принял во внимание, до официальной публикации этого кода переделаю парсер.
Спасибо, за замечание.
0
09.04.2014, 05:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2014, 05:40

[РЕШЕНО] Директивы условной компиляции в AVRSTUDIO4
Коллеги доброго времени суток! Помогите разобраться с директивами условной...

Неизвестный полигон на GPS модуле EB-500
Здравствуйте! Пару дней назад я купил EB-500. И очень удивился увидев...

GPS модуль EB-500. Передача команды для конфигурации
нужна помощь!! подключил GPS модуль EB-500 к компу данные приходят а вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru