В связи с увлечением запусками ракет, решил запилить для ракеты небольшую систему управления полётом и записи данных о траектории. Контроль осуществляется в виде поджёга топлива на старте и выпуска парашюта, когда ракета пойдёт на снижение.Так же есть система световой и звуковой подачи сигнала в случае чего или просто во время полёта, чтобы было легче найти ракету. Данные о полёт берутся с двух датчиков: BMP180 и MPU6050. После считывания МК записывает их на микроСД карту по SPI интерфейсу каждые там 10-100 милисекунд.
Начал я это всё дело воплощать, запилил схему, запаял плату, написал тестовую прошу (просто берётся значение с одного датчика и пишется на карту), но в лучших традициях ничего не заработало. Упростил прошивку - просто записать на карту в текстовый файл константу, указанную в коде. Опять нифига. Думаю - эх, не работает мой код, плохой программист я. Взял готовый проект, тупо залил хекс файл из него, врубил - нифига (предварительно создал нужный файл, в нужной директории на карте и немного "заполнил" файл пробелами). Проверял 1000 раз пайку, все контакты, отмывал литрами спирта, форматировал микросд карту в фат со стандартым размером клатера, в фат32, пробовал 3 разные карты, пересоздавал файлы - нифига. Вся схема питается от 3.3В стабилизатора (KB33), имеет 3.25В на выходе, никаких просадок напряжения не замечено.Кодил это всё на основе библиотеки Petit FAT, микроконтроллер - Atmega328P, карты - микросд, пробовал 3 штуки (втавляются в разьём), все по 2Гб, ни одна так и не записала данные.
Подключал карту к МК по схеме(только выводы подсоединял соответсвующие микроСД карте):
Потом повесил резисторы на шину по 50кОм к + питания, думал поможет
В итоге ничего не вышло.У меня пару версий - эти карты не поддерживают СПИ интерфейс, либо я не правильно подключаю карту к МК, может, 50К резисторы большие, но в статьях сказано 10-100кОм. Ну, ещё может быть контакты разъёма для карточки в остатках флюса либо окислены, но я их промывал под струёй мед. спирта и засовавал в слот для карты бумажку и елозил там внутри, разве что ещё наждачку попробовать Внутрь заглядвал - все контакты целые....
Кто что может подсказать?
Самописец для ракеты
Мда, после небольшого допиливания библиотеки SPI интерфейса всё заработало, но тему пока закрывать не буду, вдруг ещё вопросы возникнут....
Удалось получить данные с одного датчика, но проблема в том, что запись должна вестись циклично во время полёта ракеты, а библиотека работы с картой позволяет производить запись только в начале сектора, и не важно сколько байт ты записал, все 512 считаются занятыми, что и сказивается на файле с данными: после записи значения датчика нужно сместить указатель записи на те же 512 байт, иначе новое значение просто перезапишется поверх старого, в результате мы видим в .тхт файле одно значение, 500 с чем-то пробелов и следующее значение, кароче говороя - безобразие. Я пробовал записывать значения одно под одним, начиная с новой строчки, но у меня ничего не вышло. Я читал что надо отправить в конце передачи данных значения 0xD 0xA, что в таблицах ASCII значит перенос на начало новой строки, тогда последующая запись данных будет, собственно, с новой строчки. Но моя попытка не увенчалась успехом. Насколько я понял надо передать значения типа int, тогда тхт файл поймёт что ему делать, но тип передаваемых данных библиотекой - BYTE, другие типы, насколько я понял, она передавать не хочет и моя попытка отправить int переменые первращает значения в какую-то тарабарщину.
Можете подсказать как, собственно, реализовать запись в столбец?
Можете подсказать как, собственно, реализовать запись в столбец?
Дак нужно писать сразу по 512 байт. Если нужно поменять в них что-то, то нужно прочесть 512 байт, отредактировать в памяти и записать обратно.
- iEugene0x7CA
- Адепт
- Сообщения: 1570
- Откуда: Киев
Nikomo писал(а):решил запилить для ракеты небольшую систему управления полётом и записи данных о траектории.
Какие люди, и какие звездолёты собирают. С минувших дней лишь помню, как пытались с тобой триггер 74HC109 купить.
Касательно проектика — низкоуровнево с SD картой беспонтово работать, только в связке с FAT и через готовые либы.
Если в подобном нет необходимости и/или желания разбираться — можно заюзать в сотни раз более простой, быстрый и надёжный вид памяти: SPI Flash.
Вот типичный представитель, 16 МБ, брал здесь в Имраде: https://www.winbond.com/resource-files/ ... 242015.pdf
Недавно с такой штуки ниггерские песни играл.
https://www.youtube.com/watch?v=pwo9-BxnC_Y
Но, если SD флеха уже читается — BSVI правильно говорит.
Инфа на SD-картах хранится в виде 512-байтных секторов, читается и пишется тоже 512-ю байтами, такая особенность.
Неужели библиотеку сам писал? И не знаешь что есть страничная запись? тогда вдвойне круто!
Но всё же надо почитать про флешь память и почему в ней принято писать страницами. Здесь та же ситуация, по сути СД карта это массив флешь памяти с контроллером SDIO.
Когда то делал работу с флешкой на STM32, использовал FatFs от Чана, очень понравился его код, и файловая система работала как часы, но там без буферов не обойтись, т.е на AVR может и получится, но надо будет ужиматься изо всех сил.
ЗЫ. А перенос строк ничего не даст, нужно организовывать у себя (в AVR) буфер на 512 байт и заполнять его, по заполнению -писать его на карту -т.е страницами, как и положено.
Но всё же надо почитать про флешь память и почему в ней принято писать страницами. Здесь та же ситуация, по сути СД карта это массив флешь памяти с контроллером SDIO.
Когда то делал работу с флешкой на STM32, использовал FatFs от Чана, очень понравился его код, и файловая система работала как часы, но там без буферов не обойтись, т.е на AVR может и получится, но надо будет ужиматься изо всех сил.
ЗЫ. А перенос строк ничего не даст, нужно организовывать у себя (в AVR) буфер на 512 байт и заполнять его, по заполнению -писать его на карту -т.е страницами, как и положено.
- iEugene0x7CA
- Адепт
- Сообщения: 1570
- Откуда: Киев
mutabor писал(а):Когда то делал работу с флешкой на STM32, использовал FatFs от Чана, очень понравился его код, и файловая система работала как часы, но там без буферов не обойтись, т.е на AVR может и получится, но надо будет ужиматься изо всех сил.
Для AVR есть кастрированная версия — Petit FatFs.
Рабочий пример можно тут взять: http://avr-start.ru/?p=1874
Библиотеку конечно же не сам - PetitFat юзаю. Для датчиков тоже библиотеки есть, хотя для 6050-го датчика надо нехило так с ней поработать, но не суть.
Спасибо, народ, делаю как вы говорите - заполняю 512 байт буфер, пишу на карту, потом перезаписываю буфер и опять пишу. Всё работает, и всё бы нечего, но запись 4 блоков (2кб) занимает долгие 10 секунд, при рабочей частоте мк в 8МГц, при том, я засекал по току, что очень долго идёт заполнение буфера (я запитывал устройство через милиамперметр и когда происходит обращение к карте, присходит скачёк тока, что сигнализирует о записи одного блока данных, собственно за один цикл работы - 4 таких броска), т.е. пару секунд ток себе стабилен (буфер заполняется), потом пишет за долю сенкунды и снова ждёт.
Я думаю - может это данные с датчика долго обрабатываются библиотекой или может быть такое, что оператива МК забивается значениями буфера (хотя у него по даташиту 2кб оперативы и буфер - всего 1/4 её обьёма) и МК начинает тупить.
Спасибо, народ, делаю как вы говорите - заполняю 512 байт буфер, пишу на карту, потом перезаписываю буфер и опять пишу. Всё работает, и всё бы нечего, но запись 4 блоков (2кб) занимает долгие 10 секунд, при рабочей частоте мк в 8МГц, при том, я засекал по току, что очень долго идёт заполнение буфера (я запитывал устройство через милиамперметр и когда происходит обращение к карте, присходит скачёк тока, что сигнализирует о записи одного блока данных, собственно за один цикл работы - 4 таких броска), т.е. пару секунд ток себе стабилен (буфер заполняется), потом пишет за долю сенкунды и снова ждёт.
Я думаю - может это данные с датчика долго обрабатываются библиотекой или может быть такое, что оператива МК забивается значениями буфера (хотя у него по даташиту 2кб оперативы и буфер - всего 1/4 её обьёма) и МК начинает тупить.
Nikomo. Скорей всего дело не в процессоре и не в том, что он начинает тупить (если в нем не стоит операционка конечно ). Просто данные с датчика идут с небольшой частотой, вот и долго буфер копится. Как сделан опрос датчика?
Запись в файл легко проверить -просто сделай переменную-счетчик (16битную к примеру) и инкрементируй ее в цикле, значения пиши в буфер. В файле должен увидеть эти значения от 0 до 2047 (смотреть можно Winhex'ом к примеру). Скорость записи в этом случае будет примерно = максимальной
Евгений, спасибо, не знал. Наверно потому что особо ими не интересовался. Сейчас вообще отошел от 8битников -надоело уже код оптимизировать на уровне ассемблера хотя в плане простоты с ними работать одно удовольствие
Запись в файл легко проверить -просто сделай переменную-счетчик (16битную к примеру) и инкрементируй ее в цикле, значения пиши в буфер. В файле должен увидеть эти значения от 0 до 2047 (смотреть можно Winhex'ом к примеру). Скорость записи в этом случае будет примерно = максимальной
Евгений, спасибо, не знал. Наверно потому что особо ими не интересовался. Сейчас вообще отошел от 8битников -надоело уже код оптимизировать на уровне ассемблера хотя в плане простоты с ними работать одно удовольствие
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 49 гостей