#pic
#рис
Вопрос:
Проблема: не могу понять, как установить порт A и порт B в качестве входных и выходных данных
Я использую книгу в качестве ссылки: страница 19 — Введение (глава) — Название книги: Джон Мортон Третье издание — Микроконтроллер PIC Ваш личный вводный курс
Согласно тому, что я понял из книги, нумерация битов идет справа налево, поэтому я должен читать как порт DCBA, и вот почему: b’0010′
Однако этот абзац на странице 18 действительно сбивает с толку :
Он перемещает литерал в рабочий регистр. Затем команда tris принимает число в рабочем регистре и использует его для выбора, какие биты порта должны действовать как входные, а какие как выходные. Двоичный 1 будет соответствовать входу, а 0 соответствует выходу.
И, читая его снова, мне интересно, есть ли для каждого порта 4 бита, и я могу выбрать, сколько из них вводится и сколько выводится? Но я думал, что порт может быть только выходным или входным..
Пожалуйста, кто-нибудь разъяснит?
__config _CP_OFF amp; _WDT_OFF amp; _XT_OSC
list P = 16F57;
include "C:Program Files (x86)MicrochipMPLABXv3.40mpasmxp16f57.inc";
portA equ 05
portB equ 06
org 0 ; Starts at 0?
goto Start
Init
clrf portA ; Reset Port A and B States
clrf portB ;
movlw b'0010'; Set port B as output
tris portA;
movlw b'0010'; Set Port A as input
;0010 should mean -> ABCD port states?
tris portB;
retlw 0; return
Start
call Init;
Main
bsf portA,0;
goto Main;
END
Ответ №1:
Отдельный порт соответствует всем связанным с ним выводам. Например, на PIC16F57 у вас есть контакты RA0, RA1, RA2 и RA3. Эти выводы соответствуют битам ПОРТА 0, 1, 2 и 3 соответственно. Итак, это то, что происходит на самом деле.
clrf portA
clrf portB
movlw b'0010' ;Set RA1 as input and RA0,RA2,RA3 as output
tris portA;
movlw b'0010' ;Set RB1 as input and RB0,RB2,RB3 as output
tris portB
Следует отметить, что все контакты инициализируются как входные при включении или сбросе питания, и, хотя PORTA — это всего лишь 4-разрядный регистр, PORTB равен 8 битам. В этом случае может быть лучше явно объявить все биты для этого регистра.
movlw b'00000010' ;Set RB1 as input all others as output.
tris portB
Вы должны убедиться, что прочитали таблицу данных, чтобы определить ширину ваших регистров портов и их соответствующие выводы.
Комментарии:
1. Спасибо за ответ. Но почему существует определение «порт», если я могу использовать «контакты» для подключения чипа к внешнему миру?
2. @ScientistGirl — Это потому, что каждый бит порта соответствует отдельному pin-коду — вам все равно нужно ссылаться на правильный регистр порта, чтобы использовать pin-код. Например, в приведенном выше коде RA0 был установлен на выход. Теперь, если я хочу установить этот вывод на высокий уровень, мне нужно будет установить соответствующий бит в регистре ПОРТА
BSF PORTA, 0
следующим образом. Чтобы установить выход на низкий уровень, я бы использовалBCF PORTA, 0
.3. Другой способ подумать об этом — это то, что вы работаете с 8-разрядным микроконтроллером. Разработчик чипа мог бы использовать весь регистр для одного вывода, но это было бы пустой тратой семи бит (поскольку для вывода требуется только 1 бит). Для большей эффективности имеет смысл иметь 8-разрядный регистр, в котором каждый бит связан с отдельным выводом — это экономит место. Я бы посоветовал вам взглянуть на таблицу данных здесь .
Ответ №2:
TRISB=0xFF; //For PortB as a Input
TRISB=0x00; //For PortB as Output