...

понедельник, 23 марта 2015 г.

Проект инфо-панели оповещения об авариях (Часть 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. Пока не до конца дописана, интерфейсов и прочего нет, читает заранее обозначенное количество байт. Нужно несколько переделать на объекты для упрощения работы с ней.


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий