Проект инфо-панели оповещения об авариях (Часть 3)

    Приветствую всех.
    Вот уже третья часть довольно сильно затянувшейся истории (раз, два).
    Устройство ещё не завершено, хотя почти все основные блоки в настоящий момент собраны:
    — Индикаторы (2);
    — Процессорный модуль (в этой части);
    — Блок питания (импульсный преобразователь 48V -> 5V до 6А) (в процессе, пауза из-за окончательно сломавщихся щупов к осциллографу (кЕтай));

    План действий:
    [+] SD-Card-Sector
    [+] FAT-FS
    [+>] OneWire async
    [-] Slave firmware
    [part] Ethernet
    [-] Протокол обмена между процессорами
    [-] Bootloader

    Осторожно, фото.


    Плата процессоров претерпела изменения:
    Скрытый текст
    V.1:

    Разобрана, перенесена на следующую.
    V.2:

    В первом варианте не удалось развести PORTA главного контроллера, в варианте 2 было исправлено — выведен на полную гребёнку. Возможно использование как дополнительной переферии, так и в роли DAC (если удастся заставить работать без сбоев воспроизведение звука из UDP пакетов).
    Переферия модульная. Предусмотрены на плате:
    — Датчик температуры DS18B20 (либо любые другие OneWire устройства);
    — Часы DS1307;
    — Аппаратная консоль (TTL уровни, 115200,N,1);
    — Пьезоизлучатель (пищалка, разъём);
    — Статусный модуль (подключаемый);
    Вид модуля: Очень хорошо бы сделать к нему мини-окна, чтобы диоды не засвечивали «соседей».
    Скрытый текст

    Процессор управления экраном обзавёлся дополнительным разъёмом подключения внешних индикаторов (часы, просто часы) без дополнительного питания — они будут забирать его непосредственно от БП.

    Код пока не собран до конца. Занимаюсь аппаратной частью (в настоящий момент — индикаторы:
    Скрытый текст

    Динамическая индикация, драйверы строк и столбцов на транзисторах, скважность 8 для каждой строки. Схемы и модели плат будут позднее.

    FAT: Частичный базиз — использование библиотеки от «www.roland-riegel.de» (страница билиотеки). Написать хочется самому, так что файлы, хоть и распространяются по лицензии GPL, используются как пример.
    Чудом заработала функция чтения/записи с/наSD-карты/у. Инициализация проходит нормально, карта определяется, но при чтении возвращаются нули. Появился странный костыль при запросе чтения/записи сектора — требуется прибавлять к абсолютному адресу константу. Для обычных карт — получается формула: Вычисленный_Адрес = (Требуемый_Сектор + 249 ) * 512. Для SDHC приходится прибавлять 2048.
    Скрытый текст
    uint8_t SPI_SD_READ_SECTOR(uint32_t Sector)
    {
    	uint16_t i;
    	uint32_t calc_Addr;
    	if (Sector == raw_block_buffered)			// Если начало блока совпадает с буфферезованным сектором
    	{
    		return R_OK;					// Возвращаем успех. Ничего не нужно делать, ибо данные в буфере.
    	};
    	SPI_Select_CARD();
    	if (!(sd_raw_card_type & (1 << SD_RAW_SPEC_SDHC)))	// Если карта НЕ является SDHC - добавляем 9 бит к адресу.
    	{
    		// !SDHC
    		calc_Addr = ((Sector+249) << 9);		// DaFaq?! But will not work in other case.
    	} else {
    		// SDHC
    		calc_Addr = (Sector+2048);			// And one more DAFAQ!
    	};
    	i = SPI_SD_SendCMD(CMD_READ_SINGLE_BLOCK, calc_Addr);	// Передаём вычисленный адрес карте
    	if(i)
    	{
    		SPI_UnSelect_CARD();				// Отпускаем карту
    		return R_ERR;					// Возвращаем ошибку. =(
    	};
    	while (SPI_SD_Rd_Byte() != 0xFE);			// Ждём начала блока. Чаще всего до 30-40 итераций.
    	for (i=0; i<512; i++)					// Читаем байт и заносим его в буфер (512 байт)
    	{
    		raw_block[i] = SPI_SD_Rd_Byte();
    	};
    	SPI_SD_Rd_Byte();					// CRC
    	SPI_SD_Rd_Byte();					// CRC (2) // IGNORED T_T
    	/* deaddress card */
    	SPI_UnSelect_CARD();					// Отпускаем карту (шину)
    	SPI_SD_Rd_Byte();					// Тактирование.
    	raw_block_buffered = Sector;				// Запоминаем сектор, коотрый считали.
    	return R_OK;
    };
    

    Протестированные карты:
    Transcend MicroSD 1GB /Taiwan/ (I C1210000 924)
    Transcend MicroSD 2GB /Taiwan/ (8281AB 2G 01DS1)
    Samsung MicroSDHC 8GB Class 2 /Taiwan/ (C FJCB85PZ T15)
    Kingston MicroSCHC 16GB Class 10 /Taiwan/ (TM2I121100200)

    Замеченная странность поведения карт воспроизводится.

    Вопрос читателям: Кто-нибудь с подобным сталкивался в работе AVR* с SD-картами?

    С Ethernet модулем возникла сложность — сам модуль работает, но подключать его в сеть с наличием активного PoE питания нельзя. Прямая ссылка на datasheet трансформаторов, используемых в Arduino-совместимых Ethernet модулях — в них все 4 пары средней точкой подтянуты к общей точке внутри схемы резисторами в 75Ом (логично, что это линейные терминаторы). При таком соединении возможны всего два варианта — либо БП уходит в защиту, либо сгорает розетка. Оба неприятны.
    Сейчас делаю плату Ethernet (фактически, переделываю приобретённый модуль Arduino-ENC28J60 на новую плату). Модуль получился 71*33мм (для сравнения, модуль от Arduino — 55*35мм).
    Скрытый текст
    Типовая схема из описания к модулю.

    Разведённая плата (трансформатор от какого-то, найденого в офисной корзине, устройства — M-TEK G24102MKG — очень плохо гуглится).

    Плата в сборе. Трансформатор оказался битым. Но, т.к. в выброшеном устройстве-доноре использовались только первые пары, он заработал в… таком виде.


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

    Недавно более-менее отлажена асинхронная библиотека для OneWire. Пока не до конца дописана, интерфейсов и прочего нет, читает заранее обозначенное количество байт. Нужно несколько переделать на объекты для упрощения работы с ней.
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 2

      0
      Сейчас проектирую плату с RJ45, выбрали разъем HR911105A со встроенными трансформаторами, у них средняя точка соединяется с землей через развязывающий конденсатор 1нф. По поводу диодов могу посоветовать взять с маленьким углом, бывают порядка 15 градусов, или сделать световоды, например распечатать их на 3d принтере из полупрозрачного ABS пластика.
        0
        В провинции достать специфические детали сложно, да и найти 3D принтер тоже. Но идея мне понравилась. Вообще, думаю соорудить нечто похожее на ячеистую крышку, залитую полу прозрачной эпоксидной смолой, чтобы свет распространялся вперёд, в свою ячейку, а не как на фото.
        Примерно, как делают световоды на «взрослых» устройствах. Очень примерно. Самый похожий вариант нашёл в индикаторе парктроника, где светодиоды были на обжей подложке, но светили в такие же ячеистые окошки.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое