Это то понятно, но чтобы хорошо совместить - нужно разобраться что там и куда вставлять, а на это нужно время...
Вид для печати
Я тут платку ZX FDD Emulator развел для себя, может кому-нибудь еще пригодится: https://github.com/andykarpov/zx-fdd-emulator-pcb/
https://github.com/andykarpov/zx-fdd...ocs/pcb_3d.png
- - - Добавлено - - -
Только разъем для micro SD карточки взял первый попавшийся в Eagle, это Molex 49225-0821, вероятно это не самый дешевый разъем :) К тому же он перевернутый, ну то есть карточка вставляется в него вверх ногами. Нужно поискать что-то попроще, есть может у кого что-то более-менее распространенное / китайское в виде библиотеки для Eagle? :)
UPD: Версию с разъемом molex перенес в отдельный бранч, текущая версия в master - с другим слотом для SD-карточки.
А может не разъём? Может модуль? В смысле сейчас цена модуля дешевле, чем цена разъёма.
Шаг выводов у них стандартный, цоколёвка правда бывает разной... но можно взять за основу которые подешевле или развести сразу под две модели (покупай любую и впаивай/приклеивай)
Модули все разные, размеры разные, распиновка тоже, в общем непонятно, универсального стандарта нет.
В репозитарий добавил новую версию платы, micro SD карточка другая, добавил 6-контактный разъем SPI для SD-модуля, но его все равно прийдется паять на проводках. Еще забыл 2 pull-up резистора на i2c шину, добавил в схему.
В любом случае - исходники платы открыты, можно брать и править под себя :)
Теоретически, если пожертвовать крепежными отверстиями, можно и полноразмерную SD-карточку приделать.
Приехали платки v1.0 и разъемы molex для sd-карточки, спаял первую ревизию платы.
Вложение 60534
Нашлось сразу много мелких косяков:
1) если в качестве разъема для дисковода использовать shrouded header - ему не хватает буквально полтора миллиметра, чтобы встать нормально, мешается 3.3v регулятор. пришлось сам разъем снизу немного подпилить надфилем в этом месте :)
2) такая же история с разъемом для ISP, обычные pin headers встают без проблем.UPD: все норм становится, если разъем для SD-карты паять первым :)
3) посадочное место под подстроечный резистор не соответствует расстоянию между выводами подстроечника, имеющегося в наличии. мелочь, а неприятно
4) отсутствие pull-up резисторов на i2c шине, пока хз, насколько это критично и будет ли работать на внутренних подтяжках atmega328UPD: не критично, хватает подтяжек на стороне атмеги.
5) порядок подключения дисплея к выводам pcf8574 отличается от порядка, принятого в китайских адаптерах
6) перемычки для выбора адреса pcf8574 не работают в открытом состоянии, потому что нет подтяжек. будет работать, только если все они замкнуты. соответственно, i2c адрес будет 0x20.
Завести текущую версию проекта пока полностью не получилось:
1) была попытка указать адрес и порядок пинов в LCDModule.h, но потом выяснилось, что в коде используется только LCDEX_ADDR, а остальные дефайны не используются, работа с i2c дисплеем захардкожена.
2) переписал LCDModule.h и LCDModule.cpp на использование библиотеки LiquidCrysyal_I2C, в конструктор которой можно передать в качестве аргументов порядок пинов
3) после чего было обнаружено, что текущая версия Arduino IDE 1.8.1 как-то не так интерпретирует main() - он просто не работает. пришлось int main() заменить на void loop() и добавить void setup().
4) после этого платка завелась, на экране отображается список файлов, по кнопке энкодера можно монтировать и отмонтировать образ
5) но сам энкодер не хочет работать по какой-то причине. после того, как его покрутить - все зависает намертво.
вот с этим пунктом, если можно - дайте, плз, совет. может энкодер какой-то не такой? или что-то можно подкрутить в коде?
Все завелось, версия ПО для ревизии платы 1.0: https://github.com/andykarpov/ZX_FDD_Emulator
Резисторы есть в клавиатуре
Захардкожены только датапины, остальные можно менять, если нужно, могу допилить эту часть
Весьма странно, я проверял на всех версиях, вроде проблем с этим не было.
возможно подключенная библиотека или еще что-то использует те прерывания, которые повешены на энкодер.
Ой, это я с эмулятором клавиатуры попутал :-D
PS: а какие именно пины нужно переставить? А то я там что-то в коде уже потерялся, давно эту библиотеку писал...
PS2: предлагаю попробовать вот такой вариант функции отправки данный в экстендер
Код:void twi_send_byte(unsigned char data)
{
twi_start(LCDEX_ADDR);
unsigned char data_out = 0;
if(data & 16) data_out |= _BV(LCDEX_D4);
if(data & 32) data_out |= _BV(LCDEX_D5);
if(data & 64) data_out |= _BV(LCDEX_D6);
if(data & 128) data_out |= _BV(LCDEX_D7);
TWDR = data | _BV(LCDEX_LIGHT & light_val); //temporary
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));
twi_stop();
}
Кусок не работает.
В нет, как минимум, перестановки остальных значащих битов (RS,RW,EN), + мы инициализируем data_out, но при этом передаем все равно data :)
Ну и непонятно откуда взявшаяся переменная light_val.
Да, что-то я поторопился :)
light_val определена какКод:void twi_send_byte(unsigned char data)
{
twi_start(LCDEX_ADDR);
unsigned char data_out = 0;
if(data & 16) data_out |= _BV(LCDEX_D4);
if(data & 32) data_out |= _BV(LCDEX_D5);
if(data & 64) data_out |= _BV(LCDEX_D6);
if(data & 128) data_out |= _BV(LCDEX_D7);
TWDR = data_out | _BV(LCDEX_LIGHT & light_val); //temporary
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));
twi_stop();
}
uint8_t light_val = LCDEX_LIGHT;
в функции включения подсветки ей присваивается light_val = LCDEX_LIGHT;
а в выключении ноль, что вполне нормально, т.е. этот пин можно спокойно переставлять.
в крайнем случае, чтобы всё время светилась можно
вместо _BV(LCDEX_LIGHT & light_val)
написать _BV(LCDEX_LIGHT);
(RS,RW,EN) не нужно переставлять, т.к. они определены в дефайне
и везде заданы как data |= _BV(LCDEX_EN); и т.д. т.е. берется номер бита и преобразуется в значение.
UPD: совсем забыл еще, что в дате могут быть другие данные :)
тогда переделаю всё библиотеку в ближайшие 2-3 дня....