Я использую защелки LS374, и у меня их две. Я захватил данные, которые поступают в защелку и выводятся из защелки по тактовому сигналу. Данные логического анализатора, поступающие на защелки и выходящие на них, я записал в текстовый файл. Я написал небольшую программу на C++, которая проверяет, работает ли защелка или нет. вот мой пример кода обработки, IOWR — это тактовый сигнал для LS374
Проблема в том, что я получаю некоторые временные интервалы с неправильной фиксацией, как показано на рисунке. правильный ли мой подход к проверке данных?
MVP:
#include <iostream>
#include <iomanip>
#include <vector>
#include <sstream>
#include <fstream>
#include <string>
using namespace std;
struct Data {
double time;
int latchA1, latchCS1, latchCS2;
int D0, D1, D2, D3;
int IOWR;
int MPC_A1, MPC_CS1, MPC_CS2;
int MPC_D0, MPC_D1, MPC_D2, MPC_D3;
};
// Function to load data from a text file
vector<Data> loadData(const string& filename) {
vector<Data> dataList;
ifstream file(filename);
if (!file.is_open()) {
cerr << "Error opening file." << endl;
return dataList;
}
string line;
while (getline(file, line)) {
stringstream ss(line);
Data data;
char comma;
ss >> data.time >> comma
>> data.latchA1 >> comma
>> data.latchCS1 >> comma
>> data.latchCS2 >> comma
>> data.D0 >> comma
>> data.D1 >> comma
>> data.D2 >> comma
>> data.D3 >> comma
>> data.IOWR >> comma
>> data.MPC_A1 >> comma
>> data.MPC_CS1 >> comma
>> data.MPC_CS2 >> comma
>> data.MPC_D0 >> comma
>> data.MPC_D1 >> comma
>> data.MPC_D2 >> comma
>> data.MPC_D3;
dataList.push_back(data);
}
file.close();
return dataList;
}
// Function to combine Qs (Latch Outputs) into a single hex value
string combineQsToHex(const Data& data) {
// Combine Latch outputs into an 8-bit value
int latchOutput = (data.latchA1 << 6) | (data.latchCS1 << 5) | (data.latchCS2 << 4) | (data.D0 << 3) | (data.D1 << 2) | (data.D2 << 1) | data.D3;
stringstream ss;
ss << hex << setw(2) << setfill('0') << latchOutput;
return ss.str();
}
// Function to combine Ds (MPC Inputs) into a single hex value
string combineDsToHex(const Data& data) {
// Combine MPC inputs into an 8-bit value
int mpcInput = (data.MPC_A1 << 6) | (data.MPC_CS1 << 5) | (data.MPC_CS2 << 4) | (data.MPC_D0 << 3) | (data.MPC_D1 << 2) | (data.MPC_D2 << 1) | data.MPC_D3;
stringstream ss;
ss << hex << setw(2) << setfill('0') << mpcInput;
return ss.str();
}
// Function to print hex data
void printHexData(const Data& data) {
cout << "Time: " << fixed << setprecision(10) << data.time << "s\t";
cout << "Latch Output (Hex): 0x" << combineQsToHex(data) << "\t";
cout << "MPC Input (Hex): 0x" << combineDsToHex(data) << endl;
}
// Function to process latch data
void processLatchData(const vector<Data>& dataList) {
bool lastIOWRWas1 = false;
bool transitionDetected = false;
for (const auto& data : dataList) {
if (data.IOWR == 0 && lastIOWRWas1 && !transitionDetected) {
// Detected transition from 1 to 0
transitionDetected = true;
}
else if (data.IOWR == 1 && transitionDetected) {
// Detected transition from 0 to 1
string latchHex = combineQsToHex(data);
string mpcHex = combineDsToHex(data);
if (latchHex == mpcHex) {
printHexData(data);
}
else {
cout << "Incorrect latch at time: " << fixed << setprecision(10) << data.time << "s" << endl;
printHexData(data);
}
transitionDetected = false; // Reset the transition detection flag
}
lastIOWRWas1 = (data.IOWR == 1);
}
}
int main() {
string filename = "data.txt"; // Specify your filename here
vector<Data> dataList = loadData(filename);
if (dataList.empty()) {
cerr << "No data to process." << endl;
return 1;
}
processLatchData(dataList);
return 0;
}
Образец файла данных:
https://www.mediafire.com/file/7uwi4ur1d6iosn5/30.07.2024+without+internal+lcd2.rar/file
Согласно таблице данных Qn действителен и стабилен, когда /OC и CLK низкие. Непонятно, какой сигнал вы используете для /OC, но вы читаете данные Q, когда CLK высокий, что явно неверно.
Вам необходимо получить данные D на CLK 0->1 и данные Q на CLK 1->0.
Захватывая Q на нарастающем тактовом сигнале, вы находитесь в состоянии гонки за распространение устройства, зависящей от асинхронной выборки логического анализатора. Время распространения D до Q по фронту тактовой частоты составляет от 15 до 28 наносекунд, поэтому считывание Q по фронту тактовой частоты не будет работать надежно.
Обозначение восходящей стрелки указывает, что эта строка таблицы истинности становится применимой, когда измененный сигнал изменяется, как указано, и будет оставаться применимой до тех пор, пока не будет применена какая-либо другая строка. Обратите внимание, что в зависимости от состояния D на нарастающем фронте Clk может быть применима либо первая, либо вторая строка таблицы истинности. Однако таблица является неполной, поскольку она не описывает тот факт, что нарастающий фронт CLK, когда /OC высокий, захватывает состояние D в Q0 и выводит это состояние /OC становится низким до следующего нарастающего фронта Clk. .
@supercat Я не уверен, на кого нацелен ваш комментарий и добавляете ли вы информацию или оспариваете ответ. Дело в том, что код не работает и не читает защелку, он обрабатывает выборочные данные логического анализатора. Хотя это правда, что Q переходит в состояние D при возрастании CLK, это требует времени, и выборка логического анализатора может произойти, а может и не произойти после этого времени. Помимо того, что поведение защелки или логического анализатора не по теме, правильность кода, анализирующего захват, является вопросом по теме.
@supercat, ваше последнее замечание о повышении высокого уровня CLK при низком уровне /OC верно, но академически - это было бы ошибкой проектирования при обычном использовании в качестве адресуемой защелки. При использовании сигналов шины MCU это было бы сложно сделать.
@Клиффорд не просто академик... это важно для того, что Ахмед стремится сделать (чтение LATCH с помощью STM32 и декодирование захваченного материала в изображение), что означает, что необходима небольшая задержка внутри нарастающего фронта /CLK ISR... однако он все еще сталкивается с проблемами с электричеством, поскольку собранные данные показывают, что ЗАЩЕЛКИ работают только какое-то время, а потом вообще не работают ... проблема в том, что у него низкие знания в области ЭЭ, а это сигнал 16-32 МГц, который вызывает множество проблем с УКВ ( с которыми я недостаточно знаком, чтобы помочь больше, чем просто догадки, пробы и ошибки)
@Spektre нет, он этого не делает, он обрабатывает захват логического анализатора. Это было бы актуально, если бы он ставил под сомнение конструкцию аппаратного обеспечения. Код анализа является предметом вопроса, и он не считывает данные Q при правильном переходе. Я понятия не имею, как вы определили, что здесь замешан STM32. Сигнал IOWR предполагает другое, поскольку STM32 не имеет шины ввода-вывода, отдельной от шины памяти. Информация о времени приведена в другом месте таблицы данных, но не имеет отношения к вопросу.
@Клиффорд, это всего лишь небольшая проблема, связанная с выполнением его задачи. Многие важные сведения содержатся в последующих вопросах и чатах ОП, который вы, вероятно, еще не видели ... поскольку ОП не размещал здесь ссылки.
Не используйте сторонние ссылки, не используйте ссылки, которые ни в коем случае не работают, не размещайте картинки текста. Здесь нет встроенного кода. Почему тег? Поскольку речь идет о непрограммируемом электронном устройстве, лучше задавать на сайте electronics.stackexchange.com .