sat
https://aliexpress.ru/item/1005001771530872.html
🇺🇦
Простая, но в то же время гениальная книжка: Компьютерная инженерия для самых маленьких
r/#arduino
Автор
Вик Аник
для всех остальных)))
Вик Аник
Вик Аник
Mr.Mait
Mr.Mait
Evgeniy
Mr.Mait
Mr.Mait
Evgeniy
321
Кто нибудь знает как это читать и где можно литературу найти, о том как диаграммы читать и по ним писать протокол для общения с железкой, а в идеале пару примеров бы найти
Alex
Alex
Evgeniy
321
Max
Max
лично мне, как начинающему кодеру, это видео было очень и очень кстати
Daniil
Создал поток, который работает внутри вечного цикла. Но спустя секунду примерно срабатывает собачий таймер и перезагружает есп. Если втыкаю delay, то все начинает работать нормально. В чём проблема?
🤙🏻 ℙ𝔸𝕍𝔼𝕃
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Можно найти это в исходниках freertos
🤙🏻 ℙ𝔸𝕍𝔼𝕃
ТОже самое произойдет если запустить делэй с 0
🤙🏻 ℙ𝔸𝕍𝔼𝕃
таймер стартует при запуске таска и следит чтобы были отбивки этого тамера, отбивает его как раз делэй
Daniil
🤙🏻 ℙ𝔸𝕍𝔼𝕃
1мс вроде не так критично? хотя смотря что делать конечно
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Я подсвечиваю 7 сегментный дисплей, в целом 1 мс не заметна, не перцает.
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Но я за 1 мс успеваю все цифры пройти
🤙🏻 ℙ𝔸𝕍𝔼𝕃
при чем через set_gpio
Daniil
🤙🏻 ℙ𝔸𝕍𝔼𝕃
сча
🤙🏻 ℙ𝔸𝕍𝔼𝕃
это решаемо
Daniil
сча
Ну да пофиг. Она просто чуть тусклее горит, А так вроде норм
🤙🏻 ℙ𝔸𝕍𝔼𝕃
static void xRenderTask(void* args)
{
int8_t current = 2;
uint8_t min_number = 0;
for (int min = 0; min < 2; min++) {
if (display_chars[min] == 63) {
min_number++;
} else {
break;
}
}
for (;;) {
for (current = 2; current >= min_number; current--) {
flushNumbers();
highlightNumber(current);
renderNumber(display_chars[current]);
for (int i = 0; i < 130000; i++) {}
}
current = 2;
min_number = 0;
for (int min = 0; min < 2; min++) {
if (display_chars[min] == 63) {
min_number++;
} else {
break;
}
}
vTaskDelay(1);
}
}
🤙🏻 ℙ𝔸𝕍𝔼𝕃
У меня вот такой цикл, т.е. я делаю еще даже задержки пустым циклом чтобы размазать эту МС равномерно на все 3 цифры
🤙🏻 ℙ𝔸𝕍𝔼𝕃
В твоем случае можно успеть обойти все 8к, потом 1мс подождать и еще раз обойти.
🤙🏻 ℙ𝔸𝕍𝔼𝕃
тут у меня еще логика с отключением ведущих нулей, но в общем смысл должен быть понятен
Daniil
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Всегда пожалуйста =)
Dmytro
Василий
А внутрь делай залезть и посмотреть что он там дергает нельзя?
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Но вообще мб руки дойдет переделаю на очередь на изменение отображаемого значения. В конкрено моем случае это избыточно)
Василий
Dmytro
Dmytro
Есть ещё ключевое слово atomic - как альтернатива единичным переменным, которое гарантирует что переменная в таком "полузаписанном" или "полупрочитанном" состоянии не будет
Василий
Andy
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Если я пишу его для собственных целей и не планирую его куда-то выкатываенть то я ничего никому НЕ ДОЛЖЕН =)))
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Я же знаю когда и как я вызываю те или иные функции которые я написал, и в курсе когда это можно делать, зачем мне усложнять свой код?
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Опять же, если мне понаобится многопоточность для этого модуля, я всегда смогу реализовать её ПО ПОТРЕБНОСТИ =))
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Правда я с трудом могу себе приедставить кейс где требуется конкурентное отображение данных на одном дисплее с разных потоков 🤔
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Не уверен что выкидывает, т.к. если этот цикл убрать, то отображается только последний символ, из чего могу сделать вывод что оно остается и отрабатывает. если задержки ставить меньше то яркость смещается так же к поледнему символу.
🤙🏻 ℙ𝔸𝕍𝔼𝕃
В ассемблере я не шарю, так что скомпиленный код не смотрел, да и в компиляторах тоже, скажем так)
Anton
🤙🏻 ℙ𝔸𝕍𝔼𝕃
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Anton
я на работе, у меня нет иде сейчас
🤙🏻 ℙ𝔸𝕍𝔼𝕃
CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y
CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y
CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y
CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y
🤙🏻 ℙ𝔸𝕍𝔼𝕃
дефолтный конфиг для нового проекта, я там ничего не менял
Anton
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/kconfig.html#config-compiler-optimization
🤙🏻 ℙ𝔸𝕍𝔼𝕃
значит я не буду этого делать)))
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Я просто не нашел вариантов сделать задержку меньше 1мс, кроме как пустым циклом
Anton
usleep пробовал?
🤙🏻 ℙ𝔸𝕍𝔼𝕃
нет
🤙🏻 ℙ𝔸𝕍𝔼𝕃
посмотрим в эту сторону
Anton
я сам не пробовал :)
Anton
кажись фриртос эту функцию не на всех платформах умеет
🤙🏻 ℙ𝔸𝕍𝔼𝕃
Это функция сей
🤙🏻 ℙ𝔸𝕍𝔼𝕃
http://all-ht.ru/inf/prog/c/func/usleep.html
🤙🏻 ℙ𝔸𝕍𝔼𝕃
ну как буду опять с кодом ковыряться, заменю на usleep, если вообще буду езе юзать этот дисплей ))) пока он прсото как франкинштейн стоит на макетке на подоконнике и питается от ноута =))
Anton
если что, вот кусок из ардуино-фв, который делает микросекундный делей: #define NOP() asm volatile ("nop")
unsigned long IRAM_ATTR micros()
{
return (unsigned long) (esp_timer_get_time());
}
void IRAM_ATTR delayMicroseconds(uint32_t us)
{
uint32_t m = micros();
if(us){
uint32_t e = (m + us);
if(m > e){ //overflow
while(micros() > e){
NOP();
}
}
while(micros() < e){
NOP();
}
}
}
🤙🏻 ℙ𝔸𝕍𝔼𝕃
я думаю usleep справится)