Разница между чтением ПОРТА и ПИН


9

В чем разница между чтением PORTA и PINA? Какая связь между портом и его выводами? Я действительно запутался !!! Пример чтения ПОРТА: (здесь не нужен пин-код для чтения)

Сборка f = 1 МГц ATmega8 Мне нужно дополнять PORTB каждые 1 мс (рабочий цикл = 50%)

    LDI R16,$FF
    OUT DDRB,R16
    MAIN: LDI R16,00
    DELAY:CPI R16,200
    BREQ LOOP
    INC R16
    RJMP DELAY
    loop:IN R17,PORTB
    COM R17
    OUT PORTB,R17
    OUT R17,PORTB
    RJMP MAIN

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

Извините, это отредактировано.
Ханна

Это ваш собственный код или это из примера? Если это пример, то откуда он? Почему вы говорите "чтение булавки здесь не полезно"?
angelatlarge

Я проверял это раньше в студии AVR. Как вы думаете, в R17 PINB правильный?
Ханна

Ответы:


13

PORT - это буфер OUTPUT, PIN-код - это буфер INPUT.

Если вы хотите установить на выводе «высокое» или «низкое» напряжение, запишите в регистр PORT.

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

Биты этих регистров представляют соответствующие выводы универсального порта ввода / вывода.

Вот упрощенная схема электроники внутри AVR, подключенного к одному выводу (см. Здесь для полных таблиц данных).

Этот блок схемы повторяется для каждого контакта. Восемь из них образуют порт (например, порт A).

введите описание изображения здесь

Начиная с самого левого квадрата (который представляет физическую связь с внешним миром), вы можете увидеть три пути:

  1. Самым верхним путем является выбираемый программно подтягивающий резистор
  2. Средний путь используется, когда штифт настроен как выход
  3. Самый низкий путь используется, когда вывод сконфигурирован как вход

Следует отметить, что некоторые или все эти схемы могут быть обойдены, когда вывод используется совместно с внутренней периферией. Например, аналого-цифровой преобразователь (АЦП).


+1 Стоит также отметить, что когда порты настроены как входы, запись 1 в любой бит PORT включает внутренний подтягивающий резистор на этом выводе.
Мэтт Янг

Когда я должен читать ПОРТ?
Ханна

Вы читаете с PIN-кода. Чтение из ПОРТА не даст вам ничего полезного.
Мэтт Янг

@user - чтение из PORT даст вам состояние подтягивающих резисторов (независимо от того, включено подтягивание для этого вывода или нет), но, как упоминает Мэтт Янг, это не так уж и полезно.
DrFriedParts

Я добавил пример чтения ПОРТА
Ханна

4

Я полностью согласен с ответом DrFriedParts , однако хочу добавить, что вы действительно можете прочитать, PORTчтобы узнать, настроен ли порт / вывод как высокий или низкий выходной (когда DDR= 1, порт / вывод настроен как выходной) или внутренний подтягивающий резистор активирован (когда DDR= 0, порт / контакт настроен как вход). Таким образом порт порта может использоваться (довольно глупо) в качестве общего хранилища или для передачи информации о состоянии выводных / выходных подтягиваний, как в следующем сценарии

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


Можете ли вы дать мне лучший код? И почему в R17 PINB там не отвечает?
Ханна

Из вашего вопроса не ясно, что вы пытаетесь сделать ... можете ли вы уточнить это в своем вопросе: какова цель этого фрагмента кода? Вы просто пытаетесь переключить порт с определенной частотой и рабочим циклом?
angelatlarge

да !!! только это
Ханна

1

Для ваших целей чтение из PORT действительно имеет смысл: эти выводы являются выходными, и вы просто хотите прочитать последнее записанное вами значение, переключить его и записать обратно. Таким образом, вы используете регистр портов в качестве байта внешней наблюдаемой оперативной памяти.

С другой стороны, для этого конкретного приложения вы можете просто сохранить значение в регистре, и вам даже не придется считывать регистр PORT.


Так почему чтение ПИН неверно?
Ханна

Значение, которое вы получаете с помощью PIN-кода, в принципе зависит от того, что прикреплено к нему, и в вашем конкретном приложении вас интересует только то значение, которое вы ранее написали сами (это, конечно, довольно нетипично для I / O булавки). На практике, однако, я ожидал бы, что значения PORT и PIN здесь идентичны (вы пробовали это?).
микротерион

Да, я проверял это раньше в студии AVR. Я думаю, что вы сказали, что это правда. Нам просто нужно дополнить значение порта ...
Ханна
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.