Plazer-don.ru

Сварочное оборудование
7 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Урок ОК04

Урок ОК04

Profile picture for user lamazavr

Урок построен на основе ОК03. Рассматривается как использовать таймер для мигания ОК (ACT) светодиодом с точным интервалом. Предполагается, что у Вас есть код урока ОК03.

1. Новое устройство

До сих пор мы рассмотрели только одно устройство Raspberry Pi — GPIO контроллер. Я просто рассказал Вам что делать, и это сработало. Сейчас мы срассмотрим таймер и я собираюсь помочь Вам понять как он работает.

Так же как и у контроллера GPIO у таймера есть адрес в памяти — 0x20003000. В документации на процессор мы можем найти такую таблицу:

Таблица 1 — Регистры GPIO контроллера

АдресРазмер (Байт)ИмяОписаниеЧтение/Запись
200030004Control / StatusРегистр управление таймером.RW
200030048CounterСчетчик инкрементирующийся с частотой 1МГц.R
2000300C4Compare 00 регистр совпадения.RW
200030104Compare 11 регистр совпадения.RW
200030144Compare 22 регистр совпадения.RW
200030184Compare 33 регистр совпадения.RW

Эта таблица многое нам рассказывает, но самое ценное содержит описание различных полей. Документация объясняет, что таймер в принципе просто инкрементирует значение счетчика (counter) на 1 каждую микросекунду. Каждый раз значение в счетчике (его младшие 32 бита) сравнивается со значениями 4ех регистров сравнения. Если значение совпало, то обновляется значение поля Control/Status сигнализирую какое из значений совпало.

Наша задача — создать функцию, которую мы будем вызывать задавая необходимое время, она должна прождать заданное время. Задумайтесь на минуту о том, как мы могли бы сделать это, учитывая то, что мы имеем.

Я вижу два варианта:

1. Считать значение счетчика, а затем возвращаться назад к тому же коду, пока счетчик не достигнет нужного значения.
2. Считать значение счетчика, добавить к этому значению время ожидания, записать это значение в регистр сравнения, а зтем ожидать пока необходимый бит в регистре Control/Status не установится.

Оба эти варианта сработают на отлично. Но в данном уроке мы рассмотрим только первый. Причина этого в том, что использование регистра сравнения скорее приведет к ошибке, т.к. проходит время при вычислении на вычисления. Счетчик уже может превысить необходимое значение и совпадения не произойдет. Могут возникнуть очень длинные не предусмотренные задержки, если будет задана задержка в 1мкс (или еще хуже при 0).

2. Реализация

Во многом я оставлю задачу написания идеальной функции задержки заданием для Вас. Я предлагаю расположить весь код связанный с таймером в файле systemTimer.s (надеюсь по понятным причинам). Сложность состоит в том, что счетчик имеет 8 байтное значение, но каждый регистр может содержать только 4 байта. Поэтому, значение счетчика должно быть помещено в два регистра.

Последующие блоки кода — примеры.

Вам понадобиться инструкция ldrd. Она загружает 8 байт из памяти в два регистра. В данном случае 8 байт из памяти начиная с адреса в r2 будут скопированы в r0 и r1. Некоторые сложности вызывает то, что r1 на самом деле содержит старшие 4 байта. Другими словами, если счетчик имеет значение 999,999,999,999 = 0b1110100011010100101001010000111111111111, то r1 будет содержать 0b11101000, а r0 будет содержать 0b11010100101001010000111111111111.

Наиболее разумным способом реализации будет вычисление разности между текущим значением счетчика и тем, которое было при запуске метода. Затем необходимо сравнить полученное значение с временем, которое необходимо ожидать. Удобно, если только вы не хотите поддерживать время ожидание длиной 8 байт. Значение r1 в приведенном примере можно отбросить и сравнивать только младшие 4 байта.

Вы не должны использовать сравнения на равенство т.к. вы можете пропустить нужное значение таймера и задержка будет длиться бесконечно.

Если вы не можете понять как реализовать такую функцию, смотрите объяснение ниже.

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

Другой полезной функцией будет функция, которая возвращает текущее значение счетчика в регистрах r0 и r1.

Эта функция ипользует функцию GetSystemTimerBase для получения адреса таймера, после чего загружает значение счетчика при помощи комманды ldrd.
Теперь мы хотим запрограммировать наш метод ожидания. Прежде всего нужно использовать функцию GetTimeStamp для получения текущего значения счетчика.

Этот метод копирует входной параметр (время ожидания) в r2 и вызывает функцию GetTimeStamp, которая вернет значение счетчика в r0 и r1. После этого младшая часть копируется в r3.
Далее необходимо вычислить разность между текущим значением счетчика и начальным. Необходимо продолжать делать это пока значение не превысит заданное время ожидания.

Этот код будет выполняться до тех пор пока не пройдет заданное время. Тут происходит чтение текущего значения счетчика, вычитание из него начального значения и сравнение с заданным промежутком. Если необходимое время еще не вышло происходит переход к метке loop$;

Этот код завершает метод задержки возвратом.

3. Другая моргалка светодиодом

Когда вы создали рабочую функцию задержки измените main.s чтобы использовать её. Задайте в качестве времени ожидания большое число (помните это время в микросекундах) и проверьте все на Raspberry Pi. Если что-то не так посетите страницу устранения неисправностей.

Если все заработало, поздравляю! Вы только что освоили еще одно устройство процессора Raspberry Pi и управление временем вместе с ним.
В следующем и последнем уроке этой части мы рассмотрим как моргать светодиодом в определенной последовательности.

Линии ввода/вывода

Все двунаправленные линии ввода/вывода (23 — для НТ48Е30) могут работать как на ввод, так и на вывод. Регистры линий ввода/вывода обозначаются от РА до РС и РG и находятся в памяти данных по адресам [12H], [14H], [16H] и [1EH] (для НТ48Е30). При приеме данных на вход эти порты не работают как защелки, поэтому их содержимое должно быть считано по фронту Т2 команды MOV A [m]_ (m=12H, 14H, 16H или 1EH). Регистры работают как защелка при выводе данных, и их состояние не меняется до тех пор, пока не будут записаны новые данные.

Для создания нужной конфигурации ввода/вывода каждая линия имеет собственный регистр управления (PAC, PBC, PCC, PGC), который позволяет динамически конфигурировать структуру входа (триггер Шмитта) и выхода (КМОП) с или без нагрузочных резисторов программным способом. Если для входа возможны различные варианты структуры, то КМОП-выход является единственно возможным.

По сбросу на линиях ввода/вывода «висят» высокие уровни или они находятся в высокоимпедансном состоянии (в зависимости от нагрузочных резисторов). Доступ к регистрам-защелкам ввода/вывода реализован побитно, и их установка или сброс выполняются по командам SET [m].i и CLR [m].i (m=12H, 14H, 16H или 1EH). Для упрощения труда разработчика некоторые команды начинают работать с входящими данными, а завершают свою работу уже с выходом. Например, команды SET [m].i, CLR [m].i, CPL [m], CPLA [m] считывают состояние порта в микропроцессор, выполняют определенные операции (в побитном режиме), а затем записывают результаты в защелки или в аккумулятор.

Запуск НТ48Ехх может выполняться по каждой линии порта А. Кроме того, для всех линий ввода/вывода реализована возможность подключения нагрузочных резисторов (побитно): при выборе этой функции на линию ввода/вывода подключается нагрузочный резистор по питанию. Следует отметить, что работа линии ввода/вывода во входном режиме без нагрузочного резистора может привести к высокоимпедансному состоянию.

Для работы с пьезоизлучателем BZ предназначены две линии — РВ0 и РВ1. Если задан режим сигнала BZ, то при появлении сигнала переполнения от таймера/счетчика событий 0 на выводы РВ0/РВ1 подается импульсный сигнал звуковой частоты. Эти выходные сигналы управляются только регистром данных РВ0. Входной режим при этом остается без изменений.

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

CT4-MC62 Счетчик-таймер

Размеры

Заказать поставляемую нами продукцию можно позвонив по телефону 8(495) 661-72-81 или отправив Ваш заказ на электронную почту: delexgroup@mail.ru (обязательно указывайте контактный телефон для связи с Вами). Вам выставят счет на оплату, по которому заказанный товар будет зарезервирован на складе в течение 5 рабочих дней. Если в течение этого времени счет не оплачивается, то товар снимается с резерва. Также можно заказать продукцию через Интернет-магазин.

Оплата выставленного счета

Оплатить заказанный товар можно как безналичным расчетом, так и наличными при получении товара. При оплате за наличный расчет предоставляется полный комплект документов и кассовый чек на приобретаемые товары.

Получение оплаченного товара

Получение товара производится только после 100% предоплаты товара (уточняйте о поступлении оплаты у Вашего менеджера). Для получения товара юридическими лицами необходим оригинал доверенности с круглой печатью (форма М-2) и паспорт получателя. Для получения товара физическими лицами необходимо предъявить квитанцию об оплате товара, если оплата производилась через банк. Оформление документов и получение товара производится в нашем офисе по адресу: г. Москва, ул. Шоссейный проезд, д.34. Схема проезда.

Доставка оплаченного товара

Доставка по Москве и Московской области осуществляется курьерской компанией «КурьерСервисЭкспресс». Сроки и стоимости доставки согласовывайте с нашими менеджерами.

Доставка в регионы России осуществляется транспортными компаниями «Деловые Линии». Экспедирование до терминалов этих транспортных компаний в Москве бесплатное, Вам остается только рассчитаться с перевозчиком за доставку. По желанию клиент может заказать любую курьерскую службу заранее уведомив менеджера об этом для подготовки груза к отправке. Доставка осуществляется только после 100% предоплаты товара (уточняйте о поступлении оплаты у Вашего менеджера).

голоса
Рейтинг статьи
Читайте так же:
Как вставить счетчик яндекс метрика opencart
Ссылка на основную публикацию
Adblock
detector