Вот пример от Грока:
memento mori
#include <reg167.h> // Заголовочный файл для C167
// Определение констант
#define ADC_CHANNEL 0 // Канал АЦП для датчика скорости
#define CAN_ID_REQUEST 0x100 // Идентификатор CAN для запроса
#define CAN_ID_RESPONSE 0x101 // Идентификатор CAN для ответа
// Инициализация АЦП
void init_adc() {
ADC_CON = 0x0000; // Сброс настроек АЦП
ADC_CON |= (1 << 5); // Включение АЦП
ADC_CON |= (ADC_CHANNEL & 0x0F); // Выбор канала
}
// Инициализация CAN
void init_can() {
CAN_CON = 0x41; // Инициализация CAN-контроллера
// Настройка объекта для приема запросов
CAN_OBJ[0].MCR = 0x5555; // Маска для приема
CAN_OBJ[0].AR = CAN_ID_REQUEST; // Идентификатор запроса
CAN_OBJ[0].MOFCR = 0x0008; // Режим приема
// Настройка объекта для отправки данных
CAN_OBJ[1].AR = CAN_ID_RESPONSE; // Идентификатор ответа
CAN_OBJ[1].MOFCR = 0x0000; // Режим отправки
}
// Настройка PEC
void init_pec() {
PECSRC0 = (unsigned int)&ADC_DAT; // Источник: данные АЦП
PECDST0 = (unsigned int)&CAN_OBJ[1].DATA[0]; // Назначение: данные CAN
PECC0 = 0x0001; // Передача 1 слова
SRCP0 = (unsigned int)&CAN_OBJ[0].MOFCR; // Срабатывание по приему запроса
PECPTR0 = (unsigned int)&PECC0; // Указатель на настройки PEC
}
// Основная функция
void main() {
init_adc(); // Инициализация АЦП
init_can(); // Инициализация CAN
init_pec(); // Инициализация PEC
while (1) {
// Основной цикл свободен для других задач
}
}
- Инициализация АЦП:
- Функция init_adc настраивает АЦП для чтения данных с датчика скорости через заданный канал.
- Инициализация CAN:
- Функция init_can конфигурирует CAN-контроллер, создает объект для приема запросов (с идентификатором CAN_ID_REQUEST) и объект для отправки данных (с идентификатором CAN_ID_RESPONSE).
- Настройка PEC:
- Функция init_pec задает автоматическую передачу данных из регистра АЦП (ADC_DAT) в буфер CAN-сообщения при получении запроса через CAN.
- Основной цикл:
- После инициализации PEC работает автономно, освобождая ЦПУ для других задач.
Этот код минимизирует нагрузку на процессор, так как PEC самостоятельно обрабатывает передачу данных по запросу из CAN-Bus.