Перейти к содержанию

Разбираем Pic Код


bolt_2.0

Рекомендуемые сообщения

Выходной каскад порта контроллера сделан схемотехнически как комплементарный двухтактный (КМОП).

Если закрыт нижний транзистор (N) и открыт верхний (Р), то на выходе 1 (уровень питания). Если нижний открыт, а верхний закрыт, то на выходе 0 (уровень земли-общего). Если оба закрыты - то выход ОТКЛЮЧЕН вообще - это третье состояние.

Так вот PORTB управляет выходным сигналом в подключенном состоянии, а TRISB отключает/подключает пины выхода (1 в разряде этого регистра означает третье состояние этого пина). При этом входные цепи всегда подключены.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов 88
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Так это получается что неиспользуемые контакты МК можно не указывать как выходные а просто их отключить. Например все контакты порта B:

movlw b11111111

bsf Status,5

movwf TrisB

???

Изменено пользователем dimas5552
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Так отключение выходного буфера пина порта и есть конфигурирование его как входа. Никаких других инструментов для этого больше нет.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Теперь я что то недопонимаю :huh: То есть TrisB устанавливает будут ли работать контакты этого порта на вход или на выход, а PortB устанавливает лог. 0 или 1 на контактах порта B, если они работают на выход, Верно?

Ссылка на комментарий
Поделиться на другие сайты

К слову.

Совет.

Рекомендую производить написание текста программы в АСМе, используя только мнемоническое название регистров спецназначения и ИХ ОТДЕЛЬНЫХ БИТ.

Кроме того, для читабельности текста в МПЛАБе принято выделение команд и других элементов синтаксиса АСМа разным шрифтом и цветом. Очень советую писать названия спецрегистров большими буквами, а имена своих маленькими. Команды только маленькими.

Так в приведенном Вами примере стоит писать bsf STATUS, RP0.

При присоединении к проекту в МПЛАБе хедера <имя контроллера>.inc все имена регистров спецназначения, их отдельных бит, названия конфигурационных бит (фьюзов) будут корректно транслироваться в коде без дополнительного их объявления.

По последнему посту.

Да именно так, но с одним уточнением. Вход ВСЕГДА ПОДКЛЮЧЕН. Его нет смысла отключать. Он не мешает при работе пина как выхода. Для работы пина как вход остается отключить только выход и он перестанет шунтировать другой внешний чужой выход подключенный к этому пину. Пин станет входом.

И опять рекомендую посмотреть в даташите раздел входы/выходы портов. Там есть полные схемы в которых легко разобраться в логике работы.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

В самоучителе написанно наоборот, что неиспользуемые контакты следует делать на выход, или это вообще без разницы?

А что будет, если на контакт, указанный как вход подать через PortB логическую 1 ?

Ссылка на комментарий
Поделиться на другие сайты

Можно и никуда не подавать. Просто прочитать пин порта, предварительно установив его как выход и 1. Эту единицу и прочтете.

В самоучителе написанно наоборот

Наоборот к чему??? :blink:

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

Так что конфигурирование свободных пинов как выход и определит конкретный логический уровень входа этого же пина.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Обычно при создании нового проекта хедер указывается в окне "Files". Если в шапке программы прописать хедер директивой INCLUDE (напр: #include p16f84a.inc) то нужно ли при этом прикреплять файл хедера к проекту или MPLab сам найдет указанный дерективой INCLUDE файл хедера и автоматически будет "качать" данные из него при компиллировании проекта ?

Изменено пользователем dimas5552
Ссылка на комментарий
Поделиться на другие сайты

Если путь найдет, то можно и не указывать в окне проекта хедер.

Однако это элементарно неудобно. В хедере можно посмотреть синтаксис определяемых регистров и бит.

Например конфиг.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Вопрос 1:

Допустим в коде программы мы написали Call 'куданибудь туда' а в конце кода прям перед End мы напишем эту метку. При исполнении программы без перехода в коде по стеку в 'куданибудь туда' в конце программы эта самая подпрограмма будет исполняться, или она просто пропустится как незадействованная?

Вопрос 2:

Если сбросить все биты INTCON в 0 (clrf INTCON), а вовод RB0 проконфигурировать на вход, то при смене на нем уровня (с 0 на 1 или наоборот с 1 на 0) флаг INTF будет ли реагировать на эти изменения или все же флаг INTF будет постоянно находится в состоянии 0, так как прерывания по RB0/INT запрещены ?

Вопрос 3:

Сколько по времени продлится задержка перед запуском кристалла, если в строке конфигурации PWRTE будет установлен в ON ?

Изменено пользователем dimas5552
Ссылка на комментарий
Поделиться на другие сайты

Про Call я разобрался, можно просто в коде написать так:

----- -----

goto N1

*** модули ***

N1

End

тогда модули при простом проходе исполняться не будут. Так же флаг INTF реагирует на смену такта, даже если прерывания запрещенны. Вот только не могу найти инфу про время задержки PWRTE... подскажите пожалуйста :)

Изменено пользователем dimas5552
Ссылка на комментарий
Поделиться на другие сайты

Даташиты - это единственный и полный источник сведений о микроконтроллере.

Открываем раздел Специальные функции SPECIAL FEATURES и смотрим параграф Reset.

Все там есть...

72 мс - таймер сброса.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Про Call я разобрался.............

........................................................

...тогда модули при простом проходе исполняться не будут.

:blink: Это Вы о чем???

Was ist das PROSTOI PROHOD?

...есть одно нехорошее смутное подозрение...

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Это Вы о чем???

Was ist das PROSTOI PROHOD?

Например нужна подпрограмма, которая бы обнуляла регистр при наличии в нем значения .250, а если в регистре будет значение меньше .250, то обнулять его не нужно. Допустим программа будет исполняться линейно (простым инкриментом PCL). Тогда при наличии значения меньше .250 эту подпрограмму задействывать не нада. Дупустим с каждым проходом значение контролируемой переменной инкрементируется на 1 и сохраняется в EEPROM. Тогда через 250 "проходов" программы нужно будет "вызывать" эту самую подпрограмму сброса. Выходит, что за те 249 ранее намотанных кругов подпрограмму сброса задействывать и исполнять не нужно :)

Ссылка на комментарий
Поделиться на другие сайты

А в чем проблема предложенного примера?

Если нужно сбросить некую переменную, то это делается элементарно. За одну строку АСМа. И ничего не нужно вызывать.

Никакого отношения к метке перед END это не имеет. Программа любого контроллера не имеет конца. Есть суперлуп (главный цикл) с бесконечным исполнением.

Метакоманда ассемблера END не компилируется и означает конец кода.

Переход на начало делается либо goto 0x00 , либо reset (в 18-х ПИКах).

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Переход на начало делается либо goto 0x00 , либо reset (в 18-х ПИКах).

А вот такой код как понять?:

--- ПУСК ---

ORG 0 ;Вектор сброса

Reset bcf STATUS,RP0 ;Обращение к банку 0

bcf STATUS,RP1

goto Begin ;Обходим обработчик прерываний и подпрограммы

...

...

...

Это получается, что программа не успела ещё запустится а её уже сбрасывают :blink: Как тогда нижеидущие команды исполняются?

Изменено пользователем dimas5552
Ссылка на комментарий
Поделиться на другие сайты

У контроллеров есть несколько особых адресов памяти программ. Адреса программной памяти принято называть ВЕКТОРАМИ. К таким особым векторам, которые фиксированы аппаратно в архитектуре контроллеров относятся вектор сброса и вектора прерываний.

Это адреса памяти по которым программа принудительно перейдет ПОСЛЕ сброса или прерываний.

Нулевой вектор - это вектор сброса.

Для 12...16-х ПИКов вектор прерывания один. Четвертый.

Таким образом, верхние четыре адреса (0х00...0х03) содержат короткий код перехода на произвольно расположенное начало исполняемого кода. С четвертого адреса (0х04) должен быть расположен обработчик прерываний (или переход на него).

Стандартное начало программной памяти:


         ORG  0x00
                nop                  ;  пустая операция для отладчика
                goto    start     ;  переход на метку  start
        ORG   0x04
                .............
                isr - interrupt service routine
                 .............
                retfie               ;  выход из прерывания с разрешением глобальных прерываний

start         ................. main  code
                ................................................

       END

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

ORG 0 ;Вектор сброса

Reset bcf STATUS,RP0 ;Обращение к банку 0

bcf STATUS,RP1

goto Begin ;Обходим обработчик прерываний и подпрограммы

;--------------------------------------------------------------------------------------------------

; --- ОБРАБОТЧИК ПРЕРЫВАНИЙ ---

;--------------------------------------------------------------------------------------------------

ORG 4 ;Вектор прерываний

Interrupt movwf W_copy ;Сохраняем контекст

mov ST_copy,STATUS

mov FSR_copy,FSR

Насколько я понял, Reset здесь является меткой перехода, например в коде должна быть тогда команда GOTO Reset, но там такой нет и правильно, ведь Reset это команда асмы и являтся меткой перехода не может. Тогда смысл строки Reset bcf STATUS,RP0 мне вообще не понятен, ведь для сброса программы нужно писать команду Reset где нибудь в коде на нужном месте, но не первой же командой :blink: Объясните пожалуйста на пальцах этот момент... :unsure: И вообще как так получается, что две команды находятся на одной строке?

Изменено пользователем dimas5552
Ссылка на комментарий
Поделиться на другие сайты

Как Вы уже правильно заметили, это не команда, а МЕТКА. Ее можно использовать в программе для перехода на начало (программный сброс). Однако метку можно написать но не применять. Весь смысл записи метки в присвоении выражению метки числового значения адреса этой строки программы. Т.е. в данном случае везде в тексте программы компилятор при трансляции заменит слово Reset на 0х000

Просто выбрано неудачное название метки (в 18-х ПИКах reset - это команда программно-аппаратного сброса и само слово является зарезервированным). В 10...16-х ПИКах такой команды нет и слово может применятся как метка.

Кроме того, команда не может находится в первой колонке. МПЛАБ (ассемблер) выдаст ошибку.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

То есть 16 пик команду Reset не поддерживает... Хм, вот только зачем нужно было делать такую "странную" метку, тем более что к ней программа не разу не обрашается... <_< Если только из соображения, что программа писалась с шаблона...

Изменено пользователем dimas5552
Ссылка на комментарий
Поделиться на другие сайты

Если не обращается, то возможно эта метка выполняет функции комментария. Непонятна Ваша озабоченность этой "проблемой". Ну назвали так, что из того. Хоть матом обзови. Компилятору это по барабану.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Открыл хедер для 16f628 (проект написан для него). Строка конфигурации такая:

__CONFIG 03F30h ;WDT=off, BODEN=off, LVP = off, OSC = INTRC 4MHz

В хедере встретил много новых слов, которых не было на 84-м:

_BODEN_ON EQU H'3FFF'

_BODEN_OFF EQU H'3FBF'

_CP_ALL EQU H'03FF'

_CP_75 EQU H'17FF'

_CP_50 EQU H'2BFF'

_CP_OFF EQU H'3FFF'

_DATA_CP_ON EQU H'3EFF'

_DATA_CP_OFF EQU H'3FFF'

_PWRTE_OFF EQU H'3FFF'

_PWRTE_ON EQU H'3FF7'

_WDT_ON EQU H'3FFF'

_WDT_OFF EQU H'3FFB'

_LVP_ON EQU H'3FFF'

_LVP_OFF EQU H'3F7F'

_MCLRE_ON EQU H'3FFF'

_MCLRE_OFF EQU H'3FDF'

_ER_OSC_CLKOUT EQU H'3FFF'

_ER_OSC_NOCLKOUT EQU H'3FFE'

_INTRC_OSC_CLKOUT EQU H'3FFD'

_INTRC_OSC_NOCLKOUT EQU H'3FFC'

_EXTCLK_OSC EQU H'3FEF'

_LP_OSC EQU H'3FEC'

_XT_OSC EQU H'3FED'

_HS_OSC EQU H'3FEE'

В частности что такое BODEN?

Ссылка на комментарий
Поделиться на другие сайты

Я уже сто раз Вам говорил. Откройте даташит. Там все есть.

BOREN - brown-out reset enable - конфигурационный бит управляющий пороговым детектором пониженного напряжения питания. Как вариант может быть обозначен как BODEN - brown-out detector enable.

При включенной функции понижение напряжения питания контроллера ниже некоего (см.даташит) порога происходит аппаратный сброс.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Нашел, что битом _CP... в 16f628 можно защищать часть памяти программы (0%, 50%, 75%, 100%). Это как? Как можно защитить 50% памяти, а остальные 50 тогда что?

Изменено пользователем dimas5552
Ссылка на комментарий
Поделиться на другие сайты

Защита кода - это невозможность его считать из программного флеша. Защищенная часть кода читается нулями.

Обойти защиту желающему похитить прошивку электрическими методами невозможно.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...