Карма: 22
Рейтинг сообщений: 94
Зарегистрирован: Чт мар 26, 2009 04:35:04 Сообщений: 3142 Откуда: Москва
Рейтинг сообщения:0
Спасибо, интересно попробую разобраться Сейчас ещё время поджимает, надо остальное доделывать. Я шил из Ардуины ИДЕ через юсб, просто выбрал процессор 328, а надо было 168
Тут частота CLC увеличивается от 100 Гц, сначала медленно, потом быстрее и в конце просто мелькает и опять сбрасывается на 100. Стабильность импульсов хорошая, но я уже боюсь туда ещё какую-то обработку добавлять ...
Осциллограф Fnirsi-1014D, купил специально для проекта (он будет его частью). Его ругают, но если понимать, что происходит, то вполне юзабельный. Лежу с ним и ардуинкой на диване и смотрю импульсы
_________________ (Аль Котоне,кот ещё тот,Cattus Sapiens) Усы и хвост - мои документы. Кот - авторитет! Скажет "Мяу!" - не поспоришь. (скажи мне "мяу" и я скажу кто ты)
Это просто демонстрационный тест - все, что в loop() - образец возможных действий. То, что достаточно для проверки макетом. Частота меняется с шагом в 10 единиц от самой низкой к самой высокой (источник данных может быть иным, но максимум желательно не менее 100 единиц ставить или самому подумать о "разумных пределах"). ГСЧ стандартный, продвигается "по мере усвоения результата" (привязка делалась к каждому импульсу, но с учетом возможного пропуска, если обработка ГСЧ и/или задатчика частоты не успели подготовить новые данные). Пробуйте разобрать под собственные задачи. Кыстати... В тексте ошибка - 20000 это максимально низкая частота, а 100 - максимально высокая. Недосмотрел... Исправил...
Карма: 22
Рейтинг сообщений: 94
Зарегистрирован: Чт мар 26, 2009 04:35:04 Сообщений: 3142 Откуда: Москва
Рейтинг сообщения:0
Нашёл, отчего у меня фронты дрыгались - от плавающей, блин, запятой - SIDE = 1.3 - SIDE; // округление до целого числа (меняем сторону) Лучше так сторону менять: SIDE = abs(SIDE-1); а ещё лучше так: SIDE = SIDE^1;
_________________ (Аль Котоне,кот ещё тот,Cattus Sapiens) Усы и хвост - мои документы. Кот - авторитет! Скажет "Мяу!" - не поспоришь. (скажи мне "мяу" и я скажу кто ты)
От дробной части можно и по другому избавиться - просто увеличить размерность до устранения "значения за запятой". 1.3 = 13 или 1300... Также и с "минусовыми значениями" можно делать - смещая "точку нуля" на конечное значение минуса в температурной (или иной) шкале. Это уже как удобнее. СИ снимает трахотню с математикой, но под ассемблером порой приходится поизворачиваться.
ОШИБКА ОДНОСТРОЧНОГО КОММЕНТАРИЯ в #DEFINE С великим прискорбием обнаружил, что во всех моих ранее опубликованных проектах присутствует одна и та же грубейшая ошибка - в заголовочных файлах СИ (*.h) и файлах описания ресурсов на ассемблере после #define name [value] до конца строки с этим объявлением следует однострочный комментарий... Странно только, что еще за все время и в проектах все работало, и никто меня в ту ошибку носом не ткнул... Позор старому коту... Однако на будущее в новых публикациях данная ошибка будет устранена (старые уже перебрать вряд ли возможно - там только удаление или перенос комментария на строку выше нужен)...
Собственно ошибкой (независимо от того, какой из компиляторов применяется для СИ или компиляторы ассемблера avrasm2, c51asm, mpasm) считается любой из этих вариантов написания:
Код:
#define name [value] ; комментарий #define name [value] // комментарий
в случае с СИ или avrasm2 допускается применение такого варианта
Код:
#define name [value] /* комментарий */
Приношу извинения за весьма поздно обнаруженную ошибку...
Ну, вообще то препроцессор, прежде чем обрабатывать дефайны, должен удалять все комментарии... Так что #define name [value] // комментарий Должно работать. Во всяком случае, для GCC работает.
Ваше утверждение неверно... При #define выполняется подстановка всех символов до конца строки. К сожалению я на то ранее не уделил должного внимания. А поведение реальной ошибки зависит от места применения обозначеной при помощи #define константы/макроса и того, что в ОДНОСТРОЧНОМ (//.....) комментарии за #define окажется. А вот комментарий вида /*...... */ будет игнорироваться. Хорошо, если выполняется без ошибок ( что до сих пор имело место)... Собственно и для ассемблера данное правило существенно. Даже у мпасма при его "... любой текст после (;) трактуется как комментарий и все символы до конца строки игнорируются... " далее следует "... Допускаются строковые константы, содержащие (;), как комментарии они не воспринимаются... " Единственно не путаем в avrasm2 - там есть и #define как текстовая подстановка препроцессора и директива .DEF для подмены имени регистров R0 - R31... Но то уже "чисто ассемблерная" директива, подчиняющиеся правилам работы с директивами ассемблера.
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 с линтером, вам такую ерунду на лету отлавливать будут.
Но правильно говорит JackSmith, еще до препроцессора все коментарии удаляются. И это касается Си. Если у вас асм или что то еще - нужно читать правила вашего компилятора.
Ну в англоязычные стандарты я не заглядывал, однако в имеющихся материалах/учебной литературе практически всегда даётся предупреждение о нежелательности любых комментариев от конца необходимой для работы части строки с директивой #define. Что по данному вопросу могут спецы по СИ добавить - было б желательно выслушать и их мнение. Является ли то, что я выше указал критической ошибкой или нет. К примеру от ARV или еще кого... Помимо прочего в тех же компиляторах ассемблера не всегда имеются разделители комментария, аналогичные применяемым в СИ, а вот #define (при аналогичных правилах) присутствует. Что подразумевает необходимость придерживаться одного стиля написания с соблюдением максимально возможной осторожности и внимания. Насчет "выполняется"... Выше уже говорил, что несмотря на даную ошибку мои проекты работают (чему вобщем то удивлен, после перечитывания учебной литературы). НО... Пока выполняется простая подстановка вопросы возникать не будут (компилятор ошибку не выдаст). А "сложные" варианты мне еще просто не попадались. Подождем может кто из спецов по данному вопросу что то добавит. Кыстати... Just_Fluffy составе компилятора (тот же GCC хоть для аврстудио, хоть для адуринки) имеется множество заголовочных файлов описания ресурсов АВРок... Те же заголовочники *.h с теми же #define плюс редко, но встречающимися комментариями... Найдите там хоть один, нарушающий те правила, что я в самом начале указал (однострочный простой комментарий после #define до конца строки). В новой строке они имеются (до или после #define ), но в пределах строки исключительно /* комент */ ... Авторы данных файлов тоже "перестраховались"?.... к примеру:
я, наверное, очень тупой и занудный, но стандарт, который в первой строке пишет "делать так недопустимо", а во второй строке "но разработчик компилятора может поступать иначе" или что-то в этом духе, называть стандартом нельзя. а стандарт Си - это полное собрание противоречий типа "нельзя, но если очень хочется - то можно".
имхо, стандарт - это средство унификации. а какая может быть унификация, если тип int по стандарту не имеет фиксированной разрядности, как и БАЙТ?! так что, не смотря на мою относительную любовь к Си, стандарт Си я не уважаю с тех пор, как попробовал его почитать...
в своё время такое же ощущение у меня вызвал стандарт ЕСКД... если кто его читал, то поймет, о чем я.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
С, комментарии удаляются препроцессором перед обработкой #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 раз.
Так у Вас тот же пример, о коем говорится как о допустимом варианте комментария - #define mmm nnn /* комментарий*/ А я о том, что придется изменять все "некорректные" вида #define mmm nnn // комментарий Тут скорее вопрос последовательности обработки относительно #define... Т. Е. если изначально делается простая текстовая подстановка символов до конца строки, а затем уже по месту применения данной подстановки происходит удаление комментария конца строки, в которой произведено применение результата подстановки - это одно. А в случае абсолютно обязательного удаления компилятором ЛЮБОГО содержимого из последовательности символов начинающихся с // это другое. Тогда подстановка на первом этапе уже не будет включать в себя строку комментария (но компилятор должен в сим вольной строке блокировать все, что начинается с // ) ...
поскольку в Си никогда на 100% нельзя быть уверенным, что там в очередной редакции стандарта и очередной версии компилятора было изменено, а так же для того, чтобы не забивать голову лишними знаниями всякой ерунды, я для себя сделал свой "стандарт", который однозначно (надеюсь) никогда не подведет: 1. во всех выражениях всегда расставлять приоритет вычислений скобками, не надеясь на приоритеты операций "по стандарту" 2. комментарии в дефайнах всегда делать /* длинными */ 3. никогда не использовать "подразумевающиеся" фичи типа бесконечного цикла for(;;) 4. всегда использовать "стандартную библиотеку" вместо самодельных аналогов функций, если это технически реализуемо на выбранном МК 5. никогда не использовать типы "негарантируемого" размера (int, char и вытекающих из них), только int16_t и т.п. "гарантированные".
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Ну никто не запрещает писать /* длинные */ комментарии.... Возможно, это даже правильно будет с точки зрения не-Сишных компиляторов...
Спросила у нейросетки насчет однострочных комментариев в дейайнах. Вкратце:
Стандарт C и C++ допускает использование однострочных комментариев (//) внутри строк с #define. Комментарии рассматриваются препроцессором как пробелы, поэтому они не нарушают синтаксис макроса. Однако нет отдельного стандарта, который бы специально регламентировал именно комментарии внутри #define — действуют общие правила языка о том, что комментарии игнорируются компилятором.
Что говорит стандарт - C89/C90: поддерживаются только многострочные комментарии /* ... */. Однострочные // ещё не были частью стандарта. - C99 и новее: добавлены однострочные комментарии //. Они могут использоваться в любом месте исходного кода, включая строки препроцессора (#define, #include и т.д.). - C++ (начиная с C++98): однострочные комментарии // всегда были частью стандарта, и также разрешены в макросах.
Учитывая разнообразие стандартов и предпочтение работе как с различными версиями компиляторов СИ, так и с различными компиляторами ассемблера я таки предпочитаю позицию ARV , как наиболее универсально - безопасную. Хош при том кое-где вероятно придется над редактированием поморочиться.
ARV, кстати, а что вы имели ввиду под "подразумевающимися фичами" бесконечного цикла for(;;) ? Бесконечный цикл иногда удобная штука же.... У меня иногда получается, что проще выйти из бесконечного цикла через break, нежели возиться с флагом, который проверять потом в do {} while Правда, for(;;) для бесконечности никогда не применяла... В основном while(1) {}
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения