AVR для начинающих.Урок 3.Порты ввода/вывода.

Автор: | 04.07.2016

Итак, продолжим знакомство с микроконтроллерами!

Сегодня мы рассмотрим такую важную тему как порты ввода/вывода. С ними мы столкнулись уже в предыдущем уроке, когда зажигали светодиод. Взаимодействие микроконтроллера с внешними устройствами, происходит именно благодаря портам ввода/вывода (Порты I/O(Input/Output)).

Порт микроконтроллера AVR представляет собой достаточно запутанный для новичка механизм. Однако сейчас мы не будем досконально разбирать его устройство, а лишь получим общее представление его работы. В данный момент нас интересует его программная реализация, которую мы рассмотрим в данном уроке, а к техническому устройству порта мы вернемся позднее.

I/O порт микроконтроллера AVR в программном виде представляет из себя 3 регистра, которые непосредственно отвечают за его работу. Так как микроконтроллеры AVR 8 разрядные, ножки контроллера для удобства были сгруппированы в порты по 8 штук.

atmega8_pinout_lrg

То есть, ножки контроллера PB0-PB7 являются портом B микроконтроллера AtMega8. Точно так же с выводами PD0-PD7, которые являются портом D.

Каждой ножке соответствует бит в управляющих регистрах. То есть ножке под номером 4 (Например PB4) соответствует 4 бит в регистрах PORTB,DDRB,PINB.

Каждая ножка порта может быть как портом ввода, так и портом вывода. То есть, мы можем либо управлять чем либо (например зажигать светодиод), либо принимать данные с чего либо (например обрабатывать нажатие кнопки).

За работу порта отвечает 3 регистра:

  • PORTx
  • PINx
  • DDRx

Каждый из данных регистров 8 разрядный. То есть, каждый бит данного регистра регулирует работу одной ножки контроллера. Рассмотрим каждый из данных регистров подробнее.

Рассматривать будем на примере порта B микроконтроллера AtMega8.

DDRB:

Каждый бит регистра DDRB отвечает за режим работы соответствующей ножки (PB0-PB7). Записав 0 в соответствующий бит, мы настраиваем соответствующую ножку в режим входа. То есть, теперь мы сможем считывать с неё входящие с внешних устройств данные. Записав в соответствующий бит 1 мы установим ножку в режим вывода, что позволит нам управлять чем либо (Например зажигать светодиод).

Читайте также  AVR для начинающих. Урок 11.UART.Подключение к компьютеру.

Пример кода на C(Настройка ножки PD4 на вывод):

Пример кода на ASM(Настройка ножки PD4 на вывод):

PORTB:

При настройке соответствующего вывода на вывод, регистр PORTB управляет состоянием данной ножки. То есть установив 1 в соответствующем бите регистра, мы подадим логическую 1 на вывод контроллера (Около +5 вольт), тем самым мы, например, зажигаем светодиод, подав на него +5v. Установив 0 в соответствующем бите регистра PORTB, мы установим логический 0 на выводе контроллера (Около 0 вольт), тем самым, например, мы гасим светодиод, подав на него около 0v, что прекратит протекание электрического тока через него.

Пример кода на C(установим ножку PB3 в состояние вывода и подадим на нее логическую единицу):

Пример кода на Ассемблере(установим ножку PB3 в состояние вывода и подадим на нее логическую единицу):

PINB:

Каждый бит регистра PINB, показывает текущее состояние соответствующей ножки контроллера, при её настройке в состояние ввода. Данный регистр, в отличии от двух предыдущих работает только в режиме чтения. То есть записать что либо в него мы не можем, однако считать состояние текущей ножки контроллера не составит труда! При подаче логической единицы на соответствующую ножку контроллера(которая разумеется работает в режиме ввода), в соответствующий бит данного регистра будет записана единица. Наоборот, при подаче логического нуля, в соответствующий бит будет записан 0.

Следующий пример поможет Вам лучше понять описанное выше:

Читайте также  COM порт Windows. SerialPort. C#.Продолжение.

Соберем следующую цепь

Номинал резистора R1, вы уже можете рассчитать самостоятельно!

Создадим в Atmel Studio новый проект на удобном Вам языке.

С:

ASSEMBLER:

При нажатии кнопки S1, на ножку PB1 контроллера AtMega8, подается логический ноль. В бесконечном цикле мы проверяем состояние регистра PINB, и если бит PB1 равен 0, то зажигаем светодиод. В противном случае, выключаем светодиод HL1.

Читайте также  Измерение периода сигнала

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

Если у Вас ещё остались вопросы, оставляйте их в комментариях.

Спасибо за внимание!

Администрация сайта MKPROG.RU

Другие уроки цикла.


Копирование, воспроизведение, цитирование данного материала или его частей разрешено только с письменного разрешения администрации сайта MKPROG.RU.

AVR для начинающих.Урок 3.Порты ввода/вывода.: 10 комментариев

  1. саша

    ошибка в коде на с
    «if((PINB&(1<<PB1))==) //Если на PB1 логический ноль"

    к чему равно условие?

  2. Виктор

    Если я правильно понял прочитанное, то в статье небольшая опечатка.
    ———————-
    Пример кода на ASM(Настройка ножки PD4 на вывод):
    Start:
    sbi DDRB,4
    ———————-
    Получается, что запись sbi DDRB,4 нужно записать, как sbi DDRD,4

  3. Андрей

    Здравствуйте! Подскажите, пожалуйста, как будет выглядеть код в ASM чтоб зажигалась лампочка после нажатия кнопки но без фиксации ее, и выключалась после второго нажатия.

    1. DamiKK Автор записи

      Здравствуйте!
      Проще всего повесить кнопку на вход внешнего прерывания и работать с ним.
      Настраиваете прерывание и в нем просто меняете значение выводимое в порт.

  4. Александр

    Доброе время суток! Большое спасибо за статьи, очень помогают при изучении, но подскажите новичку такой вопрос: с входом/выходом немного понятно, а как сделать что-то на подобии дешифратора. Я пишу так:
    #include
    int main(void)
    {
    PORTB=0xFF; //порт В как вход
    DDRB=0x00;
    PORTD=0x00; //порт D как выход
    DDRD=0xff;
    while(1) //бесконечный цикл
    {
    if (PORTB=0x01)
    {
    PORTD=0x05;
    }
    else
    {
    PORTD=0x00;
    }
    }
    }
    в чем у меня ошибка? проверяю в протеусе, постоянно горит значение PORTD=0x05

    1. DamiKK Автор записи

      Здравствуйте!
      if (PORTB=0x01)
      замените на
      if (PORTB==0x01)

      Затем у вас ошибки здесь:
      PORTB=0xFF; //порт В как вход
      DDRB=0x00;
      PORTD=0x00; //порт D как выход

      Ножка будет входом если в PORTx записан 0 и выходом если 1

  5. Рудольф

    «Каждый бит регистра PINB, показывает текущее состояние соответствующей ножки контроллера, при её настройке в состояние ввода.»

    Немного непонятно — «состояние ввода», речь идёт о вводе в микроконтроллер? (DDRx = 0x00)
    или вводе микроконтроллером информации в другое устройство? (DDRx = 0xFF)

    И второй вопрос, есть ли смысл в данной записи?:
    DDRD = 0x00;
    PORTD=0xFF;
    PIND = 0xFF;
    Непонятна логика, если DDRD установлен на вход данных в микроконтроллер, в чём смысл подавать на порт логическую «1»? (взято из учебной лекции одного института). Если я правильно понял, эта логическая «1» подаётся микроконтроллером на ножку порта. А в описанном выше получается, что мы вручную задаём информацию микроконтроллеру, что его порт D, на всех ножках имеет входящий сигнал логической «1».

    1. DamiKK Автор записи

      Здравствуйте, под словом состояние ввода имелось ввиду состояние ножек настроенных на вход DDRx = 0x00.

      Смысл записи в том что, при настройке ножки на ввод, битами регистра PORTx мы задаем подтяжку ножки к соответствующему уровню (pull-up,pull-down).PINx = 0xFF здесь уже лишнее.

Добавить комментарий для Александр Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *