Разработка логической схемы реализации линии связи
Архитектура вычислительного ядра микропроцессора ATmega169. Работа блока идентификации сигналов. Подключение заголовочного файла, который позволяет объявлять булевские переменные. Исходный код программы. Принцип работы микроконтроллера, ответ на сигнал.
Рубрика | Коммуникации, связь, цифровые приборы и радиоэлектроника |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 27.11.2016 |
Размер файла | 9,3 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru//
Размещено на http://www.allbest.ru//
1. Формулировка задания
К общей шине (ОШ) подключены несколько абонентов, каждый из которых функционирует автономно в соответствии с управляющей информацией, полученной от специального устройства - арбитра общей шины. Эта шина включает 3 линии связи: одну информационную и 2 синхронизирующие. Передача информации ведется в последовательном коде. При этом синхроимпульсы С1 отмечают начало каждого байта, а С2 синхронизируют подачу отдельных битов. Основная тактовая частота 1 МГц. Длительность синхроимпульсов 0,25 мкс.
При необходимости связи арбитр вырабатывает общий для всех абонентов сигнал ВНИМАНИЕ и затем - АДРЕС нужного абонента. Этот абонент, после идентификации своего адреса, выдает в шину сигнал ГОТОВ либо ЗАНЯТ в зависимости от своего состояния. Получив сигнал готовности, арбитр сразу же формирует непрерывную многобайтную посылку - информационное сообщение, которое замыкается сигналом КОНЕЦ-ПЕРЕДАЧИ. Приняв эту посылку, абонент отвечает сигналом КОНЕЦ-ПРИЁМА, при отсутствии ошибок передачи, либо сигналом ПОВТОРИТЬ-ПЕРЕДАЧУ, если обнаружена ошибка. В последнем случае арбитр повторяет весь цикл связи заново.
Информационное сообщение имеет символьный характер. Каждый символ занимает 1 байт (8 разрядов). Алфавит сообщений содержит всего 200 символов. Оставшиеся 56 символов могут быть использованы в качестве сигналов связи: ГОТОВ, ВНИМАНИЕ и др.
Для реализации связи каждому абоненту передаётся интерфейсный модуль-контроллер связи. Сигналы ГОТОВ и ПОВТОРИТЬ-ПЕРЕДАЧУ вырабатываются контроллером по получении от своего абонента сигналов конца работы (КР) и ошибки передачи (ОП) соответственно.
Таблица кодов сигналов
Сигнал |
Десятичный код |
Двоичный код |
|
Адрес |
73 |
1001001 |
|
Внимание |
119 |
01110111 |
|
Готов |
102 |
01100110 |
|
Занят |
219 |
11011011 |
|
Конец - передачи |
255 |
11111111 |
|
Конец - приема |
206 |
11001110 |
|
Повторить - передачу |
116 |
1110100 |
2. Описание работы схемы
2.1 Необходимые средства разработки
В качестве программируемого микроконтроллера возьмём ATmega169. Выбор обусловлен тем, что данное устройство поддерживает необходимые для выполнения курсового проекта характеристики, хотя и является избыточным.
Рисунок 1. Микросхема ATmega 169.
Микропроцессоры семейства AVR содержат высокоскоростное вычислительное ядро RISC архитектуры, развитую периферию и функцию внутрисистемного программирования. Кроме того, микропроцессоры этого семейства имеют производительность 1 MIPS при тактовой частоте 1 МГц, т.е. выполняют большинство команд за 1 цикл.
Микропроцессор ATmega169 является первым низкопотребляющим членом семейства AVR, который содержит встроенный контроллер ЖКИ. AVR ядро объединяет богатый набор команд и 32 рабочих регистра, которые могут быть напрямую подключены к АЛУ, что позволяет выполнять действия с двумя регистрами одновременно одной командой. Вычислительное ядро построено по Гарвардской архитектуре с разделенными памятью и шинами программы и данных. Процессор имеет одноуровневый конвейер, позволяющий при выполнении команды выбирать следующую. Такая архитектура вычислительного ядра позволяет выполнять команды в каждом цикле. Архитектура вычислительного ядра микропроцессора приведена на рисунке 2.
Архитектура вычислительного ядра микропроцессора ATmega169. Рисунок 2.
Микропроцессор содержит 16 кбайт программной Flash памяти, 512 байт EEPROM памяти, 1 кбайт SRAM, 53 линии портов ввода-вывода общего назначения, 32 рабочих регистра общего назначения, JTAG интерфейс, встроенные автоматы отладки и программирования, законченный контроллер ЖКИ с преобразователем напряжения, три гибких независимых таймера/счетчика, внешние и внутренние источники прерывания, последовательный программируемый USART, универсальный последовательный интерфейс с детектором стартового состояния, 8- канальный 10- битный АЦП, программируемый сторожевой таймер со встроенным генератором и последовательный SPI порт.
Предназначенный для использования в аппаратуре с автономным питанием, микропроцессор имеет превосходные мощностные характеристики. Во-первых, он выпускается в трех модификациях с различными диапазонами напряжения питания: ATmega169 имеет диапазон напряжения питания от 4,5 до 5,5 В, ATmega169L - от 2,7 до 5,5 В, а ATmega169V - от 1,8 до 5,5 В. При этом модификации имеют различные диапазоны рабочих частот тактового генератора: ATmega169 - от 0 до 16 МГц, ATmega169L - от 0 до 8 МГц, а ATmega169V - от 0 до 1 МГц. При работе на частоте 1 МГц, т.е. с производительностью 1 MIPS, микропроцессор потребляет всего 400 мкА при 1,8 В питании! Во-вторых, имеется возможность программного изменения частоты работы вычислительного ядра. Для выполнения сложных вычислительных функций или других действий, требующих высокого быстродействия вычислительного ядра, разработчик может установить высокую тактовую частоты, а при выполнении простых управляющих функций тактовая частота вычислительного ядра может быть существенно снижена. При работе с частотой 32 кГц микропроцессор потребляет всего 20 мкА (40 мкА при активизированном драйвере ЖКИ). В-третьих, микропроцессор имеет пять программно инициализируемых режимов пониженного потребления: Idle, Power-down, Power-save, ADC Noise Reduction и Standby.
Объединяя в себе 8-битное RISC ядро и внутри системно само программируемую Flash память в одном корпусе, микропроцессор ATmega169 является мощным прибором, который даст Вашим устройствам более высокие гибкость и стоимостную эффективность.
Микропроцессор ATmega169 AVR поддерживается различными программными и системными средствами разработки, такими как С- компиляторы, макроассемблеры, отладчиком/симулятором (AVR Studio версий 3.5 и 4.0), внутрисхемными эмуляторами (ATICE50 и AVR JTAG ICE) и внутрисистемным программатором AVR ISP. Для ускорения разработки новых устройств на базе микропроцессора ATmega169 и снижения затрат на разработку выпущены отладочная плата STK502 и демонстрационный набор AVR Batterfly.
Работу программы будем проверять в эмуляторе AVR Studio 4.13.528
Компилировать программу будем в WinAVR 20071221
AVR Studio - интегрированная среда проектирования программ для микроконтроллеров.
WinAVR - программный пакет, содержащий в себе интересующий нас компилятор GNU GCC для C.
2.2 Схема микроконтроллера
Для программирования необходимой логики работы мы будем использовать 3 из 8 выводов порта А и все 8 выводов порта B
2.2.1 Описание работы порта А
-- На вывод 0 поступает сигнал синхронизации С1
-- На вывод 1 поступает сигнал синхронизации С2
-- Вывод 2 используется для посылки и приёма Арбитру управляющих сигналов («Внимание», «Готов» ит.д.), а также для приёма информационного сообщения.
Выводы 3-7 не используются и поэтому не показаны на схеме
2.2.2 Описание работы порта B
8 выводов порта B используются для параллельной передачи и приёма Абоненту управляющих сигналов («Ошибка передачи», «Конец работы» ит.д.), а также для пересылки информационного сообщения, которое идёт от Арбитра
Рисунок 3. Схема микроконтроллера
3. Исходный код программы
Подключение заголовочного файла io.h, который в свою очередь подключит iom169.hiom169.h - заголовочный файл, который ставит в соответствие константам PORTA и PORTB реальные адреса выводов конкретного контроллера (в нашем случае ATmega169)Таким образом io.h позволяет работать с портами ввода-вывода*/#include <avr/io.h>// Подключение заголовочного файла, который позволяет объявлять булевские переменные
#include <stdbool.h>
// Определение пользовательского типа данных byte
typedef unsigned char byte;
// Константы, определённые для обращения к выводам порта А
#define C1(PINA & 0x01) /* 0-вой вывод порта А, на который приходит сигнал С1 */
#define C2(PINA & 0x02) /* 1-вой вывод порта А, на который приходит сигнал С2 */
#define DATAIN((PINA & 0x04) >> 2) /* 2-вой вывод порта А, на который приходит информация.
Чтение информации из порта */
#define DATAOUT(x)PORTA = (PORTA & ~(0x04)) | (x << 2) /* 2-вой вывод порта А, на который приходит информация. Ввод информации в порт */
#define ATTENTION 236// Внимание
#define ADDRESS 43// Адрес
#define READY 252// Готов
#define BUSY 203// Занят
#define END_OF_TRANSFER_SEQUENCE 113 // Конец передачи
#define END_OF_RECEIVE 153 // Конец приёма
#define REPEAT_TRANSFER 83 // Повторить передачу
// Символы сигналов связи от Абонента
#define END_OF_WORK 1// Конец работы
#define TRANSFER_ERROR 2 // Ошибка передачи
// Глобальные переменные
byte frameFromArbiter = 0;
bool abonentStateReceived = false;
bool frameCameFromArbiter = false;
bool AddressCameFromArbiter = false;
bool frameToAbonentWasSent = false;
bool requestToAbonentWasSent = false;
bool stateOfAbonentWasSentToArbiter = false;
bool DataMessageRefered = false;
int abonentState = 0;
// Получаем побитово байт от Арбитра
void ReceiveFrameFromArbiter()
{static int C2Count = 0;
static bool C1Came = false;
static bool C2Out = true;
if(C1) // Если пришёл сигнал С1,
{
C1Came = true; // запоминаем что сигнал С1 приходил
}
if(C1Came) // Если сигнал С1 приходил
{ if(C2 && C2Out) // Если сигнал С2 пришёл,
{frameFromArbiter = (frameFromArbiter & ~(1 << C2Count)) | (DATAIN << C2Count); //
считываем очередной бит с информационной линии
/*(1 << C2Count) даст нам байт с единицой, установленной на том бите, который мы должны установить
~(1 << C2Count) инвертирование даст нам байт с нулём, установленным на том бите, который мы должны установить
(frameFromArbiter & ~(1 << C2Count)) даст нам исходный frameFromArbiter с нулём, установленным на том бите, который мы должны установить (DATAIN << C2Count) даст нам бит со значением пришедшим по информационной линии, который установлен в байте на том бите, который мы должны установитьИтоговое поразрядное ИЛИ даст нам исходный frameFromArbiter со значением пришедшим по информационной линии, которое установится в frameFromArbiter на номере бита, равном номеру сигнала С2*/
C2Count++; // Считаем номер пришёдшего сигнала С2
C2Out = false; // Запоминаем, что С2 пришёл, но ещё не уходил
}
if(C2Count == 8) // Если пришло 8 сигналов С2, значит мы приняли целиком байт
{C2Count = 0; // Обнуляем количество сигналов С2
C1Came = false; // Запоминаем что пришёдший после С1 байт уже обработан, ждём следующий С1
C2Out = true;
frameCameFromArbiter = true; // Запоминаем что байт пришёл
}
if(!C2){ // Если сигнал С2 ушёл
C2Out = true; // Запоминаем, что сигнал С2 ушёл
}
}
}
// Ждём поступления от Арбитра адреса микроконтроллера
void WaitAddressFromArbiter()
{DDRA = 0x00; // Указываем микроконтроллеру настроить все выводы на приём информации
bool attentionCame = false;
ReceiveFrameFromArbiter(); // Получить байт от Арбитра
if(frameCameFromArbiter) // Если байт от Арбитра пришёл
{if(attentionCame) // Если сигнал Внимание уже приходил
{if(frameFromArbiter == ADDRESS) // И пришедший байт равен адресу микроконтроллера
{AddressCameFromArbiter = true; // Запоминаем, что адрес пришёл
}
attentionCame = false;
}
if(frameFromArbiter == ATTENTION) // Если пришёл байт равный сигналу Внимание
{attentionCame = true; // Запоминаем, что приходил сигнал Внимание
}
frameCameFromArbiter = false; // Записываем, что мы уже обработали пришедший байт
}
}
// Посылаем параллельно байт Абоненту
void SendFrameToAbonent(byte sendFrame)
{static bool C1Came = false;
if(C1) // Если пришёл сигнал С1,
{C1Came = true; // запоминаем что сигнал С1 приходил
}
if(C1Came) // Если сигнал С1 приходил
{PORTB = sendFrame; // Выдаём на выводы порта B байт
}
if(!C1 && C1Came) // Если сигнал С1 ушёл и приходил
{frameToAbonentWasSent = true; // Запоминаем что байт был отослан
C1Came = false;
}
}
// Посылаем Абоненту запрос о его состоянии
void SendToAbonentRequestAboutAbonentState()
{DDRB = 0xFF; // Указываем микроконтроллеру настроить все выводы порта B на вывод информации
SendFrameToAbonent(READY); // Посылаем байт ГОТОВ Абоненту
if(frameToAbonentWasSent) // Если байт был послан
{requestToAbonentWasSent = true; // Запоминаем, что запрос Абоненту был послан
}
}
// Получаем от Абонента его состояние
void ReceiveFromAbonentAbonentState()
{DDRB = 0x00; // Указываем микроконтроллеру настроить все выводы порта B на приём информации
static bool C1Came = false;
if(C1) // Если пришёл сигнал С1,
{C1Came = true; // запоминаем что сигнал С1 приходил
}
if(C1Came) // Если сигнал С1 приходил
{abonentState = PINA; // Выдаём на выводы порта B байт
}
if(!C1 && C1Came) // Если сигнал С1 ушёл и приходил
{abonentStateReceived = true; // Запоминаем что получили состояние Абонента
C1Came = false;
}
}
// Посылаем Арбитру состояние Абонента
void SendToArbiterAbonentState(byte frame)
{DDRA = 0x04;
static int C2Count = 0;
static bool C1Came = false;
static bool C2Out = true;
if(C1) // Если пришёл сигнал С1,
{C1Came = true; // запоминаем что сигнал С1 приходил
}
if(C1Came) // Если сигнал С1 приходил
{ if(C2 && C2Out) // Если сигнал С2 пришёл,
{DATAOUT((frame & (1 << C2Count)) >> C2Count); // Записываем очередной бит на информационную линию
C2Count++; // Считаем номер пришёдшего сигнала С2
C2Out = false; // Запоминаем, что С2 пришёл, но ещё не уходил
}
if(C2Count == 8)
{C2Count = 0; // Обнуляем количество сигналов С2
C1Came = false; // Запоминаем что пришёдший после С1 байт уже обработан, ждём следующий С1
C2Out = true;
stateOfAbonentWasSentToArbiter = true; // Запоминаем, что состояние Абонента было отослано Арбитру
}
if(!C2){ // Если сигнал С2 ушёл
C2Out = true; // Запоминаем, что сигнал С2 ушёл
}
}
}
// Получаем информационное сообщение от Арбитра и пересылаем Абоненту
void ReceiveDataMessageFromArbiterAndReferToAbonent()
{DDRA = 0x00; // Указываем микроконтроллеру настроить все выводы на приём информации
ReceiveFrameFromArbiter(); // Получить байт от Арбитра
if(frameCameFromArbiter) // Если байт от АРбитра пришёл
{SendFrameToAbonent(frameFromArbiter); // Посылаем байт Абоненту
frameCameFromArbiter = false; // Запоминаем, что мы обработали байт, пришедший от Арбитра
if(frameFromArbiter == END_OF_TRANSFER_SEQUENCE) // Если пришёдший байт совпадает с символом КОНЕЦ ПЕРЕДАЧИ
{DataMessageRefered = true; // Запоминаем что информационное сообщение переслали
}
}
}
int main (void)
{while(1) // Запускаем бесконечный цикл
{if(!AddressCameFromArbiter) // Если адрес МК ещё не пришёл от Арбитра,
{WaitAddressFromArbiter(); // ждём
}
if(AddressCameFromArbiter) // Если от Арбитра пришёл адрес МК
{SendToAbonentRequestAboutAbonentState(); // посылаем Абоненту запрос о его состоянии
if(requestToAbonentWasSent) // Если запрос о состоянии Абонента был послан
{ReceiveFromAbonentAbonentState(); // получаем ответ
}
if(abonentStateReceived) // Если получили состояние Абонента,
{if(abonentState == END_OF_WORK) // и состояние равно КОНЕЦ РАБОТЫ,
{SendToArbiterAbonentState(READY); // посылаем Арбитру сигнал ГОТОВ
if(stateOfAbonentWasSentToArbiter) // Если состояние Абонента отослалось Арбитру
{ReceiveDataMessageFromArbiterAndReferToAbonent(); //
Начинаем принимать информационное сообщение от Арбитра и пересылать его Абоненту
if(DataMessageRefered) // Если информационное сообщение было отослано
{SendToAbonentRequestAboutAbonentState(); // Посылаем Абоненту
запрос о его состоянии
if(requestToAbonentWasSent) // Если запрос о состоянии Абонента был послан,
{ReceiveFromAbonentAbonentState(); // ждём ответ
}
if(abonentStateReceived) // Если получили состояние Абонента,
{if(abonentState == TRANSFER_ERROR) // Если состояние
Абонента равно ОШИБКА ПЕРЕДАЧИ
{SendToArbiterAbonentState(REPEAT_TRANSFER);
// Посылаем Арбитру сигнал ПОВТОРИТЬ ПЕРЕДАЧУ
}
else // Если ошибки не произошло
{SendToArbiterAbonentState(END_OF_RECEIVE); //
//Посылаем Арбитру сигнал КОНЕЦ ПРИЁМА
}
}
}
}
}
else // Если состояние не равно КОНЕЦ РАБОТЫ
{SendToArbiterAbonentState(BUSY); // Посылаем Арбитру, что Абонент ЗАНЯТ
}
}
}
}
}
Список литературы
1. Конспект лекций по курсу «Микропроцессоры»
2. Голубцов М.С., Кириченкова А.В. Микроконтроллеры AVR: от простого к сложному. - М.: «Солон-Пресс», 2004.
3. Шпак Ю.А. Программирование на языке C для AVR и PIC микроконтроллеров. - М.: «МК-Пресс», 2006.
4. Фрунзе А.В. Микроконтроллеры? Это же просто! - K.: «Додэка XXI», 2007.
5. Белов А.В. Самоучитель разработчика устройств на микроконтроллерах AVR. - М.: «Наука и техника», 2008.
6. Хартов В.Я. Микроконтроллеры AVR. Практикум для начинающих. -М.: МГТУ им. Н. Э. Баумана, 2007.
7. Джон Мортон Микроконтроллеры AVR. Вводный курс AVR: An Introductory Course. - К.: «Додэка XXI», 2006.
8. Евстифеев А.В. Микроконтроллеры AVR семейства Tiny. Руководство пользователя. - К.: Додэка XXI, 2007.
Приложение 1
Пошагово посмотрим, как работает микроконтроллер. Зададим начальные параметры:
// Глобальные переменные
byte frameFromArbiter = 0;
bool abonentStateReceived = false;
bool frameCameFromArbiter = true;
bool AddressCameFromArbiter = true;
bool frameToAbonentWasSent = true;
bool requestToAbonentWasSent = true;
bool stateOfAbonentWasSentToArbiter = true;
bool DataMessageRefered = true;
int abonentState = 0;
// Ждём поступления от Арбитра адреса микроконтроллера
void WaitAddressFromArbiter()
{
DDRA = 0x00; // Указываем микроконтроллеру настроить все выводы на приём информации
bool attentionCame = true;
// Посылаем параллельно байт Абоненту
void SendFrameToAbonent(byte sendFrame)
{
static bool C1Came = true;
if(C1) // Если пришёл сигнал С1,
{
C1Came = true; // запоминаем что сигнал С1 приходил
} логический микроконтроллер связь сигнал
// Получаем от Абонента его состояние
void ReceiveFromAbonentAbonentState()
{
DDRB = 0x00; // Указываем микроконтроллеру настроить все выводы порта B на приём информации
static bool C1Came = true;
// Посылаем Арбитру состояние Абонента
void SendToArbiterAbonentState(byte frame)
{
DDRA = 0x04;
static int C2Count = 1;
static bool C1Came = true;
static bool C2Out = true;
Запускаем программу и нажимая клавишу F11 для пошагового просмотра работы программы.
int main (void)
{while(1) // Запускаем бесконечный цикл
Состояние порта А
Состояние порта В
SendToAbonentRequestAboutAbonentState(); // посылаем Абоненту запрос о его состоянии
// Посылаем Абоненту запрос о его состоянии
void SendToAbonentRequestAboutAbonentState()
DDRB = 0xFF; // Указываем микроконтроллеру настроить все выводы порта B на вывод информации
SendFrameToAbonent(READY); // Посылаем байт ГОТОВ Абоненту
// Посылаем параллельно байт Абоненту
void SendFrameToAbonent(byte sendFrame)
if(C1) // Если пришёл сигнал С1,
if(C1Came) // Если сигнал С1 приходил
PORTB = sendFrame; // Выдаём на выводы порта B байт
if(!C1 && C1Came) // Если сигнал С1 ушёл и приходил
frameToAbonentWasSent = true; // Запоминаем что байт был отослан
C1Came = false;
if(frameToAbonentWasSent) // Если байт был послан
requestToAbonentWasSent = true; // Запоминаем, что запрос Абоненту был послан
if(requestToAbonentWasSent) // Если запрос о состоянии Абонента был послан
ReceiveFromAbonentAbonentState(); // получаем ответ
// Получаем от Абонента его состояние
void ReceiveFromAbonentAbonentState()
DDRB = 0x00; // Указываем микроконтроллеру настроить все выводы порта B на приём информации
if(C1) // Если пришёл сигнал С1,
if(C1Came) // Если сигнал С1 приходил
abonentState = PINA; // Выдаём на выводы порта B байт
if(!C1 && C1Came) // Если сигнал С1 ушёл и приходил
abonentStateReceived = true; // Запоминаем что получили состояние Абонента
C1Came = false;
if(abonentStateReceived) // Если получили состояние Абонента,
if(abonentState == END_OF_WORK) // и состояние равно КОНЕЦ РАБОТЫ,
SendToArbiterAbonentState(BUSY); // Посылаем Арбитру, что Абонент ЗАНЯТ
// Посылаем Арбитру состояние Абонента
void SendToArbiterAbonentState(byte frame)
DDRA = 0x04;
if(C1) // Если пришёл сигнал С1,
if(C1Came) // Если сигнал С1 приходил
if(C2 && C2Out) // Если сигнал С2 пришёл,
if(C2Count == 8)
if(!C2){ // Если сигнал С2 ушёл
C2Out = true; // Запоминаем, что сигнал С2 ушёл
if(!AddressCameFromArbiter) // Если адрес МК ещё не пришёл от Арбитра,
if(AddressCameFromArbiter) // Если от Арбитра пришёл адрес МК
SendToAbonentRequestAboutAbonentState(); // посылаем Абоненту запрос о его состоянии
// Посылаем Абоненту запрос о его состоянии
void SendToAbonentRequestAboutAbonentState()
DDRB = 0xFF; // Указываем микроконтроллеру настроить все выводы порта B на вывод информации
SendFrameToAbonent(READY); // Посылаем байт ГОТОВ Абоненту
// Посылаем параллельно байт Абоненту
void SendFrameToAbonent(byte sendFrame)
if(C1) // Если пришёл сигнал С1,
if(C1Came) // Если сигнал С1 приходил
if(!C1 && C1Came) // Если сигнал С1 ушёл и приходил
if(frameToAbonentWasSent) // Если байт был послан
requestToAbonentWasSent = true; // Запоминаем, что запрос Абоненту был послан
if(requestToAbonentWasSent) // Если запрос о состоянии Абонента был послан
ReceiveFromAbonentAbonentState(); // получаем ответ
// Получаем от Абонента его состояние
void ReceiveFromAbonentAbonentState()
DDRB = 0x00; // Указываем микроконтроллеру настроить все выводы порта B на приём информации
if(C1) // Если пришёл сигнал С1,
if(C1Came) // Если сигнал С1 приходил
if(!C1 && C1Came) // Если сигнал С1 ушёл и приходил
if(abonentStateReceived) // Если получили состояние Абонента,
if(abonentState == END_OF_WORK) // и состояние равно КОНЕЦ РАБОТЫ,
SendToArbiterAbonentState(BUSY); // Посылаем Арбитру, что Абонент ЗАНЯТ
// Посылаем Арбитру состояние Абонента
void SendToArbiterAbonentState(byte frame)
DDRA = 0x04;
if(C1) // Если пришёл сигнал С1,
if(C1Came) // Если сигнал С1 приходил
if(C2 && C2Out) // Если сигнал С2 пришёл,
if(C2Count == 8)
if(!C2){ // Если сигнал С2 ушёл
C2Out = true; // Запоминаем, что сигнал С2 ушёл
if(!AddressCameFromArbiter) // Если адрес МК ещё не пришёл от Арбитра,
Размещено на Allbest.ru
...Подобные документы
Схема линии связи и подключения абонентов. Ведение передачи информации в последовательном коде. Использование интерфейсного модуля-контроллера связи для ее реализации. Схема микроконтроллера, описание работы портов. Создание проекта в AVR Studio.
контрольная работа [82,6 K], добавлен 24.02.2014Разработка структурной и принципиальной схемы микропроцессора. Подключение шины адреса, данных и управления к соответствующим блокам на схеме. Формирование блока устройства памяти (ОЗУ и ПЗУ) и подключение его к шинам блока центрального процессора.
контрольная работа [220,5 K], добавлен 08.07.2012Общая характеристика микроконтроллера PIC16F873A, его корпус, технические параметры, структурная схема и организация памяти. Подключение питания и тактирование, анализ принципиальной схемы. Разработка рабочей программы для заданного микроконтроллера.
курсовая работа [667,0 K], добавлен 23.04.2015Описание алгоритма работы и разработка структурной схемы микропроцессорной системы управления. Разработка принципиальной схемы. Подключение микроконтроллера, ввод цифровых и аналоговых сигналов. Разработка блок-схемы алгоритма главной программы.
курсовая работа [3,3 M], добавлен 26.06.2016Разработка принципиальной электрической схемы на базе микропроцессора. Механизм работы устройства, его зависимость от сигналов, приходящих на микроконтроллер от датчиков присутствия человека в помещении. Выбор датчика присутствия. Расчет параметров реле.
курсовая работа [491,6 K], добавлен 03.04.2017Способы и методы измерения частоты, их характеристика. Типы индикаторов и проектирование принципиальной электрической схемы блока индикации. Разработка предварительного делителя частоты. Алгоритм работы микропроцессора и конструктивное решение прибора.
дипломная работа [1,0 M], добавлен 09.07.2013Назначение блока узкополосного передатчика. Требования к печатному узлу. Базовые требования по целостности сигнала. Разработка конструкции блока. Расчет искажений сигнала. Способы согласования линии связи. Помехи в короткой и длинной линии связи.
дипломная работа [4,3 M], добавлен 14.07.2016Алгоритм функционирования контроллера имитатора навигационного сигнала, его упрощенная структурная схемы. Спецификация входных и выходных сигналов. Разработка аппаратной части заданного блока контроллера и программного обеспечения. Исходный код программы.
курсовая работа [1,1 M], добавлен 13.10.2017Принцип работы супергетеродина, основанного на принципе преобразования принимаемого сигнала в сигнал фиксированной промежуточной частоты с усилением. Выбор и обоснование конструктивного исполнения, подбор элементной базы и расчет надежности блока.
дипломная работа [1,1 M], добавлен 13.02.2016Микропроцессорные системы и микроконтроллеры. Разработка схемы и программы микроконтроллера. Симуляция проекта в программе Proteus 7. Прерывание программы по внешнему сигналу, поступающему в процессор. Устройство и настройка канала порта на ввод-вывод.
контрольная работа [551,8 K], добавлен 26.01.2013Проектирование цифрового генератора аналоговых сигналов. Разработка структурной, электрической и функциональной схемы устройства, блок-схемы опроса кнопок и работы генератора. Схема делителя с выходом в виде напряжения на инверсной резистивной матрице.
курсовая работа [268,1 K], добавлен 05.08.2011Алгоритм работы схемы микропроцессорного устройства и протокол обмена информацией между ним и объектом управления. Составление карты памяти для микропроцессора. Разработка программы на языке Ассемблера для выбранного микропроцессора и микроконтроллера.
контрольная работа [207,8 K], добавлен 29.06.2015Понятия о проводной передаче данных. Принцип работы интерфейса стандарта RS-485. Согласование линии с передатчиком и приемником. Адресация данных в протоколе Modbus RTU. Структурная организация микроконтроллера MCS-51. Вывод управляющих сигналов.
курсовая работа [952,0 K], добавлен 15.06.2013Структурная схема устройства. Общая характеристика микропроцессора Z80, его особенности. Описание выводов. Схемотехника и принцип работы блоков. Схема микропроцессорного блока и памяти. Программное обеспечение микроконтроллера. Расчёт блока питания.
контрольная работа [355,3 K], добавлен 07.01.2013Разработка функциональной схемы устройства, осуществляющего обработку входных сигналов в соответствии с заданным математическим выражением зависимости выходного сигнала от двух входных сигналов. Расчет электрических схем вычислительного устройства.
курсовая работа [467,5 K], добавлен 15.08.2012Разработка схемы принципиальной электрической для осуществления мультиплексирования трехцифровых сигналов на основе цифровых микросхем. Выполнение и моделирование работы схемы в программе MicroCap. Программирование схемы на микроконтроллере PIC16.
контрольная работа [903,2 K], добавлен 22.06.2022Разработка и описание структурно-функциональной схемы к динамику. Принципы построения устройства синтезатора звуковых сообщений, работа с таймером микроконтроллера. Выбор элементной базы. Разработка программного обеспечения, алгоритм и листинг программы.
курсовая работа [387,9 K], добавлен 24.12.2012Структурная схема микропроцессорного устройства для определения частоты сигнала. Выбор микроконтроллера, описание алгоритма нахождения частоты. Алгоритм работы программы управления микропроцессорным устройством. Программа работы микропроцессора.
курсовая работа [605,7 K], добавлен 24.11.2014Описание основных блоков микропроцессорного устройства управления и обоснование выбора элементной базы. Основные особенности микроконтроллера. Принцип передачи сигнала. Согласование и конфигурация линии связи. Подключение приемников-передатчиков.
курсовая работа [1,5 M], добавлен 28.12.2014GSM блок управления автоматикой ворот. Передатчик сигнала с пульта. Описание электрической принципиальной схемы блока управления шлагбаумом (БУШ). Работа БУШ в режиме редактирования массива телефонных номеров в памяти, при приеме входящего звонка.
дипломная работа [3,0 M], добавлен 04.02.2016