Управление портами через регистры Atmega
Описание регистров Atmega168
PORTD отображается на цифровые выводы Arduino от 0 до 7.
- DDRD – The Port D Data Direction Register (регистр направления передачи данных порта D)
- PORTD – The Port D Data Register (регистр данных порта D)
- PIND – The Port D Input Pins Address (адрес входных выводов порта D)
PORTB отображается на цифровые выводы Arduino от 8 до 13, два старших бита (6 и 7) отображаются на выводы, получающие тактовый сигнал с кварцевого резонатора (crystal) и не используются.
- DDRB – The Port B Data Direction Register (регистр направления передачи данных порта B)
- PORTB – The Port B Data Register (регистр данных порта B)
- PINB – The Port B Input Pins Address (адрес входных выводов порта B)
PORTC отображается на аналоговые выводы Arduino от 0 до 5, выводы 6 и 7 доступны только в Arduino Mini.
- DDRC – The Port C Data Direction Register (регистр направления передачи данных порта C)
- PORTC – The Port C Data Register (регистр данных порта C)
- PINC – The Port C Input Pins Address (адрес входных выводов порта C)
Переменные, использующие порт
В соответствии с приведенным выше назначением выводов, регистры PortD управляют цифровыми выводами Arduino от 0 до 7.
Можно, однако, заметить, что выводы 0 и 1 используются для последовательного обмена при программировании и отладке Arduino, поэтому обычно следует избегать изменять состояние этих выводов, кроме необходимости задействовать функции последовательного ввода-вывода. Знайте, что это может повлиять на загрузку или отладку программы.
DDRD это регистр направления передачи данных порта D. Биты этого порта управляют тем, настроены ли выводы Порта D как входы, или как выходы, например, так:
DDRD = B11111110; // назначает выводы Arduino 1-7 выходными, вывод 0- входным DDRD = DDRD | B11111100; //это менее рискованно - назначает выводы со 2 по 7 // выходными, не изменяя значений на выводах 0 и 1
PORTD – это регистр состояния выходов. Например,
PORTD = B10101000; // устанавливает HIGH на цифровых выводах 7,5,3
Вы получите 5 В на этих выводах только в том случае, когда они были назначены выходными с использованием регистра DDRD или с помощью функции pinMode().
PIND – это входная регистровая переменная – она одновременно прочитает все цифровые входы.
«За» и «против» манипулирования портами через регистры.
Вообще говоря, делать подобные вещи не слишком хорошая идея. Почему? Вот несколько причин:
- Код гораздо более сложен для отладки и поддержки, и достаточно тяжел для понимания другими людьми. Выполнение кода занимает у процессора всего несколько микросекунд, но вам могут потребоваться часы, чтобы понять, почему он работает неверно и исправить это! Ваше время дорого, не так ли? А время компьютера очень дешево, соизмеримо со стоимостью потребленного им электричества. Обычно гораздо лучше писать код более очевидным образом.
- Код менее переносимый. При использовании digitalRead() и digitalWrite(), гораздо проще написать код, который будет работать на всех микроконтроллерах Atmel, тогда как управляющие регистры и регистры порта могут быть разными у каждого типа микроконтроллера.
- Используя прямой доступ к порту, гораздо проще вызвать непреднамеренные нарушения в работе. Обратите внимание на строку DDRD = B11111101; выше упоминалось, что вывод 1 должен оставаться входным выводом. Вывод 1 – это приемная линия последовательного порта. Будет очень легко случайно вызвать остановку работы последовательного порта, назначив вывод 1 выходным! Разве теперь вас не собьет с толку то, что вы вдруг не сможете принимать последовательные данные?
Так что вы можете сказать сами себе: – Ну ладно, захочется ли мне после этого все время использовать эту штуку? Вот несколько положительных сторон прямого доступа к порту:
- Если вам не хватает памяти программ, то эти трюки помогут уменьшить ваш код. Потребуется гораздо меньше байт скомпилированного кода для одновременной записи ряда аппаратных выводов одновременно через регистры порта, чем с использованием циклической записи каждого вывода в отдельности. Иногда от этого зависит, войдет ваша программа во флэш-память или нет!
- Иногда возникает необходимость несколько выходных выводов точно в одно время. Вызов функции digitalWrite(10,HIGH) вслед за digitalWrite(11,HIGH) приведет к тому, что вывод 10 будет установлен в «1» на несколько микросекунд раньше, чем вывод 11, что может сбить с толку точную срабатывающую по времени цифровую схему, к которой вы должны подключаться. В качестве альтернативы вы могли бы установить оба бита в «1» точно в одно время, используя PORTB |= B1100;
- Вам может потребоваться иметь возможность переключать выводы очень быстро, за доли микросекунд. Если посмотреть на исходный код по ссылке lib/targets/arduino/wiring.c, вы обнаружите, что digitalRead() и digitalWrite() содержат каждая по дюжине или около того строк кода, которые будут скомпилированы в порядочное число машинных команд. Каждая машинная команда требует один такт на частоте 16 МГц, что может стать проблемой в приложениях, чувствительных ко времени. Прямой доступ к порту сделает ту же работу за гораздо меньшее число тактов.
Управляем светодиодами с помощью кнопок
В прошлой части мы разобрали примеры инициализации МК и создали простую программу. Сейчас немного доработаем программу, задействуем порты ввода, разберем несколько примеров обработки цикла опроса кнопки и применим простую антидребезговую защиту.
Прежде чем начать обращаться с портом и считывать с него данные, необходимо настроить данный вывод МК на вход. При этом стоить помнить, что на выходе выбранного порта установиться логическая единица.
ser temp ; настраиваем все выводы порта В на выход
out DDRB, temp ;
Для простоты мы оставим PORTB в таком состоянии и проведем настройки порта D.
ldi temp,0b00000011
out PORTD,temp
В данном примере мы настроили выводы PD0 и PD1 на вход.
С настройкой определились, теперь необходимо разобрать простой пример обработчика кнопки. Подключим к выводу PD0 обычную кнопку, которая будет замыкаться на массу.
Вспомним наш цикл main:
main:
sbi portb,5; устанавливаем логическую “1” в PORTB5
rcall delay ;вызываем подпрограмму задержки
cbi portb,5; устанавливаем логический “0” в PORTB5
rcall delay
rjmp main
Здесь обычное переключение порта с логического состояния«0» в «1». Доработаем цикл, чтобы мигание включилось после нажатия на кнопку, подключенную к PD0.
sbic PIND,0
rjmp main
sbi portb,5; устанавливаем логическую “1” в PORTB5
rcall delay ;вызываем подпрограмму задержки
cbi portb,5; устанавливаем логический “0” в PORTB5
rcall delay
rjmp main
Как видно, добавилась строка «sbic PIND,0» и дополнительная метка перехода «rjmp main». Командой «sbic» мы проверяем логическое состояние порта ввода. Если кнопка нажата и на порте установился логический «0», то пропускается следующая строка «rjmp main» и программа переходит к «sbi portb,5». После того, как программа дойдет до «cbi portb,5» и «rcall delay», произойдет возврат на начальную метку «main:». Снова попадаем на цикл опроса порта ввода. Если на сей раз кнопка не будет нажата, на выводе PD0 установиться логическая «1» и цикл замкнется на опросе порта.
Стоить отметить, что такая программа очень простая и годится только для компьютерного моделирования. В реальности из-за переходного процесса в коммутации контактов возникнет дребезг сигнала, который необходимо подавлять.
Простейшим способом для фильтрации сигнала от дребезга является применение задержки опроса порта ввода. Таким образом, мы минимизируем влияние переходных процессов на выполнение нашей программы. Для этого достаточно будет перед строкой «sbic PIND,0» вставить подпрограмму задержки «rcall delay». На рисунке ниже, можно посмотреть выполнение нашей программы.
К каналу А подключен вход PD0, а к каналу В подключен выход PB5. Как видно, цикл мигания сработал несколько раз из-за долгого удержания кнопки.
Так как временной цикл переключения порта, в данном примере, достаточно маленький, около 100мс, то для исключения лишний срабатываний можно доработать программу, отследив задний фронт сигнала.
Для этого нужно будет добавить всего несколько строк в цикл «main».
rcall delay
sbic PIND,0 ;Отслеживаем нажатие кнопки
rjmp main
otpuskaem:
rcall delay ;задержка
sbis PIND,0 ;Отслеживаем отпускание кнопки
rjmp otpuskaem ;
sbi portb,5; устанавливаем логическую “1” в PORTB5
rcall delay ;вызываем подпрограмму задержки
cbi portb,5; устанавливаем логический “0” в PORTB5
rcall delay
rjmp main
Как видно появился дополнительный небольшой цикл отслеживания отпускания кнопки «otpuskaem».
Посмотрим на осциллограмму.
По каналу А видно, что кнопка удерживалась около 1400 мс, при этом не было ни одного срабатывания на выводе PB5. Как только фронт сигнала на выводе PD0 спал, сразу же произошло срабатывание порта PB5.
С помощью такого простого примера обработки входных сигналов, можно с легкостью избавиться от самых больших дребезгов при коммутации. Необходимо лишь будет подстроить временные задержки в подпрограмме «delay», либо же организовать отдельную подпрограмму по подобному принципу.
Код полной программы бегущей строки:
.device Attiny2313 ; указываем тип устройства
.include “tn2313def.inc” ; подключаем файл директив МК ATtiny2313
.def temp = r16 ; задаем имя нашему регистру общего назначения
.org 0x0000 ; начало программы с 0 адреса
ldi temp,ramend ; грузим значение ramend в регистр temp
out $3d, temp ;
ser temp ; настраиваем все выводы порта В на выход
out DDRB, temp ; порт на выход
ldi temp,0b00000011
out PORTD,temp
ldi r22,1 ; загружаем в регістр r22 константу 1
out PORTB,r22 ; значение выводим в PORTB
main:
rcall delay
sbic PIND,0 ;Отслеживаем нажатие кнопки
rjmp main
otpuskaem:
rcall delay ;задержка
sbis PIND,0 ;Отслеживаем отпускание кнопки
rjmp otpuskaem ;
rol r22 ;сдвиг влево
out PORTB,r22 ; значение выводим в PORTB
rjmp main
delay:
clr r20
clr r21
d_1:
cpi r20,200
brne d_1
d_2:
inc r21
cpi r21,50
brne d_1
ret
Программу можно компилировать и проверять ее в Proteus.
На рисунках ниже видны переключения светодиодов после каждого нажатия на кнопку.
Итак мы разобрали примеры простейшего цикла обработки кнопок, применили защиту от дребезга контактов, написали простую программу бегущей строки.
В следующей статье разберем примеры использования внешних прерываний INT0, INT1. Доработаем существующую программу, избавимся от цикла «main».
Предыдущие статьи:
♦ Микроконтроллер и как его победить
♦ Микроконтроллер и системы счисления
♦ Микроконтроллер и логические операции
♦ Общее устройство микроконтроллера
♦ Арифметико-логическое устройство и организация памяти – память программ, память данных, энергонезависимая память
♦ Регистры общего назначения, регистры ввода/вывода, стек, счетчик команд
♦ Регистр состояния SREG
Регистр данных порта b – portb
Бит $18 Чт./зап. (R/W) Начальн.знач. | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
PORTB7 | PORTB6 | PORTB5 | PORTB4 | PORTB3 | PORTB2 | PORTB1 | PORTB0 | PORTB | |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Регистр направления данных порта b – ddrb
Бит $17 Чт. /зап. (R/W) Начальн.знач. | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
DDB7 | DDB6 | DDB5 | DDB4 | DDB3 | DDB2 | DDB1 | DDB0 | DDRB | |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Выводы порта b – pinb
Бит $16 Чт./зап. (R/W) Начальн.знач. | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
PINB7 | PINB6 | PINB5 | PINB4 | PINB3 | PINB2 | PINB1 | PINB0 | PINB | |
R | R | R | R | R | R | R | R | ||
Hi-Z | Hi-Z | Hi-Z | Hi-Z | Hi-Z | Hi-Z | Hi-Z | Hi-Z |
PINB не является регистром, по этому адресу осуществляется доступ к физическим значениям каждого из выводов порта B. При чтении PORTB, читаются данные из регистра-защелки, при чтении PINB читаются логические значения присутствующие на выводах порта.
Все 8 бит порта B при использовании для ввода/вывода одинаковы. Бит DDBn регистра DDRB выбирает направление передачи данных. Если бит установлен (1), вывод сконфигурирован как выход. Если бит сброшен (0), то вывод сконфигурирован как вход. Если PORTBn установлен и вывод сконфигурирован как вход, включается КМОП подтягивающий резистор. Для отключения резистора, PORTBn должен быть сброшен (0) или вывод должен быть сконфигурирован как выход.
Примечание: Старший разряд порта (PB7) в микроконтроллере ATtiny26 используется для подачи внешнего сигнала сброса (RESET). Не используйте его как порт ввода/вывода.
Задания для домашней подготовки
Разработать схему устройства на базе микроконтроллера ATtiny26, включающую:
Устройство ввода (клавиатура 3×4 или 4×4)
4 элемента световой индикации
Элемент звуковой индикации
Управление сбросом МК
Интерфейс для SPI-программирования (STK200/300)
Исходя из схемы устройства напишите подпрограммы:
вывода 4-битного числа на элементы световой индикации (П-4.1)
вывода сигнала произвольной частоты звукового диапазона на элемент звуковой индикации (П-4.2)
опроса клавиатуры и определения кода нажатой клавиши (П-4.3)
*При написании подпрограмм вывода (во избежание конфликта устройств) учитывайте состояние битов порта, предназначенных для других устройств. Так, например при генерации звука, Вы можете нарушить состояние элементов индикации.
Проекты на микроконтроллерах AVR – Конфигурирование портов в Bascom-AVR
Конфигурирование портов в Bascom-AVR
Любой микроконтроллер умеет общаться с внешней периферией. Для этого у них есть порты общего назначения, которые могут работать в качестве входов (для подключения кнопок, для приема данных, для обработки внешних сигналов и т.д.), а так же в качестве выходов (для вывода данных, для подключения светодиодов, индикаторов, сервомашинок и других элементов которыми можно управлять).
Для того чтобы использовать любой порт микроконтроллера, его сперва необходимо сконфигурировать в качестве входа или выхода. На примере самого распространенного микроконтроллера AVR давайте сконфигурируем две его ножки в качестве выхода – PortB.0 (PB0) и входа PortB.1 (PB1)
В Bascom-AVR конфигурация портов выглядит следующим образом:
Config PortB.0 = Output
Config PortB.1 = Input
здесь мы отдельно указываем для каждого вывода микроконтроллера как он должен работать – как вход (Input) или как выход (Output).
Такой способ удобен, когда нужно сконфигурировать небольшое количество ножек.
Бывают случаи когда весь порт должен быть сконфигурирован как вход или как выход, тогда пишется та же команда что и выше, но без указания номера порта:
Config PortB = Output ‘весь порт B сконфигурирован как выход
Так же нередки случаи когда используется весь порт, но не в одном каком-то режиме, а некоторые ножки должны работать как выход, а некоторые как вход.
К примеру, давайте сконфигурируем целиком порт микроконтроллера следующим образом:
PortB.0, PortB.1, PortB.3, PortB.5, PortB.6, PortB.7 на выход
PortB. 2 и PortB.4 на вход.
Из рассмотренного выше примера, можно записать вот так:
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Input
Config Portb.3 = Output
Config Portb.4 = Input
Config Portb.5 = Output
Config Portb.6 = Output
Config Portb.7 = Output
DDRB = 11101011 ‘2 и 4 ножки порта B сконфигурированы на вход, остальные – на выход
Ок, но не будем останавливаться на простом конфигурировании портов. Ведь все это проделывается лишь с целью дальнейшего использования настроенных портов в своих проектов. Да и гораздо интересней вживую наблюдать за результатом своих трудов;)
Давайте рассмотрим самый простой пример: к микроконтроллеру Attiny2313 подключен светодиод и кнопка. Чтобы далеко не ходить, давайте сконфигурируем порты как в первом примере: т.е. PortB.0 – выход, сюда подключим светодиод; и PortB.1 – вход, сюда подключим кнопку. Получаем вот такую схему:
Светодиод будет гореть если на анод (т.е. на PortB.0), будет подана логическая единица. Сразу после конфигурирования в качестве выхода, на ножке устанавливается низкий уровень и светодиод гореть не будет.
Кнопка подключена таким образом, что при нажатии на входе порта установится логический 0 (говорят, что прижимаем порт к земле).
Теперь нужно пояснить для чего нужен резистор R1. Дело в том что после конфигурирования порта в качестве входа, на этом входе устанавливается так называемое высокоимпедансное состояние – состояние при котором на входе нет какого-либо четкого уровня. И в зависимости от внешних помех на входе может быть как логический ноль, так и логическая единица. Это ведет к непредсказуемой логике работы программы. В нашем случае активным состоянием выбран логический ноль, это состояние на входе будет означать что кнопка нажата. Так вот чтобы избежать помех и четко зафиксировать высокий уровень на входе порта когда кнопка еще не нажата, используется подтягивающий резистор в несколько килоом.
Теперь приступим к написанию программы и придумаем алгоритм. Для начала напишем очень простую программу,которая будет постоянно опрашивать вход и если микроконтроллер увидит что кто-то нажал кнопку, зажгет светодиод.
$regfile = “2313def.dat” ‘указываем компилятору что работать будем с Attiny2313
$crystal = 1000000 ‘частота работы микроконтроллера 1МГц
Config Portb.0 = Output ‘устанавливаем PortB.0 в качестве выхода
Config Portb.1 = Input ‘устанавливаем PortB.1 в качестве входа
Do ‘начало главного цикла
If Pinb.1 = 0 Then ‘условие: если на входе обнаружен низкий уровень
Portb.0 = 1 ‘устанавливаем на выходе высокий уровень
Else ‘иначе, если это условие не выполняется
Portb.0 = 0 ‘на выходе будет низкий уровень
End If
Loop ‘повторяем весь цикл сначала
End
‘конец программыЗаметьте, что считывание состояния на входе происходит по команде Pin, а установка нужного уровня на выходе – по команде Port.
После компиляции программы (нажимаем F7), полученный *.hex файл прошиваем в микроконтроллер. Программатор, с помощью которого происходит прошивка программатора, можно собрать самостоятельно, схем в интернете очень много. Я лично остановил свой выбор на программаторе USBasp.
Также Bascom-AVR позволяет давать каждому порту свое индивидуальное имя, это сделано для удобства написания программ, так как проще ориентироваться в понятных для себя названиях, чем с номерами портов.
$regfile = “2313def.dat” ‘указываем компилятору что работать будем с Attiny2313
$crystal = 1000000 ‘частота работы микроконтроллера 1МГц
Config Portb.0 = Output ‘устанавливаем PortB.0 в качестве выхода
Config Portb.1 = Input ‘устанавливаем PortB.1 в качестве входа
Led Alias Portb.0 ‘даем имя порту выхода
Button Alias Pinb.1 ‘даем имя порту входа
Do ‘начало главного цикла
If Button = 0 Then ‘условие: если на входе обнаружен низкий уровень
Led = 1 ‘устанавливаем на выходе высокий уровень
Else ‘иначе, если это условие не выполняется
Led = 0 ‘на выходе будет низкий уровень
End If
Loop ‘повторяем весь цикл сначала
End ‘конец программы
Так программа становится более читаема. Но самое главное, что если нужно переназначить какую-нибудь ножку, это достаточно сделать в одном месте, там где мы ее сконфигурировали.
RDC1-0009, Цифровое сердце | сделай своими руками!
То, что у вас уже есть, вы можете удалить в корзине.
Это цифровое, светодиодное сердце будет отличным подарком девушке ко Дню Влюбленных, 8 Марта, или на День рождения.
21 светодиод расположены по периметру печатной платы в виде сердца. Все они управляются микроконтроллером ATmega328. В демонстрационном скетче прописаны несколько эффектов оживляющих сердце. Скетч загружается с помощью любого контроллера Arduino. Но главная изюминка это вибромоторчик от смартфона расположенный на тыльной стороне. Он создает эффект бьющегося в такт световым эффектам сердца. Скетч легко изменить, если вы придумаете новые световые эффекты и частоту стука сердца.
На тыльной стороне сердца есть зарядное устройство для Li-ion аккумуляторов, которое будет подзаряжать ваше сердце через порт Mini USB. Схема зарядного устройства собрана на микросхеме MCP73831T. Схема включения стандартная из описания на микросхему.
Все детали проекта открыты для свободного использования. Проект созданный в KiCAD можно скачать в приложении.
Внешний вид устройства
Технические параметры
Размер – 50 х 50 мм.
Источник питания – Li-Ion или Li-Pol аккумулятор 3,7В
Электрическая схема
Это открытый проект! Лицензия, под которой он распространяется – Creative Commons – Attribution – Share Alike license. Проект выполнен в KiCad. Любые файлы доступны для скачивания.
Инструкция по программированию.
В этом разделе вы оживите электронное сердце. Запишите загрузчик в новый микроконтроллер, а затем скетч с эффектами
Для записи загрузчика, а затем скетчей в модуль RDC1-0009 “Цифровое сердце” можно использовать любую плату Arduino на которой есть разъем Arduino ISP.
Рассмотрим пример для платы Arduino Uno (Ванилин). Сделайте соединения как показано на рисунке.
1. Запустите на ПК Arduino IDE.
2. На главном меню найдите вкладку «Инструменты» в ней пункт «Плата:…». Выберите плату – Arduino/Genuino Uno.
3. В пункте «Порт» выберите тот порт, который был назначен операционной системой вашей плате Arduino Uno. Например COM11.
4. Заходите в пункт главного меню «Файл» -> Примеры –> 11.ArduinoISP и нажимайте ArduinoISP.
5. Откроется новый скетч «ArduinoISP» Загрузите его в свою плату. После загрузки этого скетча с помощью вашей Arduino UNO уже можно будет программировать «Цифровое сердце».
6. Перед программированием RDC1-0009 нужно сделать ещё один шаг – «Добавить новую плату в Arduino IDE». Вам будет нужна дополнительная плата – «ATmega168 (8 MHz internal clock)». Такой микроконтроллер вы установили в сердце. Скачайте архив «boards» в разделе Документы. В папке со скетчами создайте папку «hardware». Размещение папки со скетчами можно узнать, выбрав «Файл – Настройки».
Распакуйте скаченный файл в созданную папку «hardware». Должно получиться примерно так: «C:\Users\имя пользователя\Documents\Arduino\hardware\breadboard». Перезапустите Arduino IDE. Если сделали все правильно, в списке плат появиться строка «ATmega168 (8 MHz internal clock)»
7. На этом этапе у вас уже всё готово к загрузке нового скетча в RDC1-0009. Откройте ваш скетч в Arduino IDE. Затем проверьте что в пункте меню «Инструменты» должен быть выбран программатор «Arduino as ISP»
В «Инструментах» выберите плату «ATmega168 (8 MHz internal clock)».
Запишите загрузчик в новый микроконтроллер. В «Инструментах» выберите «Записать загрузчик»
Внимание! Загрузчик записывается в новый микроконтроллер только один раз!
И сразу загрузите скетч в сердце «Через программатор».
Попробуйте скетч «Heart» из раздела «Документация». Не понравится, загрузите скетч «RDC1-0009», который загружается при производстве сердца RDC1-0009 на фабрике. Он в окне просмотра.
Lava DSerial PCIv3 PortB Загрузка драйверов для Windows 10, 7, 8 / 8.1, Vista (64/32 бит)
Вы запускаете: unknown OS
Драйверы найдены в нашей базе драйверов.
Дата выпуска драйверов: 15 Apr 2021
специальное предложение
Ваша ОС: Выбрать ОС:Windows 2000Windows XPWindows VistaWindows 7Windows 8Windows 8.1Windows 10Mac OS
См. дополнительную информацию об инструкциях по Outbyte и деинсталяции instrustions. Пожалуйста, просмотрите Outbyte EULA и app.privacy
Нажмите «Загрузить сейчас», чтобы получить средство обновления драйверов, которое поставляется с драйвером LavaLink Lava DSerial PCIv3 PortB :componentName. Утилита автоматически определит подходящий драйвер для вашей системы, а также загрузит и установит драйвер LavaLink Lava DSerial PCIv3 PortB :componentName. Инструмент обновления драйверов – это простая в использовании утилита, которая представляет собой отличную альтернативу ручной установке, признанной многими компьютерными экспертами и компьютерными журналами. Инструмент содержит только последние версии драйверов от официальных производителей. Он поддерживает такие операционные системы, как Windows 10, Windows 8 / 8.1, Windows 7 и Windows Vista (64/32 бит). Чтобы загрузить и установить драйвер LavaLink Lava DSerial PCIv3 PortB :componentName вручную, выберите нужный вариант из списка ниже.
LavaLink Lava DSerial PCIv3 PortB Драйверы
Имя оборудования: Lava DSerial PCIv3 PortB Тип устройства: Другие Manufactures: LavaLink Версия драйвера: 6.3.9600.16384 Дата выпуска: 23 May 2014 Размер файла: Система: Windows 2000, Windows 2003, Windows XP 64-bit, Windows XP, Windows XP 64-bit, Windows Vista, Windows Vista 64-bit, Windows 7, Windows 7 64-bit, Windows 8, Windows 8 64-bit, Windows 8.1, Windows 8.1 64-bit Идентификатор оборудования: PCI\VEN_1407&DEV_0111&SUBSYS_01111407
Была ли эта страница полезной?
Какой процент пользователей установили драйверы LavaLink?
95% установил драйвер
Какой процент пользователей не помог этой статье?
5% не помогло
АЛЬТЕРНАТИВНЫЕ ФУНКЦИИ PORTB — Мегаобучалка
SCK – PORTB, Bit 5 – Выход тактовой частоты ведущего и тактовый вход ведомого процессора канала SPI. Если работа SPI разрешена и шина сконфигурирована как ведомая, этот вывод устанавливается на ввод независимо от установки DDB5. Если процессор работает как ведущий, направление передачи данных по этому выводу определяется DDB5. Когда вывод устанавливается на ввод, подключение подтягивающего резистора состоянием бита PORTB5. Подробнее см. описание порта SPI.
MISO – PORTB, Bit 4 – Вход данных ведущего, выход ведомого в канале SPI. Если разрешена работа SPI в качестве ведущего, вывод PB4 сконфигурирован как вход независимо от установки DDB4. Если SPI разрешен и работает как ведомый, направление передачи данных управляется состоянием DDB4. Когда вывод принудительно сконфигурирован как вход, подключение подтягивающего резистора по-прежнему управляется состоянием бита PORTB4. Подробнее см. описание порта SPI.
MOSI – PORTB, Bit 3 – Выход данных ведущего, вход ведомого в канале SPI. Когда SPI работает как ведомый, этот вывод работает как вход независимо от установки бита DDB3. При работе SPI ведомым направление передачи этого вывода управляется битом DDB3. Когда вывод принудительно сконфигурирован как вход, подключение подтягивающего резистора по
прежнему управляется состоянием бита PORTB3. Подробнее см. описание
порта SPI.
SS – PORTB, Bit 2. – Вход выбора ведомого. Если канал работает как ведомый, этот вывод работает как вход независимо то установки DDB2.
SPI активируется как ведомый при переводе этого вывода в низкое состояние. При работе SPI как ведущего, направление передачи данных через этот вывод управляется битом DDB2. Когда вывод переводится в состояние ввода, подключение подтягивающего резистора управляется битом PORTB2. Подробнее см. описание порта SPI.
OC1 – PORTB, Bit 1. Выход совпадения. Вывод PB1 может работать как внешний выход совпадения таймера/счетчика 1. Для обслуживания этой функции вывод должен быть сконфигурирован как выход (DDB1=1). Разрешение работы этой функции рассмотрено при описании таймера. Вывод OC1
также работает как выход при работе таймера в режиме ШИМ.
ICP – PORTB, Bit 0. Вход захвата. Вывод PB0 может работать как внешний вход захвата Таймера/счетчика 1. Для обслуживания этой функции вывод должен быть сконфигурирован как вход. Подробнее см. описание работы таймера.
Порт C
Порт C 6-разрядный двунаправленный порт ввода/вывода.
Для обслуживания порта отведено три регистра: регистр данных PORTC (15h, 35h), регистр направления данных – DDRC (14h, 34h) и ножки порта C – PINC (13h, 33h). Адрес ножек порта C предназначен только для чтения, в то время как регистр данных и регистр направления данных – для чтения/записи. Все выводы порта имеют отдельно подключаемые подтягивающие резисторы. Выходы порта C могут поглощать ток до 20 mA и непосредственно управлять светодиодными индикаторами. Если выводы PC0..PC5 используются как входы и замыкаются на землю, если включены внутренние подтягивающие резисторы, выводы являются источниками тока (Iil). Дополнительные функции порта C – аналоговые входы АЦП. Если некоторые из выводов порта сконфигурированы как выходы, во время преобразования не рекомендуется производить их переключение. В экономичном режиме триггеры Шмитта отключаются от цифровых входов. Это позволяет удерживать на входах аналоговое напряжение Vcc/2 без заметного увеличения потребления.
РЕГИСТР ДАННЫХ ПОРТА C – PORTC
H(35h)
Чтение Изменить Запись Проблема
Проблема чтения-изменения-записи
Семейство микроконтроллеров PIC16Fxxx
Микроконтроллеры PIC среднего уровня Microchip используют последовательность, известную как чтение-изменение-запись (RMW) при изменении состояния выхода (1 или 0) на выводе. При определенных обстоятельствах это может вызвать неожиданное поведение.
Когда ваша программа изменяет состояние на определенном выводе, например RB0 в PORTB, микроконтроллер PIC сначала ЧИТАЕТ все 8 бит регистра PORTB, который представляет состояния всех 8 выводов в PORTB (RB7-RB0).
Затем микроконтроллер PIC сохраняет эти данные в MCU. Бит, связанный с RB, который вы задали для MODIFY , изменяется, а затем микроконтроллер PIC ЗАПИСЫВАЕТ все 8 бит (RB7-RB0) обратно в регистр PORTB.
Во время первого чтения регистра PORT вы будете читать фактическое состояние физического контакта.
Проблема возникает, когда выходной вывод загружен таким образом, что на его логическое состояние влияет нагрузка.Примеры таких нагрузок – это светодиоды без токоограничивающих резисторов или нагрузки с большой емкостью или индуктивностью.
Например, если между контактом и землей установлен конденсатор, зарядка займет некоторое время, когда контакт установлен на 1.
С другой стороны, если конденсатор разряжен, он действует как короткое замыкание, переводя вывод в состояние «0», и, следовательно, чтение регистра PORT вернет 0, даже если мы записали в него 1 .
Давайте проанализируем следующий пример:
ПОРТБ.B0 = 1; PORTB.B1 = 1;
Предположим, что изначально для порта PORTB задано нулевое значение, а все контакты настроены на вывод. Допустим, мы подключаем разряженный конденсатор к выводу RB0.
Первая строка, PORTB.B0 = 1;
будет декодировано следующим образом:
Вторая строка, PORTB.B1 = 1;
будет декодировано следующим образом:
Чтобы исправить проблему в коде, вставляйте задержку после каждой строки PORTB.Bx = 1
или изменяйте весь регистр PORTB в одной строке PORTB = 0b00000011
.
Семейство микроконтроллеров PIC18Fxxxx
На устройстве PIC18Fxxxx этой проблемы можно избежать, используя регистр LATx при записи в порты, а не регистры PORTx.
Запись в регистр LATx эквивалентна записи в регистр PORTx, , но чтения из регистров LATx возвращают значение данных, хранящееся в защелке порта, независимо от состояния фактического вывода .
Например, давайте проанализируем следующий пример:
LATB.B0 = 1; LATB.B1 = 1;
Первая строка, LATB.B0 = 1;
будет декодировано следующим образом:
Вторая строка, LATB.B1 = 1;
будет декодировано следующим образом:
Когда использовать LATx вместо PORTx
В зависимости от вашего оборудования может возникнуть непредсказуемое поведение при использовании битов PORTx для управления выводом.
Дисплеи (GLCD, LCD), контакты выбора микросхемы в интерфейсах SPI и другие случаи, когда вам нужен быстрый и надежный вывод, следует использовать LATx вместо PORTx.
Что вы думаете об этой теме? Отправьте нам отзыв! Хотите больше примеров и библиотек?
Найдите их на
Примеры манипуляции с портами Arduino – Arduino Learning
Регистры портовобеспечивают более быстрое и низкоуровневое управление контактами ввода-вывода микроконтроллера на плате Arduino. Чипы, используемые на плате Arduino UNO, имеют три порта:
B (цифровые контакты 8-13)
C (контакты аналогового входа)
D (цифровые контакты 0-7)
Каждый порт управляется тремя регистрами, которые также являются переменными, определенными в языке Arduino.Регистр DDR определяет, является ли вывод INPUT или OUTPUT. Регистр PORT контролирует, является ли вывод HIGH или LOW, а регистр PIN считывает состояние контактов INPUT, установленных для ввода с помощью pinMode (). Карты микросхем ATmega8 и ATmega168 показывают порты. Новый чип Atmega328p в точности повторяет распиновку Atmega168.
РегистрыDDR и PORT можно как записывать, так и читать. Регистры PIN соответствуют состоянию входов и могут быть только прочитаны.
PORTD отображается на цифровые контакты Arduino с 0 по 7
DDRD – Регистр направления данных порта D – чтение / запись
PORTD – Регистр данных порта D – чтение / запись
PIND – Регистр входных контактов порта D – только чтение
PORTB отображается на цифровые выводы Arduino с 8 по 13 Два высоких биты (6 и 7) отображаются на контакты кристалла и не используются
DDRB – Регистр направления данных порта B – чтение / запись
PORTB – Регистр данных порта B – чтение / запись
PINB – Регистр входных контактов порта B – только чтение
PORTC отображается на аналоговые выводы Arduino с 0 по 5. Контакты 6 и 7 доступны только на Arduino Mini
DDRC – Регистр направления данных порта C – чтение / запись
PORTC – Регистр данных порта C – чтение / запись
PINC – Регистр входных контактов порта C – только чтение
Каждый бит этих регистров соответствует одному выводу; например младший бит DDRB, PORTB и PINB относится к выводу PB0 (цифровой вывод 8). Для полного сопоставления номеров контактов Arduino с портами и битами см. Схему для вашего чипа: ATmega8, ATmega168. (Обратите внимание, что некоторые биты порта могут использоваться для других целей, кроме ввода-вывода; будьте осторожны, чтобы не изменить значения соответствующих им битов регистра.)
Код
В этом примере все порты PORTB будут настроены на выходы, что немного избыточно, поскольку тогда все контакты порта будут установлены на высокий, а затем на низкий уровень, а не на отдельный встроенный светодиод
.#include#include установка void () { DDRB = 0xFF; } пустой цикл () { PORTB = 0xFF; _delay_ms (1000); PORTB = 0x00; _delay_ms (1000); }
Это установит PB5 (вывод 13 – светодиод на плате) только путем установки значения PORT на 0x32, это будет следующее в двоичном формате – 00100000.Бит 5 высокий.
#include#include установка void () { DDRB = 0xFF; } пустой цикл () { PORTB = 0x32; _delay_ms (1000); PORTB = 0x00; _delay_ms (1000); }
Вы также можете сделать это так, что покажет вам биты, которые вы устанавливаете и используете, и может быть немного проще для понимания
#include#include установка void () { DDRB = B11111111; } пустой цикл () { ПОРТБ = B00100000; _delay_ms (1000); PORTB = B00000000; _delay_ms (1000); }
Этот метод также включает и выключает встроенный светодиод.
#include#include установка void () { DDRB = B11111111; } пустой цикл () { PORTB = PORTB | 0x20; // Записывает PORTB5 low _delay_ms (500); ПОРТБ = ПОРТБ & 0xDF; // Записывает в PORTB5 высокий уровень _delay_ms (500); }
Размер шестигранника:
Давайте посмотрим на пример мигания, эта информация взята из Arduino IDE
.Sketch использует 1030 байт (3%) места для хранения программ. Максимум 32 256 байт.
Теперь используем нижний пример выше
Sketch использует 494 байта (1%) пространства для хранения программ.Максимум 32 256 байт.
Итак, ясно, что этот базовый пример сократит размер шестнадцатеричного файла, что не так важно в этом примере, но в более сложных примерах может быть актуально.
Скорость.
Управление портами происходит быстрее, чем использование команды Arduino digitalWrite (), вероятно, не критично, если вы просто мигаете светодиодом, но бывают случаи, когда скорость может быть проблемой
Ошибка в функции прерывания PORTB при изменении
Ошибка в функции прерывания PORTB при измененииОшибка в прерывании PORTB при изменении функции
Большинство микроконтроллеров Microchip PIC16 и PIC18 поддерживают прерывание при изменении функция, которая может генерировать прерывание, когда входной порт (обычно биты 4-7 порта PORTB) изменяет состояние.Состояние гонки в реализация этой функции, которая может привести к изменению вывода, не генерирование прерывания. На этой диаграмме PORTB взят из PICmicro
Справочное руководство по семейству MCU среднего уровня, логика обнаружения изменений
был выделен красным. Защелка с маркировкой Защелка
является
входная защелка; защелка без надписи под ней – это защелка для сдачи. В
входная защелка обновляется каждый квартал, а защелка изменения обновляется каждый
Q3 при чтении порта. Выход этих двух защелок подвергается операции XOR.
обеспечить индикацию изменения.Проблема возникает из-за того, что вход
к обеим защелкам идет вывод порта, но защелки обновляются на
разное время в цикле обучения. В результате булавка
изменение во время Q2 инструкции, которая читает порт, не будет
генерировать прерывание. Вот пример времени, при котором возникнет проблема:
- Первоначальное чтение PORTB выполняется при низком уровне на контакте. Это устанавливает ввод защелка = 0, изменить защелку = 0.
- Штифт идет высоко. Это устанавливает защелку входа = 1, защелку изменения = 0.Поскольку входная защелка! = Изменить защелку, устанавливается RBIF.
- Вектор прерывания.
MOVF PORTB, W; прочтите PORTB, чтобы очистить условие несоответствия
- Q1: Входная защелка обновлена до 1.
- Q2: Считывание входной защелки PORTB. Пин здесь низкий.
- Q3: Заменить защелку обновлено на 0.
- Q4: W записывается с состоянием входной защелки (1).
BCF INTCON, RBIF; очистить RBIF
- Q1: Входная защелка обновлена до 0.
- Q2: Считывается INTCON.
- Q3: Обработка.
- Q4: записан INTCON. Поскольку входная защелка и защелка изменения оба 0 на этом этапе, RBIF разрешено очищать.
Исправление состоит в том, чтобы добавить третий шаг: прочитать порт во второй раз.В значение второго чтения отражает истинное состояние вывода:
MOVF PORTB, W; читать PORTB
- Q1: Входная защелка обновлена до 0.
- Q2: Считывание входной защелки PORTB.
- Q3: Заменить защелку обновлено на 0.
- Q4: W записывается с состоянием входной защелки (0).
MOVF PORTB, W; прочитать и выбросить PORTB
- Q1: Входная защелка обновлена до 1.
- Q2: Считывание входной защелки PORTB.
- Q3: Заменить защелку обновлено до 1.
- Q4: W записывается с состоянием входной защелки (1).
BCF INTCON, RBIF; очистить RBIF
- Q1: Входная защелка обновлена до 1 (снова).
- Q2: Считывается INTCON.
- Q3: Обработка. Защелка изменения – , а не , здесь обновлено, так как PORTB не читаются.
- Q4: записан INTCON. Поскольку входная защелка и защелка изменения оба равны 1 на данный момент, RBIF может быть очищен.
MOVF PORTB, W; читать PORTB
- Q1: Входная защелка обновлена до 1 (снова).
- Q2: Считывание входной защелки PORTB. Пин здесь низкий .
- Q3: Заменить защелку обновлено до 0. Поскольку входная защелка! = Изменить защелка, устанавливается RBIF.
- Q4: W записывается с состоянием входной защелки (1).
Последний сценарий – смена вывода, происходящая во втором квартале , оба порта . прочтите инструкцию:
MOVF PORTB, W; прочитать и выбросить PORTB
- Q1: Входная защелка обновлена до .1
- Q2: Считывание входной защелки PORTB. Пин здесь низкий .
- Q3: Заменить защелку обновлено на 0.
- Q4: W записывается с состоянием входной защелки (1).
BCF INTCON, RBIF; очистить RBIF
- Q1: Входная защелка обновлена до 0.
- Q2: Считывается INTCON.
- Q3: Обработка. Защелка изменения – , а не , здесь обновлено, так как PORTB не читаются.
- Q4: записан INTCON. Поскольку входная защелка и защелка изменения оба 0 на этом этапе, RBIF разрешено очищать.
MOVF PORTB, W; читать PORTB
- Q1: Входная защелка обновлена до 0 (снова).
- Q2: Считывание входной защелки PORTB. Штифт здесь высокий .
- Q3: Заменить защелку обновлено до 1. Поскольку входная защелка! = Изменить защелка, устанавливается RBIF.
- Q4: W записывается с состоянием входной защелки (0).
Использование PORTB вне ISR
Справочные руководства семейств PIC16 и PIC18 предупреждают, чтофункция прерывания при изменении рекомендуется для пробуждения по клавише депрессия и операции, в которых PORTB используется только для прерывания об изменении функции.Опрос PORTB не рекомендуется при использовании прерывание при изменении функции.В других технических паспортах особо указывается что прерывания могут быть потеряны путем опроса PORTB и форума Microchip пользователи сообщали о случаях потери прерываний.
Заключение
Эта проблема возникает только в том случае, если у вас есть- Одиночный вывод, который может меняться дважды за период приблизительно равно задержке обработчика прерывания RBIF, или
- Два или более штифта, которые могут быть изменены в течение приблизительно периода времени равно задержке обработчика прерывания RBIF.
кредитов
Спасибо ocelot, который первым задокументировал эту проблему.Авторские права © 2008 John Temples (фото на xargs dot com)
Множественные внешние прерывания в PIC16F877A с использованием прерывания PORTB
В нашем предыдущем руководстве мы уже видели внешние прерывания, последовательные прерывания и прерывания по таймеру.В этом руководстве мы увидим, как использовать несколько внешних прерываний в PIC16F877A.
Как следует из названия, прерывания – это особые события, требующие немедленного внимания, они останавливают микроконтроллер / микропроцессор от выполняемой задачи и выполняют специальную задачу, известную как процедура обслуживания прерываний (ISR) или обработчик прерываний.
PIC 16F877A имеет следующие 15 источников прерываний:
- Внешний
- Таймер 0
- Таймер 1
- RB Изменение порта
- Чтение / запись параллельного подчиненного порта
- Аналого-цифровой преобразователь
- Получение USART
- Передача USART
- Синхронный последовательный порт
- CCP1 (захват, сравнение, ШИМ)
- CCP2 (захват, сравнение, ШИМ)
- Соответствие TMR2 PR2
- Компаратор
- Операция записи EEPROM
- Столкновение с автобусом
Как мы уже знаем, у нас есть только одно внешнее прерывание, которое находится в PortB.0. Например, в моем проекте мне нужно использовать много внешних прерываний. Как использовать много, так как у нас только один в PORTB.0. Итак, в этом руководстве мы увидим, как использовать несколько внешних прерываний в PIC16F877A.
В PIC16F877A у нас есть одно прерывание, которое является прерыванием изменения PORTB. Это прерывание используется для идентификации изменения порта в PORTB. Это будет контролировать только PORTB.4, PORTB.5, PORTB.6 и PORTB.7. Итак, сначала мы увидим это прерывание изменения PORTB. Для этого вам необходимо ознакомиться с регистром прерывания, доступным в PIC16F877A.Мы уже обсуждали эти регистры. Вы можете обновить здесь.
Шаги, которых необходимо придерживаться
- Разрешить прерывание изменения PORTB.
- Подключите внешние контакты прерывания к RB4, RB5, RB6 и RB7 (PORTB.4 – PORTB.7).
- Каждый раз, когда изменяется состояние любого из RB4, RB5, RB6, RB7, срабатывает ISR.
- В ISR вы должны прочитать регистр PORTB. Только тогда он очистит прерывание PORTB.
Исходный код
При изменении состояния любого из RB4, RB5, RB6, RB7 произойдет прерывание.В ISR я переключаю светодиод в PORTD.
// Прерывание PORTB #include# определить задержку для (i = 0; i <= 50000; i ++) #define LED PORTD беззнаковый int i; недействительное прерывание ISR (недействительно) { беззнаковый символ temp_PORTB = PORTB; LED = 0xff; задерживать; LED = 0x00; RBIF = 0; } void main (пусто) { / * Порт B как вход * / TRISB0 = 0xFF; / * Порт D как выход * / TRISD = 0; Светодиод = 0; / * Регистрируем прерывание PORTB * / OPTION_REG | = 0b00000000; INTCON | = 0b10011000; в то время как (1) { } }
Выход
[Пожалуйста, найдите здесь выходное изображение]
Шаги, которых необходимо придерживаться
- Перед инициализацией прерывания сначала сохраните значение PORTB в одной переменной.
- Разрешить прерывание изменения PORTB.
- Подключите внешние контакты прерывания к RB4, RB5, RB6 и RB7 (PORTB.4 - PORTB.7).
- Каждый раз, когда срабатывает ISR, вам нужно прочитать значение PORTB и сравнить со старым значением PORTB, используя метод XOR.
- Затем вы получите новое значение, а затем, используя оператор ИЛИ, вы сможете найти точный прерванный вывод.
Исходный код
В этом источнике всякий раз, когда изменяется PORTB.4 - PORTB.7, я мигаю уважаемым светодиодом, подключенным к PORTD.new_PORTB; if (key_pressed & PORTB_4) { LED = PORTB_4; } else if (key_pressed & PORTB_5) { LED = PORTB_5; } else if (key_pressed & PORTB_6) { LED = PORTB_6; } else if (key_pressed & PORTB_7) { LED = PORTB_7; } еще { // нежелательное прерывание } задерживать; RBIF = 0; } void main (пусто) { / * Порт B как вход * / TRISB0 = 0xFF; / * Порт D как выход * / TRISD = 0; Светодиод = 0; / * Сохранение исходного значения PORTB * / old_PORTB = ПОРТБ; / * Регистрируем прерывание PORTB * / OPTION_REG | = 0b00000000; INTCON | = 0b10011000; в то время как (1) { LED = 0x00; } }
Выход
[Пожалуйста, найдите здесь выходное изображение]
Итак, теперь у нас есть 5 внешних прерываний, включая PORTB. 0 прерывание. Вы можете поиграть с этим.
4.5 2 голоса
Рейтинг статьи
СвязанныеВходы / выходы – – Документация Great Cow BASIC
О входах и выходах
Выводы большинства универсальных микроконтроллеров могут работать в одном из два режима: режим ввода или режим вывода.
При работе в качестве входа контакт входа / выхода общего назначения будет переведен в состояние высокого импеданса.Затем микроконтроллер обнаружит контакт ввода / вывода общего назначения, и программа сможет читать состояние контакта ввода / вывода общего назначения и принятие решений на его основе.
В режиме вывода микроконтроллер подключает общий вывод ввода / вывода к одному из Vcc (положительное питание) или Vss (земля или отрицательное питание). В Затем программа может установить состояние контакта ввода / вывода общего назначения на высокий или низкий.
Great Cow BASIC попытается определить направление каждого вывода общего назначения ввода / вывода и установить его соответственно, когда это возможно. Great Cow BASIC попытается установить направление вывода общего назначения ввода / вывода. Однако, если общий вывод ввода / вывода считывается и записывается в вашей программе, тогда контакт ввода / вывода общего назначения должен быть настроен программой для режима ввода или вывода, используя соответствующие команды Dir.
Пример команды dir
.
'Адрес порта зависит от микроконтроллера. Portx.x - это общий случай для PIC и AVR dir portb.0 в dir portb.1 out 'Адрес порта зависит от микроконтроллера. gpiox.x - общий случай для некоторых PIC dir gpio.0 в dir gpio.1 Out 'Установить весь порт как выход dir portb out dir gpio out 'Установить весь порт как вход dir portc in dir gpio in
Особенности микрочипа для операций чтения / записи
Для получения информации о конкретных портах и выводах ввода / вывода общего назначения, доступных для конкретного микроконтроллера, см. техническая спецификация.
Порт | Назначение | Пример |
---|---|---|
PORTx отображается на цифровые выводы микроконтроллера с 0 по 7. Где x может быть a, b, c, d, e, f или g | Читать: PORTx регистр данных порта для операции чтения. | uservar = ПОРТА uservar = PORTA.1 |
PORTx отображается на цифровые выводы микроконтроллера с 0 по 7. Где x может быть a, b, c, d, e, f или g | Написать: PORTx регистр данных порта для операции записи, и, где LATx не требуется, поскольку Great Cow BASIC будет реализовывать LATx при необходимости. См. Опцию NoLatch для получения дополнительной информации о регистрах LAT и о том, как отключить эту автоматическую функцию. | ПОРТА = 255 ПОРТА.1 = 1 |
Для чтения вывода ввода / вывода общего назначения необходимо убедиться в правильности направления. DIR Portx IN
установлен (по умолчанию IN) или определенный набор битов порта.Где uservar = PORTx.n можно использовать
.
Примеры:
uservar = PORTb.0 uservar = PORTb
Для записи на контакт ввода / вывода общего назначения необходимо убедиться в правильности направления DIR Portx OUT
для порта или определенного набора битов порта.
Где PORTx.n = uservar
может использоваться.
Примеры:
PORTb.0 = uservar PORTb = uservar
Особенности ATMEL для операций чтения / записи
Используя Mega328p в целом, следующее дает представление об устройствах AVR.Для конкретных портов и общего назначения контакты ввода / вывода, доступные для конкретного микроконтроллера, см. в таблице данных.
Порт | Операция записи | Операция чтения |
---|---|---|
PORTD отображается на цифровые контакты Mega328p (и микроконтроллеры AVR) с 0 по 7 | PORTD – Регистр данных порта D – операция записи (операция чтения в порт предоставит статус подтягивания) | PIND – Регистр входных контактов порта D – только чтение |
PORTB соответствует цифровым контактам с 8 по 13 Mega328p (и микроконтроллерам AVR).Два старших бита (6 и 7) отображаются на кристалл. булавки и непригодны для использования | PORTB – Регистр данных порта B – операция записи (операция чтения в порт предоставит статус подтягивания) | PINB – Регистр входных контактов порта B – только чтение |
PORTC соответствует аналоговым контактам с 0 по 5 Mega328p (и микроконтроллерам AVR).Контакты 6 и 7 доступны только на Mega328p. (и микроконтроллеры AVR) Mini | PORTC – Регистр данных порта C – операция записи (операция чтения в порт предоставит статус подтягивания) | PINC – Регистр входных контактов порта C – только чтение |
Для чтения вывода ввода / вывода общего назначения необходимо убедиться в правильности направления. DIR Portx IN
установлен (по умолчанию IN) или определенный набор битов порта.Где uservar = PINx.n можно использовать
, и поэтому для чтения порта данных используйте uservar = PINx
.
Примеры:
uservar = PINb.0 uservar = PINb
Для записи на контакт ввода / вывода общего назначения необходимо убедиться в правильности направления DIR Portx OUT
для порта или определенного набора битов порта.
Где можно использовать PORTx.n = uservar
и, следовательно, для записи в порт данных используйте PORTx = uservar
.
Примеры:
PORTb.0 = uservar PORTb = uservar
Настройка портов и Port.bit
Вы можете установить порт, как показано выше, с помощью переменной, или вы можете установить с помощью константы или любой комбинации, используя побитовые и логические операторы.
#define InitStateofPort 0b11110000 PORTb = InitStateofPort 'безоговорочно установит биты 4: 7 PORTb = 0b11110000 'безоговорочно установит биты 4: 7 PORTb = uservar ИЛИ 0b11110000 'выполнит ИЛИ биты 4: 7, чтобы убедиться, что биты 4: 7 установлены.
Следующее также верно – чтение порта.bit, а затем установите port.bit с переменной или значением порта. Как показано ниже.
dir portb out portb.0 = NOT portb.0
Приведенный выше код пользователя может вызывать проблемы с ошибками при выполнении операций чтения и записи. Посмотрим на сгенерированные ассемблер.
; portb.0 = НЕ portb.0 banksel SYSTEMP1 clrf SysTemp1 btfsc PORTB, 0 incf SysTemp1, F comf SysTemp1, F bcf PORTB, 0 btfsc SysTemp1,0 bsf PORTB, 0
Для устранения любых сбоев добавьте #option Volatile
в свой код пользователя.
#option Неустойчивый портb.0 dir portb out portb.0 = НЕ portb.0
Эта опция предоставляет следующий ассемблер, решающий проблему сбоя.
; portb.0 = НЕ portb.0 banksel SYSTEMP1 clrf SysTemp1 btfsc PORTB, 0 incf SysTemp1, F comf SysTemp1, F btfsc SysTemp1,0 bsf PORTB, 0 btfss SysTemp1,0 bcf PORTB, 0
См. Также Dir, #Option Volatile
204363 Parker – Специальное холодильное оборудование A8BS / (S) PORTB Adapter Kit
СтранаAfghanistanÅland IslandsAlbaniaAlgeriaAmerican SamoaAndorraAngolaAnguillaAntarcticaAntigua & BarbudaArgentinaArmeniaArubaAustraliaAustriaAzerbaijanBahamasBahrainBangladeshBarbadosBelarusBelgiumBelizeBeninBermudaBhutanBoliviaBosnia & HerzegovinaBotswanaBouvet IslandBrazilBritish Индийского океана TerritoryBritish Virgin IslandsBruneiBulgariaBurkina FasoBurundiCambodiaCameroonCanadaCape VerdeCaribbean NetherlandsCayman IslandsCentral африканского RepublicChadChileChinaChristmas IslandCocos (Килинг) IslandsColombiaComorosCongo – BrazzavilleCongo – KinshasaCook IslandsCosta RicaCôte d’IvoireCroatiaCubaCuraçaoCyprusCzechiaDenmarkDjiboutiDominicaDominican RepublicEcuadorEgyptEl SalvadorEquatorial GuineaEritreaEstoniaEswatiniEthiopiaFalkland IslandsFaroe IslandsFijiFinlandFranceFrench GuianaFrench PolynesiaFrench Южный TerritoriesGabonGambiaGeorgiaGermanyGhanaGibraltarGreeceGreenlandGrenadaGuadeloupeGuamGuatemalaGuernseyGuineaGuinea-BissauGuyanaHaitiHeard & McDonald IslandsHondurasHong Kong SAR Chi naHungaryIcelandIndiaIndonesiaIranIraqIrelandIsle из ManIsraelItalyJamaicaJapanJerseyJordanKazakhstanKenyaKiribatiKosovoKuwaitKyrgyzstanLaosLatviaLebanonLesothoLiberiaLibyaLiechtensteinLithuaniaLuxembourgMacao SAR ChinaMadagascarMalawiMalaysiaMaldivesMaliMaltaMarshall IslandsMartiniqueMauritaniaMauritiusMayotteMexicoMicronesiaMoldovaMonacoMongoliaMontenegroMontserratMoroccoMozambiqueMyanmar (Бирма) NamibiaNauruNepalNetherlandsNew CaledoniaNew ZealandNicaraguaNigerNigeriaNiueNorfolk IslandNorthern Mariana IslandsNorth KoreaNorth MacedoniaNorwayOmanPakistanPalauPalestinian TerritoriesPanamaPapua Новый GuineaParaguayPeruPhilippinesPitcairn IslandsPolandPortugalQatarRéunionRomaniaRussiaRwandaSamoaSan MarinoSão Tomé & PríncipeSaudi ArabiaSenegalSerbiaSeychellesSierra LeoneSingaporeSint MaartenSlovakiaSloveniaSolomon IslandsSomaliaSouth AfricaSouth Грузия и Южные Сандвичевы IslandsSouth KoreaSpainSri LankaSt.BarthélemySt. Елена Китс и Невис LuciaSt. MartinSt. Pierre & MiquelonSt. Винсент и ГренадиныСуданСуринамСвальбард и Ян-МайенШвецияШвейцарияСирияТайвань, провинция КитаяТаджикистанТанзанияТаиландТимор-ЛестеТогоТокелаТонгаТринидад и ТобагоТунисТурцияТуркменистанУкраина Соединенное КоролевствоУкраина Соединённые Штаты АмерикиУкраина Соединённые Штаты Америки. Внешние острова Виргинские островаУзбекистанВануатуВатиканВенесуэлаВьетнамУоллис и ФутунаЗападная СахараЙеменЗамбияЗимбабве
Штат / провинцияВыберите регион, штат или провинцию.AlabamaAlaskaAmerican SamoaArizonaArkansasArmed сила AfricaArmed сила AmericasArmed сила CanadaArmed сила EuropeArmed силы Среднего EastArmed сила PacificCaliforniaColoradoConnecticutDelawareDistrict из ColumbiaFederated Штатов MicronesiaFloridaGeorgiaGuamHawaiiIdahoIllinoisIndianaIowaKansasKentuckyLouisianaMaineMarshall IslandsMarylandMassachusettsMichiganMinnesotaMississippiMissouriMontanaNebraskaNevadaNew HampshireNew JerseyNew MexicoNew YorkNorth CarolinaNorth DakotaNorthern Mariana IslandsOhioOklahomaOregonPalauPennsylvaniaPuerto RicoRhode IslandSouth CarolinaSouth DakotaTennesseeTexasUtahVermontVirgin IslandsVirginiaWashingtonWest VirginiaWisconsinWyoming
Включение внутренних подтягиваний PORTB PIC16F877A с помощью компилятора CCS C
Каждый из выводов PORTB микроконтроллера PIC16F877A имеет внутреннюю слабую подтяжку.Один контрольный бит может включить все подтягивания. Это выполняется очисткой бита RBPU (OPTION_REG <7>). Слабое подтягивание автоматически отключается, когда вывод порта настроен как выход. Подтягивания отключены при сбросе при включении питания.
В этой небольшой статье показано, как включить внутренние подтягивания PORTB PIC16F877A с помощью компилятора CCS C.
Следующая строка компилятора CCS C может разрешить все внутренние подтягивания PORTB:
port_b_pullups (true);
И следующая строка может отключить все внутренние подтягивания PORTB:
port_b_pullups (false);
Пример включения внутренних подтягиваний PIC16F877A PORTB:
Это простой пример показывает, как включить и использовать внутренние подтягивания PIC16F877A.