Как установить порт в качестве входного или выходного с помощью PIC?

#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