В последнее время я работаю над системой Z80 с 3 микросхемами расширения (74HC138), 1 микросхемой оперативной памяти, тактовой частотой 20 МГц и 40-контактным разъемом для подключения к внешним системам.
Однако при отладке Z80 с помощью ESP32 с использованием кода, который записывает 0b00000000
на шину данных, считывает адрес и печатает его на последовательном порту, он работает неправильно, адреса увеличиваются случайным образом, но при касании GND он увеличивается правильно. . Скорее всего что-то не так с заземлением платы.
ПРИМЕЧАНИЕ:
Код отладки 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 напрямую, пожалуйста.
Z80 не является однотактовым процессором. Пожалуйста, обратитесь к справочному руководству, чтобы узнать, как и когда Z80 считывает данные из памяти.
Вам нужно синхронизироваться по одному краю nMREQ
, чтобы увидеть, когда произойдет новый цикл памяти.
Чтобы правильно составить «программу» бесконечных NOP
, соблюдайте nRD
и nMREQ
. Только если они оба активны, что является низким, подавайте на шину данных данные. Однако в этой примитивной схеме можно обойтись статической шиной данных.
Это соответствующая временная диаграмма из Руководства пользователя процессора семейства Z80 прямо из Zilog:
Измените свой эскиз так, чтобы он читал линии до нарастающего фронта часов. Затем он должен получить адрес инструкции, когда увидит nMREQ
= low И nRD
= low в первый раз после того, как оба будут высокими. Это начало состояния часов T2. Обратите внимание, что начало состояния часов T3 имеет ту же схему.
Этого достаточно для вашего самого простого эксперимента. Для правильной выборки добавьте nM1
, который сигнализирует низким уровнем, что цикл памяти является первым циклом выборки кода операции. Как вы узнаете, разные инструкции имеют разное количество байтов. Инструкции с более чем одним байтом считывают дополнительные байты без активного nM1
, имейте это в виду.
Добро пожаловать в StackOverflow! Пожалуйста, посетите тур , чтобы узнать, как работает этот сайт, и прочитайте « Как спросить ». Затем вернитесь и отредактируйте свой вопрос, добавив важную информацию. Покажите пожалуйста проводку, желательно в виде схемы. Похоже, вы забыли соединить массы обеих систем (Z80 и ESP32). Кстати, это похоже на вопрос не по теме, который лучше задать SE/EE, поскольку речь идет не о программном обеспечении, а об аппаратном обеспечении. Будьте готовы, если из-за этого ваш вопрос будет закрыт.