Главная страница
Навигация по странице:

  • 1.2 Порты ввода-вывода

  • 1.3 Расположение выводов (пинов) на плате Arduino Uno R 3

  • Ардуйно. ЛК1 - Архитектура и порты AVR. Тема Архитектура микроконтроллеров серии avr


    Скачать 379 Kb.
    НазваниеТема Архитектура микроконтроллеров серии avr
    АнкорАрдуйно
    Дата27.12.2021
    Размер379 Kb.
    Формат файлаdoc
    Имя файлаЛК1 - Архитектура и порты AVR.doc
    ТипДокументы
    #319439


    Тема 1. Архитектура микроконтроллеров серии AVR
    Все микропроцессоры первого поколения обладали жестко "прошитой" логи­кой декодирования команд архитектуры RISC. Но более скоростным процессорам приходилось долго ожидать считывания следующей команды для декодирования из медленнодействующего запоминаю­щего устройства. Для устранения этого недостатка возникла идея микропрограмми­рования, т.е. каждая машинная команда последовательно обрабатывается микропрограммой, которая выполняется внутри кристалла процессора.

    Так появились процессоры CISC (Complex Instruction Set Computer - ком­пьютер со сложным набором команд). Типичными представителями этой CISC-архитек­туры процессоров являются семейства 80x86 и процессор Pentium компании Intel или семейства 680x0 компании Motorola.

    Со временем изготовителям модулей памяти удалось резко сократить время доступа, в результате чего произошел возврат "к исто­кам", и была разработана RISC-архитектура: компьютеры с сокращен­ным набором команд, у которых команды, как и в процессорах первых поколений, снова декодировались посредством "жесткой прошивки".

    Характерные особенности архитектуры RISC:

    - ограниченное количество эффективных команд;

    - отсутствие классического накапливающего сумматора в пользу большего числа равноправных рабочих регистров;

    - организация диапазонов памяти по Гарвардской модели (шина команд и шина данных);

    - единый интерфейс с запоминающими устройствами за счет исключитель­ного применения команд вида "Загрузка/Сохранение";

    - обработка команд в течение единственного машинного такта;

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

    Микроконтроллеры AVR работают по Гарвардской архитектуре - разделение памяти для программ и данных. Они используют одноступенчатую конвейерную обработку. Это означает, что во время вы­полнения команды выполняется загрузка следующей команды из памяти программ (рисунок 1.1).


    Рисунок 1.1 – Конвейерная обработка при выборке и выполнении команды
    Благодаря этому, достигается возможность выполне­ния команды в течение одного тактового цикла. Первая команда программы выполняется на один тактовый цикл дольше, чем та же команда в другом месте программы, поскольку в этом случае выборка не может быть осуществлена параллельно с выполнением преды­дущей команды.


    Рисунок 1.2 – Структурная схема микроконтроллера серии AVR
    Память программ реализована на основе программируемой и электрически стираемой флэш-технологии. Во всех микроконтроллерах AVR память 16-разрядная (двухбайтовая), и всегда находится "на кристалле". Расширение памяти программ с помощью блоков EPROM или флэш невозможно.

    Внутренняя память для энергозависимых данных, представляет со­бой статическую ОЗУ (SRAM).

    В EEPROM-память данных можно за­писывать данные во время нормального выполнения программы.

    Область ввода/вывода занимает 64 байта и нахо­дится в статической ОЗУ по адресам от $20 до $5F. Функции ввода/вывода для взаимодействия с внешним миром применимы не только для портов (от А до D), но также и для всех регистров со­стояния и управления таких "встроенных в кристалл" периферийных функций как таймер, устройство UART, интерфейс SPI и т.д.

    В микроконтроллерах серии AVR реализовано множество периферийных функций:

    - 32 программируемых линий ввода-вывода;

    - универсальный асинхронный приемо-передатчик UART;

    - синхронный интерфейс SPI;

    - 8-разрядный таймер/счетчик;

    - 16-разрядный таймер/счетчик с функциями сравнения и захвата и возмож­ностью реализации двух выходов ШИМ (широтно-импульсный модуля­тор);

    - интегрированный сторожевой таймер;

    - аналоговый компаратор.
    1.2 Порты ввода-вывода
    Все порты ввода/вывода являются 8-разрядными и двунаправленными. Каждый вывод порта может быть индивидуально сконфигурирован как вход или выход, причем в случае функционировании в качестве входа к нему может быть по выбору подключено подтягивающее сопротивление.

    Регистр направления передачи данных DDX определяет назначение вывода порта: вход или выход.

    Если разряд "n" в регистре DDXn содержит сигнал 0, то со­ответствующий вывод сконфигурирован как вход. Если разряд "n" в регистре DDXn содержит сигнал 1, то со­ответствующий вывод сконфигурирован как выход.

    Все возможные конфигурации для направления передачи данных и подтяги­вающего сопротивления порта перечислены в таблице 1.1.
    Таблица 1.1 – Конфигурация портов

    DDXn

    PortXn

    Ввод/ вывод

    Подтягивающее сопротивление

    Описание


    0

    0

    Ввод

    Нет

    Высокоомный вход

    0

    1

    Ввод

    Да

    Подтягивающее сопротивление

    1

    0

    Вывод

    Нет

    Двухтактный выход: лог. 0

    1

    1

    Вывод

    Нет

    Двухтактный выход: лог. 1


    Регистр направления передачи данных и регистр порта доступны для чтения и записи. AVR в состоянии принимать входные токи силой до 20 мА и благодаря этому, например, напрямую управлять светодиодами, под­ключенными к питающему напряжению.
    1.2.1 Порт А
    Наряду с общими функциями ввода/вывода, в качестве особой функции через этот порт осуществляется управление работой мультиплексированной шины адресов и дан­ных, если к микроконтроллеру семейства AVR подключено внешнее запоминаю­щее устройство RAM. На этот случай порт А оснащен внутренними подтягиваю­щими сопротивлениями.

    Когда порт А с помощью разряда SRE регистра MCUCR переключен на вы­полнение альтернативной функции, его регистр направления передачи данных DDRA соответствующим образом переписывается.

    1.2.1.1 Регистр данных порта А.

    Регистр данных PORTA расположен в области ввода/вывода по адресу $1В (по адресу $ЗВ в памяти RAM) и доступен для чтения и записи. После поступле­ния сигнала сброса он инициализируется значением $00.

    1.2.1.2 Регистр направления передачи данных DDRA.

    Регистр направления передачи данных DDRA расположен в области вво­да/вывода по адресу $1А (по адресу $ЗА в памяти RAM) и доступен для чтения и записи.
    1.2.2 Порт В
    Наряду с выполнением общих функций ввода/вывода, он также выполняет и некоторые особые функции.

    1.2.2.1 Регистр данных порта В.

    Регистр данных порта В расположен в области ввода/вывода по адресу $18 (по адресу $38 в памяти RAM) и доступен для чтения и записи. После поступле­ния сигнала сброса он инициализируется значением $00.
    Таблица 1.2 – Назначение разрядов регистра порта В

    P0RTB7

    P0RTB6

    P0RTB5

    PORTB4

    PORTB3

    PORTB2

    PORTB1


    PORTB0

    SCK

    MISO

    MOSI










    AIN1

    AIN0

    SCK

    MISO

    MOSI

    -

    OC1

    -

    AIN1

    AIN0

    SCK

    MISO

    MOSI

    /SS

    AIN1

    AIN0

    T1

    T0

    SCK

    MISO

    MOSI

    /SS

    AIN1

    AIN0

    T1

    T0


    Описание разрядов регистра порта В:

    SCK - тактовый выход в случае, если ведущим устройством является после­довательный интерфейс SPI, и тактовый вход в случае, если этот интерфейс явля­ется ведомым;

    MISO - вход последовательного интерфейса SPI в качестве ведущего устройства, и выход в слу­чае, если этот интерфейс применяется в качестве ведомого;

    MOSI - выход последовательного интерфейса SPI в качестве ведущего устройства, и вход в случае, если этот интерфейс применяется в качестве ведомого;

    /SS - вход выбора, если SPI явля­ется ведомым;

    AIN1 - инвертирующий вход аналогового компаратора;

    AIN0 — неинвертирующий вход аналогового компаратора;

    ОС1 - выход функции сравнения таймера/счетчика Т/С1;

    T1 - тактовый вход для T/C1;

    Т0 - тактовый вход для Т/С0.

    1.2.2.2 Регистр направления передачи данных DDRB.

    Регистр направления передачи данных DDRB расположен в области вво­да/вывода по адресу $17 (по адресу $37 в памяти RAM) и доступен для чтения и записи.
    1.2.3 Порт С
    Наряду с общими функциями ввода/вывода, в качестве особой функ­ции выполняется вывод через порт С старшего байта адреса, когда подсоединена внеш­няя память RAM. На этот случай порт С оснащен внутренними подтягивающими сопротивлениями.

    Когда порт С с помощью разряда SRE регистра MCUCR переключен на вы­полнение альтернативной функции, его регистр направления передачи данных DDRC соответствующим образом переписывается.

    1.2.3.1 Регистр данных порта С.

    Регистр данных PORTC расположен в области ввода/вывода по адресу $15 (по адресу $35 в памяти RAM) и доступен для чтения и записи.

    1.2.3.2 Регистр направления передачи данных DDRC.

    Регистр направления передачи данных DDRC расположен в области вво­да/вывода по адресу $14 (адрес $34 в RAM) и доступен для чтения и записи.
    1.2.4 Порт D
    Наряду с выполнением общих функций ввода/вывода, порт D также выполня­ет некоторые особые функции.

    1.2.4.1 Регистр данных порта D.

    Регистр данных порта D расположен в области ввода/вывода по адресу $12 (по адресу $32 в RAM) и доступен для чтения и записи.

    Таблица 1.3 – Назначение разрядов порта D

    P0RTD7

    PORTD6

    P0RTD5

    PORTD4

    PORTD3

    PORTD2

    PORTD1

    PORTD0

    -

    -

    -

    T0

    -

    INT0




    -

    -

    ICP

    T1

    T0

    INT1

    INT0

    TxD

    RxD

    /RD

    /WR

    0C1A

    -

    INT1

    INT0

    TxD

    RxD

    /RD

    /WR

    OC1A

    -

    INT1

    INT0

    TxD

    RxD


    Разряды порта D:

    /RD - управляющий сигнал чтение внешней памяти RAM;

    /WR - управляющий сигнал запись во внешнюю память RAM;

    ICP - вход для функции захвата таймера/счетчика Т/С1;

    ОС1А - выход для функции сравнения или функции ШИМ таймера/счетчикаТ/С1;

    Т1 - тактовый вход для Т/С1;

    Т0 - тактовый вход для Т/С0;

    INT1 - вход для внешнего прерывания 1;

    INT0 - вход для внешнего прерывания 0;

    TxD - информационный выход приемопередатчика UART;

    RxD - информационный вход приемопередатчика UART.

    1.2.4.2 Регистр направления передачи данных DDRD.

    Регистр направления передачи данных порта DDRD расположен в области ввода/вывода по адресу $11 (по адресу $31 в RAM) и доступен для чтения и запи­си.
    1.3 Расположение выводов (пинов) на плате Arduino Uno R3
    Пины разбиты на 3 группы: Digital – блок цифровых пинов; Analog – блок аналоговых пинов; Power – блок пинов, которые связаны с питанием и работой микросхемы.



    Рисунок 1.3 – Распиновка платы ардуино UNO
    При этом в разделе Digital пины, которые могут выдавать ШИМ (PWM)-сигнал, помечены тильдой «

    ». Для служебных целей и проверки работоспособности контроллера на плате установлен светодиод, который подключен к 13-му выводу, а из среды разработки Arduino IDE к нему можно обращаться через встроенную директиву LED_BUILTIN.
    1.4 Hex-файлы
    Двоичное представление команды - командное слово, или код операции (КОП) - компилятор записывает в виде числа в выходной файл с расширением hex, который затем используется программатором для записи в контроллер. Рассматриваемый формат разработан фирмой Intel (есть и другие "гексы") и отлича­ется тем, что содержит числа в шестнадцатеричной коде. На рисунке 1.4 представлен файл короткой про­граммы, открытый в обычном Блокноте. Чтение затрудняется тем, что строки не поделены на отдельные байты. Разбираться будет проще, если скопи­ровать этот файл под другим именем и расставить в нем пробелы после каждой пары символов.


    Рисунок 1.4 - Файл формата HEX
    Основную часть файла занимают информационные строки, содержащие непосред­ственно КОП. Они состоят из ряда служебных полей и собственно данных. Каждая строка начинается двоеточием и заканчивается парой символов "возврат карет­ки" - "перевод строки", на экране не отображаемых. После двоеточия идет число байтов в строке - кроме пер­вой и последней, везде стоит число 10 (десятичное 16), т.е. в каждой строке будет ровно 16 информационных байтов (исключая служебные). Затем следуют два байта адреса памяти - куда писать (в первой строке 0000, во второй это будет, естественно, 0010, т. е. предыдущий адрес + 16, и т. д.). Наконец, после адреса расположен еще один служебный байт, обозначающий тип данных, который в информационных строках равен 00 (а в первой и последней - 02 и 01, о чем да­лее). Только после этого начинаются собственно байты данных, которые означают соответствующие КОП, записанные пословно (КОП для AVR занима­ют в основном два байта, и память в этих МК также организована пословно), при­чем так, что младший байт идет первым.

    Таким образом, запись в первой информационной строке 3AС0 в привычном нам "арабском" порядке, когда самый старший разряд располагается слева, должна выглядеть, как С03А.

    В первой строке служебный байт типа данных равен 02, и это означает, что данные в ней представляют сегмент памяти, с которого должна начинаться запись (в данном случае 0000). Заканчивается hex-файл всегда строкой:00000001FF - значение типа данных 01 означает конец записи, данных больше не ожидается. А что означает FF?

    Самым последним байтом в каждой строке идет контрольная сумма (дополнение до 2, LRC - Longitudinal Redundancy Check) байтов строки, включая служебные. Алгоритм вычисления LRC - нужно вычесть из числа 256 значения всех байтов строки (не обращая внимание на перенос) и взять младший байт результата. Так, в первой строке число информационных байтов всего два, оба равны нулю, плюс число информационных байтов равно 2, плюс служебный байт типа данных, равный также 2, итого контрольная сумма всегда равна 256- 2-0-0-2 = 252 = $FC. В последней строке одни нули, кроме типа данных, равного 1, - соответственно контрольная сумма равна 256 - I = 255 = $FF.
    1.4.1 Расшифровка данных

    Первое слово в 1-й информационной строке равно C03A. Значению старшей тетрады в КОП, равной С (1100), соответствует команда rjmp - любая программа начинается с безусловного перехода на метку RESET. Теперь очевидно, что остальные биты в этом значении (03А) представляют абсо­лютный адрес в программе, где в тексте стоит метка RESET.

    Адреса отсчитываются по словам, а не по байтам, т.е. число $ЗА (58) нужно умножить на 2 (получится 116 = $74) и искать в этой области. Разыщем строку с адресом $0070, отсчитаем три пары байтов от начала данных и найдем там фрагмент "F894", который в нормальной записи будет выглядеть как 94F8, а это код команды cli, запрещающей прерывания (которая в начале программы лишняя, т.к. они все равно запрещены, но, видимо, поставлена на всякий случай).

    Следующая команда будет начинаться с байта Е5, и первая тетрада в ней обозначает код команды ldi (1110), а пятерка есть фрагмент адреса конца памяти (ramend), который в силу довольно сложного формата записи команды получается на самом деле равным 025F (см. значение младшего байта, равное $2F), Это соответствует значению ramend, определенному в inc-файлах для МК с 512 байтами встроенного ОЗУ (025F = 607, т.е. всего адресов 608, из которых 96 (51) занимают регистры, итого получается 512 ($0200) незанятых байтовых ячеек, составляющих ОЗУ). Если обратить внимание на первую-вторую строки с данными, то увидим повторяющийся фрагмент "1895", который является командой reti.

    Программа, которая превращает код обратно в текст, называется дизассемблер (она входит в AVR Studio).

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


    написать администратору сайта