ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
6 мая
1516533 Топик полностью
Бoмж (Сегодня, 11:28, просмотров: 25) ответил Бoмж на Нужно сделать без PEC. Если данные скорости в ответ на запросы по CAN станут корректными, значит PEC запрограммирован неправильно.
Вот пример от Грока: 
#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) {
// Основной цикл свободен для других задач
}
}
  1. Инициализация АЦП:
    • Функция init_adc настраивает АЦП для чтения данных с датчика скорости через заданный канал.
  2. Инициализация CAN:
    • Функция init_can конфигурирует CAN-контроллер, создает объект для приема запросов (с идентификатором CAN_ID_REQUEST) и объект для отправки данных (с идентификатором CAN_ID_RESPONSE).
  3. Настройка PEC:
    • Функция init_pec задает автоматическую передачу данных из регистра АЦП (ADC_DAT) в буфер CAN-сообщения при получении запроса через CAN.
  4. Основной цикл:
    • После инициализации PEC работает автономно, освобождая ЦПУ для других задач.

Этот код минимизирует нагрузку на процессор, так как PEC самостоятельно обрабатывает передачу данных по запросу из CAN-Bus.

memento mori