Перед тем как продолжить изучение wav, придется сделать еще один небольшой шаг и освоить взаимодействие с FAT.
Думаю не для кого не секрет, что для нормальной работы, с носителем информации в операционной системе, будь то флешка или жесткий диск, его нужно отформатировать с учетом определенной файловой системы. В дальнейшем, это позволит операционной системе производить основные действия с папками и файлами: копирование, переименование, создание, чтение, редактирование и т.п.
Для микроконтроллеров также существует своя библиотека, позволяющая работать с файловой системой Fat — FatFs. Это очень удобно, закинул на флешку песню через проводник и не надо париться как она записалась, фрагментами или подряд. Но и расплата — большее использование ресурсов, по сравнению с прямым чтением, рассмотренному в предыдущем уроке. Для примера, в atmega8 целиком вся библиотека не влезет, поэтому единственно возможный способ — отключить все возможные функции, оставить только чтение. В целом этого достаточно, допустим фото и звуки можно загружать через компьютер, а читать их уже через микроконтроллер.
Для начала нужно отформатировать вашу флешку в FAT16 и закинуть на нее файл 1.txt, содержащий символы 123, наша задача прочитать их микроконтроллером.
Следующий шаг создать проект и подключить в настройках проекта поддержку ММС, все как в предыдущем уроке. Далее подключаем либу ff.h. Не буду описывать процесс настройки этой библиотеки, там комментариев автора более чем достаточно, кому лень разбираться можно сразу скачать настроенную либу FF.H
Грабли №1 В коментах четко сказано, при любых изменениях либы проект нужно очищать
Теперь поехали писать код.
#include <mega8.h> #include <ff.h> //библа для работы с фатом #include <delay.h> // Timer2 output compare interrupt service routine interrupt [TIM2_COMP] void timer2_comp_isr(void) { disk_timerproc(); //особенность работы с флешкой, обновление с частотой 100Гц } void main(void) { FATFS fs; /* Рабочая область (file system object) для логических дисков */ FIL fp; /* файловые объекты */ unsigned char buffer[20]; /* буфер для копирования данных файла */ unsigned int br; /* счетчик чтения/записи файла */ PORTD=0x00; DDRD=0x01; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: 7,813 kHz // Mode: CTC top=OCR2 // OC2 output: Disconnected ASSR=0x00; TCCR2=0x0F; TCNT2=0x00; OCR2=0x64; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x80; #asm("sei") delay_ms(1000); disk_initialize(0); //инициализируем флешку f_mount(0, &fs); //монтируем файловую систему f_open(&fp, "0:/1.txt", FA_OPEN_EXISTING | FA_READ); //открываем файл 1.txt только для чтения f_read(&fp, buffer, 2, &br); //читаем в буфер 2 символа f_close(&fp); //закрываем файл if(buffer[0]=='1') //если в файле первый символ 1 то включить светодиод { PORTD.0=1; } else //если нет, то бесконечно мигаем. { while(1) { PORTD.0=1; delay_ms(200); PORTD.0=0; delay_ms(200); } } while(1); } |
Грабли №2 Компилятор просил увеличить стек, причем каждый раз выдавал новое значение O_o, меняется в настройках проекта. Раза с 5-6 стало компилиться, сошлись на 750 байтах.
Шпрот одобрил работу прошивки, массив buffer содержит прочитанные символы.
На железе выплыли косяки, которые не заметил шпрот, все исправлено, в результате тоже все пучком, светодиод горит, а не мигает.
Прошивка и схема в протеусе.
UPDATE: тов. Аппаратчик воодушевил на подвиги, в результате, с его помощью удалось портировать облегченную библиотеку PetitFat для CAVR. К встроенной либе она не имеет никакого отношения. Занимает меньше места, не глючит и не требует отдельного таймера
Приветствую
Возник вопрос а если есть желание не читать а записовать в файл то пишем
…
f_write(&fp, buffer, 2, &br); //записываем в буфер 2 символа
…
или не так??
примерно так, только не забывайте, что запись и чтение могут не влезть в микроконтроллер
Скачал, открыл… протеус и код не из одного проэкта. Ну да ладно — минутное дело выкинуть две детали добавить светодиод… захожу в CVAVR 2.05.0 и кроме граблей с стеком вылазит…превышение памяти атмеги8. Захожу заново, сходу чищу проект для профилактики, ставлю стек 1016 (максимум)… и все равно. выкидываю весь код (кроме инклудов и мейна с пустымифигурными) — компилится на ура, 2% флеша.
Что я сделал не так? слышал неоригинальные екзешники бывают кривоваты…
Скачал из урока 22.1, заменил в инклудах кавычки, все ок, в протеусе лоад CPU но работает.
Попытался добавить в этот проект diskio.h — словил других ошибок…
да, я все это делал не особо задумываясь, потому что не особо понимаю
Предыдущий пост — касательно полного FatFS из wav_last.7z. Извиняюсь, мой недосмотр.
Спасибо за порт, но и в архиве для PetitFat протеус тоже не под проект…
Немного пугает количество warning.
Возникли следующие вопросы: чем отличается объявление
#include «pff.h»
и если написать так
#include
потом в протеусе (7.7 SP2 неоригинальный екзешник) постоянно вылетает:
блог съел картинку и кавычки…
в чем разница инклуда с двойным апострофом и треугольной одиночной закорючкой?
ссылка на картинку: hostingkartinok.com/show-image.php?id=049d320fa1d534719430779f6efb7ec0
Протеус поддерживает только MMC, SD и SD HC в нем не работают. Инклуды в кавычках находятся в папке проекта
Продолжу, с позволения спамить… несколько не удобно так общаться, но что поделать.
Так как я не в состоянии использовать оригинальную библиотеку в CVAVR, то используя вашу продолжил на чужих костылях свои строить. Необходимо на 8й атмеге сделать лог с трех температурных датчиков. Вроде ничего сложного… начал кодить. сначала наткнулся на грабли, что при попытке добавить USART и библиотеку stdio.h, получаю в данной библиотеке declaration syntax eror на строке 45:
int fgetc(FIL *fp);
поплакал ну и выкинул UART, запихал 8 светодиодов для отладки (пока все в протеусе)
проблемой конечно стало необходимость записывать большое количество данных, не имея expand в PetitFS. Было подсмотрено решение проблемы через создание пустых файлов, заполненных нулями, человек также выложил на питоне скрипт/программку создавать такие фалы. конечно же нумерация подряд, например log01.txt log02.txt… сделал соответственно циклы и проверки, чтобы открывать файл — писать до его окончания, финализировать (не дополняя нулями, они и так там есть), открывать следующий. максимальный размер фала ограничен размером типа unsigned int = 65535, так как переменная на основе него используется для подсчета (и хранения) позиции записи. И вот в этом месте напоролся на странную граблю: оно пишет только между 2000-2100 кб… а после непонятно чем занимается и не переходит на следующий файл. Тоесть ставим ограничение 2000 — отрабатывает на ура по всем файлам. Ставим 2100 — первый файл заполняется, причем в моем варианте еще и 2 последних символа буферной строки обрезаются, и все, непонятно чем занимается. Не могу понять откуда ограничение, ведь все типы данных unsigned char для строк и unsigned int для остального, что явно больше 2000.
Может при портировании Вы чтото подкручивали? Или подскажите как связаться с Вами поудобнее/скинуть код, чтобы я мог Вас помучать. Я конечно находил два варианта логгеров на атмеге… но они в еклипсе и/или avr-gcc, а с ними я работать не умею… И вообще для какой среды сделана оригинальная бибиотека Petit?
Оригинальная библиотека elm-chan сделана под gcc, я брал готовый пример который работал по авр студию, просто перенес его под CAVR. Если есть пример логгера по gcc то перенести его под CAVR не составит проблем, просто поправляйте ошибки при компиляции и все. Мои контакты есть на самом верху, хотя я не пробовал работать с либой больше чем проигрывание звуков, поэтому не знаю чем могу помочь.
1. Спасибо большое за уроки очень интересные.
2. С библиотекой ff.h беда съедает всю память так что запустить удалось на Atmega32.
3. Использовал функции чтения и записи работает без глюков.
4. Пытался использовать «PetitFat для CAVR» нечего не получилось выдаёт ошибки : function ‘disk_initialize’ declared, but never defined , на чтение, открытие.
И сам вопрос: Может где есть хорошее, простое описание как с данной либой работать?
Заранее спасибо.
на сайте elm-chan
Подскажите, а как записывать данные в файл с определённой частотой, нпример через каждые 2мкс?
Мне бы хотелось графические файлы в формате HEX на которые создаются с помощью программы LCD Vision в уроке №18, читать с SD карты, ибо flash память контроллера не безгранична особенно если речь пойдет о цветном изображении. Подскажите как читать файлы (желательно с примером) созданные LCD Vision с SD карты, или дайте примерное направление в котором двигаться, для реализации подобного проекта. Большое спасибо!
открываете файл, читаете в буфер, выводите этот буфер на дисплей, больше даже не знаю что сказать. сложностей не должно быть.
А если файл «весит» несколько мегабайт, буфер обмена справится? Ведь нужно чтобы файл читался и писался частями, иначе не какого буфера не хватит.
зависит от того какую мегу возьмете. у меги8 1кб рамы
Многоуважаемый Admin, прошу прощения за мою дотошность, но я никак не могу понять свою ошибку. Реализовал ваш пример по FAT на «железе» использовал Atmega32 и символьный ЖК, вывел информацию из SD карты на экран LCD не только цифры но и символы, все получилось, спасибо огромное за пример.
Но с уроком 23.1 у меня никак не получается что либо считать с SD карты, ЖК печатает «ок» а на второй строке следующее «|| || || ||». Подскажите как отформатировать эту «долбаную» SD карту чтобы стала «читаемой» файл на SD-ку писал с помощью программы WinHex. В протеусе все работает.
скорее всего вы пытаетесь вывести единицу как 0x01, а нужно как 0x31. добавляйте к цифре 0х30
Тоже не получается с уроком 23.1 та же ситуация «у меня никак не получается что либо считать с SD карты, ЖК печатает «ок» а на второй строке следующее «|| || || ||»» в моем случае символы немного другие «-| 3 ч ,» Символы пробовал записывать разные — выводит одно и тоже. Файл на SD-какрту писал с помощью программы WinHex. Карта 1GB Kingston В протеусе все работает.
а если в проекте раскоментировать //delay_ms(1000);
то тоже выдает «|| || || ||»
а если символы выводить не на дисплей а в Uart, что приходит?
Вновь сел за тестирование. с Uart пока не пробовал.
Если спецификатор формата поставить %X (%lu -не работает вообще), то выводится на дисплей следующая FA 33 C0
Но что интересно, когда на Sd карте ничего не записано, на дисплее все равно отображается FA 33 C0.
На карте у меня записано «012», что никак не бьется.
Вывожу следующим образом:
sprintf(display_buffer,»%X»,Buff[0]);
lcd_gotoxy(0,1);
lcd_puts(display_buffer);
sprintf(display_buffer,»%X»,Buff[1]);
lcd_gotoxy(3,1);
lcd_puts(display_buffer);
sprintf(display_buffer,»%X»,Buff[2]);
lcd_gotoxy(6,1);
lcd_puts(display_buffer);
Тут вариантов, где может быть ошибка просто тьма. Для начала исключите проблемы с картой, возьмите проект из 22.2 поиграйте вавку, если все ок, переходите к чтению данных.
в uart приходит следующее: FA 33 C0 0A 0D (вид принимаемой информации HEX)
использовал printf(«%c%c%c\n\r»,Buff[0],Buff[1],Buff[2]);
если достать карту: 30 30 30 0A 0D
ок начнем с вавки
Небольшой перерыв в испытаниях 🙂 . Вавку воспроизводим на ура.
Добрый день!Давно хотел заняться картами памяти и тут ваша статья ,спасибо.
Но возникли вопросы:
1-Почему для вывода текста FAT16 ,а для звука FAT32??
Нельзя ли в одной системе??
2-Для работы со звуком и текстом разные библиотеки..а если надо читать звук и текст чего подключать??
Из урока 22,2 звук читается ,как теперь ещё и текст читать и писать???
Разницы между текстом и звуком никакой. И то и другое читается одинаково
Если взять флешь память микросхему типа такой W25Q128 с SPI интерфейсом.
На компьютере создать файл образ SD с FAT, потом залить в память микросхемы.
Можно ли будет работать с этой микросхемой как с обычной SD картой памяти?
Или еще проще подключить память микросхемы напрямую к компьютеру через адаптер SD для микро и компьютером форматировать в фат?
Вы очень подробно и доступно объясняете, Я был бы Вам лично благодарен, да и многим было бы интересно что бы Вы описали и привели примеры работы с GSM модулем. Как написать алгоритм, какие команды, как предать данные через GPRS. Как управлять мк через интернет по GSM GPRS. За ранее спасибо.
Спасибо автору за разбор. Небольшой комментарий по отладки FatFS и Petit в Proteus. Долго мучился пока не обнаружил следующее. При подстановке на карту маленьких образов — 4, 8 Мб, как во многих примерах, не удается подключиться к карте (FR_NO_FILESYSTEM). Однако если такой же образ, но например 128 Мб, то все ок.