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

Микроконтроллеры семейства PIC

Вопрос   Каковы особенности внутренней работы PIC'ов с данными ?

Ответ  Ответ: Наверх [Вернуться в категорию "Микроконтроллеры семейства PIC"]
Небольшое предисловие: употребляемые далее формулировки типа "нечто _может_ произойти" ("значение _может_ измениться") отнюдь не означают какой-то случайности этого события, все полностью предсказуемо, но оговаривать в каждом случае влияющие факторы было бы излишним (чаще всего это pull-up или pull-down на соответствующем выводе). В документации (параграф "Выполнение команд") указывается, что после чтения и декодирования команды производится чтение байта данных, АЛУ выполняет требуемую операцию, затем результат записывается по требуемому адресу (W или адрес операнда). То есть _все_ операции над данными выполняются как "чтение-модификация-запись" (read-modify-write, далее в этом пункте - RMW), даже если одно или два из этих трех элементарных действий излишни в каком-то конкретном случае. Естественно, в АЛУ используются только те данные, которые реально нужны для этой команды. Так например, для команды "movwf PCLATH" безразлично старое значение PCLATH. Конечно, такой подход приводит к выполнению "бесполезных" действий, однако не замедляет работу, так как те узлы, которые выполняют эти "бесполезные" действия все равно никак не могли бы помочь в выполнении действий "полезных". А реализацию процессора это существенно упрощает. Hо иногда RMW приводит к некоторым неочевидным эффектам. Так, например, команда "tstf XXX" (которая на самом деле "movf XXX,f", то есть "пересылка из XXX в XXX") действительно выполнит запись в XXX. Конечно, в большинстве случаев это ни на чем не отражается, но для некоторых регистров бывает важен сам факт записи. Таковы, например, TMR0 и PCL. Иногда к неочевидным последствиям может привести не запись, а чтение данных. Похоже, что именно это (чтение в неподходящий момент, сам _факт_ чтения) является первопричиной некоторых ошибок, отраженных в errata. При работе с портами важен не факт чтения, а само прочитанное значение в сочетании с последующей записью. Это может давать отмеченый в документации побочный эффект (возможное изменение содержимого бита регистра данных порта, если соответствующий вывод настроен как вход). При чтении документации этот момент кажется очевидным и не всегда запоминается как источник возможной ошибки. А источник коварный. Ситуации "тут работаем с одним битом порта, а десятью строками выше (или ниже) - с другим, причем забыв о RMW" отслеживаются легко. Hо то же самое может произойти и при обработке прерывания, если оно использует [другие] биты того же порта. Hапример, такой участок кода (команды переключения страниц опущены): clrf TRISB bcf PORTB,0 ; выход, состояние '0' (важно что _известное_) Part1: ... ; что-то делаем, но RB0 не трогаем bsf TRISB,0 ; RB0 в hi-Z, но его буфер по-прежнему '0' Part2: ... ; здесь нет обращений к PORTB bcf TRISB,0 ; надеемся получить на RB0 уровень '0' Если во время исполнения фрагмента Part2 произойдет прерывание, изменяющее какой-либо бит в PORTB (кроме нашего RB0, разумеется), то после "bcf TRISB,0" сигнал на выводе RB0 вполне может оказаться '1' (зависит от внешних цепей). В частности, фрагмент Part2 может быть и пустым (непосредственно за bsf следует bcf), что создает ничем не обоснованную иллюзию, что между bsf и bcf "ну вообще нет никаких обращений к PORTB". Да, такая необходимость переключать вывод из hi-Z непосредственно в _требуемое_ состояние возникает не очень часто (обычно при эмуляции открытого коллектора при реализации I2C master), но иногда это бывает нужно. Очевидно, что для обеспечения невмешательства потусторонних сил достаточно просто запретить прерывания на время от установки требуемого значения в регистре данных порта до переключения этого разряда порта в режим выхода. Cходный побочный эффект от RMW при работе с портами описан и в следующем вопросе.
[Микроконтроллеры семейства PIC]

Новости
[06/02/2019] Конференция в МГТУ им. Баумана «Технологии разработки и отладки сложных технических систем» 2019
[09/05/2018] Грандиозная майская распродажа на Gearbest!
[16/05/2017] С 15 по 17 мая в магазине Gearbest проходит грандиозный флэшсейл
[10/05/2017] Так что же такое Спиннер?
[05/12/2016] Новый Год и Рождество с GearBest!
Читать все новости >>
Каталог схем
PDA - интерфейсы и схемы Автозвук Автомобиль Аудио Безопасность Бытовая электроника Видео Видеокамеры Высоковольтные Генераторы Игры, развлечения Измерения Интерфейсы Коммутация Компьютер Медицина Моделирование/ Роботы Музыка Передатчики Питание Получение и накопление данных Предусилители Радио Разное Ремонт Ретро Свет/Лазер/ Cветодиоды/IR Сети Солнечная энергия Сотовая связь ТВ-Мониторы Телефония Управление двигателями Фильтры Цифровые/ Микроконтроллеры Electronic circuits Datasheets Каталог схем Принципиальные схемы
Мicrocontrollers
Drivers for LED dispays Data Logger for iButton LCD-module with MCS-51 Thermometers Dallas Semiconductor Work with EEPROM 24LCxx MSP430 with Flash-memory ATmega169 and AVR-Baterfly CAN interface USB interface
Избранные схемы
Arduino Аудио В Вашу мастерскую Видео Для автомобиля Для дома и быта Для начинающих Зарядные устройства Измерительные приборы Источники питания Компьютер Медицина и здоровье Микроконтроллеры Музыкантам Опасные, но интересные конструкции Охранные устройства Программаторы Радио и связь Радиоуправление моделями Световые эффекты Связь по проводам и не только... Телевидение Телефония Узлы цифровой электроники Фототехника Шпионская техника
Пользователи
Создано аккаунтов:
Сегодня: 0
Вчера: 0
Всего: 146140

Статистика:

Bet Boom
 © 2003—2024 «Электронный портал»Обр@тная связь