Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 24.09.2012, 22:09  
tempora
Почётный гражданин KAZUS.RU
 
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
tempora на пути к лучшему
По умолчанию Re: FAQ по STM8

Ох, Yurkin2007, ну, зачем так спешить?

Сообщение от Yurkin2007 Посмотреть сообщение
...старшие 4 бита регистра AWUTB зарезервированы, и по правилам хорошего тона туда не надо ничего писать....

Именно!!! Однако же, пишут товарисчи из СГС-Томсона:
  • AWU-›TBR &= (uint8_t)(~AWU_TBR_AWUTB); // ~AWU_TBR_AWUTB ≡ ~0x0F ≡ 0b11110000 !!!


Сообщение от Yurkin2007 Посмотреть сообщение
При этом состояние зарезервированных старших битов не изменяется.
Не изменяется только потому, что их там нет!
Если в следующей ревизии там что-то появится, этот код будет писать в это "что-то" сначала единицы, потом - нули.


Сообщение от Yurkin2007 Посмотреть сообщение
То же самое и для регистра AWU_APR ...
Именно - то же самое (с точностью до количества бит):
  • AWU-›APR &= (uint8_t)(~AWU_APR_APR); // ~AWU_APR_APR ≡ ~0x3F ≡ 0b11000000 !!!

А вот младшие биты, в которые второй строкой вписываются целевые значения, сначала обнуляются (я именно об этом писал, вообще-то) - большой в этом смысл?

В остальном - всё пишете верно.
Реклама:
__________________
There's always more than one way to skin a cat.

Последний раз редактировалось tempora; 24.09.2012 в 22:38.
tempora вне форума  
Непрочитано 25.09.2012, 00:19  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от tempora Посмотреть сообщение
этот код будет писать в это "что-то" сначала единицы, потом - нули.
Оператор &= не является просто оператором присвоения. Сначала с содержимым регистра AWU-›TBR и константой 0b11110000 производится побитовый AND, а затем результат помещается обратно в регистр. Очевидно, что в результате этого старшие 4 бита останутся без изменения, а младшие занулятся.

В следующей строке оператор |= сначала производит побитовое ИЛИ содержимого регистра сo значением Time Base в виде 0b0000xxxx. При этом опять же старшие биты не изменяются, а в младших устанавливаются единички в нужных местах. Результат засылается обратно в регистр.

Если в последующих версиях STM8S будут запользованы старшие биты регистра AWU-›TBR, то этот кусок программы будет корректно записывать Time Base для AWU.

Последний раз редактировалось Yurkin2007; 25.09.2012 в 00:28.
Yurkin2007 вне форума  
Непрочитано 25.09.2012, 00:43  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: FAQ по STM8

Когда особых требований к оптимизации кода нет, я голосую за читаемость. С этими библиотеками читаемость кода просто превосходная. Пробежал глазами и сразу понял, что и как работает. А ваши битовые преобразования в основном коде вам одному понятны. Да и не вспомните через неделю, чего там навертели.
Easyrider83 вне форума  
Непрочитано 25.09.2012, 00:52  
tempora
Почётный гражданин KAZUS.RU
 
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
tempora на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от Yurkin2007 Посмотреть сообщение
Оператор &=
Фу, чёрт, по инерции проскочил и не заметил, что оператор-то И, а не ИЛИ (я ж о других битах говорил исходно) - прошу пардону! Однако, вопрос, касавшийся действующих бит, а не отсуствующих ("нафига, перед записью четырех бит, их очищать?") остается без ответа - зачем сначала в биты пишутся нули, а затем правильное значение?:
Код:
void AWU_Init(AWU_Timebase_TypeDef AWU_TimeBase)
{
    /* Set the TimeBase */
    AWU-›TBR &= (uint8_t)(~AWU_TBR_AWUTB);
    AWU-›TBR |= TBR_Array[(uint8_t)AWU_TimeBase];
    /* Set the APR divider */
    AWU-›APR &= (uint8_t)(~AWU_APR_APR);
    AWU-›APR |= APR_Array[(uint8_t)AWU_TimeBase];
}
Мне именно этот компот и не нравился, если только нет какой-то причины, о которой я пока ничего в документации не нашел.
Так вот - есть причина, или это перегибы индусов?
__________________
There's always more than one way to skin a cat.
tempora вне форума  
Непрочитано 25.09.2012, 00:56  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от Easyrider83 Посмотреть сообщение
А ваши битовые преобразования в основном коде вам одному понятны.
Дык, мы как раз и обсуждаем код из Ваших любимых библиотек. Так сказать, содержимое библиотечных .с-файлов ...
Yurkin2007 вне форума  
Непрочитано 25.09.2012, 01:01  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от tempora Посмотреть сообщение
зачем сначала в биты пишутся нули
Это самый простой и очевидный способ записать, например, число 0b00001101 в регистр, содержимое которого в текущий момент равно 10100001. В результате этих двух строк будем иметь 10101101.
А как можно по-другому? Можете привести пример?
Yurkin2007 вне форума  
Непрочитано 25.09.2012, 01:09  
tempora
Почётный гражданин KAZUS.RU
 
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
tempora на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от Easyrider83 Посмотреть сообщение
я голосую за читаемость.
Я тоже, но дело в том, что эти две цели достижимы одновременно. Не всегда, но часто.
И в данном случае - без особого труда. Скажем, перестраховка от записи зарезервированных бит обычно делается очисткой их в записываемом значении, а не в регистре. Далее - вместо того, чтобы передавать в функцию не значение параметра, а индекс в массив, где хранятся все возможные его значения, проще всё же передавать именно сам параметр - и он, и индекс всё равно задефайнены "говорящим" именем, так что читаемость одинаковая, зато, не нужно тратить клоки на доставание из массива и байты на хранение всех (часто, не используемых) значений - вот сразу и код сократится, и читаемость, как минимум, не ухудшится (улучшиться может - строк-то меньше будет, как и манипуляций с индексом и массивом).
А с "не вспомнится через неделю" не соглашусь. Ну, что тут сложного-то? :
Код:
// Spi Control Register bit fields:
#define   SPISCKby4   (0)
#define   SPISCKby16  (1)
#define   SPISCKby64  (2)
#define   SPISCKby128 (3)

#define   SPI_MODE0   (0‹‹_CPHA)
#define   SPI_MODE1   (1‹‹_CPHA)
#define   SPI_MODE2   (2‹‹_CPHA)
#define   SPI_MODE3   (3‹‹_CPHA)
...
    /* Enable SPI, Master, set clock rate fck/16 */
    SPCR = SPI_MASK|(SPI_MODE3)|(SPISCKby16);
Имена функций, в таком случае, тоже можно забыть.
__________________
There's always more than one way to skin a cat.
tempora вне форума  
Непрочитано 25.09.2012, 01:21  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от tempora Посмотреть сообщение
перестраховка от записи зарезервированных бит обычно делается очисткой их в записываемом значении, а не в регистре.
Я понимаю Ваши затруднения.
Ну, хорошо, очистили записываемое значение, получили 0b0000xxxx.
А дальше что? Неужели AWU-›TBR = 0b0000xxxx ?
Yurkin2007 вне форума  
Непрочитано 25.09.2012, 01:22  
tempora
Почётный гражданин KAZUS.RU
 
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
tempora на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от Yurkin2007 Посмотреть сообщение
Можете привести пример?
Разумеется:
Код:
void AWU_Init(AWU_Timebase_TypeDef AWU_TimeBase)
{
...
    /* Set the TimeBase */
    AWU-›TBR =
        (
          AWU-›TBR  &  ((uint8_t)(~AWU_TBR_AWUTB))
        )
        | TBR_Array[(uint8_t)AWU_TimeBase];
...
}
Ненужной записи нулей здесь нет. И никаких затруднений.
__________________
There's always more than one way to skin a cat.
tempora вне форума  
Непрочитано 25.09.2012, 01:26  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: FAQ по STM8

Бьюсь об заклад - Вы меня разыгрываете !
Не, правда, очень смешно !
Yurkin2007 вне форума  
 

Закладки

Метки
arm, cortex, stm32, stm8
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импульсная зарядка для авто-аккумуляторов (новодел) Falconist Источники питания и свет 1915 14.03.2024 19:56
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
STM8(S/L), первые впечатления kison STM8 1423 19.05.2018 19:23
Вопросы и замечания по топику - FAQ по PROTEUS avr123-nm-ru Proteus 291 05.06.2015 20:49
FAQ Импульсный трансформатор alberio Источники питания и свет 87 13.11.2012 18:07


Часовой пояс GMT +4, время: 06:28.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot