#include <16F84.h>
/* 0-й бит порта А — SCL, 1-й бит порта А — SDA, режим ведущего, протокол Fast */
#use i2c(master, scl=PIN_A0, sda=PIN_A1, fast)
#byte DATA_X = 0x20
#byte DATA_Y = 0x21
void MAX518 (unsigned int channel_0, unsigned int channel_1);
void irain(void)
{
/* Различный код * /
МАХ518(DATA_X, DATA_Y); /* Передаем два байта данных * /
/* Остальной ход * /
}
void MAX518(unsigned int channel_0, unsigned int channel_1)
{
i2c_start(); /* Формируем состояние СТАРТ * /
i2c_write(0x58); /* Передаем адрес ведомого * /
i2c_write(0); /* Посылаем 1-й управляющий байт * /
i2c_write(channel_0); /* Посылаем данные 0-го канала * /
i2c_write(0x01); /* Посылаем 2-й управляющий байт * /
i2c_write(channel_1); /* Посылаем данные 1-го канала * /
/* Обновляем оба канала * /
i2c_stop(); /* Формируем состояние СТОП * /
}
В этой программе используются следующие встроенные функции компилятора CCS:
∙ i2c_start();
Формирует состояние СТАРТ.
∙ i2c_stop();
Формирует состояние СТОП.
∙ i2c_read();
Считывает один байт с шины. Если необязательный параметр равен 0, то в ответ на принятые данные будет возвращен NACK. При работе в режиме ведущего также генерирует тактовый сигнал.
∙ i2c_write(value);
Передает по шине один байт. При работе в режиме ведущего также генерирует тактовый сигнал.
∙ #use i2c(master, scl=PIN_A0, sda=PIN_A1, fast)
С помощью этой директивы программист сообщает компилятору о том, какие выводы будут использоваться для подключения к линиям шины I2С, тип используемого протокола (стандартный или высокоскоростной), а также режим работы модуля (ведущий или ведомый). К моменту написания книги компилятор не поддерживал возможности модуля MSSP по работе в качестве ведущего, поэтому такие функции реализованы программно. Функции ведомого могут быть реализованы аппаратно модулем MSSP, если в директиве #use i2c() указать опцию FORCE_HW.
* * *
Отличительной особенностью всех последовательных протоколов, рассмотренных нами до настоящего момента, является то, что ведущее устройство генерирует тактовый сигнал, благодаря которому ведомое устройство может принимать и передавать данные в синхронном режиме. Альтернативный подход к передаче данных базируется на допущении, что передатчик и приемник работают примерно с одной и той же скоростью. Такой
Одной из особенностей ранних компьютеров, создававшихся в 40-х и 50-х годах, было интенсивное заимствование существовавших к тому времени технологий. А одним из основных элементов любой машинно-ориентированной системы является терминал данных. В то время в области телекоммуникаций широко использовались телетайпы (TTY)[159]. Последовательные данные преобразовывались в параллельный формат самим терминалом, который также выполнял функции клавиатуры и печатающего устройства.
До начала 80-х годов телетайпы были исключительно электромеханическими устройствами, управляющимися синхронными электродвигателями. То есть синхронность работы удаленных терминалов гарантировалась только в течение короткого интервала времени. Для устранения этой проблемы каждому передаваемому слову предшествовал старт-бит, а после него передавался один или более стоп-битов. Типичный пример показан на Рис. 12.20. В свободном состоянии линии на ней присутствует лог. 1 (обрыв). Появление сигнала лог. 0 сигнализирует о начале слова. Завершает передачу слова сигнал лог. 1. Электромеханические терминалы обычно печатали со скоростью десять символов в секунду и требовали не менее двух стоп-битов. Для 8-битных слов данных это соответствует
Рис. 12.20.