Форум » Для начинающих. » Проблема ЧМЗ » Ответить

Проблема ЧМЗ

Алексей: У начинающих часто возникают вопросы, связанные с работой с портами контроллера. Проявляется это в непредвиденном изменении состояния одного или нескольких выводов контроллера. Очень часто данная проблема связана с непониманием работы процесса чтение\модификация\запись в приложении к работе с портами... Приведу пример, поясняющий это... В частности товарищ Galrad задал вопрос КЕА и пока не получил ответа В общем то этот пример и есть ответ на его вопрос... В качестве отладчика используется протеус, ссылка на проект в конце поста... Схема проста Увеличить ;**************************************************************************** ; Пример для понимания работы ЧМЗ и связанных с этим фокусов... ;**************************************************************************** [pre2] __config 1F01H #include <p16F627A.inc> errorlevel -302 ;============================================================================ ; Определение названия и положения регистров общего назначения. ;============================================================================ cblock 20h ; начальный адрес области данных endc ;============================================================================ ; START ;============================================================================ org 0x000 ; Вектор сброса ;============================================================================ ; Подготовительные операции ;============================================================================ START bcf STATUS, RP0 bcf STATUS, RP1 clrf PORTA clrf PORTB clrf T1CON clrf T2CON clrf CCP1CON clrf RCSTA movlw 07h movwf CMCON bcf INTCON,GIE bsf STATUS, RP0 clrf TXSTA clrf TRISA clrf TRISB movlw b'00001111' movwf OPTION_REG bcf STATUS, RP0 [/pre2] ;============================================================================ ; С этого момента пошагово выполняем программу, внимательно и с интересом ; наблюдаем за тем, что происходит в симуляторе... Получим результат не тот, ; что ожидаем! И такое происходит не только в протеусе!, но и реальном ; железе!!! ;============================================================================ [pre2]main clrf PORTB ; сброшу порт в нули чтобы bsf STATUS,RP0 ; быть уверенным что в выходных clrf TRISB ; защелках записаны 0 bcf STATUS,RP0 ; BsF PORTB,3 ; Понадобится позже... bsf STATUS,RP0 ; Теперь переключу часть выводов movlw b'01001001' ; на вход movwf TRISB ; bcf STATUS,RP0 ; bsf STATUS,RP0 ; Опять переключу порт на выход clrf TRISB ; убедиться что все пока нормально bcf STATUS,RP0 ; В ВЫХОДНЫХ ЗАЩЕЛКАХ ЧИСЛО .8!!! ; Пока проблем не наблюдается :) bsf STATUS,RP0 ; Опять переключу часть выводов movlw b'01001001' ; на вход. За счет резисторов movwf TRISB ; на этих выводах сформируется bcf STATUS,RP0 ; логический 0 или 1... ;============================================================================ ; А ТЕПЕРЬ, ВНИМАНИЕ, ФОКУС!!! Помните?, в защелках записано число .8!!! ;============================================================================ BsF PORTB,1 ; модифицирую порт бит ориентированной ; командой... По логике должен ; измениться только один 1 бит! И в ; результате должно бы получиться .10 bsf STATUS,RP0 ; Опять переключаю порт на выход clrf TRISB ; И ЧТО Я ВИЖУ В ПОРТУ? Совершенно bcf STATUS,RP0 ; не то, что ожидал... А ожидал .10 ; Даже скинулся 3 бит!!! а он был ; установлен мной ранее!!!!!!!!!! И ; я его не трогал!!! ;============================================================================ ; Что мы теперь видим в регистре PORTB? По идее должны бы видеть число ; .10... Была ведь записана .8 и в дополнение я поднял 1 бит... Что в ; в общем случае дает .10... На самом деле видим совершенно другую ; картину, .67, почему??? Причем 3 бит был поднят! а сейчас нет! ; Все дело в способе работы с регистрами в контроллере. Дело в том, ; что даже бит ориентированные команды не работают с одним единственным ; битом регистра. Сначала производится чтение из регистра, затем модификация ; всего байта, независимо от того, какая команда применяется, и только затем ; запись в регистр всех 8 бит с одним модифицированным. Вроде бы ничего ; такого, и проблем никогда с этим не возникает... Но вот такое творится ; только при работе с регистрами PORTx... И тут дело в том, что чтение ; производится исключительно с "выводов" контроллера, а вот запись производится ; в выходные защелки регистра. Т.е. получается что вместо одного регистра ; PORTx фактически имеем целых два! Один из них это выходные защелки порта, ; которые отключаются от физических выводов при работе на ВХОД. Но тем не ; менее чтение происходит "непосредственно" с выводов порта... Таким образом ; имеем, ЕСЛИ ПОРТ ХОТЯ БЫ ЧАСТИЧНО РАБОТАЕТ НА ВХОД, ЛЮБАЯ! КОМАНДА, ; ИЗМЕНЯЮЩАЯ ЗНАЧЕНИЕ РЕГИСТРА PORTX, БУДЕТ РАБОТАТЬ ТАК: ; 1. Чтение всего порта "непосредственно" с выводов контроллера ; 2. Затем его модификация. Причем не важно как мы работаем с портом! даже ; бит ориентированными командами BSF и BCF... ; 3. Ну и запись... Но запись производится не непосредственно на выводы ; порта :), а естественно в выходные защелки. ; Т.е. получается довольно тернистый путь, читаем с одного места, а пишем в ; другое... Что и может вызвать большие затруднения у начинающих программистов. ; Добавлю еще, что такая ситуация наблюдается до 16 серии включительно... За ; исключением новых контроллеров PIC16F(LF)xxxx. В них и более старших ; семействах уже введен дополнительный регистр LATx. Он и есть те самые ; выходные защелки. Чтение же порта происходит из регитра PORTx... В принципе, ; в ситуациях не связанных с ЧМЗ, без разницы к какому регистру обращаться. ; Т.о. разработчики устранили проблему ЧМЗ, но чтобы понимать и в старшем ; семействе откуда надо читать и куда писАть о проблеме ЧМЗ знать надо... ;============================================================================ goto main end[/pre2] Здесь лежит проект в протеусе, созданный специально для данного примера... Использовать в Обмене и статьях КЕА запрещено

Ответов - 68, стр: 1 2 All

igor: "Частотная составляющая", и особенно в случаях работы на максимальной Fosc, конечно же важна. Её признак - избавление от "бяки" после осуществления "врезки" NOPов, но у меня были такие случаи, что "врезки" даже десятков NOPов не помогали. Что подразумевает автор под словом "бяка"? Не пояснил. Бяка и всё. Об остальном догадайтесь. Для чего автор врезает NOPы. Не пояснил. Врезал и всё. Об остальном догадайтесь.

Алексей: Да уж, не хотел бы я по такому объяснению разбираться с ЧМЗ... Сочувствую...

Bigor: А мне кажется, что цитаты "мастера" приведенные Анатолием (medved) не столько объясняют проблему ЧМЗ, сколько запутывают её. Это пример того, как не следует объяснять ЧМЗ. Вполне вразумительно эта проблема разъяснена в данной теме в постах Алексея и В. Тимофеева (tester-а).


Bigor: Уважаемые коллеги! Многие посты этой темы, и не только этой, на прямую подсказывают "мастеру" что отвечать на вопросы задаваемые на его форуме. Он, с некоторой задержкой, переводит на свой "суконно-пламенный" язык ответы с этого форума (правда, не всегда удачно) и публикует их от своего имени на форуме имени себя. Вот такая "загагулина" получается. Хоть бы спасибо сказал.

igor: Bigor пишет: переводит на свой "суконно-пламенный" язык ответы с этого форума (правда, не всегда удачно) и публикует их от своего имени на форуме имени себя. Да и пускай пользуется. Так оно и было всегда. Только хочется пожелать автору, чтобы в этих перевода было поменьше воды и ошибок. И откуда они только берутся эти ошибки. И я придерживаюсь мнения, что "мастеру" не надо писать так уж заумно. Попроще, подоходчивей. Оно и самому понятней будет и птенцам. Но это моё мнение. Если фиксированная задержка в 3 м.ц. (3 NOPа) не помогает, то это не то, о чём идёт речь в этом сообщении, а то, чему посвящено моё предыдущее сообщение Откуда такая уверенность? Почему именно три NOPа, а не два или пять? Непонятно. Вопрос: "В одной из разбираемых мной программ обнаружил неизвестные мне ранее команды: BNZ, BC, BZ. М ожет кто разъяснит их значение?" А почему бы и нет. Не буду умничать, просто открою книжку Предко " Справочник по PIC микроконтроллерам". Там написано :.......чтобы повысить функциональную гибкость системы команд микроконтроллеров младшего и среднего подсемейств, фирмой microchip введены специальные команды (макрокоманды). [pre2] BNZ label равнозначна btfss STATUS,Z ;если результат не равен нулю goto Label ; то переход BC Label равнозначна btfsc STATUS,C ;переход при переносе goto Label BZ Label равнозначна btfsc STATUS,Z ;если результат равен нулю goto Label ; то переход[/pre2]

Алексей: "В одной из разбираемых мной программ обнаружил неизвестные мне ранее команды: BNZ, BC, BZ. М ожет кто разъяснит их значение?" Мне так непонятна, такая жгучая ненависть мастера ко всем даже макрокомандам ... ведь без них никак не обойтись... В смысле без [pre2]btfsc STATUS,Z ;если результат равен нулю goto Label ; то переход [/pre2] А раз так, откуда такая ненависть к макроопределениям?

tester: Вот от производителя (см. главу 9.10): PIC Mid-Range MCU Family Reference Manual И для ленивых на русском. Еще добавлю: кто-то тут написал, что проблема касается только бит-ориентированных команд. Это не так. Проблема актуальна для всех команд, работающих по принципу RMW (read-modify-write), т.е. для все команд, изменяющих значение содержимого регистра, кроме команд MOVWF и CLRF.

Алексей: tester пишет: кто-то тут написал, что проблема касается только бит-ориентированных команд Наверно это был я

medved: Алексей пишет: Наверно это был я Нет, Алексей, не ты. Нечего себе чужие заслуги присваивать "мастер" пишет: Ещё раз дружески советую: в случаях возникновения подобного рода конфузов, нужно просто перейти с бит-ориентированных команд, на байт-ориентированные, и все дела ("дёшево и сердито"). Проверено жизнью, и не один раз (эквивалент "штампа ОТК"). Правильно должно быть так tester пишет: Выходов - два: 1. Простой (по рекомендации микрочипа) - разделять RMW-инструкции над портами ввод/вывода хотя бы одним NOP'ом. 2. Правильный - работать через буферный регистр. Как он сейчас будет выкручиваться? Опять Далласа приплетет? PS Кстати здесь тоже у него тоже закралась неточность. Правильно будет "Директива Даллеса (Аллен Уэлш Даллес). Врагов надо знать в лицо, а тем более как пишутся их фамилии

Доктор: Sergey Roslik пишет: в мплабе крутите его и наблюдаете состояние регистров, куда уже наглядней. да не крутится....

Доктор: medved пишет: Читаешь с ножки МК, а пишешь в защелку. Поучите,Гуру.Вроде и по- руски - - а ничего не ронятно.

Доктор: Доктор пишет: ронятно. палец попал не туда - -а все ровно не понял,medved? Подскажи,если не трудно.

igor: Что конкретно не понятно?

Bigor: Доктор, любой порт, как двуликий Янус, его выводы могут работать как на вход так и на выход. При считывнии со входа Вы (точнее МК) снимаете информацию прямо с вывода, а при использовании для выведении инфы она записывается в защелку. При этом возможны проблемы, которые рассмотрены в этой теме.

Доктор: Bigor пишет: Уважаемые коллеги! Многие посты этой темы, и не только этой, на прямую подсказывают "мастеру" что отвечать на вопросы задаваемые на его форуме. Он, с некоторой задержкой, переводит на свой "суконно-пламенный" язык Уважаемы форумчане,ттоли я не туда попал,толи не понимаю ничего.А так и есть,я еще молодой,.Кто это - мастер? Я этот форум в поиску нашел,хотел подучиться малость,но но как -то трудно уже с первых постов.Medved -я понимаю,что тема интересная,но вот если бы попроще...

Bigor: Доктор пишет: Кто это - мастер? Это наши внутренние разборки. Вкратце - очень амбициозный человек.

SanSanich: Доктор Собственно, вопрос так и не был задан. Что у Вас не получается?

Bigor: Доктор, учиться надо по литературе. Желательно по фирменным апнотам и некоторым книгам. Одна из них принадлежит перу tester-а. Ее можно скачать здесь И еще информация на русском http://www.microchip.ru/lit/?mid=1x0. Изучайте и задавайте вопросы. Успехов.

Доктор: Ну слава тебе,Господи,хоть кто-то посоветовал дело.На других форумах так сразу лесом посылали...

Доктор: SanSanich пишет: Собственно, вопрос так и не был задан Еслиб бы я их умел задавать...

SanSanich: Доктор пишет: Еслиб бы я их умел задавать... Это наводит на некоторые мысли Если Вы чисто позабавиться, Вам не сюда. Я бы посоветовал Вам заполнить свой профиль, хотябы возраст, чтоб участникам было легче ориентироваться в способе и методе оказания Вам помощи.

medved: Специально для Доктора попробую еще раз с самого начала. МК имеет выходные защелки, которые автоматически отключаются от ножки при переключении на вход. Для примера возьмем PORTB. Переключением управляет регистр TRISB Допустим следующие исходные данные: в TRISB "лежит" значение 0010 0000, т.е. RB5 настроен на вход, остальные на выход. в PORTB - 0000 1111 Далее считываем данные с PORTB (на самом деле читаем с ножек), а на ножках 0010 1111. Ведь пятый вывод порта у нас настроен на вход и там может быть любое значение. Производим какие-то действия со считанными данными, например очистим нулевой бит и запишем опять в регистр 0010 1110. И все бы ничего, но стоит нам переключить пятый вывод на выход начнутся непонятки. Ведь в регистре пятым битом был 0 и мы никаких действий с ним вроде бы не делали, а значит там и должен быть 0. На самом деле там уже 1. Понятно?

Алексей: Доктор пишет: хотел подучиться малость А можно ваш уровень подготовки? Может зря пока полезли в самые дебри?

Доктор: Алексей пишет: Может зря пока полезли в самые дебри Алексей,спасибо за пост.Беда в том,что я пока не знаю,где тут дебри,а где нет.Моя основа - три книжки А.В.Фрунзе.Кроме скальпеля,умею держать паяльник.medved,спасибо,только скажите мне,где это начало?Что я должен прочесть и знать?Я это сделаю. И не о каких забавах речь не идет.ВЕСЕЛЯЩИЙСЯ ДОКТОР это ХУЖЕ ЦУНАМИ.Профиль я сейчас оформлю.С уважением ко всем,Доктор.

medved: Доктор пишет: где это начало? По-моему Вам действительно это еще рановато. Доктор пишет: Что я должен прочесть и знать? Почитайте Справочник по среднему семейству микроконтроллеров PICmicro

Bigor: Доктор, начало определяется имеющимся начальным уровнем. В МК приходят разные люди. Опытные электронщики (без знаний в программировании) и программисты разного уровня (без знания электроники) и различные промежуточные любители и специалисты. Определите для себя кто Вы и исходя из этого планируйте свою работу над собой и что прочесть. В какой мере Вы знаете английский? Это в нашем деле очень важно. разработка программ (проектов) для пиков производится в среде MPLAB последнюю версию скачайте и потихоньку разбирайтесь. Скачать можно по ссылке: http://www.microchip.com/Microchip.WWW.SecureSoftwareList/secsoftwaredownload.aspx?device=en019469&lang=en&ReturnURL=http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002#

Вячеслав: Bigor пишет: потихоньку разбирайтесь. Лучше не скажешь. МК - это почти вторая профессия. Дисциплинирует, подтягивает интеллект. Доктор, года полтора Ваши "шестерни" должны скрипеть. Разбирайте чужие проекты. Пытайтесь создать свои. Заставить заработать холодную железяку - это как вылечить уже "холодного" пациента. Успехов.

Photographer: Вячеслав пишет: Заставить заработать холодную железяку - это как вылечить уже "холодного" пациента. Ужас как двусмысленно. Доктор пишет: Беда в том,что я пока не знаю,где тут дебри,а где нет.Моя основа - три книжки А.В.Фрунзе.Кроме скальпеля,умею держать паяльник.medved,спасибо,только скажите мне,где это начало?Что я должен прочесть и знать?Я это сделаю. И не о каких забавах речь не идет. Отвечу по своему, решайте сами как поступить. Давно зрела идея, вот и повод подвернулся. По моему ничего за ранее читать и изучать не надо, особенно в вашей ситуации. В любом случае Вам программирование надо не для галочки, а под какие то конкретные цели. Возможно у Вас есть уже какие то идеи и проекты. А если нет, то не страшно. Можно для начала и помигать светодиодом. А там и ещё чего захочется. Предлагаю прямо сейчас открыть личную тему и начать реализовывать в реальное устройство свою идею. А там и ясно будет чем помочь и что не получается. В этом разделе "Для начинающих" я создал свою такую личную тему. Можете взять её за образец. Просто выкладывайте там свою идею, исходники и начинайте работать, спрашивать. Уверен, что при таком раскладе дело у Вас пойдёт быстрее.



полная версия страницы