Проверка данных Latch LS374

Я использую защелки 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

Не используйте сторонние ссылки, не используйте ссылки, которые ни в коем случае не работают, не размещайте картинки текста. Здесь нет встроенного кода. Почему тег? Поскольку речь идет о непрограммируемом электронном устройстве, лучше задавать на сайте electronics.stackexchange.com .

Clifford 31.07.2024 21:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно таблице данных 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 31.07.2024 21:59

@supercat Я не уверен, на кого нацелен ваш комментарий и добавляете ли вы информацию или оспариваете ответ. Дело в том, что код не работает и не читает защелку, он обрабатывает выборочные данные логического анализатора. Хотя это правда, что Q переходит в состояние D при возрастании CLK, это требует времени, и выборка логического анализатора может произойти, а может и не произойти после этого времени. Помимо того, что поведение защелки или логического анализатора не по теме, правильность кода, анализирующего захват, является вопросом по теме.

Clifford 31.07.2024 22:30

@supercat, ваше последнее замечание о повышении высокого уровня CLK при низком уровне /OC верно, но академически - это было бы ошибкой проектирования при обычном использовании в качестве адресуемой защелки. При использовании сигналов шины MCU это было бы сложно сделать.

Clifford 31.07.2024 22:39

@Клиффорд не просто академик... это важно для того, что Ахмед стремится сделать (чтение LATCH с помощью STM32 и декодирование захваченного материала в изображение), что означает, что необходима небольшая задержка внутри нарастающего фронта /CLK ISR... однако он все еще сталкивается с проблемами с электричеством, поскольку собранные данные показывают, что ЗАЩЕЛКИ работают только какое-то время, а потом вообще не работают ... проблема в том, что у него низкие знания в области ЭЭ, а это сигнал 16-32 МГц, который вызывает множество проблем с УКВ ( с которыми я недостаточно знаком, чтобы помочь больше, чем просто догадки, пробы и ошибки)

Spektre 01.08.2024 08:41

@Spektre нет, он этого не делает, он обрабатывает захват логического анализатора. Это было бы актуально, если бы он ставил под сомнение конструкцию аппаратного обеспечения. Код анализа является предметом вопроса, и он не считывает данные Q при правильном переходе. Я понятия не имею, как вы определили, что здесь замешан STM32. Сигнал IOWR предполагает другое, поскольку STM32 не имеет шины ввода-вывода, отдельной от шины памяти. Информация о времени приведена в другом месте таблицы данных, но не имеет отношения к вопросу.

Clifford 01.08.2024 08:53

@Клиффорд, это всего лишь небольшая проблема, связанная с выполнением его задачи. Многие важные сведения содержатся в последующих вопросах и чатах ОП, который вы, вероятно, еще не видели ... поскольку ОП не размещал здесь ссылки.

Spektre 01.08.2024 12:16

Другие вопросы по теме