Отговори на тема  [ 26 мнения ]  Отиди на страница Предишна  1, 2
UART Baudrate detector 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10376
Местоположение: Добрич
Мнение Re: UART Baudrate detector
Дали е удачно или не, такива са стандартите ;-)
Стекът със сигурност получава и потвърждава заявките за баудрейт (иначе тулчето ще гръмне). Какво друго прави не знам, но няма изискване така че може да прави каквото си иска. Разумно би било да вика калбак или нотификация някаква, защото наистина си прав, че не е работа на стека. Това е работа на бриджването, което пренасочва както данни така и заявки/нотофикации...


Чет Юни 07, 2018 9:22 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пон Дек 15, 2014 10:05 pm
Мнения: 324
Мнение Re: UART Baudrate detector
Грам джава няма даже. Цялата работа е, че имаш една платформа, наречена Ардуино. Там си има готови библиотеки, класове, макроси, които са част от ядрото на платформата и се извикват в зависимост от това, кои от хардкоднатите функции използваш. Така например, ако използваш функцията Serial.begin(), зад нея стоят сумати класове, под-класове и макроси, които да накарат компилатора да бюлдне каквото му е нужно за инициализирането на UART. Едни пичове, наречени ChipKIT, напрвили нещо като патч на тази среда, за да може средата да работи кажи/речи еднакво освен с Атмелските чипове с определени ПИКове.
Когато извикаш Serial.begin() или Serial.print(), Serial.write(), Serial.println(), Ардуино платформата ще инклудне USB стека, ще инклудни предварително дефинирана инициализация на USB CDC Serial emulator и ще конфигурира само всичко което му е нужно, за да подкара UART-а на баудрейт, който ти си му задал.
Ти пишеш Serial.begin(9600), то зад тебе почва едни инклудвания, едни макроси, едно чудо, настройки на процесори, клоци, прекъсвания, само и само ти да можеш после да приемаш и предаваш информация със Serial.read() и Serial.write().
Идеята на Ардуино средатата е учениците и студентите, както и начинаещите в ембедед средата да си правят хоби проектчета и да опознават вградените системи, без много знания и всичко е направено като за малоумници.
Този USB стек е в ядрото на платформата, той не е част от това, което "програмиста", ще напише, а просто се компилира или не, според зависи от програмата на "програмиста". И за това ти казвам, че ако модифицирам стека, тези модификации ще са приложени не само за конкретната програма, ами ще са валидни всеки път, когато реша да ползвам UART. Това е все едно да промениш HARMONY на майкрочип на майкрочип, всеки път ще ти генерира нов код с направените от теб промени. И пак казвам, първоначално в Ардуино Core файловете нямаше дори реализация на DTR/RTS, трябваше сам да си ги добавям, като направих гет функции, за да може потребителя по всяко време да си прочете състоянието на виртуалните DTR/RTS линии и добавих в USB стека възможността при сетъп рикуест на контролните линии да запаметява какво иска HOST-a. Защото ардуино платките са така измислени, че не им трябва DTR/RTS, те си имат един Reset пин, който можеш да го дърпаш софтуерно или хардуерно и това им стига.

За това според мен отпада вариантът, USB стека да инициализира UART-а, по-скоро неговата работа ще е да съхранява прищявките на HOST-а, като аз като си пиша програмата, ще питам USB стека, какво му е прещракало на хоста по отношение на баудрейта и той ще ми каже, каква стойност му е задал последно. По този начин мога да си преинициализирам комуникацията с ESP32. Въпросът е, че тогава трябва непрекъснато да следя какъв ми е бауд-рейта на HOST-a, за да знам, кога точно трябва да сменя баудрейта на UART-а. Вариантите бяха да се опитам да прихвана някое от съобщенията, които HOST-а и ESP32 си разменят; да ползвам таймер и да определям времето на старт бита или както предложихте да го правя при Setup request. Сега ако при всяка итерация на loop-а, което си е все едно while() цикъл, проверявам баудрейта и го сравнявам с този, който съм задал последно, не съм сигурен дали няма да забавя препредаването на данните между ЕСП и Хоста.

За това смятам да го направя така. Когато хостът реши да си смени баудрейта, USB Стекът смао ще запамети новия бауд, нали му е през онази работа какво иска хоста, той си работи на фиксирана честота. После ардуиновската програма, която ще пиша, ще провери по някакъв начин (кога и как, не ми е ясно още) дали баудрейта е сменен и ако не е като стария, ще преинициализира UARTа с новия бауд рейт. Според мен дали ще ползвам call back или просто в loop-а ще извиквам някаква гет функция и ще сложа проверка дали новата стойност е като старата ми звучи като еднавко, откъм бързодействие. Освен, ако няма начин да се направи някакво софтуерно прекъсване, което да генерира USB стекът, а програмата, която ще пиша, просто да го обслужва, тогава просто в цикъла ще имам само една проверка за някакъв флаг, и ако е вдигнат, сменяй бауда, ако ли не давай по същество. всичко, което е извън кодът, който пише "разработчика" е промяна на ядрото на ардуино а разработчикът пише програма от рода на:

имам ябълки=1000
while(1)
{
ако (имам_ябълки)
изяж_една_ябълка();
иначе ябълките ми са 1000;
}

Пък после ардуино ядрото след него ходи да сее дървета, да полива, тори, пази, бере ,за да може да изпълни прищявката на програмиста, че да си мисли програмиста, че има 1000 ябълки и че ардуиното му ще изяде по една ябълка за една итерация на цикъла.
Горе долу същото е и с моята програма. Аз я пиша като демо, някой я взима на готово и я ползва да си програмира ESP-то. Ако е някой по-напреднал може да реши да ползва пикът за друго, пише си собствена програма или доразвива моята. Но моят пример трябва да може да осъществява USB->Serial bridge.

Добре, благодаря за отделеното време и за предложението да следя Setup Request-овете и по този начин да определям какъв да ми бъде бауд-рейта. Надявам се последен въпрос, че много яко ви измъчих с моите обяснения:
Как е най-добре да проверявам за промяна на бауда на хоста. Вече реших че стойността на бауда, ще се съхранява в променлива в USB стека и ще се актуализира тази променлива, при всеки Setup Request, който касае бауда.
Но как е най-удачно да се осъществява преинициализацията на UART-а. Дали да си направя променлива, в която да запиша първоначалната стойност и на всяка итерация на цикъла да сравнявам дали get_baudrate() функцията, която ще си напиша, ми връща стойност различна от тази, записана в променливата и ако е различна да преинициализирам UART-а и да актуализирам променливата:

Код:
int baudrate=115200;

void loop()
{
   new_baud = get_baudrate();
   if (new_baud != baudrate)
   {
      baudrate = new_baud;
     Serial0.begin(baudrate);
   }
}


Или да ползвам някакъв кол бек или има начин да създам софтуерно прекъсване и да се получи нещо от рода на:

Код:
void loop()
{
    if (BAUD_EVENT)
        Serial0.begin ( get_baudrate() );
       
}


Чет Юни 07, 2018 9:57 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 9:16 am
Мнения: 1705
Мнение Re: UART Baudrate detector
Ако имаш достъп до това -
Код:
cdc_line_coding.dwDTERate.Val
, значи можеш да си изпълниш идеята от последния пост (get_baudrate()).


Чет Юни 07, 2018 10:10 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 10:22 pm
Мнения: 3082
Мнение Re: UART Baudrate detector
Моите бедни познания по Ц не ми показват някаква разлика в двата ти кода.
Чувал съм , че Ардуиното е много странно, та може и да не виждам калбак в написаното.
Калбак знам какво е на Уиндоус, тука не виждам нищо такова.

Нищо не ти разбрах от притесненията- само ще повторя - нещата стават бързо, но не са мигновени.
От гледна точка на ПИКа - са си направо бавни. Просто трябва да пробваш , имаш си ПЦ, имаш си платки и компилатор.


Чет Юни 07, 2018 10:16 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пон Дек 15, 2014 10:05 pm
Мнения: 324
Мнение Re: UART Baudrate detector
Разликата е ,че в единия случа, ще четеш една променлива на всяка итерация на Loop(), ще правиш сравнение и тогава ще взимаш решение да сетваш или не UARTA с нов бауд.
Другият вариант е, да изгенерираш едно прекъсване, което да вдигне един флаг и тоя флаг само да проверяваш дали е вдигнат, ако не е , продължава, аколи е , обърни му внимание. Да нещата са много бързи, обаче ако изпращам голям обем данни на голяма скорост 1 милион бода, за изпращането на примерно 100 байта, може да ми трябва по-малко време отколкото няколко итерации на Loop-а х 3 проверки. И притесненията ми са, че може да отделям едва ли не повече време да сканирам баудрейта, отколкото да да предавам данни, за сумарно 1 секунда време, примерно. Тогава може да почна да изтървам какво ми казва хоста или есп-то и да стане счупен телефон.


Чет Юни 07, 2018 10:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 10:22 pm
Мнения: 3082
Мнение Re: UART Baudrate detector
Ами гледай си стека, намери как контролните точки могат да въздействат и да ги използваш, как предизвикват прекъсвания. И ДТР и РТС, и бауда да се управляват оттам. Ако пък в пика имаш и ДМА- и в луупа няма да имаш нищо. Ще ти остане време да цъкаш и лампички :D


Чет Юни 07, 2018 10:52 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пон Дек 15, 2014 10:05 pm
Мнения: 324
Мнение Re: UART Baudrate detector
Еми ще го разгледам утре на работа, даже някой тука се обърка и постна гита на Пингуино. То това е осрано Ардуино, което все едно някой като мене се е опитвал да го "модифицира" и се е получило ГМО Ардуино. Чип Кит бачкат по малко по-културен начин, акто г/д са спазвали структурата на Ардуино платформата и чрез конфигурационни файлове и малко модификация на ядрото, просто са го разширили като съвместимост. Пикчето има ДМА, ама ако почна и там да се човъркам, най-много да трябва да преинсталирам ардуиното :D
За това, просто ще пробвам утре да добавя в стека еднин стейт, където сетъп пакета чейнджва бауда и като влезе в този стейт да актуализира някаква променлива. После ще изведа в Hardware Serial класа една гет функция и накрая в луупа ще извиквам:
Serial.getBaud();
Накрая ще видя, че има хиляда подводни камъка и че нещо съм пропуснал и ще продължа с флууда. :D :D :D Добре де, ще се старая да не флуудя а и нямам за цел да флуудя тука, а да почерпя от опита на другите.

ПП: Ти знаеш ли каква мъка е да промениш от ардуиното конфигурационните битове на ПИКА ? Клони към невъзможното, щото са хард-коднати в линкер скрипт. Е за това искам да го направя културно и да е от Arduino Sketch-а. Че след мене някой като ми чете кода, да си каже "аха, този извиква една функция и тя му дава бауда" и до там, не като мене да ходи да обикаля из файлове и скриптове като луд и да се опита да разплита свински черва.

ППП: Голямо благодарско на всички, които се включиха и за насоките и търпението.


Чет Юни 07, 2018 11:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 28023
Местоположение: София
Мнение Re: UART Baudrate detector
Аз без да сън изчел всичко, що пък ардуино на ПИК ....


Пет Юни 08, 2018 3:17 am
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пон Дек 15, 2014 10:05 pm
Мнения: 324
Мнение Re: UART Baudrate detector
Ти, щото не разбираш, това е някаква нова вълна. Да се правят ПИКове съвместими с Arduino IDE.
Пример за това са Пингуино платките.


Пет Юни 08, 2018 7:35 am
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пон Дек 15, 2014 10:05 pm
Мнения: 324
Мнение Re: UART Baudrate detector
Май много бързо се зарадвах. Записах някаква програма 4-5 пъти във флаша, после тулът почна да реве за md5 проверката, че записаното във флаша не отговаря на хекс файловете. Сега ще видя, да не се овърфлоува някой буфер и да изпускам байтове. Но като цяло Пикльото вдига бауда на UART-а.


Пет Юни 08, 2018 10:38 am
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пон Дек 15, 2014 10:05 pm
Мнения: 324
Мнение Re: UART Baudrate detector
Малко преправих кода във loop-а. Предполагам, че като излизам от loop функцията, контролерът минава през една стейт машина, в която loop е просто състояние на машината, оттам и по-дълго време за изпразване на буфера. Сложих един while() в loop-а, който да ми гарантира, че ще изпразня буферите преди да изляза от loop(). В противен случай изглежда, че правя четенето на 1 байт за едно влизане в loop(). Та успях даже да запиша някаква блинк програма на ESP32, на 2M baudrate.
Много благодаря за насоките и за отделеното време!


Сря Юни 13, 2018 10:17 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 26 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 8 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни