Библиотека функций управления аналогово-цифровым преобразователем компилятора С18
Для облегчения разработки программ управления встроенным аналогово-цифровым преобразователем микроконтроллеров семейства PIC18 в библиотеке пакета MCC18 имеются несколько функций, которые являются специфическими для компилятора С18 и не существуют в стандартной библиотеке ANSI C. Функции приведены в табл. 1. Полное описание этих функций дано в заголовочном файле с именем adc.h.
Таблица 1
Функции компилятора С18 для АЦП
Функция | Описание |
OpenADC( ) | Конфигурирует АЦП |
SetChanADC( ) | Выбирает канал, который будет использоваться |
ConvertADC( ) | Запускает АЦП |
BusyADC( ) | Проверяет, занят ли сейчас АЦП |
ReadADC( ) | Считывает результат преобразования АЦП |
CloseADC( ) | Отключает АЦП |
Пример записи функции OpenADC( ), которая будет использована в данной лабораторной работе:
OpenADC(ADC_FOSC_4 & ADC_RIGHT_JUST & ADC_1ANA_ 0REF,
ADC_CH0 & ADC_INT_OFF);
Эта функция задает тактирование АЦП от генератора МК, коэффициент деления частоты FOSC равен 4; правое выравнивание результата АЦ-преобразования; один аналоговый вход AN0, опорные напряжения UREF+ = UDD, UREF- = USS ; выбирается канал 0 (вход AN0); запрещаются прерывания от АЦП.
Следующая функция SetChanADC( ) выбирает канал, который будет использовать АЦП. Прототип функции:
void SetChanADC(unsigned char channel);
Аргумент функции: channel
ADC_CH0 Канал 0
ADC_CH1 Канал 1
ADC_CH2 Канал 2
…………….
Пример записи функции, который будет использоваться в лабораторной работе:
SetChanADC(ADC_CH0);
Выбирается канал 0, т.е. аналоговый сигнал должен подаваться на линию AN0 (вывод RA0 порта А).
Функция ConvertADC( ) осуществляет запуск (старт) АЦ-преобразования. Прототип функции:
void ConvertADC(void);
Функция BusyADC( ) – АЦП в данный момент выполняет преобразование? (по-другому, АЦП занят?). Прототип функции:
char BusyADC(void);
Эта функция возвращает значение 1, если АЦП выполняет преобразование (АЦП занят), и возвращает значение 0, если АЦП не выполняет преобразование (АЦП свободен).
Функция ReadADC( ) – чтение результата АЦ-преобразования. Прототип функции:
int ReadADC(void);
Эта функция возвращает двухбайтное число, в котором размещается 10-разрядный код АЦП. Он размещается в младших или старших разрядах числа в соответствие с параметром, заданным в функции OpenADC( ).
Функция CloseADC( ) – отключение АЦП. Прототип функции:
void CloseADC(void);
Эта функция отключает модуль АЦП, при этом он не потребляет ток от источника питания.
Для осуществления АЦ-преобразования входного сигнала программа МК должна сделать следующие действия:
· выполнить конфигурацию АЦП с помощью задания соответствующих аргументов в функции OpenADC( );
· выбрать канал для ввода аналогового сигнала с помощью функции SetChanADC( );
· выполнить задержку на время 20 мкс для заряда конденсатора схемы выборки-хранения;
· запустить преобразование с помощью функции ConvertADC( );
· производить периодический опрос готовности данных АЦП с помощью функции BusyADC( ) (если не используется прерывание от АЦП);
· в случае готовности данных считать результат АЦ-преобразования с помощью функции ReadADC( ).
18. Реализация широтно-импульсной модуляции в PIC-микроконтроллерах: параметры ШИМ, функции управления ШИМ на языке С18.
Скважностью импульсной последовательности называется отношение периода следования импульсов Т к их длительности tИ и обозначается буквой Q:
Q = T / tИ
Скважность – величина безразмерная и не имеет единиц измерения.
Часто вместо скважности используется термин коэффициент заполнения γ, который является величиной, обратной скважности:
γ = 1 / Q = tИ / T
Коэффициент заполнения обычно выражается в процентах:
γ = (tИ / T) 100%
Иногда в англоязычной литературе вместо коэффициента заполнения используется термин Duty Cycle (величина рабочего цикла).
Все микроконтроллеры семейства PIC18 имеют внутренние модули, которые могут вырабатывать импульсные последовательности с широтно-импульсной модуляцией (ШИМ). Количество этих модулей или по-другому каналов ШИМ может быть от 1 до 5.
Для облегчения разработки программ управления каналами ШИМ в библиотеке пакета МСС18 имеются несколько функций. В табл.1 приведены некоторые наиболее часто используемые функции. Полное описание их дано в заголовочном файле pwm.h.
Таблица 1
Функции ШИМ
Функция | Описание |
ClosePWMx | Дезактивирует ШИМ канала х |
OpenPWMx | Конфигурирует ШИМ канала х |
SetDCPWMx | Записывает значение нового рабочего цикла в ШИМ канала х |
Рассмотрим вкратце библиотечные функции ШИМ на примере канала 1.
ClosePWM1( ) – дезактивирует ШИМ канала 1. Прототип функции:
void ClosePWM1(void);
OpenPWM1( ) – конфигурирует ШИМ канала 1, задавая период и длительность импульсов. Для работы ШИМ используется только таймер 2. Прототип функции:
void OpenPWM1(char period);
Аргумент функции period – может быть любым числом в пределах от 0х00 до 0xFF.
SetDCPWM1( ) – записывает новое значение рабочего цикла в регистр ШИМ канала 1. Прототип функции:
void SetDCPWM1(unsigned int dutycycle);
Аргумент функции dutycycle – может быть любым 10-битным числом. Только младшие 10 бит числа dutycycle записываются в регистры канала ШИМ.
unsigned int i=512;
void init(void); // прототип функции инициализации МК
void main(void)
{
init( );
SetDCPWM1( i );
while(1);
}
void init(void) // функция инициализации МК
{
PORTC = 0;
TRISC = 0;
OpenTimer2(TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_1);
// функция открытия таймера 2 при следующих параметрах:
// прерывания запрещены, коэффициент деления прескалера
// равен 1, коэффициент деления постскалера равен 1
OpenPWM1(0xFF); // период ШИМ равен 0xFF
SetDCPWM1(0); // рабочий цикл (коэффициент заполнения) =0
19. Прерывания в PIC18: источники прерываний, управляющие биты, программирование прерываний на языке С18.
Микроконтроллеры PIC18 имеют несколько источников прерываний и функцию приоритетной системы прерываний, которая позволяет для каждого источника прерываний назначить высокий или низкий приоритет. При возникновении прерывания с высоким приоритетом происходит переход по вектору 000008h, а при возникновении прерывания с низким приоритетом – по вектору 000018h.
Каждому источнику прерываний соответствует три управляющих бита:
· флаг прерываний, указывает на то, что выполнено условие возникновения прерывания;
· бит разрешения прерывания, разрешает переход по вектору прерывания при установке соответствующего флага;
· бит приоритета, выбор низкого или высокого приоритета прерывания.
Обработка прерывания заключается в следующем. Приостанавливается выполнение текущей программы, сохраняется текущий контекст и передается управление подпрограмме обработки прерывания ISR. После выполнения ISR восстанавливается информация о предыдущем контексте и возобновляется нормальная работа программы.
Рассмотрим основные особенности программирования прерываний при использовании компилятора С18.
Как и любая функция языка Си, подпрограмма обработки прерывания ISR может иметь локальные и глобальные переменные. Однако ISR не может иметь входных параметров и не может возвращать какого-либо значения, то есть объявляется как:
void isr(void)
{
……..
}
ISR может быть вызвана только реакцией на работу аппаратуры, но не из другой Си-функции.
В языке С18 не производится автоматическое размещение начала ISR по адресу вектора прерывания. Это объясняется тем, что источников прерывания, а следовательно, и ISR может быть несколько. Векторов прерывания, то есть адресов только два: 000008h для высокого приоритета и 000018h для низкого приоритета.
Обычно по адресу вектора прерывания размещается ассемблерная команда GOTO для перехода на нужную ISR. Используется in-line ассемблер, при этом блок команд ассемблерного кода должен начинаться с директивы _asm и кончаться директивой _endasm:
_asm
…………
………… // команды Ассемблера
…………
_endasm
Для размещения вектора прерывания в программном коде используется директива
#pragma code section_name = address
Здесь section_name – идентификатор языка Си, address – целая константа (integer).
Для возврата в исходную секцию кода используется директива
#pragma code
В языке С18 для задания приоритета функции обработки прерывания имеются две директивы:
#pragma interrupt fname
#pragma interruptlow fname
Директива #pragma interrupt объявляет функцию обработки прерывания как имеющую высокий приоритет, а директива #pragma interruptlow – как имеющую низкий приоритет.
Пример программирования прерываний в языке С18.
#include <p18fxxx.h>
void high_isr(void); // прототип ISR с высоким приоритетом
void low_isr(void); // прототип ISR с низким приоритетом
#pragma interrupt high_isr // функция high_isr объявляется с высоким приоритетом
#pragma interruptlow low_isr // функция low_isr объявляется с низким приоритетом
#pragma code high_vector = 0x08 // дальнейший программный код будет начинаться с адреса 000008h
void high_interrupt(void)
{
_asm
goto high_isr // переход на функцию с именем high_isr
_endasm
}
#pragma code low_vector = 0x18 // дальнейший программный код будет начинаться с адреса 000018h
void low_iterrupt(void)
{
_asm
goto low_isr // переход на функцию с именем low_isr
_endasm
}
#pragma code // возврат в исходную программную секцию кода
………………………………..
void main(void) // главная функция программы
{
……………………..
}
void high_isr(void) // функция обработки прерывания с высоким приоритетом
{
………
}
void low_isr(void) // функция обработки прерывания с низким приоритетом
{
…….
}
Управление приоритетной системой прерываний в микроконтроллерах семейства PIC18 выполняется с помощью бита с именем IPEN, который находится в регистре специальных функций RCON.
Если IPEN = 0, то приоритетная система прерываний выключена, и все прерывания имеют одинаковые приоритеты. По умолчанию предполагается, все прерывания будут иметь высокий приоритет, т.е. при возникновении любого прерывания происходит переход по вектору 000008h. Для общего (глобального) разрешения прерываний надо установить бит GIE = 1, который находится в регистре INTCON.
Если IPEN = 1, то приоритетная система прерываний включена. Для общего (глобального) разрешения прерываний с высоким приоритетом надо установить бит GIEH = 1. Для общего разрешения прерываний с низким приоритетом надо установить бит GIEL = 1. Эти биты находятся в регистре INTCON.
20.Динамическое управление линейным дисплеем на семисегментных индикаторах в PIC-микроконтроллерах.
Для отображения цифровой и буквенной информации в микроконтроллерных системах широко используются семисегментные индикаторы, которые бывают светодиодные, вакуумно-люминесцентные, жидкокристаллические, вакуумно-накаливаемые, газоразрядные. Наибольшее распространение получили семисегментные светодиодные индикаторы (ССДИ) ввиду большой яркости, малыми габаритами, способности работать в широком диапазоне температур, механической прочности. На рис. 1,а показано расположение и обозначение сегментов ССДИ. Семь отображающих элементов позволяют высвечивать десятичные и шестнадцатиричные цифры, некоторые буквы латинского и русского алфавитов, а также некоторые специальные знаки. При формировании, например, цифры 3 будут подсвечиваться сегменты a, b, c, d и g, а сегменты e и f останутся темными. При формировании буквы F будут подсвечиваться сегменты a, e, f и g, а темными останутся сегменты b, c и d.
По способу соединения отдельных светодиодов в ССДИ различают индикаторы с общими катодами (ОК) и с общими анодами (ОА). Их схемы внутренних соединений показаны на рис. 1,б, в. На рис. 1,г приведено условное графическое изображение ССДИ.
Рис. 1. Семисегментный светодиодный индикатор: а) - условное обозначение сегментов; б) – индикатор с общими катодами (ОК); в) – индикатор с общими анодами (ОА); г) - условное графическое обозначение на схемах
При формировании символов в ССДИ требуются специальные семисегментные коды, которые отличаются от обычных позиционных двоичных кодов, используемых в МК. Для получения семисегментных кодов могут быть применены два метода:
1) аппаратурный;
2) программный.
Аппаратурный метод основан на использовании специальных микросхем преобразователей кодов, которые преобразуют двоичный позиционный код в семисегментный. В качестве таких преобразователей наиболее широко применяются микросхемы КР514ИД1 и КР514ИД2, которые обычно называют дешифраторами кода. Микросхема КР514ИД1 используется для индикаторов с ОК, а КР514ИД2 – для индикаторов с ОА. Недостатком этих дешифраторов является то, что они позволяют получить только семисегментные коды десятичных цифр от 0 до 9. При этом на их входы должен подаваться двоично-десятичный код.
Программный метод получения семисегментного кода основан на том, что каждому сегменту индикатора поставлен в соответствие определенный бит D7, D6,…, D0 байта. Для индикаторов с ОК принято, что если этот бит равен 1, то сегмент светится. Определенные комбинации единичных значений битов формируют на индикаторе отображаемый символ, как это приведено в табл. 1.
Семисегментные коды для отображения символов от 0 до 9
для индикаторов с ОК
D7 - h | D6 –g | D5 –f | D4 –e | D3 –d | D2 – c | D1 -b | D0 – a | HEX | Сим- вол |
… | … | … | … | … | … | … | … | 3F … 6F | … |
Таблица семисегментных кодов обычно хранится в памяти программ.
Для отображения многосимвольной информации используются линейные (однострочные) дисплеи. Такие дисплеи представляют собой “линейку”, смонтированную из отдельных ССДИ. Число знакомест (позиций или разрядов) дисплея определяется в соответствии с требованиями к МКС.
Существует два способа организации МК с линейными дисплеями: статический и динамический (мультиплексный).
Первый требует наличие на входах каждого индикатора специальных буферных регистров для хранения кодов выводимых символов. Естественно, что с увеличением разрядности дисплея возрастает число дополнительных микросхем, а, следовательно, и стоимости МКС.
Второй способ (динамический) основан на том, что любой световой индикатор является инерционным прибором, а человеческому глазу отображаемая на дисплее информация, если ее обновлять с частотой не менее 20 раз в секунду, представляется неизменной. Динамический способ вывода информации на дисплей требует значительно меньших аппаратных затрат, но более сложного программного обеспечения.
rom near char table[ ] =
{
0x3F, 0x06, 0x5B,0x4F, 0x66, 0x6D,0x7D,0x07, 0x7F, 0x6F,
};
char count; // переменная-счетчик
void main(void)
{
char select; // код для выбора индикатора (его включения)
char a; // переменная-счетчик индикаторов дисплея
PORTB = 0xFF;
TRISB = 0; // настроить порт В на вывод
PORTC = 0;
TRISC = 0; // настроить порт С на вывод
count = 0;
while( 1 ) // бесконечный цикл вывода на дисплей
{
/* вывод цифр одновременно на все индикаторы дисплея */
POTRB = 0xFF; // гашение дисплея
PORTC = table[ count ]; // вывод на сегменты индикаторов
PORTB &= 0b11110000; // включение индикаторов дисплея
Delay10KTCYx(50); // задержка на 0,5 секунды
/* вывод цифр поочередно на индикаторы дисплея*/
select = 0b11111110; // код для выбора 1-го индикатора
for ( a = 0; a < 4; a++)
{
POTRB = 0xFF; // гашение дисплея
PORTC = table[ count ]; // вывод на сегменты индикаторов
PORTB = select; // включение индикатора
select = (select << 1) | 0b00000001; // сдвиг кода влево и вставка 1 в младший разряд
Delay10KTCYx(50); // задержка на 0,5 секунды
}
count++; // следующая цифра для вывода
if( count >= 10 )
count = 0;
} }
24) Интегрированная среда CodeVisionAVR: состав и назначение, структура программы на языке Си в CVAVR, управление портами и отдельными битами.
CodeVisionAVR – это интегрированная среда разработки (IDE – Integrated Development Environment), включающая кросс-компилятор Си, автоматический генератор программ (CodeWizardAVR) и встроенный программатор. CodeVisionAVR (или для краткости CVAVR) предназначен для разработки программ микроконтроллеров семейства AVR фирмы Atmel.
CodeVisionAVR обеспечивает выполнение почти всех элементов языка Си, которые разрешены архитектурой микроконтроллеров AVR, с некоторыми добавленными элементами, которые реализуют преимущество специфики архитектуры AVR.
Запустить CVAVR можно нажатием на кнопку мыши, поместив курсор на ярлык CVAVR на рабочем столе компьютера. После запуска программы вы увидите на экране рабочий стол среды, который имеет следующие компоненты:
1) Главное текстовое меню.
2) Графическое меню.
3) Рабочая область, в которой размещаются открытые окна с файлами, диалогами или другой информацией.
4) Линейка состояния, отображающая текущую настройку системы.
Наберите текст программы с именем count.c в окне редактора. В качестве микроконтроллера выбран ATmega16 с четырьмя портами ввода/вывода, которые обозначаются: PORTA, PORTB, PORTC, PORTD. Программа будет просто увеличивать в бесконечном цикле число на 1 и выводить его в порт В.
count.c – программа вывода содержимого счетчика в порт В
#include<mega16.h> // заголовочный файл для МК ATmega16
unsigned char count; // переменная count – беззнаковое однобайтное
// целое число
void main(void)
{
DDRB = 0xFF; // настроить порт В на вывод
PORTB = 0; // вывести нули в порт В
count = 1;
while(1) // бесконечный цикл вывода в порт В
{
PORTB = count; // вывести значение count в порт В
count++; // инкремент содержимого count
}
Для выполнения программы выберите меню Debug. В раскрывшемся списке будут отображены виды команд, которые можно использовать при отладке. Для последовательного пошагового выполнения операторов программы удобно использовать команду Step Intoили «горячую» клавишу F11. Щелкните по строке Step Into. Желтая стрелка в окне программы count.c переместится на следующий оператор, и будет выполнении оператор
DDRB = 0xFF;
25) Программирование в CodeVisionAVR типовых функций управления и контроля: вывод информации в порт, управление отдельными разрядами портов, опрос переключателя, реализация временных задержек.
Для облегчения разработчику написания программ устройств с микроконтроллерами семейства AVR в интегрированной среде CodeVisionAVR имеется специальное средство, называемое Автоматическим генератором программ - CodeWizardAVR.
CodeWizardAVRпозволяет по заданию разработчика сгенерировать весь необходимый код для выполнения таких функций, как:
· сброс и исходная идентификация микроконтроллера;
· инициализация портов ввода/вывода;
· инициализация внешних прерываний;
· инициализация таймеров/счетчиков;
· инициализация сторожевого таймера Watchdog;
· инициализация UART (USART);
· инициализация аналогового компаратора;
· инициализация АЦП;
· инициализация интерфейсов SPI, I2C, 1-Wire;
· инициализация LCD- модуля.
При запуске Автоматического программного генератора на экране появится окно CodeWizardAVRс новым проектом, который по умолчанию будет назван untitled.cwp.
В верхней части окна находится строка меню, а под ней строка панели инструментов. Строка меню позволяет выбрать команды из различных меню.
В левой части окна CodeWizardAVRнаходится набор различных закладок. Закладки позволяют выбрать и задать соответствующие опции того или иного периферийного устройства. В соответствии с этими настройками CodeWizardAVRсгенерирует соответствующий код.
В правой части экрана располагается окно Program Preview(предварительного просмотра программы), которое позволяет просмотреть код, сгенерированный CodeWizardAVR.
3.1.3. В окне CodeWizardAVRна закладке Chip(Чип) выберите микроконтроллер ATmega16 и установите тактовую частоту 8,000000 МГц. Остальные настройки на этой закладке оставьте без изменения.
Далее перейдите на закладку Ports(Порты). На закладке Port B(Порт В) сконфигурируйте 1-й бит порта (Bit 1) как вход (In). Установите подтягивающий резистор на этом входе, что обозначается буквой P для этого бита. Остальные биты порта В оставьте без изменения, так как они не используются в данном примере.
На закладке Port D(Порт D) сконфигурируйте 1-й бит порта (Bit 1) как выход (Out). Установите на его выходе начальное значение 1. Это необходимо, чтобы после запуска программы на 1-й линии порта D был высокий уровень, поэтому диод VD1 светиться не будет. Остальные биты порта D можно оставить без изменения.
Остальные периферийные устройства в данном проекте не участвуют, поэтому оставьте их установленными по умолчанию.
3.1.4. Теперь все готово для генерации кода. С этой целью выберите пункт меню Program. В раскрывшемся списке уберите «галочку» со строки “Generate Code for Disabled Peripherals” (Генерировать код для неиспользованной периферии). Это сделает программу более компактной и удобной для анализа. Затем выберите из списка команду Generate, Save and Exit(Генерировать, сохранить и выйти) и щелкните мышью.
После выбора этой команды появится окно Save C Compiler Source File(сохранить исходный файл компилятора Си), в котором нужно будет выбрать папку для сохранения проекта. С этой целью выберите папку AVR и раскройте ее. Затем щелкните в окне правой кнопкой мыши, из выпадающего списка выберите пункт меню Создать > Папку и щелкните левой кнопкой. Вместо текста «Новая папка» введите имя Led_sb (Светодиод_кнопка) папки, где будут храниться все файлы разрабатываемого проекта. Далее щелкните два раза левой кнопкой мыши, чтобы раскрыть новую папку Led_sb.
В поле Имя файлавведите имя исходного файла с расширением .c, например, led_sb.c и щелкните по кнопке Сохранить.
Затем на экране появится окно Save C Compiler Project File(Сохранить файл проекта компилятора Си). В поле Имя файлавведите имя файла проекта с расширением .prj (led_sb.prj) и щелкните по кнопке Сохранить.
И, наконец, на экране появится окно Save untitled.cwp As(Сохранить … Как). В поле Имя файлавведите имя файла проекта CodeWizardAVRс расширением .cwp (led_sb.cwp) и щелкните по кнопке Сохранить.
После этого CodeWizardAVRоткроет окно исходного файла со сгенерированным кодом.
3.1.5. Просмотрите весь текст кода в окне. Анализ текста показывает, что CodeWizardAVRсгенерировал своеобразную заготовку программы, в которой выполнено подключение заголовочного файла выбранного микроконтроллера, а периферийные устройства используемого микроконтроллера сконфигурированы в соответствии с настройками пользователя на соответствующих закладках в окне CodeWizardAVR.
CodeWizardAVRобильно снабжает сгенерированный код соответствующими комментариями, подробно описывая, как сконфигурировано то или иное периферийное устройство. Кроме того, CodeWizardAVRподсказывает разработчику, где следует поместить объявление глобальных и локальных переменных, код, который должен выполняться программой обработки прерывания, код основной программы и т. д.
В рассматриваемом примере МКУ требуется, чтобы при разомкнутом контакте кнопки SB1 диод VD1 не горел, а при замкнутом – горел. Диод будет гореть, если на 1-м выводе порта D будет низкий уровень (логический 0). Если на этом выводе будет высокий уровень (логическая 1), то диод не горит. При разомкнутом контакте кнопки SB1 на 1-м входе порта В будет высокий уровень (логическая 1), а при замкнутом – низкий уровень (логический 0). Поэтому можно для вывода в 1-й разряд порта D использовать сигнал на 1-м входе порта В, и записать это на языке Си следующим образом:
PORTD.1 = PINB.1;
Эту строку необходимо вставить в бесконечный цикл while(1), расположенный в конце программы, в то место, куда CodeWizardAVRуказывает с помощью строки комментария “// Place your code here “ (Поместите свой код сюда).
3.1.6. Наберите в окне редактора строку требуемого кода в цикле while(1):
………………………….
while(1)
{
// Place your code here
PORTD.1 = PINB.1;
}
…………………………..
26. Интерфейс CAN: общее описание и основные параметры, виды и форматы сообщений в CAN.
Интерфейс CAN (Controller Area Network – буквально, сеть контроллеров) был разработан в конце 80-х годов фирмой Bosch для связи электронных устройств, применяемых в автомобилях.
Общее описание CAN.Сеть предназначена для коммуникации так называемых узлов, которые могут быть приемниками или передатчиками. Каждый узел состоит из двух составляющих: CAN-контроллера и приемопередатчика (трансивера). Контроллер реализует протокол обмена по сети CAN, а трансивер обеспечивает взаимодействие с сетью (передачу и прием сигналов).
На практике, согласно стандарту шина CAN обычно представляет собой витую пару, по которой передаются сигналы дифференциальным методом.
На рис. приведена структура CAN-сети. Обычно в качестве контроллера используется микроконтроллер, имеющий CAN-модуль, который имеет выход передатчика TxD последовательного кода и вход приемника RxD кода. Трансивер преобразует логические сигналы, то есть логические 0 и 1, в дифференциальное напряжение, поступающее на два провода шины, обозначенные CAN_H и CAN_L. Согласно стандарту линия должна иметь волновое сопротивление в пределах 108-132 Ом. Для уменьшения отражений сигналов на каждом конце шины должны быть подключены согласующие резисторы RС сопротивлением 120 Ом. Для повышения надежности передачи и повышения помехоустойчивости иногда используют третий провод – общий, обозначаемый как GND. Питающее напряжение UCC (или UDD) по стандарту равно +5 В относительно GND.
Для абстрагирования от физической среды передачи спецификация CAN определяет два логических состояния (то есть логические 0 и 1) как рецессивное (recessive) и доминантное (dominant). При этом предполагается, что при передаче одним узлом сети рецессивного бита, а другим доминантного, принят будет доминантный бит.
В рецессивном состоянии (то есть логическая 1 на входе TxD трансивера) дифференциальное напряжение UDIFF =UCANH – UCANL меньше минимального порога (0,5 В на входе приемника или 0,05 В на выходе передатчика).
В доминантном состоянии (то есть логический 0 на входе TxD трансивера) дифференциальное напряжение UDIFF больше минимального порога (0,9 В на входе приемника или 1,5 В на выходе передатчика).
Сообщения в CAN.Интерфейс использует короткие сообщения: максимальный размер – 94 бита. Содержимое данных в CAN-сообщении как бы неявно определяет адрес источника этого сообщения и адреса приемников, кому эта информация необходима. Например. один CAN-узел выдает на шину сообщение «Температура масла двигателя 80». Все другие узлы принимают это сообщение, но используют эту информацию только те узлы, кому она необходима.
Сообщения, передаваемые по CAN-шине, именуются кадрами или фреймами. В зависимости от инициатора передачи и ее цели существуют 4 типа кадров:
1) кадр данных (Data Frame), используется для передачи данных; (2) кадр запроса данных (Remote Frame), используется для дистанционного запроса данных от удаленного узла;
(3) кадр ошибки (Error Frame), когда обнаруживаются ошибки на шине; (4) кадр перегрузки (Overload Frame), передается для задержки передачи пакетов Data Frame и Remote Frame, например, при неготовности приемника.
Вид стандартного формата сообщения Data Frame приведен на рис. Он состоит из семи различных битовых полей:
Поле начала кадра (Start of Frame – SOF) состоит из одного доминантного бита, который служит также для синхронизации генераторов приемников и передатчика.
Поле арбитража (Arbitration Field) содержит 11-битный идентификатор ID и бит RTR – (запрос передачи данных). Для кадра данных этот бит должен иметь доминантный уровень.
Управляющее поле (Control Field) состоит из шести битов. Два самых старших бита в настоящее время не используются. Четырехбитный код длины данных указывает число байтов в поле данных.
Поле данных (Data Field) содержит от нуля до восьми байтов данных.
Поле контрольной суммы (CRC Field) включает в себя контрольную сумму сообщения (15 бит) и бит-разделитель рецессивного уровня.
Поле подтверждения (ACK Field) состоит из двух битов. Старший бит с именем Slot выставляет передающий узел рецессивного уровня. В случае, когда передача прошла успешно, приемный узел сигнализирует об этом установкой этого бита в доминантный уровень. Второй бит в этом поле является битом-разделителем рецессивного уровня.
Поле конца кадра (EOF – End of Frame) состоит из семи битов рецессивного уровня.
После конца кадра (EOF) следует поле промежутка (Intermission Field), состоящее из трех битов рецессивного уровня. После этого промежутка шина считается свободной.
27. Интерфейс CAN: арбитраж, обнаружение и обработка ошибок, скорость передачи и длина сети.
Арбитраж в CAN.Сеть CAN работает в режиме CSMA . Это означает, что когда имеются данные для передачи, узел CAN «слушает» шину (C S – контроль несущей) и если шина свободна, переходит к передаче сообщения. Множественный доступ (M A) заключается в том, что любой CAN-узел, определив, что шина свободна, может начать передачу своего сообщения. При этом два и более узла, определив, что шина свободна, могут начать передавать свои кадры. Это ведет к конфликтной ситуации на шине. В широко распространенной компьютерной локальной сети Ethernet при столкновении передающие узлы обнаруживают такую ситуацию и прекращают передачу, чтобы позже попытаться снова передать свои сообщения. Это ведет к потере времени и уменьшению пропускной способности сети. CAN такую ситуацию решает по-другому. Когда происходит конфликтная ситуация при обращении к шине, CAN определяет победителя на основе побитного арбитража содержимого поля, то есть идентификаторов. Побеждает узел с наивысшим приоритетом, то есть имеющий идентификатор с наименьшим числовым значением. Только победивший узел продолжает передачу данных, остальные попытаются передать свои сообщения позже. Такой метод определения победителя называется арбитраж столкновений. Данный метод арбитража обеспечивается тем, что все CAN-узлы подключены к шине по схеме «монтажное И», где узел, выставляющий на шину «0» - доминантный уровень, подавляет «1» - рецессивный уровень, выставленный другим узлом. Кроме того, в процессе арбитража при передаче идентификатора узел проверяет действительное состояние шины и сравнивает его с передаваемым значением. Если при передаче логической 1 с шины принимается доминантный бит (логический 0), то считается, что другой узел передает сообщение с более высоким приоритетом и данный узел прекращает передачу.
Обнаружение и обработка ошибок.CAN протокол имеет мощные средства обнаружения ошибок. В CAN реализовано 5 механизмов проверки на наличие ошибок. Все они реализованы аппаратным способом.
Ошибка контрольной суммы (CRC Error). 15-разрядное значение кода CRC рассчитывается узлом передачи во время формирования сообщения. Все узлы сети принимают это сообщение, вычисляют CRC и сравнивают его с принятым значением. При несовпадении контрольных сумм сообщение считается ошибочным. Если хотя бы один узел не примет данные должным образом, будет сформировано сообщение об ошибке.
Ошибка подтверждения (Acknowledgement Error). В поле подтверждения ACK Field передающий узел проверяет наличие доминантного бита (логического 0). Если хотя бы один узел принял сообщение правильно, то доминантный бит будет сформирован в поле подтверждения. Если был получен рецессивный бит (логическая 1), значит ни одно устройство не приняло сообщение, и передающий узел регистрирует ошибку подтверждения.
Ошибка формата (Form Error). Все CAN узлы проверяют соответствие структуры принимаемого сообщения его фиксированному формату и его размеру. Если формат сообщения нарушен, то узлы генерируют ошибку формата.
Ошибка бита (Bit Error). Каждый узел во время передачи битов в сеть сравнивает значение передаваемого им бита со значением бита, которое появляется на шине. Если эти значения не совпадают, то узел генерирует ошибку бита. Естественно, что во время арбитража на шине этот механизм проверки ошибок отключается.
Ошибка битстаффинга (Stuff Error). При передаче сообщения в CAN работает механизм битстаффинга – вставка дополнительного бита после пяти подряд идущих бит с одинаковым значением. Принимающий узел этот дополнительный бит удаляет. Если приемник обнаруживает на шине больше 5 последовательных бит с одинаковым значением, то он генерирует ошибку битстаффинга.
Каждый узел CAN имеет два счетчика ошибок:
1) счетчик ошибок при передаче (TEC); (2) счетчик ошибок при приеме (REC).
Каждый узел сети CAN может находиться в одном из трех состояний:
1) активной ошибки ; (2) пассивной ошибки; (3) отключен от шины .
Состояние активной ошибки. Когда узел только начинает работу в сети CAN, он находится в состоянии активной ошибки. Узел может принимать активное участие в передаче данных. В случае обнаружения ошибки на шине он передает в сеть флаг. Этот флаг состоит из 6 последовательных доминантных бит, поэтому все узлы его регистрируют. Узел находится в состоянии активной ошибки, пока содержимое любого из счетчиков не превышает предела 127. Состояние активной ошибки – нормальный режим работы узла с возможностью принимать и передавать данные без ограничений.
Состояние пассивной ошибки. Узел приходит в это состояние, когда содержимое одного из счетчиков ошибок превышает значение 127. Узлу в этом состоянии запрещается передавать активное сообщение об ошибке, но вместо этого он передает в сеть флаг. Этот флаг состоит из 6-ти рецессивных битов, поэтому остальные узлы сети его не замечают, а он производит только увеличение счетчика ошибок данного узла.
Состояние – отключение от шины. Узел переходит в это состояние, когда содержимое хотя бы одного из двух счетчиков превышает предел 255. В этом состоянии узел не может передавать или принимать сообщения, выдавать подтверждение или формировать сообщение об ошибке.
Скорость передачи и длина сети.Спецификация CAN исходит из предположения, что все узлы принимают сигналы с шины одновременно, то есть в одно и то же время один и тот же бит принимается всеми узлами в сети. С одной стороны такое положение вещей делает возможным побитовый арбитраж, а с другой стороны ограничивает длину сети. Каждый узел, вовлеченный в арбитраж, должен быть способен осуществлять выборку каждого бита в пределах одного и того же интервала передачи бита. Обычно выборка производится примерно в середине интервала передачи бита. При передаче и приеме сигналов по шине неизбежно появляется задержка распространения tDEL, которая определяется как сумма времени прохождения сигнала по шине tBUS, выходной задержки передатчика tTRANSM и входной задержки приемника tRECEIVE. Очевидно, что с увеличением скорости передачи интервал передачи бита сокращается, а это может привести к ошибочной выборке действительного значения бита из-за влияния задержки распространения.
Стандарт ISO 11898 определяет, что при максимальной скорости передачи 1 Мбит/с длина кабеля шины CAN не должна превышать 40 метров. При использовании гальванической развязки максимальная протяженность сети при скорости передачи 1 Мбит/с ограничена 9 метрами.
28. Понятия: микроконтроллерная система (МКС) и микроконтроллерное устройство (МКУ). Основные этапы разработки МКС.
Микроконтроллерное устройство (МКУ) – это функционально и конструктивно законченное изделие, представляющее собой схемно-конструктивное соединение нескольких микросхем, включая микроконтроллер, предназначенное для выполнения одной-двух из следующих функций: получение, обработка, передача информации и управление. МКУ функционирует, как правило, в составе какой-либо технической системы.
Микроконтроллерной системой (МКС) называется аналогичное изделие, реализующее весь набор указанных функций. МКС обычно выполняет функции управления некоторым объектом, она выдает управляющие воздействия на объект в соответствии с реализуемым законом управления.
Как видно из этих определений, разница между понятием МКС и МКУ очень условна и зависит, в основном, от набора выполняемых функций.
Термин микроконтроллерная система (МКС) является более общим, чем термин микроконтроллерное устройство (МКУ).