Доброго Здоровья!
Кто нибудь работал с SD картой на уровне FAT (только чтение) без AVR-DOS?
Кто нибудь пользовал SD карту в полноценном 4-х битном режиме?
Программирование ATMEL в BASCOM. |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » Программирование ATMEL в BASCOM. » Периферия » Работа с SD картой без AVR-DOS
Доброго Здоровья!
Кто нибудь работал с SD картой на уровне FAT (только чтение) без AVR-DOS?
Кто нибудь пользовал SD карту в полноценном 4-х битном режиме?
Признаю, затупил! Спасибо большое! Почему то, никак не умещалось в моем сознании, что можно не переменную наложить на массив, а массив на переменную) Я знал, что тут мне помогут разобраться!
Давайте на в/у примере "от RDW" разберемся, используя некоторые ваши элементы...
Что не так в предложенном ?
Опробовал ваш метод. Компилятор ругается на строчки ar(1) overlay, a(2) overlay и т.д.
Если записать одной строчкой
Dim ar(6) As Byte at cmd overlay +0 at sector +1 overlay at crc +5 overlay
То компилируется без проблем, но на выходе
Spiout ar(1),6
Все равно sector задом наперед
а какая применяется версия Bascom?
2.0.8.5
Я предложил вам концепцию, а не готовый код. 
Вечером смогу проверить.
В вашем варианте "одной строки" адрес грузится в массив в том виде, как лежит в памяти, а вам надо его развернуть.
Почитал за команду SWAP. Видимо, она может мне помочь. Почему то я думал, что она только в однобайтовых и двубайтовых переменных местами меняет MSB и LSB
Используйте промежуточные переменные для подстановки.
Рабочийй вариант, компилируется без ошибок, подправьте под себя:
Dim A As Dword
Dim ar(6) As Byte
Dim arr2 As Byte At A + 3 Overlay
Dim arr3 As Byte At A + 2 Overlay
Dim arr4 As Byte At A + 1 Overlay
Dim arr5 As Byte At A + 0 Overlay...........
A = &H01020304
ar(2) = arr2 ' вот тут
ar(3) = arr3 ' колдуете
ar(4) = arr4 ' с перестановками
ar(5) = arr5 ' байтов адреса...........
Print Hex(ar(1)); " ";Hex(ar(2)); " ";Hex(ar(3)); " ";Hex(ar(4)); " ";Hex(ar(5)); " ";Hex(ar(6))
Print Hex(ar(1)); " ";Hex(ar(5)); " ";Hex(ar(4)); " ";Hex(ar(3)); " ";Hex(ar(2)); " ";Hex(ar(6))
Разумеется, Print Hex вам не нужен, это для демонстрации перестановки. 
Присвоение значений выполняется однозначно быстрее, чем крутить цикл.
Используйте промежуточные переменные для подстановки.
Ага, именно с этого я и начал упрощать) только там добавилось ещё куча значений и промежуточных переменных) А ещё всю эту галиматью нужно волочить по коду, периодически приравнивая)
Сделал набросок кода с инициализацией флешки, чтением секторов с описанием разделов FAT и вычислением всех адресов, используя swap. С виду все читаемо и не громоздко. В железе проверить не дали, отобрали ноутбук для учебных целей) Как появится возможность, тут же проверю что получилось и отпишусь.
Ага, именно с этого я и начал упрощать) только там добавилось ещё куча значений и промежуточных переменных) А ещё всю эту галиматью нужно волочить по коду, периодически приравнивая)
Чтоб "не таскать одно и то же" выделите этот шаг в подпрограмму и вызывайте по мере необходимости.
Хотя, что "таскать" собираетесь - непонятно...
Любые изменения в переменной А (в моем варианте) сразу же отразятся на остальных значениях.
Они же связаны командой DIM... 
Смотрите.. К примеру, читаем сектор 0. В нем четыре байта (кстати, тоже задом наперёд) номер загрузочного сектора FAT. Бог с ним, перешли, поставив так же задом наперёд. В загрузочном секторе дергаем из массива 1 байт размера кластера, 2 байта колличества таблиц FAT, 4байта размера таблиц FAT, 4 байта номера первого кластера корневого каталога и ещё много чего, типа общего объёма памяти и т.д. А дальше математика из имеющихся чисел. Номер сектора загрузочной + размер загрузочной области = номер сектора первой таблицы FAT. А там ещё и вторая, возможно и третья в извращенных ОС. Адрес области данных, адрес корневого каталога, секторов на кластер и т.д. И все это переворачивать через промежуточные массивы, считать, а потом опять через них переворачивать, для перехода в нужный раздел. А ещё чтение файлов, где придётся прыгать из раздела в раздел, про запись вообще молчу. Жуть жуткая. Пока додумываю простой алгоритм до конца, упрощая готовое. А ещё, объем оперативной памяти у МК не резиновый и хотелось бы не просто уложиться в ее пространство, а оставить как можно больше памяти на другие задачи. При всем этом ещё и о скорости не забыть.
P. S. А сколько ресурсов (физической и оперативной памяти) кушает AVR-DOS?
Смотрите..
Не буду... 
Была задача - развернуть очередность байтов из переменной.
Я вам предложил вариант.
С FATами и пр. силами МК никогда не работал и не планирую, эти вопросы уже не ко мне. 
К примеру, читаем сектор 0. В нем четыре байта (кстати, тоже задом наперёд) номер загрузочного сектора FAT....
Думаю, что здесь вы уже были, но все равно скину, может поможет...
Давайте прочитаем FAT без библиотек
Премного благодарен за ссылки! Конечно читал эти темы, но, благодаря Вам, теперь смогу к ним переходить без поиска.
По поводу начального вопроса, SWAP отлично справляется, со второго раза все заработало без лишних приравниваний и преобразований массивов. Со второго, потому что перемудрил не много, перевернул даже там, где не стоило) Справедливости ради, хочу отметить, что ваш вариант с промежуточным массивом тоже имел бы место быть. Разница была бы лишь в чтении с одного массива и записью через другой. Но понял я это уже когда все заработало
SWAP отлично справляется
Сравнил оба варианта по скорости.
У учетом того, что эта операция применяется неоднократно, SWAP проигрывает, несмотря на компактность кода.
Начальные установки
Dim A As Dword
Dim ar(6) As Byte
Dim arr2 As Byte At A + 3 Overlay
Dim arr3 As Byte At A + 2 Overlay
Dim arr4 As Byte At A + 1 Overlay
Dim arr5 As Byte At A + 0 OverlayA = &H01020304
17 тактов
ar(2) = arr2
ar(3) = arr3
ar(4) = arr4
ar(5) = arr5
19 тактов
SWAP A
Наверное, вы как то в симуляторе просчитываете такты и ещё где то. Я так не умею. Ради моего интереса сможете сравнить по тактам следующие варианты:
Dim ar(4)
Dim A As word at ar(1} overlay
SWAP A
Spiout A, 4
и
Dim i As byte
Dim ar(4)
Dim A As word at ar(1} overlay
For i =4 to 1 step - 1
Spiout ar(i), 1
Next
Если это возможно, конечно. Спасибо
Если это возможно, конечно.
Только если вечером...
А навскидку скажу, что с циклом будет дольше, насколько не знаю.
Скорость выполнения цикла уже рассматривалась в упомянутой ранее теме.
Скорость выполнения цикла уже рассматривалась в упомянутой ранее теме.
Ага, нашёл, спасибо. Для 4 шагов (for i = 1 to 4) будет 27+3*15=72 такта, не считая передачи по SPI. Думаю, для обратного (от 4 до 1) будет так же. Даже если два раза swap, то быстрее будет. Массивами выйграем ещё 4 такта. Экспериментируем дальше)
Отредактировано Nec (2023-01-28 14:51:24)
Думаю, для обратного (от 4 до 1) будет так же.
Да. Циклу фиолетово в какую сторону считать (по времени), если в качестве счетчика используется байт.
В этом случае (в Ассемблере) это однотактовая операция.
Даже если два раза swap, то быстрее будет.
Однозначно
SWAP A
Spiout A, 4 ' 114 тактов
Для "два раза swap", то +19 тактов------------------------------------------
For b = 4 To 1 Step -1
Spiout ar(b), 1
Next b ' 261 такт
Благодарю, примерно так и думал. В любом случае, это капля в море в сравнении с обработкой FAT32 и чтением файлов. Скажем так, скорости Attiny88 на 16МГц хватает впритирочку на чтение и воспроизведение Wav файлов до 44100 сэмплов в секунду по 16 бит)
А подскажите, знатоки баскома, прерывания pcint.x (и вообще прерывания ли они?) каким образом осуществляются? То есть когда нужно выйти из цикла Do-Loop, а int0 и int1 не хватает, можно ли их использовать?
прерывания pcint.x (и вообще прерывания ли они?) каким образом осуществляются?
! Прерывания INT0, INT1, PCINTx Atmega8_88_328 !
Подправляете под свой МК.
То есть когда нужно выйти из цикла Do-Loop, а int0 и int1 не хватает, можно ли их использовать?
Можно, но при соблюдении их (прерываний) особенностей.
Господин sasha_1973 активно использует вставки на ассемблере во всех своих материалах. За что ему, конечно, огромное уважение, но ничего не понятно) Кстати, то ли движок форума не поддерживает, то ли я, как новичок не имею прав чтобы выложить файлы. Хотел поделиться недельными наработками по работе с microSD и Fat32, на примере логирования данных, чтения txt и wav файлов на маломощных МК. Понятно, что изобретаю велосипед, но ни здесь, ни на других ресурсах ничего внятного и рабочего не нашёл. Может быть, кому-нибудь и пригодилось бы (в том числе и мне в будущем)...
Отредактировано Nec (2023-01-29 18:22:12)
Господин sasha_1973 активно использует вставки на ассемблере во всех своих материалах. За что ему, конечно, огромное уважение, но ничего не понятно)
Материалы Александра ценны в первую очередь разжеванной до состояния паштета информацией.
Вставки на Асс-ре можете игнорировать, однозначно где-то рядом есть реализация на Bascom.
Здесь, например, ! Прерывания INT0, INT1, PCINTx Atmega8_88_328 ! вообще нет Асс-ра, но есть все для понимания работы с PCINTх
Кстати, то ли движок форума не поддерживает, то ли я, как новичок не имею прав чтобы выложить файлы. Хотел поделиться недельными наработками по работе с microSD и Fat32, на примере логирования данных, чтения txt и wav файлов на маломощных МК.
Прямой файлообмен не поддерживается движком.
Используйте сторонний нормально работающий файлообменник и постите ссылку сюда в сообщении.
Кстати, у вас изменился статус и вы теперь имеете возможность создавать Тему.
Предлагаю это сделать в Разделе Периферия, я перенесу в нее из этой темы весь наш диспут сначала.
Материалы Александра ценны в первую очередь разжеванной до состояния паштета информацией.
Согласен! Ключевое слово "ЦЕННЫ"!
Кстати, у вас изменился статус и вы теперь имеете возможность создавать Тему.
Не-а, не появилась кнопка...
Собственно, из-за чего я затеял изобретать этот паровоз) Потребовалось мне писать логи на MicroSD. потому что ее память почти безгранична. Тут же быстро пришло понимание, что проще и быстрее писать напрямую в память, без всякой файловой системы. А считывать тем же МК через UART в терминал, который пишет лог в txt. Скорость чтения/записи, как уже писал выше, не больше 8мс на 512 байт, при частоте кварца 16МГц (Attiny88). Ресурсов тратится около 2-2,5Кб физической и до 100 байт оперативной памяти (зависит от размера массива чтения-записи, я взял array(64)) . Можно взять и в 512 байт массив и писать разом сектор SD. Инициализацию карты сначала разбил на множество команд и условий под разные виды флешек, но опробовав три, которые имеются в наличии (8ГБ, 16ГБ и 64ГБ), понял, что проходит все по одному и тому же сценарию. Поэтому урезал почти до минимума.
Прямое чтение-запись microSD
Далее, забавы ради, решил приколхозить работу с файловой системой. Выбрал FAT32, как самую "народную" и ,в отличие от NTFS, пригодную для флешек. Получилась некая "читалка", которая поддерживает произвольный размер кластера (указывается в Windows при форматировании карты) и фрагментированные файлы (не обязательно их перемещать на свежеотформатированную флешку), то есть, при чтении файла, постоянно обращается к таблице FAT за номером следующего кластера. Как минус, это немного тормозит процесс чтения, но не существенно. Из неудобного это отсутствие поддержки длинных имен файла. То есть, файлы, копируемые на карту, должны иметь имя на латинице в верхнем регистре (заглавные буквы) 8 символов. Иные имена распознает "на удачу". Собственно, поиск файла в корневом каталоге, осуществляется по первому совпадению символов. То есть, запрашивая файл "TEXT1" будет открыт первый из списка (ранее добавленный), будь то "TEXT1" или "TEXT100", или "TEXT101"...
Пример чтения TXT файлов с MicroSD (FAT32)
Ну и, для понимания скорости работы с файловой системой, написал пару аудиоплееров (моно и стерео) записей в несжатом формате WAV. Приемлемо воспроизводит аудио с частотой дискретизации менее 44,1КГц и глубиной 16 бит. При 44,1КГц и выше скорость воспроизведения замедляется. Моно, естественно, шустрее, чем стерео. Качество звука от ШИМ, тем более 8 битного, ожидать не стоит, но вполне не плохо для AVR. Думаю, для всяческих говорящих часов да игрушек для детей сгодится. Плеер занимает около 150байт оперативной памяти и чуть меньше 4Кб физической.
Wav моно
Стерео
Ну, и чтобы преждевременно не заморачиваться с конвертацией мелодий в WAV для теста работоспособности, пару готовых примеров с разной частотой дискретизации
44100Гц
8000Гц
Отредактировано Nec (2023-01-30 09:45:41)
а я в своё время отказался от флешек "для внутренних" целей: очень уж богат китайскими поделками рынок!
Надёжнее поставить 8-ногую м-му внешней EEPROM и работать с ней, сливая через uart/usb
Не очень понял про подделки... Все мои флешки с Али, все работают.
Касаемо еепром. Вначале поставил 2с256. Частота записи была примерно один раз в 35мс. хватало ее на 2 минуты логов. А более емкой еепром я не знаю. С флешкой на 16ГБ минут 10 записи и 1% от ее объема не заняли.
Потребовалось мне писать логи на MicroSD. потому что ее память почти безгранична.
Советую вам провести такой эксперимент. Возьмите небольшой массив и включите циклическую запись на карту. Т.е. пишем-проверяем что записали-стираем и так в цикле.
Да, нужно ещё счётчик количества циклов записи-стирания. Вы будете неприятно удивлены тем, что через N количества циклов ячейки начнут потихоньку умирать. Появятся ошибки.
Ресурс карты весьма ограничен в смысле количества циклов записи-стирания. Бюджетные модели имеют число циклов стирания-записи (P/E cycles) до 500. Более дорогие карты памяти обладают ресурсом в 1000-5000 циклов стирания-записи.
через N количества циклов ячейки начнут потихоньку умирать
совершенно верно
когда-то занимался PLC (пром контроллеры) и сделал выгрузку логов не по rs-485, а на карту памяти. И она примерно на третьей неделе сдохла. Заменил - сдохла. И только на пятой я посмотрел карты - убиты ячейки памяти, каждая - по-своему: от 1000 до 12000 записей и она "плыла" - читалась по-разному.
С тех пор - ни-ни )) Почти на всех более-менее сложных платах оставляю место под soic-8 
sva-don Еепром тоже не бесконечна в циклах записи. Как и Flash память у AVR микроконтроллеров. Если необходимо перезаписывать сотни раз в секунду, FRAM вам в помощь вместе с остальными ее плюсами и минусами. А если логировать даже раз в день, с учетом , что циклов перезаписи будет менее тысячи , то два года пользования флешкой вполне неплохой результат. Все зависит от задач.
Отредактировано Nec (2023-01-30 11:43:58)
Вы здесь » Программирование ATMEL в BASCOM. » Периферия » Работа с SD картой без AVR-DOS