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

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

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

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

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

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


 
Опции темы
Непрочитано 20.05.2013, 16:54  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,761
Сказал спасибо: 2,529
Сказали Спасибо 11,750 раз(а) в 5,886 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Проблема при симуляции

pifa, предлагаю на этом закончить, ибо все уже сказано, каждый, имеющий уши - услышал разные мнения. Это полезно. Думаю, ТС читал и сделал свои выводы. Продолжение без его вопросов - просто повторения, которые ни к чему. Если кому-то было интересно или помогло - хорошо.
Реклама:
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor на форуме  
Непрочитано 20.05.2013, 16:57  
pifa
Гражданин KAZUS.RU
 
Регистрация: 26.12.2005
Сообщений: 586
Сказал спасибо: 23
Сказали Спасибо 68 раз(а) в 45 сообщении(ях)
pifa на пути к лучшему
По умолчанию Re: Проблема при симуляции

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

И как говорится:
"нет ничего более постоянного, чем что-то временное".
pifa вне форума  
Непрочитано 20.05.2013, 19:52  
Арктур
Почётный гражданин KAZUS.RU
 
Аватар для Арктур
 
Регистрация: 29.10.2012
Сообщений: 3,015
Сказал спасибо: 7
Сказали Спасибо 3,494 раз(а) в 1,783 сообщении(ях)
Арктур на пути к лучшему
По умолчанию Re: Проблема при симуляции

Сообщение от pifa Посмотреть сообщение
... один мой знакомый утверждал, что на оформление программ у американцев ( в том числе и написание комментариев) уходит больше времени, чем на саму программу.
Это когда простые программы.

Сообщение от Ara41 Посмотреть сообщение
скоро полетят камни за CodeVision..и за CodeWizard в частности =)
Многие пишут и на CodeVision, и на других. Мало кто обращает на это внимание, все помогают.
Вот только безаппеляционные заявления типа: "This is the best of the best" - вызывают только недоумение.
Арктур вне форума  
Непрочитано 28.06.2013, 05:05  
Вячеслав Мезенцев
Частый гость
 
Аватар для Вячеслав Мезенцев
 
Регистрация: 11.09.2011
Адрес: Екатеринбург
Сообщений: 29
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
Вячеслав Мезенцев на пути к лучшему
По умолчанию Re: Проблема при симуляции

Сообщение от puchik006 Посмотреть сообщение
Я только в начале пути, поэтому мне даже удобней когда регистры подробно расписаны. Хотя понятно, что чем короче запись, тем лучше
Я тоже люблю, когда регистры подробно расписаны, да так подробно, что дальше некуда. Вот примеры:

https://mysvn.ru/avr/templates/ATmega16/MCU.cpp

Код:
// ADC Multiplexer Selection Register – ADMUX
// [ ADC Multiplexer Selection Register ]
//           00000000 - Initial Value
ADMUX = BIN8(00000000); // BIN8() не зависит от уровня оптимизации
//           ||||||||
//           76543210
//           |||||||+- 0, rw, MUX0:  -+ - Analog Channel Selection Bits
//           ||||||+-- 1, rw, MUX1:   |
//           |||||+--- 2, rw, MUX2:   |
//           ||||+---- 3, rw, MUX3:   |
//           |||+----- 4, rw: MUX4:  _|
//           ||+------ 5, rw, ADLAR:    - ADC Left Adjust Result
//           |+------- 6, rw, REFS0: -+ - Reference Selection Bits
//           +-------- 7, rw, REFS1: _|
// Примечание: AVCC
Вячеслав Мезенцев вне форума  
Непрочитано 28.06.2013, 19:14  
Halex07
Супер-модератор
 
Аватар для Halex07
 
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,507 раз(а) в 956 сообщении(ях)
Halex07 на пути к лучшему
По умолчанию Re: Проблема при симуляции

to Вячеслав Мезенцев, да, конечно, оно красиво и наглядно. Между прочим очень часто применяется именно в SPICE при описании моделей. Если смотреть текстовку, и если редактор адекватный лучше и некуда. НО! Например, в той же пошаговой отладке окно текста программы-исходника, как правило, приходится делать ограниченного размера, а этот подробный вариант отъедает рабочее пространство, как говорится, на ура! Конечно, на первоначальном этапе это подспорье, но потом, поверьте опыту - начинает напрягать... Для себя и спецов - только необходимые комменты, подробное же разжевывание - только на этапе освоения и обучения.
Halex07 вне форума  
Непрочитано 28.06.2013, 21:06  
Вячеслав Мезенцев
Частый гость
 
Аватар для Вячеслав Мезенцев
 
Регистрация: 11.09.2011
Адрес: Екатеринбург
Сообщений: 29
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
Вячеслав Мезенцев на пути к лучшему
По умолчанию Re: Проблема при симуляции

У меня тут целая тема есть по поводу "красивости и наглядности" такого подхода: Шаблоны проектов на C++ для AVR [GCC, IAR].

Поверьте моему опыту, я пока не видел ничего у кого-то, кто бы использовал вообще какой-то стиль при программировании на C или C++ для мк. Я это сделал, во-первых, для единообразия всех проектов, во-вторых, чтобы не смотреть постоянно в datasheet.

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

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

Сообщение от Вячеслав Мезенцев Посмотреть сообщение
Поверьте моему опыту, я пока не видел ничего у кого-то, кто бы использовал вообще какой-то стиль при программировании на C или C++ для мк. Я это сделал,
Непонятно, что именно вы называете стилем. Если такое:
Код:
    #define _BV(x) ( 1 ‹‹ x )

    #define cbi(port,x) port &= ~( 1 ‹‹ x )
    #define sbi(port,x) port |= ( 1 ‹‹ x )
то этого добра у всех предостаточно. Даже странно, как это вам удалось "по своему опыту" не увидеть "ничего ни у кого".

А уж писать такое:
Код:
    // Timer/Counter 0 Control Register
    // [ Регистр управления Таймером/Счётчиком 0 ]
    //           00000000 - Initial Value
    //TCCR0 = BIN8(00000000); // BIN8() не зависит от уровня оптимизации
    //           ||||||||
    //           76543210
    //           |||||||+- 0, rw, CS00:  -+ - Управление тактовым сигналом
    //           ||||||+-- 1, rw, CS01:   |
    //           |||||+--- 2, rw, CS02:  _|
    //           ||||+---- 3, rw, WGM01: -+ - Waveform Generation Mode
    //           |||+----- 4, rw, COM00: -+ - Compare Match Output Mode
    //           ||+------ 5, rw: COM01  _|
    //           |+------- 6, rw, WGM00:    - Waveform Generation Mode
    //           +-------- 7, w, FOC0:      - Force Output Compare
так и вовсе непрактично - вы просто переносите в текст кусок даташита, вместо того, чтобы хоть как-то автоматизировать свою работу. Ну, написали вы себе:
Код:
    //           |||||||+- 0, rw, CS00:  -+ - Управление тактовым сигналом
    //           ||||||+-- 1, rw, CS01:   |
    //           |||||+--- 2, rw, CS02:  _|
а дальше что - снова лезть в ДШ, чтобы вспомнить, каким сочетаниям этих трех бит какие величины прескейлера соответствуют? Не слишком полезный "стиль", на мой взгляд.

Сообщение от Halex07 Посмотреть сообщение
Если смотреть текстовку, и если редактор адекватный лучше и некуда.
Ну, отчего же "некуда"?
__________________
There's always more than one way to skin a cat.
tempora вне форума  
Непрочитано 29.06.2013, 00:06  
Вячеслав Мезенцев
Частый гость
 
Аватар для Вячеслав Мезенцев
 
Регистрация: 11.09.2011
Адрес: Екатеринбург
Сообщений: 29
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
Вячеслав Мезенцев на пути к лучшему
По умолчанию Re: Проблема при симуляции

Просто для этого конкретного случая в этом шаблоне не приведена табличка, для многих других подобных случаев такие таблички приведены, в том же файле выше могли бы увидеть:

Код:
    // [ATmega16] Table. Clock Select Bit Description
    // +----+----+----+-----------------------------------------------------------------+
    // |CSn2|CSn1|CSn0| Description                                                     ¦
    // +----+----+----+-----------------------------------------------------------------+
    // | 0  | 0  | 0  | No clock source. (Таймер/счетчик остановлен)                    |
    // | 0  | 0  | 1  | clkI/O/1    (No prescaling)                                     |
    // | 0  | 1  | 0  | clkI/O/8    (From prescaler)                                    |
    // | 0  | 1  | 1  | clkI/O/64   (From prescaler)                                    |
    // | 1  | 0  | 0  | clkI/O/256  (From prescaler)                                    |
    // | 1  | 0  | 1  | clkI/O/1024 (From prescaler)                                    |
    // | 1  | 1  | 0  | Вывод Тn, счет осуществляется по спадающему фронту импульсов    |
    // | 1  | 1  | 1  | Вывод Тn, счет осуществляется по нарастающему фронту импульсов  |
    // +----+----+----+-----------------------------------------------------------------+

    // Timer/Counter1 Control Register B
    // [ Регистр управления B Таймером/Счётчиком 1 ][ATmega16]
    //            00000000 - Initial Value
    //TCCR1B = BIN8(00000000); // BIN8() не зависит от уровня оптимизации
    //            ||||||||
    //            76543210
    //            |||||||+- 0, rw, CS10:  -+ - Управление тактовым сигналом
    //            ||||||+-- 1, rw, CS11:   |
    //            |||||+--- 2, rw, CS12:  _|
    //            ||||+---- 3, rw, WGM12: -+ - Режим работы таймера/счетчика
    //            |||+----- 4, rw, WGM13: _|
    //            ||+------ 5, r: 0          - зарезервирован, должен быть установлен в 0 при записи
    //            |+------- 6, rw, ICES1:    - Выбор активного фронта сигнала захвата
    //            +-------- 7, rw, ICNC1:    - Управление схемой подавления помех блока захвата
    // Примечание:
При написании очередного проекта мне приходилось постоянно переключаться между datasheet'ом и кодом, несколько лет назад это меня в конец достало, с тех пор как я сделал эти шаблоны, такое обращение на порядок уменьшилось. Это большое удобство. Банальную распиновку забываю и постоянно нужно pdf грузить, чтобы её вспомнить, больше я этого не делаю, т.к. распиновка также приложена к нужному методу прямо в коде PortsInit().

Не знаю что вы конкретно понимаете под автоматизацией, но у меня сборка проекта полностью автоматизирована, включая автоматическую генерацию версии прошивки (причём для двух компиляторов сразу: gcc и iar). Что касается кода, то пишу я в VS2008/2010, где плагины также полностью автоматизируют работу с кодом. Автоматизированней - дальше некуда, я даже классы могу сам не писать, они по UML сами формируются.

Под стилем я понимаю следование некоторым общим правилам по типу "Совершенного кода" Макконнелла, где, кстати, есть рекомендация по этому моему стилю: Комментируйте флаги до уровня отдельных битов (32.4. Советы по эффективному комментированию, стр. 785 русского издания).

Общие правила - это состав проекта, его сборка, используемые классы и т.д., т.е. не то, как я макросы конкретные пишу, а начиная с гораздо более верхнего уровня, включая UML. Все проекты в теме про шаблоны единообразны по составу, отличие только в тех кусках кода на C или ассемблере, которые я включаю для расширения функционала.

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

Более полное описание моего подхода я привёл на электрониксе: Шаблоны проектов на C++ для AVR [GCC, IAR].
Миниатюры:
Нажмите на изображение для увеличения
Название: Tetris, рис. 2.png
Просмотров: 59
Размер:	261.6 Кб
ID:	48685  
Вячеслав Мезенцев вне форума  
Непрочитано 29.06.2013, 02:42  
tempora
Почётный гражданин KAZUS.RU
 
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
tempora на пути к лучшему
По умолчанию Re: Проблема при симуляции

Сообщение от Вячеслав Мезенцев Посмотреть сообщение
... для многих других подобных случаев такие таблички приведены
Смысл вопроса от этого не меняется - чего ради столько труда, если результат только в переносе ДШ из одного места в другое? В чём польза от затраченных усилий, какой в них смысл?

Сообщение от Вячеслав Мезенцев Посмотреть сообщение
мне приходилось постоянно переключаться между datasheet'ом и кодом, несколько лет назад это меня в конец достало,
Судя по всему, не особенно и достало.

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

Сообщение от Вячеслав Мезенцев Посмотреть сообщение
Под стилем я понимаю следование некоторым общим правилам по типу "Совершенного кода" Макконнелла, где, кстати, есть рекомендация по этому моему стилю: Комментируйте флаги до уровня отдельных битов
Вот откуда ноги растут! Вы неправильно поняли посыл МакКоннела - он же написал про флаги, а не про регистры!

Если логически продолжить такие "рекомендации", то можно дойти и до такого:
Код:
int iYear = BIN16(0000011111011101);
    //            FEDCBA9876543210
    //            ||||||||||||||||
    //            |||||||||||||||+- бит 0 целого числа,
    //            ||||||||||||||+-- бит 1 целого числа,
    //            |||||||||||||+--- бит 2 целого числа,
    //            ||||||||||||+---- бит 3 целого числа,
    //            |||||||||||+----- бит 4 целого числа,
    //            ||||||||||+------ бит 5 целого числа,
    //            |||||||||+------- бит 6 целого числа,
    //            ||||||||+-------- бит 7 целого числа,
    //            ...
Но, слава богу, никто не собирает порядковый номер года из шестнадцати отдельных бит. По крайней мере - обычно не собирают...

Мало того, что вы себе добавили писанины, не упростив дальнейшую работу, так вы ещё и, как в той же книге пишет McConnell, усложнили жизнь тем, кто будет с этим иметь дело позже:
Цитата:
It merely gives the reader of the code more to read without providing additional information.

Давайте читать написанное немного внимательнее. Итак, имеем:
Цитата:
If a variable is used as a bit field, document the meaning of bit.
И далее иллюстрация:

Совершенно очевидно, что битовые поля интересны не составом отдельных бит, а целиком - как целые числа. Нам совершенно неважно знать какие биты установлены в поле 'kind of error', нас интересует весь код ошибки в целом, что там - 0, 1, 2 или 3? И записывать будем 0, 1, 2 или 3, и сравнивать с 0, 1, 2 или 3.

Практический пример - определите для прескейлера таймера его возможные величины:
Код:
так:
#define T0NoClk        (0)
#define T0SClk         (                      1‹‹CS00 )
#define T0SClkBy8      (           (1‹‹CS01)          )
#define T0SClkBy32     (           (1‹‹CS01)|(1‹‹CS00))
#define T0SClkBy64     ((1‹‹CS02)                     )
#define T0SClkBy128    ((1‹‹CS02)|           (1‹‹CS00))
#define T0SClkBy256    ((1‹‹CS02)| (1‹‹CS01)          )
#define T0SClkBy1024   ((1‹‹CS02)| (1‹‹CS01)|(1‹‹CS00))

или так (мне так меньше нравится):
#define T0NoClk        0
#define T0SClk         1
#define T0SClkBy8      2
#define T0SClkBy32     3
#define T0SClkBy64     4
#define T0SClkBy128    5
#define T0SClkBy256    6
#define T0SClkBy1024   7
и тогда такой оператор
Код:
        TCCR0 = T0SClkBy32;
уже не потребует не только обращения к ДШ, но даже обращения к заголовочному файлу! И править в таком операторе частоту тактирования таймера тоже будет принципиально проще, чем с той развеститой клюквой, где зачем-то расписаны отдельные биты одного числа.

Еще пример:
Код:
header file:
// Spi Control Register bit fields:
#define   SPISCKby4   (0)
#define   SPISCKby16  (          (1‹‹SPR0))
#define   SPISCKby64  ((1‹‹SPR1)          )
#define   SPISCKby128 ((1‹‹SPR1)|(1‹‹SPR0))

#define   SPI_MODE0   (0‹‹_CPHA)
#define   SPI_MODE1   (1‹‹_CPHA)
#define   SPI_MODE2   (2‹‹_CPHA)
#define   SPI_MODE3   (3‹‹_CPHA)
...
source file:
    /* Enable SPI, Master, set clock rate fck/16 */
    SPCR = SPI_MASK | (SPI_MODE3) | (SPISCKby16);

Теперь, чтобы поменять режим или скорость передачи по SPI-интерфейсу, не придётся открывать ни ДШ, ни даже заголовочный файл!
И заметьте, при этом:
- не нужно вычислять, из каких бит складывается требуемая величина прескейлера - это за нас сделает компилятор,
- не нужно вычитывать из ДШ значение прескейлера для того числа, что мы пишем в битовое поле - это значение присутствует прямо в тексте, в явном виде,
- нет нужды в таком пространном тексте, как в ваших примерах, оно и читать легче, и листать, и отлаживать.

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

Кстати, компилятор столь же мудро поступает по отношению к процессору - всё, что можно сосчитать на этапе компиляции, он обращает в константу, а не грузит процессор всякой чепухой.
__________________
There's always more than one way to skin a cat.

Последний раз редактировалось tempora; 29.06.2013 в 02:46.
tempora вне форума  
Непрочитано 29.06.2013, 03:45  
Вячеслав Мезенцев
Частый гость
 
Аватар для Вячеслав Мезенцев
 
Регистрация: 11.09.2011
Адрес: Екатеринбург
Сообщений: 29
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
Вячеслав Мезенцев на пути к лучшему
По умолчанию Re: Проблема при симуляции

Цитата:
Мало того, что вы себе добавили писанины, не упростив дальнейшую работу, так вы ещё и, как в той же книге пишет McConnell, усложнили жизнь тем, кто будет с этим иметь дело позже
Это не так. Как я уже сказал, шаблон делается один раз. Поэтому затраченные усилия окупаются с каждым новым применением шаблона всё больше.

Комментирование объявлений данных (стр. 784, там же)
Комментарий объявления переменной описывает аспекты переменной, которые невозможно выразить в её имени. Тщательно документировать данные важно...

Любые регистры конфигурации я отношу к флаговым регистрам, то, что они объявлены в системных заголовочных файлах и находятся в специальной области ОЗУ, не имеет значения в данном случае и с точки зрения комментирования назначения их полей я совершенно справедливо отношу совет из книги к этим регистрам. Это очевидно.

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

Цитата:
Совершенно очевидно, что битовые поля интересны не составом отдельных бит, а целиком - как целые числа.
В регистрах конфигурации как целые числа в AVR они не интересны. В моём случае очень важно знать что именно установлено, т.к. это может отключать или подключать целые узлы периферии мк. Именно поэтому расписываются все биты, чтобы при поиске ошибок начальной конфигурации ты совершенно точно был уверен, что нужный бит в нужном регистре установлен или сброшен.

Цитата:
Если логически продолжить такие "рекомендации", то можно дойти и до такого
Зачем же утрировать? Для 16 бит это выглядит вот так (ADSP). Около 9 лет назад я программировал DSP процессоры, всё делалось на ассемблере, а я захотел использовать C для этих целей и начал экспериментировать с комментироваем настроек периферии DSP, в отличие от AVR там всё 16-битное. В то время меня очень сильно занимал вопрос правильной начальной конфигурации, т.к. в отличие от мк информации там на порядок больше и всего не упомнить, поэтому я переносил всё в код и максимально подробно. Это мои первые шаги в этом направлении, я уже давно нахожу такой способ удобным.

Код:
// сохраняем текущий регистр страницы памяти ввода-вывода
 nSaved_IOPG = sysreg_read(sysreg_IOPG);

// Переходим на страницу таймеров
 sysreg_write(sysreg_IOPG, Timer_Page);

// Регистр конфигурации таймера Таймера 0

// Режим PWMOUT, активный уровень положительный, счетчик считает до конца периода,
// разрешена генерация прерывания, выбран вывод таймера
 asm("%0 = b#0000000000011101;" : "=g"(value) : );
//           ||||||||||||||||
//           ||||||||||||||++--------- TMODE (Режим таймера): 00 - перезагрузка (не испольуется),
//           ||||||||||||||					01 - PWM_OUT, 10 - WDTH_CAP, 11 - EXT_CLK;
//           |||||||||||||+----------- PULSE_HI: 1 - активный высокий, 0 - активный низкий;
//           ||||||||||||+------------ PERIOD_CNT: 1 - счётчик периода, 0 - счётчик длительности;
//           |||||||||||+------------- IRQ_ENA (Разрешить запрос прерывания): 1 - разрешить, блокировать;
//           ||||||||||+-------------- TIN_SEL (Выбор входа таймера): 1 - RXD, 0 - TMR0
//           |||||||||+--------------- |
//           ||||||||+---------------- |
//           |||||||+----------------- |
//           ||||||+------------------ | \
//           |||||+------------------- | - Зарезервированы
//           ||||+-------------------- | /
//           |||+--------------------- |
//           ||+---------------------- |
//           |+----------------------- |
//           +------------------------ |
 io_space_write (T_CFGR0, value);

// Регистр младшего слова длительности импульса Таймера 2
 value = 0xACD8;
 io_space_write (T_WLR2, value);

// Регистр общего состояния и управления таймерами
 asm("%0 = b#0000010100000000;" : "=g"(value) : );
//           ||||||||||||||||
//           |||||||||||||||+--------- TIMIL0 (фиксация прерывания таймера 0) для сброса надо записать 1 (выход)
//           ||||||||||||||+---------- TIMIL1 (фиксация прерывания таймера 1) для сброса надо записать 1 (выход)
//           |||||||||||||+----------- TIMIL2 (фиксация прерывания таймера 2) для сброса надо записать 1 (выход)
//           ||||||||||||+------------ Зарезервирован
//           |||||||||||+------------- OVF_ERR0 (переполнение/ошибка таймера 0) для сброса надо записать 1 (выход)
//           ||||||||||+-------------- OVF_ERR1 (переполнение/ошибка таймера 1) для сброса надо записать 1 (выход)
//           |||||||||+--------------- OVF_ERR2 (переполнение/ошибка таймера 2) для сброса надо записать 1 (выход)
//           ||||||||+---------------- Зарезервирован
//           |||||||+----------------- TIMEN0	(включение таймера 0)	для включения надо записать 1
//           ||||||+------------------ TIMDIS0	(выключение таймера 0)	для выключения надо записать 1
//           |||||+------------------- TIMEN1	(включение таймера 1)	для включения надо записать 1
//           ||||+-------------------- TIMDIS1	(выключение таймера 1)	для выключения надо записать 1
//           |||+--------------------- TIMEN2	(включение таймера 2)	для включения надо записать 1
//           ||+---------------------- TIMDIS2	(выключение таймера 2)	для выключения надо записать 1
//           |+----------------------- Зарезервирован
//           +------------------------ Зарезервирован
 io_space_write (T_GSR2, value);

Цитата:
Практический пример - определите для прескейлера таймера его возможные величины:
Ну хоть что-то полезного я добился. Ваш вариант мог бы стать вторым этапом для меня по усовершенствованию своих шаблонов. Если посмотреть мои проекты по ссылкам, то можно там заметить, что такое подробное описание регистров я делаю только на этапе инициализации контроллера, т.е. в различных функциях Init(), в рабочем же коде я использую объединённые идентификаторы битов.

Вот пример из класса CConsole:
Код:
void CConsole::PutChar( uint8_t ch, EnCodePage CodePage ) {

    // ждем окончания передачи предыдущего байта
    while ( !( UCSRA & ( 1 ‹‹ UDRE ) ) );

	// send character
    switch ( CodePage ) {

        case cp866: {

            UDR = ch;
            break;
        }

        case cp1251: {

            UDR = ( ch & 0x80 ) ? CP1251_TO_CP866[ ch & 0x7F ] : ch;
            break;
        }

    }

    // wait for char to be send
    while ( !( UCSRA & ( 1 ‹‹ TXC ) ) );

	UCSRA &= ~( ( 1 ‹‹ TXC ) || ( 1 ‹‹ UDRE ) );

}

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

Вы же в курсе, что таблицы, по которым построен ваш код, отличаются для разных мк? Поэтому я специально везде добавляю в комментариях к какому типу мк это описание относится. У меня это написано буквально к каждому регистру. Это сделано для предотвращения copy-paste.

Вот я захочу сейчас скопировать ваш код и думай и гадай к какому мк он относится. Поэтому опасно размещать такой отрывок кода, без дополнительного описания целевого мк. Народ в интернетах возьмёт, скопирует, вставит, а потом будет спрашивать: что-то у меня деление не такое, а некоторые ещё будут говорить, что код не соответствует таблице для его мк.

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

Закладки
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема симуляции схемы в Протеусе Dtolok Proteus 5 22.01.2013 21:48
Проблема с помехами на новом компе Ан-162 Ремонт оргтехники 127 01.10.2012 12:10
Задержки при плавной регулировке. Диммер с ДУ mr_smit Микроконтроллеры, АЦП, память и т.д 78 25.03.2011 00:55
Проблема при использовании модуля передачи через оптоволокно. NikWik_ Микроконтроллеры, АЦП, память и т.д 6 30.05.2010 09:35
Проблема при чтении аудио данных c SD карты IgorAVR2 Микроконтроллеры, АЦП, память и т.д 13 11.08.2008 01:31


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


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