Котуинко

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Полосатый
Друг Кота
Сообщения: 3151
Зарегистрирован: Чт мар 26, 2009 04:35:04
Откуда: Москва

Re: Котуинко

Сообщение Полосатый »

Спасибо, интересно :beer: :) попробую разобраться :roll:
Сейчас ещё время поджимает, надо остальное доделывать.
Я шил из Ардуины ИДЕ через юсб, просто выбрал процессор 328, а надо было 168 :)

Тут частота CLC увеличивается от 100 Гц, сначала медленно, потом быстрее и в конце просто мелькает и опять сбрасывается на 100.
Стабильность импульсов хорошая, но я уже боюсь туда ещё какую-то обработку добавлять ...

Осциллограф Fnirsi-1014D, купил специально для проекта (он будет его частью). Его ругают, но если понимать, что происходит, то вполне юзабельный. Лежу с ним и ардуинкой на диване и смотрю импульсы :)
Изображение (Аль Котоне, кот ещё тот, Cattus Sapiens)
Усы и хвост - мои документы.
Кот - авторитет! Скажет "Мяу!" - не поспоришь. (скажи мне "мяу" и я скажу кто ты)
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Это просто демонстрационный тест - все, что в loop() - образец возможных действий.
То, что достаточно для проверки макетом.
Частота меняется с шагом в 10 единиц от самой низкой к самой высокой (источник данных может быть иным, но максимум желательно не менее 100 единиц ставить или самому подумать о "разумных пределах").
ГСЧ стандартный, продвигается "по мере усвоения результата" (привязка делалась к каждому импульсу, но с учетом возможного пропуска, если обработка ГСЧ и/или задатчика частоты не успели подготовить новые данные).
Пробуйте разобрать под собственные задачи.
:wink:
Кыстати... В тексте ошибка - 20000 это максимально низкая частота, а 100 - максимально высокая.
Недосмотрел... Исправил...
:oops:
Аватара пользователя
Полосатый
Друг Кота
Сообщения: 3151
Зарегистрирован: Чт мар 26, 2009 04:35:04
Откуда: Москва

Re: Котуинко

Сообщение Полосатый »

Нашёл, отчего у меня фронты дрыгались - от плавающей, блин, запятой -
SIDE = 1.3 - SIDE; // округление до целого числа (меняем сторону)
Лучше так сторону менять:
SIDE = abs(SIDE-1);
а ещё лучше так:
SIDE = SIDE^1;
:)
Изображение (Аль Котоне, кот ещё тот, Cattus Sapiens)
Усы и хвост - мои документы.
Кот - авторитет! Скажет "Мяу!" - не поспоришь. (скажи мне "мяу" и я скажу кто ты)
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

От дробной части можно и по другому избавиться - просто увеличить размерность до устранения "значения за запятой".
1.3 = 13 или 1300...
Также и с "минусовыми значениями" можно делать - смещая "точку нуля" на конечное значение минуса в температурной (или иной) шкале.
Это уже как удобнее. СИ снимает трахотню с математикой, но под ассемблером порой приходится поизворачиваться.
8)
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

ОШИБКА ОДНОСТРОЧНОГО КОММЕНТАРИЯ в #DEFINE
С великим прискорбием обнаружил, что во всех моих ранее опубликованных проектах
присутствует одна и та же грубейшая ошибка -
в заголовочных файлах СИ (*.h) и файлах описания ресурсов на ассемблере
после
#define name [value]
до конца строки с этим объявлением следует однострочный комментарий...
:oops:
Странно только, что еще за все время и в проектах все работало,
и никто меня в ту ошибку носом не ткнул...
Позор старому коту...
:oops: :cry:
Однако на будущее в новых публикациях данная ошибка будет устранена
(старые уже перебрать вряд ли возможно - там
только удаление или перенос комментария на строку выше нужен)...

Собственно ошибкой (независимо от того, какой из компиляторов применяется
для СИ или компиляторы ассемблера avrasm2, c51asm, mpasm
)
считается любой из этих вариантов написания:

Код: Выделить всё

#define name [value] ; комментарий
#define name [value] // комментарий


в случае с СИ или avrasm2 допускается применение такого варианта

Код: Выделить всё

#define name [value] /* комментарий */

Приношу извинения за весьма поздно обнаруженную ошибку...
:(
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: Котуинко

Сообщение Just_Fluffy »

Ну, вообще то препроцессор, прежде чем обрабатывать дефайны, должен удалять все комментарии...
Так что
#define name [value] // комментарий
Должно работать. Во всяком случае, для GCC работает.
Белая и Пушистая
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Ваше утверждение неверно...
При #define выполняется подстановка всех символов до конца строки.
К сожалению я на то ранее не уделил должного внимания.
А поведение реальной ошибки зависит от места применения обозначеной при помощи #define константы/макроса и того, что в ОДНОСТРОЧНОМ (//.....) комментарии за #define окажется.
А вот комментарий вида /*...... */ будет игнорироваться.
Хорошо, если выполняется без ошибок ( что до сих пор имело место)...
Собственно и для ассемблера данное правило существенно.
Даже у мпасма при его
"... любой текст после (;) трактуется как комментарий и все символы до конца строки игнорируются... "
далее следует
"... Допускаются строковые константы, содержащие (;), как комментарии они не воспринимаются... "
Единственно не путаем в avrasm2 -
там есть и #define как текстовая подстановка препроцессора и
директива .DEF для подмены имени регистров R0 - R31...
Но то уже "чисто ассемблерная" директива, подчиняющиеся правилам работы с директивами ассемблера.
:roll:
Аватара пользователя
JackSmith
Потрогал лапой паяльник
Сообщения: 332
Зарегистрирован: Ср мар 09, 2016 08:07:41

Re: Котуинко

Сообщение JackSmith »

в стандарте Си написано что все комментарии без исключения заменяются пробелом, не только в макросах.
стандарт https://www.open-std.org/jtc1/sc22/wg14 ... /n3220.pdf глава 5.1.1.2 "фазы трансляции" пункт 3:
The source file is decomposed into preprocessing tokens4) and sequences of white-space
characters (including comments). A source file shall not end in a partial preprocessing token or
in a partial comment. Each comment is replaced by one space character. New-line characters
are retained. Whether each nonempty sequence of white-space characters other than new-line
is retained or replaced by one space character is implementation-defined.


ps поставьте IDE с линтером, вам такую ерунду на лету отлавливать будут.
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: Котуинко

Сообщение Just_Fluffy »

BOB51 писал(а):Ваше утверждение неверно...
в Си - верно.
иначе бы конструкции

Код: Выделить всё

#define PORTC_FLAG_MASK 0x20 // тут датчик
#define PORTB_LED_PIN 0x40 // тут светодиод

...

if (PINC & PORTC_FLAG_MASK) PORTB |= PORTB_LED_PIN;
else PORTB &= ~PORTB_LED_PIN;

давали ошибку компиляции...

Но правильно говорит JackSmith, еще до препроцессора все коментарии удаляются. И это касается Си.
Если у вас асм или что то еще - нужно читать правила вашего компилятора.
Белая и Пушистая
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Ну в англоязычные стандарты я не заглядывал, однако в имеющихся материалах/учебной литературе практически всегда даётся предупреждение о нежелательности любых комментариев от конца необходимой для работы части строки с директивой #define.
Что по данному вопросу могут спецы по СИ добавить - было б желательно выслушать и их мнение.
Является ли то, что я выше указал критической ошибкой или нет.
К примеру от ARV или еще кого...
8)
Помимо прочего в тех же компиляторах ассемблера не всегда имеются разделители комментария, аналогичные применяемым в СИ, а вот #define (при аналогичных правилах) присутствует. Что подразумевает необходимость придерживаться одного стиля написания с соблюдением максимально возможной осторожности и внимания.
:tea:
Насчет "выполняется"...
Выше уже говорил, что несмотря на даную ошибку мои проекты работают (чему вобщем то удивлен, после перечитывания учебной литературы).
НО...
Пока выполняется простая подстановка вопросы возникать не будут (компилятор ошибку не выдаст).
А "сложные" варианты мне еще просто не попадались.
Подождем может кто из спецов по данному вопросу что то добавит.
8)
Кыстати...
Just_Fluffy
составе компилятора (тот же GCC хоть для аврстудио, хоть для адуринки) имеется множество заголовочных файлов описания ресурсов АВРок... Те же заголовочники *.h с теми же #define плюс редко, но встречающимися комментариями...
Найдите там хоть один, нарушающий те правила, что я в самом начале указал (однострочный простой комментарий после #define до конца строки).
В новой строке они имеются (до или после #define ), но в пределах строки исключительно /* комент */ ...
Авторы данных файлов тоже "перестраховались"?....
к примеру:
iotn13a.h
(9.19 КБ) 56 скачиваний

iom328p.h
(20 КБ) 52 скачивания

:tea:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

2 копейки по поводу стандарта.

я, наверное, очень тупой и занудный, но стандарт, который в первой строке пишет "делать так недопустимо", а во второй строке "но разработчик компилятора может поступать иначе" или что-то в этом духе, называть стандартом нельзя. а стандарт Си - это полное собрание противоречий типа "нельзя, но если очень хочется - то можно".

имхо, стандарт - это средство унификации. а какая может быть унификация, если тип int по стандарту не имеет фиксированной разрядности, как и БАЙТ?! так что, не смотря на мою относительную любовь к Си, стандарт Си я не уважаю с тех пор, как попробовал его почитать...

в своё время такое же ощущение у меня вызвал стандарт ЕСКД... если кто его читал, то поймет, о чем я.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Так все же по сути вопроса о комментарии в #define...
Или я неправильно истолковал опасность вероятной ошибки?
И только зря "перестраивался"?
:roll:
veso74
Поставщик валерьянки для Кота
Сообщения: 1902
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Котуинко

Сообщение veso74 »

С, комментарии удаляются препроцессором перед обработкой #define.

#define AAA 1000 // test value
не возникало конфликтов с различными компиляторами на разных типах MK,
напр. avr-gcc, в CCS PIC‑C Compiler, arm‑none‑eabi‑gcc, в Keil ARMCC/ARMCLANG, riscv-none-embed-gcc для RISC-V ...
Да, недавно начал писать комментарии в define на новой строке, потому что строки стали длинными :).
Но в "заводских" .h комментарии везде "длинные": #define AAA 1000 /* test value */
Последний раз редактировалось veso74 Ср янв 14, 2026 14:04:02, всего редактировалось 1 раз.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Так у Вас тот же пример, о коем говорится как о допустимом варианте комментария -
#define mmm nnn /* комментарий*/
А я о том, что придется изменять все "некорректные" вида
#define mmm nnn // комментарий
8)
Тут скорее вопрос последовательности обработки относительно #define...
Т. Е. если изначально делается простая текстовая подстановка символов до конца строки, а затем уже по месту применения данной подстановки происходит удаление комментария конца строки, в которой произведено применение результата подстановки - это одно.
А в случае абсолютно обязательного удаления компилятором ЛЮБОГО содержимого из последовательности символов начинающихся с // это другое.
Тогда подстановка на первом этапе уже не будет включать в себя строку комментария (но компилятор должен в сим вольной строке блокировать все, что начинается с // ) ...
:roll:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

поскольку в Си никогда на 100% нельзя быть уверенным, что там в очередной редакции стандарта и очередной версии компилятора было изменено, а так же для того, чтобы не забивать голову лишними знаниями всякой ерунды, я для себя сделал свой "стандарт", который однозначно (надеюсь) никогда не подведет:
1. во всех выражениях всегда расставлять приоритет вычислений скобками, не надеясь на приоритеты операций "по стандарту"
2. комментарии в дефайнах всегда делать /* длинными */
3. никогда не использовать "подразумевающиеся" фичи типа бесконечного цикла for(;;)
4. всегда использовать "стандартную библиотеку" вместо самодельных аналогов функций, если это технически реализуемо на выбранном МК
5. никогда не использовать типы "негарантируемого" размера (int, char и вытекающих из них), только int16_t и т.п. "гарантированные".
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Это уже больше ответ тем, кто на мое информационное сообщение с ответами подключился.
Одному отбиваться сложновато (при "уровне вредного начинающего")
8)
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: Котуинко

Сообщение Just_Fluffy »

Ну никто не запрещает писать /* длинные */ комментарии....
Возможно, это даже правильно будет с точки зрения не-Сишных компиляторов...

Спросила у нейросетки насчет однострочных комментариев в дейайнах. Вкратце:

Стандарт C и C++ допускает использование однострочных комментариев (//) внутри строк с #define. Комментарии рассматриваются препроцессором как пробелы, поэтому они не нарушают синтаксис макроса. Однако нет отдельного стандарта, который бы специально регламентировал именно комментарии внутри #define — действуют общие правила языка о том, что комментарии игнорируются компилятором.

Что говорит стандарт
- C89/C90: поддерживаются только многострочные комментарии /* ... */. Однострочные // ещё не были частью стандарта.
- C99 и новее: добавлены однострочные комментарии //. Они могут использоваться в любом месте исходного кода, включая строки препроцессора (#define, #include и т.д.).
- C++ (начиная с C++98): однострочные комментарии // всегда были частью стандарта, и также разрешены в макросах.
Белая и Пушистая
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Учитывая разнообразие стандартов и предпочтение работе как с различными версиями компиляторов СИ, так и с различными компиляторами ассемблера я таки предпочитаю позицию ARV , как наиболее универсально - безопасную.
:hunger:
Хош при том кое-где вероятно придется над редактированием поморочиться.
8)
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: Котуинко

Сообщение Just_Fluffy »

ARV, кстати, а что вы имели ввиду под "подразумевающимися фичами" бесконечного цикла for(;;) ?
Бесконечный цикл иногда удобная штука же....
У меня иногда получается, что проще выйти из бесконечного цикла через break, нежели возиться с флагом, который проверять потом в do {} while
Правда, for(;;) для бесконечности никогда не применяла... В основном while(1) {}
Белая и Пушистая
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Ходять слухи, что
for(,,) используется в ардуино как основа явно видимого
раздела скотча loop
:roll:
Ответить

Вернуться в «Разные вопросы по МК»