Устранена зависимость дискретов СИФУ от основного цикла в 166
Фронты START/STOP обрабатываются при принятии командного слова CAN/RS, а окончание импульса обслуживается таймером. STOP имеет приоритет, перекрытие выходов исключено, сохранена защита от самопуска при включении. Загрузка параметров больше не подменяет живые команды нагрузки. Добавлены подробные русские комментарии во все собственные C-модули и основные заголовки, описание поведения и host-тест автомата. Обновлены файлы прошивки. Полная сборка TI 22.6.1.LTS и тесты пройдены; проверка на физической плате не выполнялась.
This commit is contained in:
+23
-3
@@ -1,3 +1,9 @@
|
||||
/* Команды и телеметрия eCAN. MBOX1 принимает кадры, MBOX0 передаёт
|
||||
* технологические регистры, MBOX2 выделен под ответы логгера.
|
||||
* Слово 127 проходит UMP_commands_write непосредственно в CAN ISR.
|
||||
* Запрос архива ISR лишь ставит на обслуживание; фрагментация
|
||||
* ответов выполняется UMP_CAN_service из фонового цикла.
|
||||
*/
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
#include "DSP2833x_SWPrioritizedIsrLevels.h"
|
||||
|
||||
@@ -13,6 +19,7 @@
|
||||
#include "peripher.h"
|
||||
#include "log_to_mem.h"
|
||||
#include "ump_can_protocol.h"
|
||||
#include "DAC.h"
|
||||
|
||||
|
||||
// Prototype statements for functions found within this file.
|
||||
@@ -162,6 +169,9 @@ void InitCan(int Port, int DevNum)
|
||||
MessageTransivedCount=0;
|
||||
}
|
||||
|
||||
/* При занятом MBOX0 возвращается без ожидания ACK в цикле.
|
||||
* Это отличается от блокирующих UART/EEPROM операций main.
|
||||
*/
|
||||
void CAN_send(int Port, int data[], int Addr)
|
||||
{
|
||||
unsigned long hiword,loword;
|
||||
@@ -234,9 +244,19 @@ void Handlai(volatile struct ECAN_MBOXES * ECanMboxes)
|
||||
Data[1] = (loword>>16) & 0xffff;
|
||||
Data[2] = (loword ) & 0xffff;
|
||||
|
||||
if(bit[0]) if(adr < ANSWER_LEN) modbus[adr] = Data[0]; adr++;
|
||||
if(bit[1]) if(adr < ANSWER_LEN) modbus[adr] = Data[1]; adr++;
|
||||
if(bit[2]) if(adr < ANSWER_LEN) modbus[adr] = Data[2];
|
||||
/* Каждое разрешённое слово имеет собственный адрес. Не опрашиваем
|
||||
* Commands после кадра безусловно: пакет телеметрии не должен
|
||||
* превращать внутренний сброс параметров в командный фронт.
|
||||
* Адрес 127 проходит через единый обработчик полного слова. */
|
||||
{
|
||||
unsigned int i;
|
||||
for (i = 0; i < 3; i++, adr++) {
|
||||
if (bit[i] && adr < ANSWER_LEN) {
|
||||
if (adr == 127) UMP_commands_write((unsigned int)Data[i]);
|
||||
else modbus[adr] = Data[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Ôèêñèðóåì ïðèìåí¸ííóþ êîìàíäó äî âûõîäà èç îáðàáîò÷èêà CAN. */
|
||||
ump_log_can((unsigned int)(hiword >> 16), Data[0], Data[1], Data[2]);
|
||||
|
||||
Reference in New Issue
Block a user