меня смущают, очень сильно, магические числа в коде - это совсем не корректная запись
Магическое число, или сигнатура — целочисленная константа, используемая для однозначной идентификации ресурса или данных. Такое число само по себе не несёт никакого смысла, и может вызвать недоумение, встретившись в коде программы без соответствующего контекста или комментария, при этом попытка изменить его на другое, даже близкое по значению, может привести к абсолютно непредсказуемым последствиям. По этой причине подобные числа были иронично названы магическими.
Так писать нельзя. Это ошибка. Вы, похоже, не понимаете смысл битовых полей
почему?
EXTI->CR1 |= EXTI_CR1_PDIS; //11: Rising and falling edge
смотрим дефайн
#define EXTI_CR1_PDIS ((uint8_t)0xC0)
устанавливаются два бита: бит 7 и 6, 0xC0 = 0b11000000
Bits 7:6 PDIS[1:0]: Port D external interrupt sensitivity bits
These bits can only be written when I1 and I0 in the CCR register are both set to 1 (level 3).
They define the sensitivity of Port D external interrupts.
00: Falling edge and low level
01: Rising edge only
10: Falling edge only
11: Rising and falling edge
49: EXTI->CR1 |= EXTI_CR1_PDIS; //11: Rising and falling edge
000036 AE 50 A0 [ 2] 172 ldw x, #0x50a0
000039 F6 [ 1] 173 ld a, (x)
00003A AA C0 [ 1] 174 or a, #0xc0
00003C F7 [ 1] 175 ld (x), a
Re: Программирование STM8
Добавлено: Ср май 20, 2015 14:21:56
a5021
oleg110592 писал(а):
меня смущают, очень сильно, магические числа в коде - это совсем не корректная запись
EXTI->CR1 |= EXTI_CR1_PDIS;
А вот это не магические, да? Это еще хуже. Там хоть было видно значение, которое идет в регистр, а здесь надо сначала посмотреть чему численно равно определение а потом уже даташит листать, что все это вообще значит. В таком формате добавляется еще один этап магии, по сравнению с предыдущим.
на всякий случай листинг SDCC:
На всякий случай, когда речь шла о битовых определениях от иара, пихать без предупреждения запись в формате определений SPL это офигенно продвинутая идея.
Re: Программирование STM8
Добавлено: Ср май 20, 2015 14:58:52
oleg110592
a5021 писал(а):А вот это не магические, да?
и где в строке "EXTI->CR1 |= EXTI_CR1_PDIS;" хоть одно число? Все в делается по человечески в дефайнах.
...с помощью директивы препроцессора #define, выражениям можно придать более приятный вид.
Директива #define используется для присваивания символических имен константам и для макроопределений. Использование символических имен делают программу более модифицируемой и переносимой.
Например, вы используете в тексте программы константу, и вдруг вам понадобилось изменить ее значение. Если она встречается всего в трех местах, то исправить ее можно и в ручную, а что делать, если она встречается в пятидесяти строчках? Мало того, что исправление займет много времени, так еще и ошибиться в этом случае проще простого. Здесь то, как раз и выручает директива #define. В начале программы задается символическое имя константы, которое используется по ходу программы. Если нам нужно изменить это значение, это делается всего лишь в одном месте. А перед компиляцией препроцессор сам подставит во все выражения вместо имени константы ее значение.
a5021 писал(а):На всякий случай, когда речь шла о битовых определениях от иара
Не принимайте близко к сердцу - речь шла о читаемости, наглядности и переносимости (да да!), которая у хидера от иара отсутствует - это лично мое мнение и я в праве здесь его выразить.
a5021 писал(а):Там хоть было видно значение, которое идет в регистр, а здесь надо сначала посмотреть чему численно равно определение а потом уже даташит листать, что все это вообще значит. В таком формате добавляется еще один этап магии
тут все проще - становимся мышкой на битовое определение, нажимаем правую кнопки мышки, идем по стрелке, нажимаем левую кнопку мышки - попадаем на нужный дефайн в хидере с прекрасным комментарием и даташит даже иногда можно не листать:
п.с. что то у меня на сайте вставка видео не работает
Re: Программирование STM8
Добавлено: Ср май 20, 2015 19:10:41
a5021
oleg110592 писал(а):тут все проще - становимся мышкой на битовое определение, нажимаем правую кнопки мышки, идем по стрелке, нажимаем левую кнопку мышки - попадаем на нужный дефайн в хидере с прекрасным комментарием и даташит даже иногда можно не листать:
Вот я и почитал один такой "прекрасный" комментарий, предложенным замечательным способом, благо иар в соседнем окне открыт (правда, stm32):
/*!< EXTSEL[2:0] bits (External Event Select for regular group) */
И вот из битов, которые этот EXTSEL инициализируют, надо сначала сложить число, а потом лезть в даташит, чтобы узнать, что оно значит. Если вам такие "прекрасные" комментарии заменяют даташит, а это ракообразие и вправду кажется удобством, то нет никакого смысла продолжать данный разговор.
Re: Программирование STM8
Добавлено: Ср май 20, 2015 20:49:55
oleg110592
axillent писал(а):что вышло в итоге
Прекрасно и светит хорошо, поздравляю.
a5021 писал(а):Если вам такие "прекрасные" комментарии заменяют даташит, а это ракообразие и вправду кажется удобством, то нет никакого смысла продолжать данный разговор
разве я написал что заменяют? Что-то вы все время врете. На картинке комментарии почему то не видим. Очки какие то разборчивые.
Дальше битовые поля EXTSEL тоже не видят очки - а ведь можно с легкостью установить любой бит, а не писать магическое число 2.
#define ADC_CFGR1_EXTSEL ((uint32_t)0x000001C0) /*!< EXTSEL[2:0] bits (External Event Select for regular group) */
#define ADC_CFGR1_EXTSEL_0 ((uint32_t)0x00000040) /*!< Bit 0 */
#define ADC_CFGR1_EXTSEL_1 ((uint32_t)0x00000080) /*!< Bit 1 */
#define ADC_CFGR1_EXTSEL_2 ((uint32_t)0x00000100) /*!< Bit 2 */
Комментарии очень помогают разбираться в коде - разве их уже отменили? Разговор можете не продолжать, а я продолжу...
И так продолжим рассмотрение примера по ссылке a5021:
видим такую строку:
PD_ODR_ODR3 = !PD_ODR_ODR3; // Toggle Port D, pin 3.
начинаем разбираться что бы это значило
Ликбез:
Для языка Си определены битовые операции:
& битовое И (AND)
| битовое ИЛИ (OR)
^ битовое ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)
~ битовое ОТРИЦАНИЕ (NOT) — унарная операция.
Логическая операция И &&;
Логическая операция ИЛИ ||;
Логическая операция НЕ ! или логическое отрицания
Пример для применения операции "!":
!( a == 3) Условие истинно, если a не равно 3.
есть рекомендации по стилю написания программ на Си:
Именованные константы (включая значения перечислений) должны быть записаны в верхнем регистре с нижним подчеркиванием в качестве разделителя.
Примеры: MAX_ITERATIONS, COLOR_RED, PI
скоро тут будет весь учебник по Си для первого класса
а теперь расшифровываем "PD_ODR_ODR3 = !PD_ODR_ODR3;": бит ODR3 равен НЕ биту ODR3 - вынос мозга, но можно и привыкнуть и стать инвалидом умственного труда. А зачем все это, если можно просто сделать - "^" "битовое ИСКЛЮЧАЮЩЕЕ ИЛИ" значения порта с константой, уже любезно прописанной в дефайне: "GPIOD->ODR ^= GPIO_PIN_3;". Запись "PD_ODR_ODR3" в первом варианте вообще говорит о том, что это константа по рекомендациям, но это бит - полный бред. Заметим второй способ соответствует всем правилам и канонам языка Си. Шаг и мат.
Домашнее задание :
Условие:
Есть переменная для флагов, обозначенная так:
uint8_t flags;
Есть однобитный флаг, обозначенный так:
#define POWER_ON (uint8_t)(1<<0);
Вопрос:
Как с точки зрения приверженца иаровского хидера установить, сбросить и инвертировать флаг "POWER_ON" в переменной "flags"?
Подсказка:
Типа "POWER_ON = 1;" не прокатит.
Еще подсказка:
Для приверженцев нормальных решений, которые знают битовые операции как отче наш, очевидно будет так:
flags |= POWER_ON; // установить бит
flags &= ~POWER_ON; // сбросить бит
flags ^= POWER_ON; // инвертировать бит
Как быть хидероиаровцам?
Ответ:
?
p.s. для STM32 тоже все хорошо и тоже иногда в даташит можно не заглядывать:
Re: Программирование STM8
Добавлено: Ср май 20, 2015 22:04:37
a5021
oleg110592 писал(а):И так продолжим рассмотрение примера по ссылке a5021:
Товарищ, вы разговариваете сам с собой. Человек по этому примеру уже разобрался и единственное, что ему было нужно -- это способ описания обработчика. Копайте ваши запятые дальше. Читайте мега-информативные коментарии вида "/*!< Bit 1 */" и делайте все, что вы там делали. Я все уже понял еще с тех времен, когда вы вектора три дня искали.
Re: Программирование STM8
Добавлено: Ср май 20, 2015 22:08:47
oleg110592
a5021 писал(а):Товарищ, вы разговариваете сам с собой
Ошибаетесь - пишу не для одного человека. Тему читает много людей, может будет кому и интересно, а может благодаря моим заметкам кто-то не будет повторять чужие ошибки. Это же хорошо и полезно для этой темы?
Опять на личность переходим? Аргументы закончились? А понял, на публику играем. Показательный финал иаровских хидеров?
a5021 писал(а):когда вы вектора три дня искали
опять вранье, тут человек их тоже не нашел, без вас разобрались что к чему.
Поздравляю вас, гражданин, соврамши!(с)
Re: Программирование STM8
Добавлено: Ср май 20, 2015 23:20:02
a5021
Олег, мы движемся в каком-то неправильном направлении. Предлагаю прекратить эту бесплодную перепалку. Если я вас чем-то задел, извините меня.
Re: Программирование STM8
Добавлено: Чт май 21, 2015 05:20:27
oleg110592
имхо не мы а вы. А чего бесплодная перепалка - может и даст всходы, если конечно держаться в рамках темы, задеть меня вообще трудно - давно вышел из такого возраста, тем более мы ж в интернете, где собеседники воочию друг друга не видят и зачастую встречаются тролли, реагировать на них, только кормить, наоборот такое поднимает настроение, а то "все кабинет, кабинет"(c), спасибо за дискуссию. Давно прошел такой путь - первый проект типа мигания светодиодом на самом первом иаре для стм8 (до этого долго использовал иар для авр - там все прекрасно) делал с хидерами иара поначалу с точками типа "PD_CR1_bit.C10=0; //PD0 - открытый сток" потом и без точек как в примере, чувствовал дискомфорт, после разборки примеров кода от производителя с SPL, посмотрев что там внутри (сама SPL мне не нужна была для S003), очень понравилось решения с хидером от производителя, иар стм8 с этим хидером засиял для меня новыми красками (для стм32 иар не использую - там кайло рулит (имхо), тем более что для F0 он сейчас вообще бесплатен), с тех пор перенес практически все проекты с авр на стм8 и стм32, в новых проектах только стм и везде в этих проектах хидеры от производителя, удобства (для меня) описывал выше. Когда я увидел код по вашей ссылке (еще потом и скопированный в эту тему) вернулись старые негативные ощущения, к стати код axillent с точечками и C10 мне показался гораздо лучше, С10 только портят. После поста примера, два человека высказались, что используют хидер от производителя, затем сообщение "Позволю себе не согласится" с примерами, где наглядно видно что лучше или хуже (для меня) особенно впечатлило - "TIM1_SMCR_TS = 5;", почему написано выше, "TIM2_CR1_OPM = 1;" как в таких записях разобраться какого размера битовое поле, потому и возник вопрос о 100500. Далее понеслось. Было интересно самому разобраться - а вдруг все таки иаровские хидеры лучше, но нет эта дискуссия наоборот еще более укрепила меня в правильности принятого решения.
Вот такая, блин, музыка. Такая, блин, вечная молодость.(с)
Извиняюсь перед участниками форума за офтоп, правда чуточку тут есть по теме.
Re: Программирование STM8
Добавлено: Пт май 22, 2015 11:04:17
oleg110592
Может кому пригодится.
Как известно в IDE IAR весьма простой редактор не соответствующий возможностям многих популярных IDE. Специалисты IAR оставили лазейку для страждущих.
Как прикрутить внешний редактор со всякими плюшками к IAR STM8.
в меню: Tools -> Option->External Editor->External Editor
поставить галочку Use External Editor
в Type должно быть Command Line
нажать на кнопку со звездочками, указать путь к EXE-файлу любимого редактора
в Arguments прописать: -n$CUR_LINE$ $FILE_PATH$
Теперь, если в Workspace кликнуть дважды на файл, который хотим редактировать - запустится внешний редактор и откроет нужный файл. Всякие плюшки, типа нормального автодополнения должны работать.
У меня работают:
Всем приятной и комфортной работы.
Re: Программирование STM8
Добавлено: Пт май 22, 2015 11:21:30
axillent
интересно
то у вас за редактор на скриншоте?
попробовал по вашей инструкции sublime - не работает, пытается открыть мой сишный файл из C:\windiws\system
To send an argument to the external editor, type the argument in the Arguments field.
For example, type $FILE_PATH$ to start the editor with the active file (in editor, project,
or messages windows).
Re: Программирование STM8
Добавлено: Пт май 22, 2015 11:55:42
axillent
сейчас обратил внимание, что sublime открывает сразу пачку пустых файлов очень похожих каждый на директорию в пути)
думаю так клинит его из за пробела в имено одной из папок в пути к проекту
поставил $FILE_PATH$ в двойные кавычки, вроже заработало
если указывать -n$CUR_LINE$ то открывается сразу два окна subime
Re: Программирование STM8
Добавлено: Вт май 26, 2015 10:30:22
vash_sa
Приветствую спецов по STM! Я в программировании контроллеров новичок, но есть желание поковыряться в этом направлении. У меня возникла идея использовать stm8s105k6 для разговора через локальную сеть. Для соединения с локалкой есть ethernet платка 28j60. На форумах я прочитал, что можно звук передавать напрямую по UDP и для этого процессоров мощных не надо, сгодится и stm8.
У меня несколько вопросов:
1. Как прикрутить микрофон и динамик к контроллеру?
2. Как оцифрованный звук упаковать в UDP пакеты и передать их по сети?
3. Что использовать для обработки переданных пакетов в браузере на компе?
Может быть кто-нибудь занимался подобной задачей на stm8 помогите, пожалуйста, или пните в нужном направлении.
Заранее благодарен за любую помощь.
Re: Программирование STM8
Добавлено: Вт май 26, 2015 10:40:14
axillent
Путаетесь в показаниях) если звук передавать на комп то зачем нужен динамик?
Для подключения микрофона я бы взял аналоговый микрофонный усилитель с АРУ, который бы на выходе давал амплитуду близкую к VCC
Этот сигнал подать на любой вход с АЦП
Stm8 врядли вы сможете применить технологию сжатия, на програмное кодирование может не хватить ресурсов и производительности, максимум сможете использовать не сжатый WAV
Лучше конечно использовать специализированный чип для кодирования в PCM или mpeg3
И с тем и с другим браузер умеет работать если правильно оформите HTTP хидер
Только это будет tcp а не udp
Re: Программирование STM8
Добавлено: Вт май 26, 2015 11:08:54
vash_sa
Устройство на stm8 будет стоять отдельно. Через него планируется разговаривать с диспетчерской. Своего рода переговорное устройство. Поэтому динамик нужен для общения. К устройству сетевой кабель и в роутер к диспетчерам. Для разборки имеются старые домофонные панели. Из них можно взять микрофон и динамик.
vash_sa писал(а):Лучше конечно использовать специализированный чип для кодирования в PCM или mpeg3
Можете что-нибудь порекомендовать?
vash_sa писал(а):И с тем и с другим браузер умеет работать если правильно оформите HTTP хидер
А можно файлик с примером, как это сделать? Скиньте в ЛС, пожалуйста.
vash_sa писал(а):Только это будет tcp а не udp
Это даже лучше. Я по tcp сделал примитивную страницу сайта. И отсылаю ее по сети диспетчерам.
примера нет. надо открыть документацию по mime types и корректно прописать хидер
Re: Программирование STM8
Добавлено: Вт май 26, 2015 12:03:13
vash_sa
Спасибо! На stm32 я плату не сделаю.
Попробую поискать VS1053. А она может как кодировать, так и декодировать?
vash_sa писал(а):открыть документацию по mime types и корректно прописать хидер
А это где? Если можно поподробней.
Re: Программирование STM8
Добавлено: Вт май 26, 2015 12:12:48
a5021
vash_sa писал(а):А можно файлик с примером, как это сделать? Скиньте в ЛС, пожалуйста.
Мне кажется у вас завышенные ожидания. Исходите лучше из того, что писать придется все самостоятельно, долго и муторно, причем, совсем не факт, что в конце ждет успех. По любому, затраты на разработку окажутся таковы, что проще будет в несколько рядов кабели до этой диспетчерской протянуть и поставить аналоговые переговорники.