Программирование STM8

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Программирование STM8

Сообщение oleg110592 »

но это почему-то никого не возбуждает

а жаль - должно бы

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

EXTI_CR1_PDIS = 2;

меня смущают, очень сильно, магические числа в коде - это совсем не корректная запись
Магическое число, или сигнатура — целочисленная константа, используемая для однозначной идентификации ресурса или данных. Такое число само по себе не несёт никакого смысла, и может вызвать недоумение, встретившись в коде программы без соответствующего контекста или комментария, при этом попытка изменить его на другое, даже близкое по значению, может привести к абсолютно непредсказуемым последствиям. По этой причине подобные числа были иронично названы магическими.


Так писать нельзя. Это ошибка. Вы, похоже, не понимаете смысл битовых полей

почему?
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

...а беретесь судить(с)

на всякий случай листинг SDCC:

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

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
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

oleg110592 писал(а):меня смущают, очень сильно, магические числа в коде - это совсем не корректная запись
EXTI->CR1 |= EXTI_CR1_PDIS;

А вот это не магические, да? Это еще хуже. Там хоть было видно значение, которое идет в регистр, а здесь надо сначала посмотреть чему численно равно определение а потом уже даташит листать, что все это вообще значит. В таком формате добавляется еще один этап магии, по сравнению с предыдущим.

на всякий случай листинг SDCC:

На всякий случай, когда речь шла о битовых определениях от иара, пихать без предупреждения запись в формате определений SPL это офигенно продвинутая идея.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Программирование STM8

Сообщение oleg110592 »

a5021 писал(а):А вот это не магические, да?

и где в строке "EXTI->CR1 |= EXTI_CR1_PDIS;" хоть одно число? Все в делается по человечески в дефайнах.
...с помощью директивы препроцессора #define, выражениям можно придать более приятный вид.
Директива #define используется для присваивания символических имен константам и для макроопределений. Использование символических имен делают программу более модифицируемой и переносимой.
Например, вы используете в тексте программы константу, и вдруг вам понадобилось изменить ее значение. Если она встречается всего в трех местах, то исправить ее можно и в ручную, а что делать, если она встречается в пятидесяти строчках? Мало того, что исправление займет много времени, так еще и ошибиться в этом случае проще простого. Здесь то, как раз и выручает директива #define. В начале программы задается символическое имя константы, которое используется по ходу программы. Если нам нужно изменить это значение, это делается всего лишь в одном месте. А перед компиляцией препроцессор сам подставит во все выражения вместо имени константы ее значение.
a5021 писал(а):На всякий случай, когда речь шла о битовых определениях от иара

Не принимайте близко к сердцу - речь шла о читаемости, наглядности и переносимости (да да!), которая у хидера от иара отсутствует - это лично мое мнение и я в праве здесь его выразить.
a5021 писал(а):Там хоть было видно значение, которое идет в регистр, а здесь надо сначала посмотреть чему численно равно определение а потом уже даташит листать, что все это вообще значит. В таком формате добавляется еще один этап магии

тут все проще - становимся мышкой на битовое определение, нажимаем правую кнопки мышки, идем по стрелке, нажимаем левую кнопку мышки - попадаем на нужный дефайн в хидере с прекрасным комментарием и даташит даже иногда можно не листать:
Изображение
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Re: Программирование STM8

Сообщение axillent »

что вышло в итоге
http://www.youtube.com/watch?v=1JAIa7OcosA

п.с. что то у меня на сайте вставка видео не работает

a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

oleg110592 писал(а):тут все проще - становимся мышкой на битовое определение, нажимаем правую кнопки мышки, идем по стрелке, нажимаем левую кнопку мышки - попадаем на нужный дефайн в хидере с прекрасным комментарием и даташит даже иногда можно не листать:

Вот я и почитал один такой "прекрасный" комментарий, предложенным замечательным способом, благо иар в соседнем окне открыт (правда, stm32):

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

/*!< EXTSEL[2:0] bits (External Event Select for regular group) */


И вот из битов, которые этот EXTSEL инициализируют, надо сначала сложить число, а потом лезть в даташит, чтобы узнать, что оно значит. Если вам такие "прекрасные" комментарии заменяют даташит, а это ракообразие и вправду кажется удобством, то нет никакого смысла продолжать данный разговор.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Программирование STM8

Сообщение 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 тоже все хорошо и тоже иногда в даташит можно не заглядывать:
Изображение
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

oleg110592 писал(а):И так продолжим рассмотрение примера по ссылке a5021:

Товарищ, вы разговариваете сам с собой. Человек по этому примеру уже разобрался и единственное, что ему было нужно -- это способ описания обработчика. Копайте ваши запятые дальше. Читайте мега-информативные коментарии вида "/*!< Bit 1 */" и делайте все, что вы там делали. Я все уже понял еще с тех времен, когда вы вектора три дня искали.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Программирование STM8

Сообщение oleg110592 »

a5021 писал(а):Товарищ, вы разговариваете сам с собой

Ошибаетесь - пишу не для одного человека. Тему читает много людей, может будет кому и интересно, а может благодаря моим заметкам кто-то не будет повторять чужие ошибки. Это же хорошо и полезно для этой темы?
Опять на личность переходим? Аргументы закончились? А понял, на публику играем. Показательный финал иаровских хидеров?
a5021 писал(а):когда вы вектора три дня искали

опять вранье, тут человек их тоже не нашел, без вас разобрались что к чему.
Поздравляю вас, гражданин, соврамши!(с)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

Олег, мы движемся в каком-то неправильном направлении. Предлагаю прекратить эту бесплодную перепалку. Если я вас чем-то задел, извините меня.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Программирование STM8

Сообщение 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. Далее понеслось. Было интересно самому разобраться - а вдруг все таки иаровские хидеры лучше, но нет эта дискуссия наоборот еще более укрепила меня в правильности принятого решения.
Вот такая, блин, музыка. Такая, блин, вечная молодость.(с)
Извиняюсь перед участниками форума за офтоп, правда чуточку тут есть по теме.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Программирование STM8

Сообщение 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 кликнуть дважды на файл, который хотим редактировать - запустится внешний редактор и откроет нужный файл. Всякие плюшки, типа нормального автодополнения должны работать.
У меня работают:
Изображение
Всем приятной и комфортной работы.
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Re: Программирование STM8

Сообщение axillent »

интересно
то у вас за редактор на скриншоте?
попробовал по вашей инструкции sublime - не работает, пытается открыть мой сишный файл из C:\windiws\system
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Программирование STM8

Сообщение oleg110592 »

sublime 2 и есть. Нашел откуда брал информацию, там варианты есть, у меня этот работает.
http://electronix.ru/forum/index.php?showtopic=27467
из документации IAR:
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).
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Re: Программирование STM8

Сообщение axillent »

сейчас обратил внимание, что sublime открывает сразу пачку пустых файлов очень похожих каждый на директорию в пути)
думаю так клинит его из за пробела в имено одной из папок в пути к проекту
поставил $FILE_PATH$ в двойные кавычки, вроже заработало

если указывать -n$CUR_LINE$ то открывается сразу два окна subime
vash_sa
Открыл глаза
Сообщения: 50
Зарегистрирован: Чт сен 04, 2014 13:22:44

Re: Программирование STM8

Сообщение vash_sa »

Приветствую спецов по STM! Я в программировании контроллеров новичок, но есть желание поковыряться в этом направлении. У меня возникла идея использовать stm8s105k6 для разговора через локальную сеть. Для соединения с локалкой есть ethernet платка 28j60. На форумах я прочитал, что можно звук передавать напрямую по UDP и для этого процессоров мощных не надо, сгодится и stm8.
У меня несколько вопросов:
1. Как прикрутить микрофон и динамик к контроллеру?
2. Как оцифрованный звук упаковать в UDP пакеты и передать их по сети?
3. Что использовать для обработки переданных пакетов в браузере на компе?
Может быть кто-нибудь занимался подобной задачей на stm8 помогите, пожалуйста, или пните в нужном направлении.
Заранее благодарен за любую помощь.
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Re: Программирование STM8

Сообщение axillent »

Путаетесь в показаниях) если звук передавать на комп то зачем нужен динамик?

Для подключения микрофона я бы взял аналоговый микрофонный усилитель с АРУ, который бы на выходе давал амплитуду близкую к VCC
Этот сигнал подать на любой вход с АЦП

Stm8 врядли вы сможете применить технологию сжатия, на програмное кодирование может не хватить ресурсов и производительности, максимум сможете использовать не сжатый WAV
Лучше конечно использовать специализированный чип для кодирования в PCM или mpeg3
И с тем и с другим браузер умеет работать если правильно оформите HTTP хидер
Только это будет tcp а не udp
vash_sa
Открыл глаза
Сообщения: 50
Зарегистрирован: Чт сен 04, 2014 13:22:44

Re: Программирование STM8

Сообщение vash_sa »

Устройство на stm8 будет стоять отдельно. Через него планируется разговаривать с диспетчерской. Своего рода переговорное устройство. Поэтому динамик нужен для общения. К устройству сетевой кабель и в роутер к диспетчерам. Для разборки имеются старые домофонные панели. Из них можно взять микрофон и динамик.
vash_sa писал(а):Лучше конечно использовать специализированный чип для кодирования в PCM или mpeg3

Можете что-нибудь порекомендовать?
vash_sa писал(а):И с тем и с другим браузер умеет работать если правильно оформите HTTP хидер

А можно файлик с примером, как это сделать? Скиньте в ЛС, пожалуйста.
vash_sa писал(а):Только это будет tcp а не udp

Это даже лучше. Я по tcp сделал примитивную страницу сайта. И отсылаю ее по сети диспетчерам.
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Re: Программирование STM8

Сообщение axillent »

на stm32 наверно можно и без внешнего чипа кодировать http://vedder.se/2012/12/stm32f4-discov ... p3-player/
для голоса конечно больше подойдет PCM, а не MP3
Для PCM не знаю что есть, для MP3 популярны VS1053

примера нет. надо открыть документацию по mime types и корректно прописать хидер
vash_sa
Открыл глаза
Сообщения: 50
Зарегистрирован: Чт сен 04, 2014 13:22:44

Re: Программирование STM8

Сообщение vash_sa »

Спасибо! На stm32 я плату не сделаю.
Попробую поискать VS1053. А она может как кодировать, так и декодировать?
vash_sa писал(а):открыть документацию по mime types и корректно прописать хидер

А это где? Если можно поподробней.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Программирование STM8

Сообщение a5021 »

vash_sa писал(а):А можно файлик с примером, как это сделать? Скиньте в ЛС, пожалуйста.

Мне кажется у вас завышенные ожидания. Исходите лучше из того, что писать придется все самостоятельно, долго и муторно, причем, совсем не факт, что в конце ждет успех. По любому, затраты на разработку окажутся таковы, что проще будет в несколько рядов кабели до этой диспетчерской протянуть и поставить аналоговые переговорники.
Ответить

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