Перейти к содержанию

Как перевести код с регистров на ардуиновский?


Рекомендуемые сообщения

Здравствуйте! Помогите решить загадку. Есть маленькая модель машинки, она гоняет по дороге, под которой проложен провод (колебательный контур). Под брюхом у машинки другой колебательный контур, так она заряжается. В машинке стоит плата с одной аттини13 и одной 328р. По дороге установлены светофоры и рядом с ними ИК-приемники и ИК-передатчики (на машинке соответственно тоже). Общаясь с ними машинка демонстрирует некоторое поведение: стоит или проезжает светофоры, поворачивает включая соответствующий поворотник, старается не въехать в зад другой машинке (у них сзади тоже ИК-передатчик). Машинок много и они постоянно глючат: устраивают "пробки", сталкиваются друг с другом, неправильно ведут себя на светофорах, разряжаются. Моя задача исправить это) Я хочу переписать код с использованием freeRTOS и arduinoIDE так, чтобы решить эти проблемы и чтобы другому новичку, вроде меня, была понятна логика работы. Есть исходный код обоих чипов, монтажная схема, тестовая машинка и тестовый полигон (на фото). Пока удалось заставить ее ехать и моргать освещением, проблемы с зарядкой ушли. Осталось научить ее общаться со светофорами, и вот тут у меня неуспех. 2026675017_.png.67a80c7ac3d331e789e1117365d72c98.png

Не пойму. Со светофора приходит 6 бит, а по коду считываться должно 8. Осциллограмму снимал и с ИК-передатчика светофора.
282400904_.png.4f621fbd7fd62b8fea52dba4b6dbb5e7.png

decoder(328p).cpp encoder(ATiny).cpp

Изменено пользователем Андрей Гараж
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

8 минут назад, Андрей Гараж сказал:

freeRTOS

На 8-битном МК? Очень плохая затея, как и лепить туда код из ардуйни. Да еще и при полном отсутствии отладчика. Работать начнет только хуже...

8 минут назад, Андрей Гараж сказал:

у них сзади тоже ИК-передатчик

Интересно, а как решена проблема наложения сигналов друг на друга? И решена ли вообще? Что мешает машинке увидеть сигнал со светофора или машинки в противоположенном конце трассы?

Изменено пользователем BARS_
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

41 минуту назад, Андрей Гараж сказал:

Со светофора приходит 6 бит, а по коду считываться должно 8.

Ну так вы посмотрите исходники светофора.

PS. Из вашего текста напрашивается вывод, что вы не знаете что делаете..

Изменено пользователем korsaj
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

43 минуты назад, Андрей Гараж сказал:

Не пойму. Со светофора приходит 6 бит, а по коду считываться должно 8. Осциллограмму снимал и с ИК-передатчика светофора.

А с чего вы решили, что это 6 бит? Это вообще не очевидно, как по мне. Я вижу 6 импульсов разной ширины.
Вполне возможно, что некоторые импульсы содержат две единицы, а равно как и промежутки между импульсами могут содержать два нуля.

Поставьте другую развертку на осциллографе, чтобы было пошире. А лучше - возьмите анализатор сигналов.

Ссылка на комментарий
Поделиться на другие сайты

21 минуту назад, korsaj сказал:

PS. Из вашего текста напрашивается вывод, что вы не знаете что делаете..

Неужели в глаза бросается?)
Исходников светофора нет, увы( Есть плата управления светофором.
2126167987_.png.65c7cf4b382b643381ba78d620610d37.png
Самое умное что мне пришло в голову, это снять сигнал с самого датчика передатчика светофора. Ибо от дороги жуткие наводки на приемнике - частота контура дороги 30 кГц. Как машинка различает там сигнал вообще.

Ссылка на комментарий
Поделиться на другие сайты

43 минуты назад, LiVit сказал:

Поставьте другую развертку на осциллографе, чтобы было пошире. А лучше - возьмите анализатор сигналов.

Пока делал заметил, что при зеленом светофоре 7 пиков, а при красном 6. Анализатора сигналов нет. В один пик действительно могут "залезть" две единицы, если по развертке посмотреть.
1605400723_.png.93c9f4196750a9b1de78894a323e5900.png

1146945059_.png.c68b448ca218e735ca84cbd6926708f9.png
Я пытаюсь хоть как-то сопоставить то, что я вижу с программой.
Написано (строки 236 - 238):
y=ACSR&0b00100000;  // bit 0
    if (y==0) adr|=0b00000001;
    _delay_us(7910);
Т.е. как я понимаю считывание бита, потом задержка 7910 мкс. А тут первая 1 и 0 (поставил курсоры), длительностью 6 мс. И все остальное считывание байта тоже в задержках 7910 мкс. К концу считывания сигнал уже "убежит". Так?
И сама запись не очень понятна. Если с регистра ACSR считали 0, то записали 1 в нулевой бит байта adr. И в следующие биты тоже записываем всегда 1, если у=0. Как так? Считывание получается срабатывает не по прерыванию, а определяется только задержкой _delay_us?

Ссылка на комментарий
Поделиться на другие сайты

100 110 100 110 0 01100111 - красный
100 110 100 110 0 10011001 - зеленый
Обратите внимание на тройки чисел. То что выделено жирным - выглядит логично. Последовательность 100 кодирует логический 0, а последовательность 110 - логическую единицу
Потом последовательность разваливается (я ориентировался на ваши нули и единицы, не анализировал осциллограмму)
Посмотрите, может быть ваша запись неверна. Потому что первые четыре бита однозначно расшифровываются как 0101 (или 1010 если в инверсии)

И посмотрите уже, как подобное реализовано в пультах управления - там явно что-то похожее

UPD.
Не, всё-равно какая-то фигня получается....
Единственное, что логично в ваших осциллограммах, так это то, что обе посылки примерно одинаковые по длительности

 

Слушайте, а какую последовательность машинка назад передает, чтобы в нее не врезались?

UPD. 2
То что выделено жирным - это стартовая последовательность.
Подчеркнутый нолик - разделитель
Дальше идут 8 бит. Красный - 67h зеленый - 99h
Только если так рассудить.
 

Изменено пользователем LiVit
Ссылка на комментарий
Поделиться на другие сайты

37 минут назад, LiVit сказал:

100 110 100 110 0 011 001 110 - красный
100 110 100 110 0 100 110 010 - зеленый

Если светофор крутит свой сигнал в непрерывном цикле, то первая часть сигнала может быть идентификатором, типа "стартового байта", а вторая часть сигнала может нести информацию о состоянии. Неизвестно ведь, в какой момент машинка подъедет к светофору - поэтому ей надо дать понять, откуда начинать считывать эту информацию.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, LiVit сказал:

а какую последовательность машинка назад передает, чтобы в нее не врезались?

Как говорили коллеги, да и по коду так похоже, что задний ИК просто светит или не светит. (строки 698 - 707) И еще в паре мест он включается, но там тоже тупо на on/off.

// STOP RED SIGNALS *****************************************************************************    
if ((clcstopsignals==0)&&(stopsignalson==0))
{
    PORTD&=0b11111101; // Stop RED led OFF
}    
if ((clcstopsignals>=stopsignals)||(stopsignalson==1))
    {
    PORTD|=0b00000010;    // Stop RED led ON
    clcstopsignals=stopsignals;
    }
 

1 час назад, LiVit сказал:

как подобное реализовано в пультах управления

Отличная мысль! Прочитал сейчас статью на вики, и да, очень похоже на то, что вы написали в разделе "Кодирование". Только этих кодировок сейчас на одной вики, вон, штук 15 написано. Но все равно спасибо, надо глянуть.

 

1 час назад, Огонёк сказал:

Если светофор крутит свой сигнал в непрерывном цикле, то первая часть сигнала может быть идентификатором, типа "стартового байта", а вторая часть сигнала может нести информацию о состоянии.

И да. Светофор посылает пакеты с частотой примерно 3 Гц. Конечно логично иметь какой-то байт синхронизации, т.к. если машинка выезжает из за поворота, то может поймать только кусок пакета. Но я в упор не нахожу по коду место, где он определяется как "стартовый" или как-либо еще. Тут очень здорово, что код написан чисто на регистрах, безо всяких кастомных библиотек, исходники которых ушли вместе с челом который это придумывал) По коду я вижу вот что (строки 226 - 259):

while (1) {                                                                                                                                                                              // НАЧИНАЕМ БЕСКОНЕЧНЫЙ ЦИКЛ

    y=ACSR&0b00100000;  // IR start Read FrontIR ********************************************************      // ПОДСКАЗКА ЧТО НАЧИНАЕМ ЧИТАТЬ ПЕРЕДНИЙ ПРИЕМНИК НА ТАЧКЕ
      if (y==0) {                                          // НАЧИНАЕМ ЗДОРОВЕННЫЙ if (НА 300 СТРОК, НО ЭТО НЕ ВАЖНО)

    adr=0;                                                 // ОБНУЛЯЕМ ПЕРЕМЕННУЮ adr В КОТОРУЮ БУДЕМ СОХРАНЯТЬ ПОЛУЧЕННЫЕ БИТЫ
     x1=0;                                                  // х1 и х2 ПОТОМ СКЛЕЯТСЯ В ОДИН (х1 - СТАРШИЙ БИТ HIGH, х2 - МЛАДШИЙ LOW)
     x2=0;
     _delay_us(19775);                              // ЗАДЕРЖКА 20 мс КРАТНА 2мс, Т.Е. МЫ ПРОПУСКАЕМ "СТАРТОВЫЕ" 10 БИТ? ТАК ЧТО ЛИ?

    y=ACSR&0b00100000;  // bit 0        // ВООБЩЕ НА СКОЛЬКО Я ПОНЯЛ ASCR ЭТО РЕГИСТР ВНУТРЕННЕГО КОМПАРАТОРА, МЫ ЕГО ЧИТАЕМ...
    if (y==0) adr|=0b00000001;            // И ЕСЛИ ОН РАВЕН НУЛЮ, ТО ЗАПИСЫВАЕМ 1 В НУЛЕВОЙ БИТ БАЙТА adr? А ЕСЛИ НЕ РАВЕН, ТО ЧТО? НЕ ПОЙМУ
    _delay_us(7910);                               // ТУПО ЖДЕМ 8 мс (ПРИ ДЛИТЕЛЬНОСТИ 1 БИТА В 2 мс ЭТО КАК-ТО МНОГОВАТО). ТОЖЕ НЕ ПОНЯТНО.
    
    y=ACSR&0b00100000;    // bit 1     // НУ И ТАК ЕЩЕ 7 РАЗ
    if (y==0) adr|=0b00000010;
    _delay_us(7910);
    y=ACSR&0b00100000;    // bit 2
    if (y==0) adr|=0b00000100;
    _delay_us(7910);
    y=ACSR&0b00100000;   // bit 3
    if (y==0) adr|=0b00001000;
    _delay_us(7910);
    y=ACSR&0b00100000;     // bit 4
    if (y==0) adr|=0b00010000;
    _delay_us(7910);
    y=ACSR&0b00100000;     // bit 5
    if (y==0) adr|=0b00100000;
    _delay_us(7910);
    y=ACSR&0b00100000;   // bit 6
    if (y==0) adr|=0b01000000;
    _delay_us(7910);
    y=ACSR&0b00100000;    // bit 7
    if (y==0) adr|=0b10000000;

2 часа назад, LiVit сказал:

Посмотрите, может быть ваша запись неверна.

127672732_.png.a55199441eb8ce50ff9462ecce27a447.png

Я курсорами осциллографа прополз всю осциллограмму, четко шаг по 2 мс получается по дельта-Т :mellow:

Ссылка на комментарий
Поделиться на другие сайты

14 минут назад, Андрей Гараж сказал:

А ЕСЛИ НЕ РАВЕН, ТО ЧТО?

То ничего не делаем, оставляем бит в нуле. Мы сначала обнуляем переменную adr, а потом каждые 8 миллисекунд проверяем компаратор и отражаем его состояние в соответствующем бите переменной. Там по идее дальше должна быть проверка полученного числа и выход из цикла при совпадении.

Изменено пользователем Огонёк
Ссылка на комментарий
Поделиться на другие сайты

Глянул код - там есть проверка переменной и куча всякой возни по результатам вместо выхода. В этот цикл вся работа упакована - поведение машины зависит от показаний переднего приёмника, получается.

Прямо праздник IF-ов какой-то, а не код!

Ссылка на комментарий
Поделиться на другие сайты

7 часов назад, Андрей Гараж сказал:

Машинок много и они постоянно глючат: устраивают "пробки", сталкиваются друг с другом, неправильно ведут себя на светофорах

И немудрено, если у них на всё восприятие мира один фототранзистор назначен. "Так, что у нас тут по курсу намигивает? Так, что ли? А если так? А если эдак? А ещё стопицот вариантов давай проверим. Что делать-то, куда ехать?" А оно намигивает и намигивает со всех сторон, и всё в один цикл через один компаратор...

Изменено пользователем Огонёк
Ссылка на комментарий
Поделиться на другие сайты

39 минут назад, Огонёк сказал:

там есть проверка переменной

Кажется начинаю вникать в этот сизIFов код... Открыл нотпадом++, получается то, что подсвечено красным слева (продублировал красными стрелками), это есть входной if. А на выходе мы должны получить только то, что я выделил желтым? А именно 10101010, adress, 10010110 или 255 (т.е. 1111 1111). Больше всего похоже на сигнал красного светофора.
459516567_.png.a255ec5992e5e226f9120f572c2baa1e.png

 

16 минут назад, Огонёк сказал:

А оно намигивает и намигивает со всех сторон

Еще посетители снимают на телефон постоянно)

Изменено пользователем Андрей Гараж
Ссылка на комментарий
Поделиться на другие сайты

6 минут назад, Андрей Гараж сказал:

А на выходе мы должны получить только то, что я выделил желтым?

Вопрос хороший, но преждевременный. Я бы, разбираясь с такой задачей, начал бы с анализа архитектуры железа машинки. Какие порты как задействованы, куда принимаем, куда управляем. Потом посмотрел бы, какие варианты есть по вводу и выводу, и как они между собой связаны - тогда, возможно, станет понятно, что, когда и для чего мы должны получать в тот или иной момент работы программы.

11 минут назад, Андрей Гараж сказал:

Открыл нотпадом++

У него должна быть возможность сворачивать if-ы и циклы, он под такие дела заточен. Я в CodeBlocks открывал - она это умеет.

Ссылка на комментарий
Поделиться на другие сайты

Когда-то делал что-то для приема кодовой последовательности. Алгоритм был следующим; ловим синхроимпульс (любой фронт) и начинаем складывать в n-разрядный буфер бит за битом. После приема каждого бита проверяем совпало ли число с одним из вариантов кодового слова разрядностью n.  Но код, при любом смещении, должен трактоваться однозначно.  

Ссылка на комментарий
Поделиться на другие сайты

9 часов назад, korsaj сказал:

А что вы гадаете на кофейной гуще, у вас есть исходник в нем и смотрите

Судя по тому, что камрады тут выкладывают, там такой лютый говнокод, что мне жалко глаза - вытекут. 

Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, Андрей Гараж сказал:

y=ACSR&0b00100000;  // bit 0

Судя по коментариям вы должны проверять биты начиная с 0 и до 7, соответственно и маска должна выбирать нужный бит по порядку,  у вас во всех условиях проверяется один и тот же бит!

 y=ACSR&0b10000000;  // bit 0

 y=ACSR&0b01000000;  // bit 1

 y=ACSR&0b00100000; // bit 2

 y=ACSR&0b00010000; // bit 3

 y=ACSR&0b00001000;  // bit 4

и.т.д.

Сергей.

Ссылка на комментарий
Поделиться на другие сайты

14 часов назад, Андрей Гараж сказал:

Я пытаюсь хоть как-то сопоставить то, что я вижу с программой.
Написано...
    _delay_us(7910);
Т.е. как я понимаю считывание бита, потом задержка 7910 мкс.

похвальное желание...
цифры в делаях ни какого отношения к реальности не имеют, и относятся только к самому макросу делай , который предполагает, что частота осциллятора, установленная в: 
#define F_CPU 1000000UL
,соответствует реальной частоте МК.
На самом деле частота МК задается фюзами конфигурации и/или частотой внешнего резонатора.
и предполагаю, что она у Вас в МК установлена на 8МГц
1/8=0,125мкс 0,125*7910=988,75мкс ≈ 1мс
 

2 часа назад, LiVit сказал:

там такой лютый говнокод

это мягко сказано, извините за каламбур :)

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, Андрей Гараж сказал:

Еще посетители снимают на телефон постоянно)

Блин, надеюсь, это не Гранд макет в Питере:lol2: Хотя там вроде все четко работало:lol2: Ну и вспышки не должны влиять на работу приемников вообще никак, т.к. они работают на определенной несущей частоте. Конечно, если разрабы не додумались сунуть в качестве приемника обычный ИК фотодиод, мез модуляции сигнала...

 

10 часов назад, Андрей Гараж сказал:

Кажется начинаю вникать в этот сизIFов код.

Блин, да выкинуть этот кривой говнокод и написать свой. Но сразу предупреждаю, с ардуйней, да еще и RTOS тут делать нечего. У МК силенок не хватит и кучу посылок постоянно ловить и декодировать, и бесполезное барахло в виде планировщика задач и прочего крутить. Но даже идеально работающий код не решит проблему тупящих машинок пока вы не найдете ответы на вопрос: Как решена и решена ли вообще проблема приема данных с разных участков трассы, не относящихся к текущему положению машинки?

 

Ссылка на комментарий
Поделиться на другие сайты

13 часов назад, Огонёк сказал:

Я бы, разбираясь с такой задачей, начал бы с анализа архитектуры железа машинки.

314596062_.png.9d40a5d6fc4c4eb15810bf6e4ec8999e.png
Это первое с чего я начал, перерисовал обвязку avr-ки 328р. Помогает эта схема только в определенной степени, естественно. Надо ж всё в совокупности смотреть.

 

12 часов назад, korsaj сказал:

Алгоритм был следующим; ловим синхроимпульс (любой фронт) и начинаем складывать в n-разрядный буфер бит за битом.

Тоже уже склоняюсь к такому варианту, сделать отдельно из датчика и ардуины что-то, что писало бы в лог ком-порта пойманные байты. Сейчас вот пробовал прошить машинку, чтоб зацепиться за зеленый/красный сигнал светофора. Исходя из осциллограммы написал код, чтоб понимать 101 или 010. А машинка чтоб отмыргивала стопарями и поворотниками то, что получает. Тк вот оказалось там еще 3й вид пакетов периодически приходит.
685856567_.png.e7f8e555b9c5a491b2566bf9fe48a2ac.png

 

6 часов назад, optima сказал:

у вас во всех условиях проверяется один и тот же бит!

Это регистр внутреннего компаратора, он определяется этим битов в регистре. Потому он всегда и один и тот же. Вот эта точка:
1115967908_.png.fcc9c35c3b1f15895e775165f57dcf88.png
1333507502_.png.2334ee6816af8f09a52980dcb3e4ab0f.png

 

 

4 часа назад, IMXO сказал:

цифры в делаях ни какого отношения к реальности не имеют


Тоже верно. На кварце платы машинки написано 4 ORG8 7J (может ORC8, все в говнище, не понятно). Не бьется в инете.

Ссылка на комментарий
Поделиться на другие сайты

9 минут назад, korsaj сказал:

Сделайте простую моргалку и узнаете частоту

Не, моргалка не дает ничего. Пакеты шлются каждые 500 мс, сегодня осциллографом мерил. А сами сигналы не различишь, весь пакет 40-50 мсек это 21 бит (пока у меня так получается). Видно просто как один мырг)

Ссылка на комментарий
Поделиться на другие сайты

14 минут назад, Андрей Гараж сказал:

все в говнище, не понятно)

Что мешает плату помыть? Спирт творит чудеса.

Только что, Андрей Гараж сказал:

моргалка не дает ничего.

Моргалка дает понимание частоты работы МК. Всего 4 строки кода:

LED_H;
_dealy_ms(100);
LED_L;
_dealy_ms(100);

дадут понимание совпадает ли реальная тактовая с указанной в прошивке.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...