Контроллер управления роботизированной платформой на радио канале
Так как нам необходим вводить управляющие команды непосредственно с клавиатуры, клавиатура была реализована как обратная связь с порта данных П1 к порту П33, порт прерывания int 1 данное решение хорошо тем, что используется уже задействованный для обмена с каналом АЦП вывод контроллера, но при этом обеспечивает нужное кол-во клавиш. В данном случае используется 5 клавиш, но кол-во клавиш может… Читать ещё >
Контроллер управления роботизированной платформой на радио канале (реферат, курсовая, диплом, контрольная)
Техническое задание
1. Разработка принципиальной схемы
1.1 Обоснование выбора микроконтроллера
1.2 Выбор датчиков
1.3 Описание элементов схемы
2. Описание программы управление контроллером
Вывод
Приложение
Техническое задание
В рамках курсовой работы необходимо разработать контроллер управления домашней метеостанцией.
Так как прибор должен обеспечивать определенный интерфейс с пользователем, предусматриваются 6 клавиш управления:
1.Клавиша + минута.
2.Клавиша — минута.
3.Клавиша + час.
4.Клавиша + день.
5.Клавиша + месяц.
6.Клавиша + год.
Для индикации используется алфавитно-цифровой ЖКИ на 2 строки по 22 позиции. В качестве входных датчиков используются датчики, температуры, давления и влажности. Исполнительной части в данном устройстве нет. Для связи с компьютером используется последовательный порт Устройство должно выполнять следующие функции:
1. Измерять с помощью датчиков температуру в комнате и на улице, давление, влажность.
2. Запоминать полученные результаты.
3. Передавать информацию на удаленный компьютер.
4. Выводить информацию на LCD.
5. Отображать дату и время на LCD.
однокристальный контроллер управление датчик
Развитие микроэлектроники и широкое применение ее изделий в промышленном производстве, в устройствах и системах управления самыми разнообразными объектами и процессами является в настоящее время одним из основных направлений научно-технического прогресса.
Использование микроэлектронных средств в изделиях промышленного и культурно-бытового назначения приводит не только к повышению технико-экономических показателей изделия и многократно сроки разработки и отодвинуть сроки «морального старения» изделий, но придает им принципиально новые потребительские качества.
За последние годы микроэлектроники бурное развитие получило направление, связанное с выпуском однокристальных микроконтроллеров (ОМК), которые предназначены для «интеллектуализации» оборудования различного назначения. ОМК представляет собой приборы, конструктивно выполненные в виде БИС, и включающие в себя все составные части «голой» микроЭВМ: микропроцессор, память программы, память данных, также программированные интерфейсные схемы для связи с внешней средой. Использование микроконтроллеров в системах управления обеспечивает достижение исключительно высоких показателей эффективности при столь низкой стоимости, что микроконтроллерам, видимо нет разумной альтернативной базы для построения управляющих и регулирующих систем. К настоящему времени более двух третей мирового рынка микропроцессорных средств составляют именно ОМК.
1. Разработка принципиальной схемы
ДВ — датчик влажности ДТ1 — первый датчик температуры ДТ2 — второй датчик температуры ДД — датчик давления МП — микропроцессор АЦП — цифро-аналоговый преобразователь ЖКИ — жидкокристаллический дисплей
COM — блок сопряжения по последовательному порту
Описание элементов схемы
Вышеприведённая функциональная схема представляет структуру контроллера бытовой метеостанции. Схему можно представить в виде следующих блоков:
МК — управляющий микроконтроллер. Он считывает информацию датчиков температуры, давления и влажности, а также посылает сигналы в ЖКИ.
ЖКИ — специализированный жидкокристаллический дисплей, необходимый для отображения температуры, давления, влажности, а так же времени и даты.
Т1 — датчик температуры для измерения температуры воздуха на улице.
Т2 — датчик температуры для измерении температуры воздуха в комнате.
БК — блок клавиатуры. Клавиатура содержит шесть кнопок. Это позволяет упростить логику и обеспечивает большое удобство работы с системой.
1.1 Обоснование выбора микроконтроллера
При выборе микроконтроллера мною было рассмотрено три микроконтроллера: AVR, PIC и МК-51. Основными критериями при выборе были: реализуемые функции, объем памяти, количество портов, стоимость.
Микроконтроллер семейства МК-51 имеют следующие аппаратные особенности:
· внутреннее ОЗУ объемом 128 байт;
· четыре двунаправленных побитно настраиваемых восьмиразрядных порта ввода-вывода;
· два 16-разрядных таймера-счетчика;
· встроенный тактовый генератор;
· адресация 64 КБайт памяти программ и 64 Кбайт памяти данных;
· две линии запросов на прерывание от внешних устройств;
· интерфейс для последовательного обмена информацией с другими микроконтроллерами или персональными компьютерами.
Микроконтроллер 8751 снабжен УФ ПЗУ объемом 4 Кбайт.
Микроконтроллер выполнен на основе высокоуровневой n-МОП технологии. Через четыре программируемых параллельных порта ввода/вывода и один последовательный порт микроконтроллер взаимодействует с внешними устройствами. Основу структурной схемы (рис. 1) образует внутренняя двунаправленная 8-битная шина, которая связывает между собой основные узлы и устройства микроконтроллера: резидентную память программ (RPM), резидентную память данных (RDM), арифметико-логическое устройство (ALU), блок регистров специальных функций, устройство управления (CU) и порты ввода/вывода (P0-P3).
AVR имеет Flash-память программ ROM объемом 1K … 8К, внутреннюю оперативную память SRAM (кроме AT90S1200) объемом 128 … 512 байт, блок энергонезависимой электрически стираемой памяти данных EEPROM объемом 64 … 512 байт, который может быть загружена извне как через SPI интерфейс, так и с помощью обычного программатора.
Перечислим периферийные устройства AVR:
таймер/счетчик, разрядность 8 бит;
n таймер/счетчик, разрядность 16 бит (кроме AT90S1200 и AT90S2323) с возможностью организации функций ШИМ и захвата/сравнения;
аналоговый компаратор (кроме AT90S2323);
скоростной последовательный интерфейс SPI;
встроенная система сброса микроконтроллера;
асинхронный дуплексный последовательный порт UART;
контроллер прерываний;
внутренний тактовый генератор;
сторожевой (WATCHDOG) таймер.
Pic16C84 относится к семейству КМОП микроконтроллеров. Отличаются тем, что имеет внутреннее 1К х 14 бит EEPROM для программ, 8-битовые данные и 64 байт EEPROM памяти данных. При этом отличаются низкой стоимостью и высокой производительностью. Все команды состоят из одного слова (14 бит шириной) и исполняются за один цикл. Периферия включает в себя 8-битный таймер/счетчик с 8-битным программируемым предварительным делителем и 13 линий двунаправленного ввода/вывода. Малые размеры корпусов, как для обычного, так и для поверхностного монтажа, делает эту серию микроконтроллеров пригодной для портативных приложений.
Рассмотрев вышеперечисленные микроконтроллеры я решил взять микроконтроллер МК-51. Данный микроконтроллер удовлетворяет всем необходимым требованиям, доступен по цене, его архитектура подробно изучена в курсе лекций и на лабораторных работах.
Из 51 серии мной выбран AT89C52s (рис.1):
Рис.1 AT89C52s
Обозначения:
· Uss — потенциал общего провода («земли»);
· Ucc — основное напряжение литания +5 В;
· X1, X2 — выводы для подключения кварцевого резонатора;
· RST — вход общего сброса микроконтроллера;
· PSEN — разрешение внешней памяти программ; выдается только при обращении к внешнему ПЗУ;
· ALE — строб адреса внешней памяти;
· ЕА — отключение внутренней программной память; уровень 0 на этом входе заставляет микроконтроллер выполнять программу только внешнее ПЗУ; игнорируя внутреннее (если последнее имеется);
· P1 — восьми битный квази двунаправленный порт ввода/вывода: каждый разряд порта может быть запрограммирован как на ввод, так и на вывод информации, независимо от состояния других разрядов;
· P2 — восьми битный квази двунаправленный порт, аналогичный Р1; кроме того, выводы этого порта используются для выдачи адресной информации при обращении к внешней памяти программ или данных (если используется 16-битовая адресация последней). Выводы порта используются при программировании 8751 для ввода в микроконтроллер старших разрядов адреса:
· РЗ — восьми битный квази двунаправленный порт, аналогичный. Р1; кроме того, выводы этого порта могут выполнять ряд альтернативных функций, которые используются при работе таймеров, порта последовательного ввода-вывода, контроллера прерываний, и внешней памяти программ и данных;
· P0 — восьми битный двунаправленный порт ввода-вывода информации: при работе с внешними ОЗУ и ПЗУ по линиям порта в режиме временного мультиплексирования выдается адрес внешней памяти, после чего осуществляется передача или прием данных.
1.2 Выбор датчиков
Рассмотрев типичные функции, выполняемые уже изготовленными метеостанциями, предложенными на рынке, я решил выполнить данный курсовой проект.
Типичная метеостанция снимает следующие показатели:
1. Температура в комнате и за ее пределами.
2. Влажность.
3. Давление.
К сожалению после поиска в Интернете и на рынке мною были найдены датчики температуры и давления. Предложенный в Интернете датчик влажности ни на рынке, ни под заказ не был представлен.
В качестве датчика температуры оптимальным решением по моему мнению является датчик DS18B20.
Микросхема цифрового термометра DS18S20, обеспечивает измерение температуры в диапазоне -55.+125°C с дискретностью 0.5°C. Стоимость микросхемы DS18S20 составляет примерно 2 $, стоимость деталей адаптера для подключения её к COM-порту компьютера — еще меньше.
Рис. 1. Внешний вид микросхемы цифрового термометра DS18S20.
С помощью дополнительных вычислений дискретность представления температуры можно уменьшить, в нашем случае она равна 0.1°C.
DS18S20 допускает напряжение питания от +3 до +5.5 В. В режиме ожидания потребляемый ток близок к нулю (менее 1мкА), а во время преобразования температуры он равен примерно 1мА. Процесс преобразования длится максимум 750мс.
Принцип действия датчика основан на подсчете количества импульсов, вырабатываемых генератором с низким температурным коэффициентом во временном интервале, который формируется генератором с большим температурным коэффициентом. Счетчик инициализируется значением, соответствующим -55°C (минимальной измеряемой температуре). Если счетчик достигает нуля перед тем, как заканчивается временной интервал (это означает, что температура больше -55°C), то регистр температуры, который также инициализирован значением -55°C, инкрементируется. Одновременно счетчик предустанавливается новым значением, которое задается схемой формирования наклона характеристики. Эта схема нужна для компенсации параболической зависимости частот генераторов от температуры. Счетчик снова начинает работать, и если он опять достигает нуля, когда интервал еще не закончен, процесс повторяется снова. Схема формирования наклона загружает счетчик значениями, которые соответствуют количеству импульсов генератора на один градус Цельсия для каждого конкретного значения температуры. По окончанию процесса преобразования регистр температуры будет содержать значение температуры.
Для DS18S20 температура представляется в виде 9-битного значения в дополнительном коде. Поскольку это значение занимает 2 байта, все разряды старшего байта равны знаковому разряду. Дискретность представления температуры составляет 0.5°C. Зависимость выходного кода от температуры приведена в таблице:
Температура Выходной код (Binary) Выходной код (Hex)
Ст. байт Мл. байт
+125°C 0000 0000 1111 1010 00FAh
+25°C 0000 0000 0011 0010 0032h
+0.5°C 0000 0000 0000 0001 0001h
0 °C 0000 0000 0000 0000 0000h
— 0.5°C 1111 1111 1111 1111 FFFFh
— 25 °C 1111 1111 1100 1110 FFCEh
— 55 °C 1111 1111 1001 0010 FF92h
Кроме ПЗУ DS18S20 имеет промежуточное ОЗУ объемом 8 байт, плюс два байта энергонезависимой памяти. Карта памяти DS18S20 показана на рисунке:
Рис. 3. Карта памяти DS18S20.
Байты TH и TL представляют собой температурные пороги, с которыми сравниваются 8 бит каждого измеренного значения температуры (младший бит отбрасывается). С помощью специальной команды можно организовать сигнализацию выхода температуры за пределы этих порогов. Если такая функция не нужна, байты TH и TL можно использовать для хранения любых данных пользователя.
Считывание значения измеренной температуры, а также передача команды начала преобразования и других команд производится с помощью 1-проводного интерфейса (1-WireTM).
Протокол, который используется 1-проводным интерфейсом, достаточно прост. В любой момент времени на 1-проводной шине можно выделить устройство-мастер, которым может быть микропроцессор или компьютер, и подчиненное устройство, в нашем случае это микросхема термометра. Так как у нас на шине присутствуют только мастер и всего одно подчиненное устройство, можно опустить всё то, что связано с адресацией устройств. В результате требуется знать лишь протокол передачи байтов, которые могут являться командами или данными.
Инициатором обмена по 1-проводной шине всегда выступает мастер. Все пересылки начинаются с процесса инициализации. Инициализация производится в следующей последовательности (рис.4):
Рис. 4. Инициализация обмена по 1-проводной шине.
Мастер посылает импульс сброса (reset pulse) — сигнал низкого уровня длительностью не менее 480 мкс.
За импульсом сброса следует ответ подчиненного устройства (presence pulse) — сигнал низкого уровня длительностью 60 — 240 мкс, который генерируется через 15 — 60 мкс после завершения импульса сброса.
Ответ подчиненного устройства даёт мастеру понять, что на шине присутствует термометр и он готов к обмену. После того, как мастер обнаружил ответ, он может передать термометру одну из команд. Передача ведётся путём формирования мастером специальных временных интервалов (time slots). Каждый временной интервал служит для передачи одного бита. Первым передаётся младший бит. Интервал начинается импульсом низкого уровня, длительность которого лежит в пределах 1 — 15 мкс. Поскольку переход из единицы в ноль менее чувствителен к ёмкости шины (он формируется открытым транзистором, в то время как переход из ноля в единицу формируется подтягивающим резистором), именно этот переход используют 1-проводные устройства для синхронизации с мастером. В подчиненном устройстве запускается схема временной задержки, которая определяет момент считывания данных. Номинальное значение задержки равно 30 мкс, однако, оно может колебаться в пределах 15 — 60 мкс. За импульсом низкого уровня следует передаваемый бит. Он должен удерживаться мастером на шине в течение 60 — 120 мкс от начала интервала. Временной интервал завершается переводом шины в состояние высокого уровня на время не менее 1 мкс. Нужно отметить, что ограничение на это время сверху не накладывается. Аналогичным образом формируются временные интервалы для всех передаваемых битов (рис. 5):
Рис. 5. Передача бита по 1-проводной шине.
Первой командой, которую должен передать мастер для DS18S20 после инициализации, является одна из команд функций ПЗУ. Всего DS18S20 имеет 5 команд функций ПЗУ:
Skip ROM [CCh]. Эта команда позволяет пропустить процедуру сравнения серийного номера и тем самым сэкономить время в системах, где на шине имеется всего одно устройство.
Приняв команду Read ROM, DS18S20 будет готов передать 64-битный код, который мастер должен принять.
При приеме данных от подчиненного устройства временные интервалы для принимаемых битов тоже формирует мастер. Интервал начинается импульсом низкого уровня длительностью 1 — 15 мкс. Затем мастер должен освободить шину, чтобы дать возможность термометру вывести бит данных. По переходу из единицы в ноль DS18S20 выводит на шину бит данных и запускает схему временной задержки, которая определяет, как долго бит данных будет присутствовать на шине. Это время лежит в пределах 15 — 60 мкс. Для того чтобы данные на шине, которая всегда обладает некоторой ёмкостью, гарантированно установились, требуется некоторое время. Поэтому момент считывания данных мастером должен отстоять как можно дальше, но не более чем на 15 мкс от начала временного интервала (Рис 6):
Рис. 6. Чтение бита по 1-проводной шине.
Прием байта начинается с младшего бита. Вначале идет байт кода семейства. За кодом семейства идет 6 байт серийного номера, начиная с младшего. После обработки одной из команд функций ПЗУ, DS18S20 способен воспринимать еще несколько команд:
Write Scratchpad [4Eh]. Эта команда позволяет записать данные в промежуточное ОЗУ DS18S20.
Read Scratchpad [BEh]. Эта команда позволяет считать данные из промежуточного ОЗУ.
Convert T [44h]. Эта команда запускает процесс преобразования температуры.
Recall E2 [B8h]. Эта команда действует обратным образом по отношению к команде Copy Scratchpad, т. е. она позволяет считать байты TH и TL из энергонезависимой памяти в промежуточное ОЗУ. При включении питания эта команда выполняется автоматически.
При использовании DS18S20 только для измерения температуры нужны всего две из этих команд: Convert T и Read Scratchpad.
Последовательность действий при измерении температуры должна быть следующей:
Посылаем импульс сброса и принимаем ответ термометра.
Посылаем команду Skip ROM [CCh].
Посылаем команду Convert T [44h].
Формируем задержку минимум 750мс.
Посылаем импульс сброса и принимаем ответ термометра.
Посылаем команду Skip ROM [CCh].
Посылаем команду Read Scratchpad [BEh].
Читаем данные из промежуточного ОЗУ (8 байт) и CRC.
Проверяем CRC, и если данные считаны верно, вычисляем температуру.
В качестве датчика давления я взял аналоговый датчик MPAXZ4115X, измеряющий напряжение в стандартном диапазоне от минимального 650 мм рт. ст. до максимального 850 мм рт. ст. При этом сигнал на выходе меняется от 0 до 5 В.
Так как микроконтроллер без внутреннего АЦП, то необходим внешний АЦП. Для этого используем ЦАП + компаратор
554SА3 сравнивающий сигнал с датчика и с ЦАП по совпадению и переключению компартора происходит оцифровка.
Такое решение позволяет с помощью двух датчиков получить температуру и уровень давления. Для измерения влажности можно использовать второй датчик не снаружи, а обернуть его влажной марлей — мокрый датчик и по разнице температур подсчитать влажность.
Для реализации клавиатуры выбран шифратор кода. Клавишный код передается тремя линиями и еще одна заведена на прерывание что упрощает процесс приема кода.
В качестве индикатора для отображения выбран активный LCD дисплей, аналогичный тому, который использовался в лабораторных работах.
Для накопления данных используется Flesh ПЗУ последовательного типа AT24C256 по интерфейсу I2C. Данное ПЗУ имеет возможность многократной перезаписи данных и за счет использования последовательного канала задействуются только 2 порта. Это очень удобно, потому что используемый контроллер имеет аппаратно поддерживаемую возможность работы с протоколом I2C, что в свою очередь упрощает программную реализацию устройства. (рис. 2).
Рис. 2 Схема АТ24Схх
Микросхемы EEPROM серии АТ24Схх фирмы Atmel — недорогие малогабаритные, электрически перепрограммируемые, энергонезависимые запоминающие устройства, с низким энергопотреблением и управлением по шине I2С.
Для звуковой сигнализации используется управляемый мультивибратор умощненный на выходе транзистором к которому и подключен звуковой излучатель.
Для сопряжения с компьютером по интерфейсу USB используется преобразователь USB-COM FT232RL. Его достоинство в том, что без использования дополнительного преобразователя уровня можно его подключить непосредственно к последовательному порту контроллера.
1.3 Описание элементов схемы
Данная принципиальная схема представляет собой максимально упрощённую разработку ориентированную на создание метеостанции с минимумом электронных элементом. Для управляющего контроллера выбран контроллер 51 серии. Выбор контроллера нами рассматривался ранее. Контроллер связан с ПК, по интерфейсу com для передачи метеоданных или настройки устройства со стороны ПК. Данный контроллер для съёма данных о состоянии погоды использует 4 датчика ДТ1, ДТ2 — датчики температуры выдают информацию в цифровом виде. Использование подобных датчиков продиктовано тем, что они очень удобно подключаются по однопроводной шине данных, используют самотактируемый последовательный однопроводной канал. На таком же канале и на таких же функциях реализован датчик давления. Данный датчик вместе с датчиком влажности позволяет определять возможность возникновения дождя по повышению влажности, перепадам давления и т. д. Все эти изменения отслеживаются программой метеостанции. Датчик давления был найден в цифровом виде, а датчика влажности в цифровом виде не было найдено. Поэтому было решено использовать аналоговый датчик предложенный в журнале Радио. Для оцифровки полученного значения используется ДД обеспечивающий преобразования аналогового значения. Датчик влажности даёт диапазон 0−5 вольт в зависимости от влажности мм р.ст. и оцифровав 12-ти разрядным АЦП мы по последовательному каналу тактируя сигналом ЦА по линии ДА считываем результат в послед коде и преобразовываем в параллельный для последующей обработки. Для сброса и начального старта используется линия RES .
Так как нам необходим вводить управляющие команды непосредственно с клавиатуры, клавиатура была реализована как обратная связь с порта данных П1 к порту П33, порт прерывания int 1 данное решение хорошо тем, что используется уже задействованный для обмена с каналом АЦП вывод контроллера, но при этом обеспечивает нужное кол-во клавиш. В данном случае используется 5 клавиш, но кол-во клавиш может быть легко расширено до 8, тогда будут использоваться все линии порта П1. Программная процедура должна предусматривать переключение 0 поочередно по всем битам порта П1 и соответственно считывание возникшего ноля на порту П3 .Для отображения информации используется стандартный ЖКИ. Данный ЖКИ имеет в составе собственный процессор, обеспечивающий вывод, как цифровой так и текстовой информации. Данные ЖКИ очень распространен, мной был использован такой же в курсе лабораторных работ. Эти ЖКИ хороши тем, что они имеют типичную группу команд и стандартный знакогенератор, что значительно упрощает их программирование и позволяет использовать для курсовой работы, процедуры разработанные в ходе выполнения лабораторных работ .
2. Описание программы управления контроллером
Изучив прототип представленный в журнале «Радио», а так же после соответствующего изменения схемы под выбранный мной контроллер и имеющиеся датчики я построил следующую программу, которая выполняет управление домашней метеостанцией и выполняет передачу данных на удаленный компьютер. Для этого я использовал специальный цифровой мост USB.COM, что упрощает написание программы т.к. используются стандартные функции последовательного обмена, встроенные в контроллер, но при этом позволяет связь через USB. При необходимости без модификации программы заменой данного моста на преобразователь 485 интерфейса (MAX 487) возможность удаления этой станции может быть до 1,5 км. от центрального компьютера.
Для съема данных используются два датчика температуры: один наружного расположения, другой внутренний. Если наружный датчик не выносить на улицу, а расположить в воде, то по разности температур данная метеостанция может выполнять расчет влажности. Так как датчики цифровые и подключены через интерфейс 1WARE для реализации корректного обмена с ними в обработчике таймера реализована соответствующая сложная процедура. Так как обработчик позволяет отслеживать такты времени для соблюдения нужных временных интервалов, я произвел предварительный расчет всех интервалов протокола и занес полученные значения в массив констант, что позволяет используя соответствующие циклы формировать управляющее воздействие с четкой привязкой по времени. Параллельно с этим в основном теле программы производится выполнение процедуры оцифровки. Процедура оцифровки выполняется путем наращивания значения ЦАП и контроля состояния компаратора. Как только компаратор изменяет свое состояние приращение ЦАП прекращается и последнее значение будет нами измерено.
Вывод информации на LCD выполняется также в обработчике таймера, что позволяет не ждать готовности индикатора, а выдерживать тайм-ауты более достаточные для того чтобы успел отработать контроллер ЖК-индикатора.
Для того чтобы учитывать скорость ветра используется механическая крыльчатка с электрическим датчиком в виде автопары. В обработчике таймера один раз в секунду пересчитывается число импульсов, соответствие скорости ветра.
Как указывалось ранее, для клавиатуры используется специализированная клавиатура шифратора, подключенная к каналу внешнего обработчика EX1. Клавиатура легко считывается и обслуживается в этом обработчике.
1 клавиша выполняет приращение часов.
2 клавиша выполняет приращение минут.
3 клавиша выполняет приращение часов таймера.
4 клавиша выполняет приращение минут таймера.
5 клавиша выполняет включение режима измерения влажности.
6 клавиша выполняет режим просмотра внешнего термометра.
7 клавиша выполняет просмотр состояния на час назад.
8 клавиша выполняет просмотр состояния на час вперед.
Для этого все полученные данные сохраняются каждый час по взведенному в обработчике таймера флагу.
За счет использования стандартного встроенного интерфейса I2C не требуется выполнять программную реализацию этого протокола т.к. он обеспечивается оборудованием контроллера.
В основном теле выполняется математическое преобразование температуры, давления, влажности и запоминание массива вывода на индикатор, а также контролируется срабатывание будильника (таймера) и выполняется включение звукового индикатора.
Последняя процедура это сохранение каждый час измеренных показателей и их последовательное извлечение из памяти, и вывод на индикатор. Для обмена с компьютером разрешено использовать прерывание последовательного порта. При приходе команды запроса, данные в этом же обработчике, отправляются удаленному компьютеру.
Вывод
При реализации данного проекта мной более детально изучена архитектура контроллера 52 серии. Изучены два новых интерфейса: 1WARE и I2C. Сформированная схема и написанная к ней программа по моему мнению полностью реализует поставленную передо мной задачу и позволяет выполнить все необходимые функции.
Приложение (Схема устройства)
Приложение (Листинг программы)
meteo: do;
$include (reg812.dcl)
declare
Time (*) byte constant (0DCh, 50h, 0DCh, 8Ch),
/*тайминги передачи команды CCh — пропуск трансляции внутреннего кода*/
Time1 (*) byte constant (0DCh, 9Ah, 0DCh, 0D6h, 0DDh, 12h, 0DDh, 20h, 0DDh, 5Ch, 0DDh, 6Ah),
Time2(*) byte constant (0DDh, 78h, 0DDh, 0B4h, DDh, 0C2h, 0DDh, 0D6h, 0DDh, 0FEh, 0DEh, 0Ch),
Time3 (*) byte constant (0DEh, 48h, 0DEh, 56h,DEh,86h),
/*тайминги передачи кода 44h — на оцифровку температуры*/
Time 4 (*) byte constant (0DEh, 0C2H, 0DEh, 0E5h, 0DFh, 21h),
Time5(*) byte constant (0DFh, 5Dh, 0DFh, 6Bh, 0DFh, 0A7h, 0DFh, 0B5h, 0DFh, 0F1h, 0DFh, 0FFh),
Time6 (*) byte constant (0E0h, 0Dh, 0E0h, 49h, 0E0h, 85h, 0E0h, 93H, 0E0h, 0CFh, 0E0h, 0DDh),
/*тайминги для передачи B8H — запрос наполучение температуры*/
Time7 (*) byte constant (0DEh, 95h, 0DEh, 0D0h, 0DFh, 8H, 0DFh, 021h, 0DFh, 02Fh),
Time8(*) byte constant (0DFh, 66h, 0DFh, 79h, 0DFh, 0B5h, 0DFh, 0C3H, 0DFh, 0FFh, 0E0h, 03Bh),
Time9(*) byte constant (0E0h, 49h, 0E0h, 85h, 0E0h, 93h, 0E0h, 0CFh, 0E0h, 0DDh),
/*тайминги для приема кода температуры*/
Time10(*) byte constant (0E0h, 0E7h, 0E1h, 23h, 0E1h, 2Dh, 0E1h, 37H, 0E1h, 073h, 0E1h, 07Dh),
Time11(*) byte constant (0E1h, 87h, 0E1h, 0C3h, 0E1h, 0CDh, 0E1h, 0D7H, 0E2h, 0B3h, 0E2h),
Time12(*) byte constant (0BDh, 0E2h, 0C7h, 0E3h, 3,0E3h, 0Dh, 0E3h, 17H, 0E3h, 53h, 0E3h, 5Dh),
/*тайминги приема знака*/
Time13 (*) byte constant (0E3h, 67h, 0E3h, 0А3h, 0E3h),
(Davl, VVeter) byte, /*измер давление и скор ветра*/
(T1,T2) byte, /* измеряемая температура */
(Zn1,Zn2)bit, /*знак принятой температуры*/
(thp, tlp) byte,
(f1,f2) bit, /*флаги ответа датчиков температуры*/
Chvetr byte, /*счетчик определения скор ветра*/
ind (32) byte,
(i, j, tp, n, p, pt, adrh1, adrh2,adrl1,adrl2,pp) byte,
(flTim, flVlagn, flTemometr, FlC, FlI2C) bit, /*флаги определения режима работы */
k byte, /*номера нажатой клавиши */
(Sek, Min, Chas, TimerChas, Timermin, DanP) byte /*счетчики часов и таймера*/
Dat (6) byte,
flViev; /*флаг просмотра содержим памяти*/
V_Vetra:procedure interrupt 0;/*определение скорости ветра*/
Chvetr=chvetr+1;
End V_Vetra;
in_key:procedure interrupt 2;
k= (P1 and 111b);
do case k;
:do;Chas=Chas+1;if chas=24 then chas=0;end;
: do;min=min+1;if min=60 then min=0;end
:do;TimerChas=Chas+1;if Timerchas=24 then Timerchas=0;end
:do;Timermin=Timermin+1;if Timermin=60 then Timermin=0;end
:FlVlagn=1;
:FlT=1;
:do;DanP=10;FlViev=1;adrl1=adrl1+1; if CY then adrh1=adrh1+1;pp=0;end;
:do;DanP=10;FlViev=1;adrl1=adrl1+1; if CY then adrh1=adrh1+1;pp=0;end;
End;
end in_key;
timer_int: procedure interrupt 1; /* прерывание t0 */
th0=0d8h;tl0=0efh;
pt=pt+1;
if pt=100 then do;sek=sek+1;per_t0=0;
if sek=60 then
do;min=min+1;
if min=60 then min=0;
Chas=Chas+1;
if chas=24 then do;
chas=0;
/*запись информации в память*/
flI2C=1;pp=0;
end;
end;
if p30=0 then P14=1 else p14=0;
p10=0;
P14,p13=0; /*начальный сброс и проверка наличия устройства*/
Do while (th0<0DAh) and (tl0<0E3h);end;/*пауза сброса 500мкс*/
Do while (th0<0DBh) and (tl0<2Fh) ;end;
If not (P13) then f1=1;
if not (P14)then f2=1; /*при ответе датчика устанавл флаг готовн к обмену*/
Do while (th0<0DCh) and (tl0<42h);end;/*таймаут для завершения инициализации*/
/*цикл передачи команды безадресного обращения — ССh */
Do n=0 to 8/*передача таймслота по заранее рассчитанным задержкам*/
If f1 then P14=0; if f2 then P32=0; /*передача 0*/
Do while (th0
/*передача команды 44h для безадресного обращения*/
Do n=0 to 8/*передача таймслота по заранее рассчитанным задержкам*/
If f1 then P14=0; if f2 then P32=0; /*передача 0*/
Do while (th0
If f1 then P31=1; if f2 then P32=1;/*передача 1 */
Do while (th0< Time4(n*4+2)) and (tl0< Time4(n*4+3)); end;
End
Else do;
/*передача запроса B8h на прием информации с датчика*/
Do n=0 to 8/*передача таймслота по заранее рассчитанным задержкам*/
If f1 then P14=0; if f2 then P32=0; /*передача 0*/
Do while (th0
If f1 then P31=1; if f2 then P32=1;/*передача 1 */
Do while (th0< Time7(n*4+2)) and (tl0< Time7(n*4+3)); end;
End;
Do while (th0<0e0h) and (tl0<0ddh); end;
Do n=0 to 7; /*прием данных от датчиков*/
If f1 then P31=0; if f2 then P32=0;/*передача строба 10мкс 0 в таймслоте*/
Do while (th0<0 Time10(n*6)) and (tl0< Time10(n*6+1)); end;
If f1 then P31=1; if f2 then P32=1;/*востановление1 и ожидание 60мкс */
Do while (th0< Time10(n*6+2)) and (tl0< Time10(n*6+3)); end;
If f1 and p31 then T1=rol ((T1+1), 1) else T1=rol (T1,1);
If f2 and p32 then T2=rol ((T2+1), 1) else T2=rol (T2,1);
Do while (th0< Time10(n*6+4)) and (tl0< Time10(n*6+5));end;
End;
Do n=0 to 7; /*прием знака */
If f1 then P31=0; if f2 then P32=0;/*передача строба 10мкс 0 в таймслоте*/
Do while (th0<0 Time13(n)) and (tl0< Time13(n+1)); end;
If f1 then P31=1; if f2 then P32=1;/*востановление1 и ожидание 60мкс */
Do while (th0< Time10(n+2)) and (tl0< Time10(n+3)); end;
If f1 and p31 then Zn1=1 else Zn1=0;
If f2 and p32 then Zn2=1 else Zn2=0;
End;
VVetr=ChVetr/4;/*расчет скорости ветра*/
/*расчет реальной температуры*/
If zn1 thenT1=shr (not (T1+1), 1) else T1=Shr (T1,1);
If zn2 thenT1=shr (not (T2+1), 1) else T1=Shr (T2,1);
FTim=1;/*флаг готовности данных*/
Tp=0;
If FlVlagn then
Do;
End;/*Расчет влажности*/
end;
if FlI2C then
if pp<5 then do;
I2CADD=Adrh1*255+Adrl1;
Do case pp;
:I2CDat=T1;
: I2CDat=T2;
: I2CDat=VVetr;
: I2CDat=Vlagn;
: I2CDat=Chas;
End;
Pp=pp+1;
End else Adrl1=Adrl1+pp;
if FlInd then
if pp<5 then do;
I2CADD=Adrh1*255+Adrl1+pp;
Do case pp;
: T1=I2CDat;
: T2=I2CDat;
: VVetr=I2CDat;
: Vlagn=I2CDat;
End;
Pp=pp+1;
End;
End;
/*Вывод на индикатор*/
If FlC then P2=101 0000b+shr (ind (tp), 4) and 0fh);
Else do;tp=tp+1;if tp>22 then FTim=0; P2=101 0000b+ind (tp) and 0fh);end;
FlC=not (FlC);/*инверсия флага тетрады для передачи мл или ст тетрад*/
end;
end timer_int;
UART: procedure interrupt 4 /* обработ прерывания отUART*/
If Ri then do; /*прерывание по приему данных*/
/*анализ принятых команд просмотром старших трех бит*/
If Sbuf=0 then
do;Sbuf=T1; p=1;end;/*запуск передачи данных*/
Else If (Sbuf and 0E0h)=0e0h then flagk=1;
Else If (Sbuf and 0E0h)=0C0h then stop=0
Else If (Sbuf and 0e0h)=40h then flTimer=0
Else If (Sbuf and 0e0h)=60h then flTimer=1
Else do; /*прием номера устанавл параметра и его значения*/
If (Sbuf and 0e0h)=40h then If FlTimer then Tim=Sbuf else Chan=Sbuf;
If (Sbuf and 0e0h)=80h then If FlTimer then Timer (Tim)=Sbuf else Dat (Chan)=Sbuf;
end;
If (Ti and (P<4)) then /*передача массива данных*/
Do case p;
:;
:Sbuf=T2;
:Sbuf=Vlagn;
:Sbuf=Vetr;
:Sbuf=Chas;
:Sbuf=min;
End;
P=p+1;
end UART;
tmod=01b;/*пеpвый pежим для 0 го таймеpа */
it0=1;/*пpеpывание по фpонту сигнала пеpеполнения*/
th0,tl0=0;tr0=1; /*обнул счетчики и pазpешаем pаботу 0 таймеpa*/
er0=1;/*запускаем таймеp 0 */
et0=1; /*pазpешаем пpеpывания Т0 */
th0,tl0=0fdh;/*работа послед порта на скорости 9600*/
ea=1;/*pазpешаем все пpеpывания*/
SCON=100 1000b; /*UART такт поТ1 8 бит данных без четн */
I2CCon=11 111 011;
PCON=0;ES=1; /*разрешение прерывания UART*/
/*устаналиваем значения по умолчанию*/
t1=6;t2=6;
end init;