Jump to content

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


Recommended Posts

Posted (edited)

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

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

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

Edited by Андрей Гараж
Link to comment
Share on other sites

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

freeRTOS

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

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

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

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

Edited by BARS_
Link to comment
Share on other sites

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

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

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

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

Edited by korsaj
Link to comment
Share on other sites

Секреты депассивации литиевых батареек FANSO EVE Energy
При длительном хранении в литиевых ХИТ происходит процесс пассивации. Он обратим, однако информации о том, как это правильно организовать, практически нет. Известный производитель батареек FANSO EVE Energy делится рекомендациями, как активировать первичный литиевый элемент питания.

Читать статью >>

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

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

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

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

Link to comment
Share on other sites

Сравнительное тестирование алкалиновых батареек POWER FLASH 

В потребительском и промышленном сегментах российского рынка химических источников тока имеется множество щелочных (алкалиновых) батареек различных производителей и ценовых категорий. Но велика ли разница в их качестве?

Провели небольшой сравнительный тест, чтобы понять, могут ли источники тока POWER FLASH эффективно заменить продукцию таких известных производителей, как Duracell и GP, вычислить, чему равна стоимость одного часа работы батареек, а также сравнить полученные данные со значениями, указанными в технической документации.  Подробнее>>

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

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

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

Link to comment
Share on other sites

Новые источники питания на DIN-рейку класса High End от MORNSUN
Компания MORNSUN разработала новую линейку ИП с креплением на DIN-рейку класса High End. Линейка состоит из двух семейств однофазных ИП, различающихся функционалом (LIMF и LIHF) и одного семейства на трехфазное напряжение (LITF). У всех этих ИП печатная плата с компонентами имеет лаковое покрытие. Продукция работоспособна в температурном диапазоне -40...85ºС (для однофазных) и -30...70ºС (для трехфазных). Кроме того, однофазные ИП соответствуют требованиям ATEX и могут использоваться во взрывоопасных зонах. Семейство LIMF имеет стандартный функционал (ККМ, сухой контакт реле, 150% перегрузочная способность), а семейство LIHF – максимальный функционал с доп. функциями селективной защиты (SFB) и возможностью дистанционного управления (может заменить серию QUINT от Phoenix Contact).

Подробнее >>

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?

Link to comment
Share on other sites

Posted (edited)

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

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

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

 

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

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

Edited by LiVit
Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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:

Link to comment
Share on other sites

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

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

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

Edited by Огонёк
Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

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

Edited by Огонёк
Link to comment
Share on other sites

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

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

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

 

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

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

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

Edited by Андрей Гараж
Link to comment
Share on other sites

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

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

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

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

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

и.т.д.

Сергей.

Link to comment
Share on other sites

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

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

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

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

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

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

Link to comment
Share on other sites

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

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

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

 

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

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

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

 

Link to comment
Share on other sites

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, все в говнище, не понятно). Не бьется в инете.

Link to comment
Share on other sites

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

А сигнал лучше смотреть на стороне приемника.

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

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

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

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

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

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

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

Link to comment
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.

  • Сообщения

    • Я не очень богатый конечно) просто в чип и дип я закупаюсь уже около 4-х лет, и за все время косяк с этим магазином был всего 1 раз (новый сборщик немного не те детали положил). Зато у них можно купить реально редкие детали, причем совершенно новыми. Да там высокая наценка, нозато всегда есть все что нужно, и при этом в идеальном виде.  ("покуРаю" это опечатка)) 
    • Это, по меньшей мере, несерьезно. Хотя у богатых свои причуды.
    • В этом прелесть ардуины: попытка слепить конфетку из неизвестно кем и неизвестно как написанных библиотек.
    • ну тогда попытаемся допалить мой 3102бм) кроме резистора на 100 ом вместо 220 что еще менять? R2? из номиналов резисторов для R2 у меня остались только 1ком, 2,2ком, 10ком, 22ком, 27ком, 33ком(сейчас как раз 33 стоит),100ком. И очень врядли, но может найду подстроечник на 100ком. А вот с R3 будет тяжело, уменя резюков низкого номинала ооочень мало. на 100 ом у меня только 0,25ватт и они у меня редкость)  кстати покураю я детали только под определенные проекты, и в магазине чип и дип. отсюда у меня и появляется так что мало популярных номиналов деталей, но куча достаточно необычных.  кстати было много вопросов по этом кондеру. это высокоточный керамический конденсатор ровно на 5,1пф. я его еще давно специально для этого проекта покупал, чтоб частота сильно не плавала. и маркировка на нем "M5p1"
    • Надо запас иметь в виде не нужных никому, кроме тебя, старых плат. За каждым резистором в магазин не набегаешься; накладно, да и быстро надоест. TL431 хороша тем, что имеет внутренний ИОН.
    • Сто процентов. Слава Богу пока были доступны затарился для себя. Тоже в будущем хочу их сюда поставить.     
×
×
  • Create New...