Доброго времени суток.
Ранее я уже поднимал тему по поводу создания коммутатора множества электромагнитных реле (56 штук). После каждой коммутации с определенной задержкой мы смотрим на замыкающие или замыкающие контакты - если после этой задержки напряжение всё ещё есть на контактах, значит контакт бракованный (не придирайтесь к деталям - описываю в общем виде).
Все эти данные от нормально замкнутых контактов собираются на одном блоке параллельных регристров, от нормально разомкнутых контактов на другом блоке. Затем эти параллельные регистры очень быстро тактируются 56 раз и заносм данные о контакте в массив
int temp[56]
Если контакт реле под номером x бракованный, значит temp[x]=0. В суперцикле проверяем - дошло ли тактирование параллельных регистров до цифры 56 и потом отправляем по UART данные о бракованных реле
Код довольно долго медленный в плане произвожительности, и на частоте выше 10 Гц (максимум 50 Гц) данные по уарту уже не успевают отправляться. Реально ли как то оптимизировать этот алгоритм?
Раздел: AVR
Ранее я уже поднимал тему по поводу создания коммутатора множества электромагнитных реле (56 штук). После каждой коммутации с определенной задержкой мы смотрим на замыкающие или замыкающие контакты - если после этой задержки напряжение всё ещё есть на контактах, значит контакт бракованный (не придирайтесь к деталям - описываю в общем виде).
Все эти данные от нормально замкнутых контактов собираются на одном блоке параллельных регристров, от нормально разомкнутых контактов на другом блоке. Затем эти параллельные регистры очень быстро тактируются 56 раз и заносм данные о контакте в массив
int temp[56]
Если контакт реле под номером x бракованный, значит temp[x]=0. В суперцикле проверяем - дошло ли тактирование параллельных регистров до цифры 56 и потом отправляем по UART данные о бракованных реле
volatile tempch[10]; //для функции itoa
if (READYTOSEND) //флаг окончания тактирования параллельных регистров
{
for (int i=0; i< 56; i++)
{
if (!temp[i]) //если реле бракованное - то temp[i]=0
{
itoa(i, tempch,10);
if (flags & OPENEDCONTACTS) //если контакт нормально размокнутый - то посылаем идентификатор "O"
{
USART_SendStr("O");
USART_SendStr(tempch);
}
else
{
USART_SendStr("N"); //если контакт нормально замкнутый - то посылаем идентификатор "N"
USART_SendStr(tempch);
}
}
}
Код довольно долго медленный в плане произвожительности, и на частоте выше 10 Гц (максимум 50 Гц) данные по уарту уже не успевают отправляться. Реально ли как то оптимизировать этот алгоритм?
Раздел: AVR