Котуинко

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

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

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

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

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

Сообщение BOB51 »

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

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

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

Сообщение BOB51 »

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

Сообщение BOB51 »

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

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

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

#define name [value] ; комментарий
#define name [value] // комментарий
в случае с СИ или avrasm2 допускается применение такого варианта

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

#define name [value] /* комментарий */
Приношу извинения за весьма поздно обнаруженную ошибку...
:(
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 553
Зарегистрирован: Ср июн 29, 2022 16:25:45

Сообщение Just_Fluffy »

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

Сообщение BOB51 »

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

Сообщение 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 с линтером, вам такую ерунду на лету отлавливать будут.
Вымогатель припоя
Аватара пользователя
Сообщения: 553
Зарегистрирован: Ср июн 29, 2022 16:25:45

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

Сообщение BOB51 »

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

Сообщение ARV »

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

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

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

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

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

Сообщение BOB51 »

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

Сообщение 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 раз.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15655
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

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

Сообщение ARV »

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

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

Сообщение BOB51 »

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

Сообщение Just_Fluffy »

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

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

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

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

Сообщение BOB51 »

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

Сообщение Just_Fluffy »

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

Сообщение BOB51 »

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

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