Устранение неполадок с заземлением в системе Z80

В последнее время я работаю над системой Z80 с 3 микросхемами расширения (74HC138), 1 микросхемой оперативной памяти, тактовой частотой 20 МГц и 40-контактным разъемом для подключения к внешним системам.

Однако при отладке Z80 с помощью ESP32 с использованием кода, который записывает 0b00000000 на шину данных, считывает адрес и печатает его на последовательном порту, он работает неправильно, адреса увеличиваются случайным образом, но при касании GND он увеличивается правильно. . Скорее всего что-то не так с заземлением платы.

ПРИМЕЧАНИЕ:

  1. На плате имеется ручной «переключатель» часов, позволяющий переключаться между внутренними часами (20 МГц) и внешними часами (внешняя система = ESP32).
  2. Плата была спаяна тонкими эмалированными медными проводами.

Устранение неполадок с заземлением в системе Z80

Устранение неполадок с заземлением в системе Z80

Код отладки ESP32

#include <Arduino.h>

int pinAddress[] = {17, 5, 18, 19};
int pinData[] = {13, 12, 14, 27, 26, 25, 33, 32};
int pinClock = 16;

void writeData(byte data)
{
  for (int i = 0; i < sizeof(pinData) / sizeof(pinData[0]); i++)
  {
    digitalWrite(pinData[i], (data << i) & 1);
  }
}

byte readAddress()
{
  byte addr;
  for (int i = 0; i < sizeof(pinAddresss) / sizeof(pinAddresss[0]); i++)
  {
    addr |= digitalRead(pinAddresss[i]) << i;
  }

  return addr;
}

void setup()
{
  Serial.begin(115200);
  pinMode(pinClock, OUTPUT);

  for (int i = 0; i < sizeof(pinAddresss) / sizeof(pinAddresss[0]); i++)
  {
    pinMode(pinAddresss[i], INPUT);
  }

  for (int i = 0; i < sizeof(pinData) / sizeof(pinData[0]); i++)
  {
    pinMode(pinData[i], OUTPUT);
  }

  writeData(0x00);
}

void loop()
{
  digitalWrite(pinClock, HIGH);
  delay(250);
  digitalWrite(pinClock, LOW);
  delay(250);

  Serial.println("Address: 0b" + String(readAddress(), BIN));
}

Выход ESP32

Address: 0b1111
Address: 0b1111
Address: 0b1111
Address: 0b0
Address: 0b0
Address: 0b0
Address: 0b0
Address: 0b0
Address: 0b0
Address: 0b0
Address: 0b0
Address: 0b0
Address: 0b1
Address: 0b1
Address: 0b1
Address: 0b1
Address: 0b1
Address: 0b1
Address: 0b1
Address: 0b1
Address: 0b10
Address: 0b10
Address: 0b1
Address: 0b1
Address: 0b11
Address: 0b11
Address: 0b11
Address: 0b11
Address: 0b11
Address: 0b11
Address: 0b11
Address: 0b11
Address: 0b1100
Address: 0b1100
Address: 0b10
Address: 0b10
Address: 0b1101
Address: 0b1101
Address: 0b1101
Address: 0b1101
Address: 0b1101
Address: 0b1101
Address: 0b1101
Address: 0b1101
Address: 0b110
Address: 0b110
Address: 0b11
Address: 0b11
Address: 0b111
Address: 0b111
Address: 0b111
Address: 0b111
Address: 0b111
Address: 0b111
Address: 0b111
Address: 0b111
Address: 0b0
...

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

the busybee 07.04.2024 18:54
Стоит ли изучать 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
2
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Z80 не является однотактовым процессором. Пожалуйста, обратитесь к справочному руководству, чтобы узнать, как и когда Z80 считывает данные из памяти.

Вам нужно синхронизироваться по одному краю nMREQ, чтобы увидеть, когда произойдет новый цикл памяти.

Чтобы правильно составить «программу» бесконечных NOP, соблюдайте nRD и nMREQ. Только если они оба активны, что является низким, подавайте на шину данных данные. Однако в этой примитивной схеме можно обойтись статической шиной данных.

Полезные подробности

Это соответствующая временная диаграмма из Руководства пользователя процессора семейства Z80 прямо из Zilog:

Измените свой эскиз так, чтобы он читал линии до нарастающего фронта часов. Затем он должен получить адрес инструкции, когда увидит nMREQ = low И nRD = low в первый раз после того, как оба будут высокими. Это начало состояния часов T2. Обратите внимание, что начало состояния часов T3 имеет ту же схему.

Этого достаточно для вашего самого простого эксперимента. Для правильной выборки добавьте nM1, который сигнализирует низким уровнем, что цикл памяти является первым циклом выборки кода операции. Как вы узнаете, разные инструкции имеют разное количество байтов. Инструкции с более чем одним байтом считывают дополнительные байты без активного nM1, имейте это в виду.

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