FAT File System چیست؟
بصورت ساده فرض کنید یک حافظه فلش یا رم … در اختیار دارید,و قراره از این حافظه جهت ذخیره اطلاعات استفاده کنید, به عنوان یک مهندس الکترونیک میدونید که در حالت عادی میتونید یک بایت یا یک سکتور از اطلاعات را در هر بار تغییر بدید.
حالا فرض کنید این اطلاعات لازمه در دسته بندی های مختلف مدیریت بشند و هر بار بتونید اطلاعات جدیدی را به یک دسته اضافه یا حذف کنید و یا بتونید حتی دسته ای را حذف نمایید.
برای مدیریت چنین حافظه هایی استانداردهایی وجود دارد که یکی از معروفترین آنها استانداردهایی هست که مایکروسافت ایجاد کرده و برخی از اونها تحت عنوان FAT شناخته میشند, مانند FAT16 FAT32 …
در این ساختار دسته بندی اطلاعات تحت عنوان فایل ذخیره میشه و کلی قابلیت دیگه هم در ساختار FAT دیده شده که به مرور به ورژنهای بالاتر اضافه شده است.
درباره این آموزش – مقدمه
وقتی قراره پروژه الکترونیکی انجام بدید و قراره مثلا حافظه مموری کارت را به پروژتون اضافه کنید استفاده از یک استاندارد مانند FAT در مدیریت ذخیره سازی اطلاعات بر روی حافظه میتونه محاسن زیادی را برای شما رقم بزنه
مثلا به راحتی میتونید اطلاعات را با سرعت بالا از کامپیوتر به حافظه و از حافظه به کامپیوتر انتقال بدید و همینطور میتونید مدیریت اطلاعاتتون را تحت یک استاندارد داشته باشید.
چندین سال پیش آقایی به نام Chang در وب سایت شخصی اش کتابخانه ای برای FAT منتشر کرده که مخصوص میکرو کنترلرهای با سرعت و رم پایین مثل AVR بوده و بسیار هم پرکاربرد بوده و هست.
آموزش زیر توسط مهندس محمد امین حردانی یکی از اعضای فعال گروه تلگرامی چیپکده منتشر شده که سعی میکنه در این آموزش به خوبی نحوه شروع به کار و استفاده از این کتابخانه را آموزش بده و برای اینکار از شبیه ساز پروتئوس استفاده کرده که مطمئنا میتونه بسیار مفید و کاربردی باشه.
دربارهی راهاندازی کتابخانه ff.h
این نوشته آموزشی صرفا برای آشنایی اولیه و راهاندازی کتابخانهی ff است و اصلاً به عنوان یک راهنمای کامل و جامع قابل استفاده نیست. برای اطلاعات بیشتر باید به راهنمای کتابخانه که در سایت elm-chang.org مراجعه نمایید.
در این پست آموزشی قرار است ما ضمن شبیه سازی برنامه نوشته شده در کدویژن با پروتئوس, حافظه مموری کارت را نیز با برنامه OSFMount که یک برنامه رایگان هست شبیه سازی نماییم.
دربارهی کتابخانهها
این سایت منتشر کنندهی دو کتابخانهی ff و pff برای کار با سیستم فایل FAT است. کتابخانهی ff برای میکروکنترلرهایی مانند ATMega که حافظهی کافی دارند یا میکروکنترلرهای قویتر ساخته شده در حالیکه کتابخانه pff با کمی امکانات کمتر برای استفاده روی میکروکنترلرهای با حافظهی کمتر مانند ATTiny ساخته شده است. با توجه به مقدار حافظهای که نیاز داریم یکی از این دو کتابخانه را استفاده میکنیم.
دربارهی نرمافزار و سختافزار
سیستم عامل مورد استفاده Windows 10 x64 Version 1703 Build 15063.540 است. مثال مطرح شده توسط برنامهی CodeVisionAVR 3.12 Advanced نوشته و کامپایل شده است.
برای شبیهسازی نیز از نرمافزارهای Proteus 8.5 SP0 Build 22067 برای شبیهسازی منطق برنامه و دیدن خروجی و برنامهی OSFMount 1.5 Build 1015 for 64-Bit Windows برای ایجاد فضای شبیهسازی شدهی فایلسیستم FAT و اختصاص فضای شبیهسازی خام برای برنامهی Proteus استفاده شده است.
لازم به ذکر است که در این پست مثال مطرح شده فقط نرم افزاری شبیه سازی شده است.
برنامه از 4 قسمت تشکیل شده است که در ادامه معرفی میشوند:
- کتابخانههای مورد استفاده معرفی شدهاند تا از توابع موجود در آنها در برنامه استفاده کنیم.
- متغیرها و ساختارهای مورد استفاده که سعی شده نامگذاری آنها متناسب با کارکردشان باشد.
- وقفهی تایمر 0 که در بازههای زمانی کوتاه اقدام به فراخوانی تابع disk_timeproc() میکند تا MemoryCard به حالت خواب نرود.
- باقی کدها برای اجرای برنامه
تنظیمات تایمر 0 هم به این شکل انجام شدهاند.
یادتان باشد این تنظیمات برای شبیهسازی انجام شدهاند و برای واقعیت باید از روی راهنمای کتابخانه محاسبه را انجام دهید. زمان اجرای تابع disk_timeproc() را باید هر 10 میلیثانیه تنظیم کنید تا کارت حافظه فعال بماند.
همچنین از منوی
Project ==> Configure ==> C Compiler ==> Libraries ==> MMC/SD/SD HC Card
تیک هر دو گزینهی موجود را بزنید و باقی تنظیمات رو مطابق عکس انجام دهید.
کدهای کامل برنامه هم در اتمام پست برای دانلود قرار گرفته است.
مدار را مطابق شماتیک زیر در پروتئوس ببندید و تنظیمات قطعات را مطابق عکسهای زیر انجام دهید (حافظهی مموری کارت 1MB در نظر گرفته شده است تا فایل نهایی پروژه جهت آپلود کم حجم شود):
همچنین از منوی
Project ==> Configure ==> C Compiler ==> Libraries ==> MMC/SD/SD HC Card
تیک هر دو گزینهی موجود را بزنید و باقی تنظیمات رو مطابق عکس انجام دهید.
کدهای کامل برنامه هم در ادامهی این مقاله و هم در ضمیمه آمدهاند.
مدار را مطابق شماتیک زیر در پروتئوس ببندید و تنظیمات قطعات را مطابق عکسهای زیر انجام دهید (حافظهی مموری کارت 1MB در نظر گرفته شده است تا فایل نهایی پروژه جهت آپلود کم حجم شود):
بعد از اولین اجرای شبیهسازی Proteus پیامهای خطایی خواهد داد که به دلیل نبودن فایلسیستم است! تصویر زیر را ببینید:
راهکار حل مشکل این است که یک بار با استفاده از برنامهی OSFMount فایل Image کارت حافظه که توسط پروتئوس ایجاد شده است را به ویندوز وصل کنیم تا بتوانیم آن را به فرمت FAT تبدیل کنیم.
ابتدا برنامهی OSFMount را اجرا کنید و سپس از منوی File گزینهی Mount new virtual disk را بزنید تا پنجرهی روبرو باز شود. مطابق شکل مقادیر پنجره را تنظیم کنید و روی OK کلیک کنید.
حالا باید فایل ما در ویندوز به شکل زیر متصل شده باشد:
همچنین درایور F نیز به صورت زیر دیده شود:
برای استفاده از درایو و تبدیل آن به FAT روی آن کلیک راست کرده و گزینهی Format را انتخاب کنید. سپس تنظیمات را با توجه به شکل انجام دهید و سپس عملیات فرمت را Start کنید. پیامهای هشدار را هم تأیید نمایید.
چون حجم درایو را 1MB درنظر گرفتیم، فقط میتوانیم از FAT12 استفاده کنیم؛ در حالیکه اگر حجم درایو را بیشتر میکردیم میتوانستیم FAT16 و FAT32 رو هم توی گزینهها ببینیم و با آنها فرمت کنیم.
کار ما با درایو مجازی تمام شد! به برنامه OSMount برگردید و روی دکمهی Dismount all & Exit کلیک کنید. با اجرای برنامهی شبیهسازی شده در Proteus میبینید که ایندفعه برنامه به خوبی کار میکند و تا انتها پیش میرود. با Mount مجدد فایل SDcard میتوانیم فایل ایجاد شده در فایل سیستم را هم ببینیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include <mega32a.h> #include <alcd.h> #include <ff.h> #include <delay.h> unsigned char buffer[16]; FRESULT res; unsigned int nbytes; FATFS drive; FIL file; char path[] = "0:/url.txt"; char text[] = "http://chipkadeh.ir"; // Timer 0 overflow interrupt service routine // disk_teimerproc avoids MemoryCard sleep! interrupt[TIM0_OVF] void timer0_ovf_isr(void) { TCNT0 = 0x31; disk_timerproc(); } void main(void) { lcd_init(16); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 3.906 kHz // Mode: Normal top=0xFF // OC0 output: Disconnected // Timer Period: 52.992 ms TCCR0 = (0 << WGM00) | (0 << COM01) | (0 << COM00) | (0 << WGM01) | (1 << CS02) | (0 << CS01) | (0 << CS00); TCNT0 = 0x31; OCR0 = 0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK = (0 << OCIE2) | (0 << TOIE2) | (0 << TICIE1) | (0 << OCIE1A) | (0 << OCIE1B) | (0 << TOIE1) | (0 << OCIE0) | (1 << TOIE0); #asm("sei") DDRB.1 = 1; PORTB.1 = 0; /* ============================ Write to disk ============================*/ f_mount(0, &drive); // mount f_open(&file, "url.txt", FA_WRITE | FA_OPEN_ALWAYS | FA_OPEN_EXISTING); f_write(&file, text, sizeof(text) - 1, &nbytes); // sizeof()-1 means no "\r" // or "\n" character f_close(&file); f_mount(0, 0); // dismount /* ============================ Read from disk ===========================*/ if ((res = f_mount(0, &drive)) == FR_OK) lcd_putsf("FAT mounted = OK"); delay_ms(1000); lcd_clear(); if ((res = f_open(&file, path, FA_READ)) == FR_OK) lcd_putsf("File open: url.txt"); delay_ms(1000); lcd_clear(); if ((res = f_read(&file, buffer, 20, &nbytes)) == FR_OK) lcd_putsf("Reading Data"); delay_ms(1000); lcd_clear(); lcd_puts(buffer); delay_ms(1000); f_close(&file); while (1); } |
دانلود فایل آموزشی بصورت PDF
CodeVision-ff-MMC-library-Virtualization.pdf
دانلود سورس پروتئوس و کدویژن
سلام ممنون از آموزشتون
یه مشکل با این پروژه دارم. احتمال دادم شما بتونید مشکل را حل کنید
بنده تمام مراحلی که گفتید را انجام میدم و از هر دو مرحله write to disk و read from disk داخل پروتئوس جواب گرفتم (برنامه در کدویژن نوشته شده). ولی مشکلی اینه که: RAM Global variables size در کدویژن سریع مقدارش افزایش پیدا میکنه و بعد از گذاشتن چند تا شرط ساده بر روی این دستورات (برای اینکه بفهمم تونسته فایل را باز کنه یا نه … شرط گذاشتم)، این حافظه RAM خطای is too large رو میزنه و دیگه برنامه داخل کدویژن کامپایل نمیشه!
سلام
من با micro sd هشت گیگ و میکروی atxmega128a1u کار میکنم. کارت حافظه رو هم به صورت fat32 فرمت کردم. تیکه کد f_mount چه کارت حافظه توی سوکت باشه چه نباشه(که عجیبه به نظرم) ok میده ولی وقتی به f_open میرسه انگار گیر میکنه. احیانا میدونین ممکنه مشکل از چی باشه؟
سلام دوست عزیز تابع f_mount پارامتر دومی داره که میگه آیا بره واقعا دیسک رو چک کنه یا نه که معمولا صفر میذاریمش و برای همین ok رو برمیگردونه اون پارامتر رو یک کنید و خواهید دید که با خطا مواجه میشید
حالا این که مشکل از کجاست بستگی به خطایی که بر میگردونه داره
سلام وقت بخیر ممنون از آموزش خوبتون من سوالی که داشتم اینه که اگه بخوایم به جای sd card این حرکت رو روی حافظه فلش که همون باspi کار می کنه بزنیم چه تغییری نیاز هست در کد ایجاد کنیم؟
خیلی بستگی داره که نوع حافظه فلش چی باشه
Nor باشه یا Nand باشه و برای هر کدام کتابخانه مناسبی وجود دارد
مثلا کتابخانه JFFS, JFFS2 و YAFFS رو ببینید
سلام.
تشکر از مطلب خوب و مفید تون.
1- بخش تایمر واقعا لازم است؟ کارت به حالت خواب بره مشکل چیه؟ فرض کنید خیلی وقتها اصلا با کارت حافظه کار نداریم.
مثلا یک فایل رو می خونیم و دیگه با کارت کاری نداریم. حالا چ نیازی به تایمر و خواب نرفتن کارت است؟
2- فرآیند خوندن از کارت به صورت یک سکتور 512 بایتی است یا بایت به بایت داره می خونه؟ چون تو کامپیوتر یک سکتور کامل خونده میشه.
سلام
تشکر
ولی چه طور میشه از طریق میکرو فایلی ایجاد کرد و داخل اون نوشت؟
مثال های chan رو ببینید داره همچین مثالی
سلام
من خیلی تلاش کردم که جواب بگیرم. از نظر سخت افزاری دقیقا مطابق چیزی که هست انجام دادم.
ولی هر کاری میکنم جواب نمیده.
این جمله فکرم رو خیلی در گیر کرده… که جمله نکته ی هست و ازش غافل شدم.!!
“یادتان باشد این تنظیمات برای شبیهسازی انجام شدهاند و برای واقعیت باید از روی راهنمای کتابخانه محاسبه را انجام دهید.”
میشه یه نفر پیدا بشه مشکل من حل بشه الان سه ماه در گیرشم.
ممنون
سلام
راه اندازی این سخت افزار واقعا چیز پیچیده ای نداره از چه میکروکنترلر و نرم افزاری استفاده میکند اگر از میکروکنترلر ۵ ولت دارید استفاده میکنید از چه روشی منطق ۳.۳ رو ایجاد میکنید ؟
سلام
ممنون از پاسخگویتون.
من از ATmega32 و نرم افزار Codevision استفاده میکنم.
خوب وقتی دارید از کدویژن استفاده میکنید – دیگه حتی نمیشه شک کرد که برنامه مشکل داره – احتمالا یه جایی یه چیزی کوچیکی رو در نظر گرفتید
سلام
من از ماژول آماده استفاده میکنم داخل خودش رگولاتور داره.
میشه بگید از کدوم پین های میکرو استفاده کردید + لینک ماژولی که دارید رو بدید ببینم ملاحضه خاصی داره
سلام
من این برنامه رو داخل پروتئوس قرار میدم به خوبی جواب میده.
ولی تو عمل نمی تونم ازش جواب بگیرم!!!
برنامه قبلا تست شده و فکر میکنم مشکل شما بیشتر سخت افزاری باشه و باید بگردید و علت اون رو پیدا کنید
سلام
سخت افزار رو چند بار چک کردم.
یه برنامه به یه زبان دیگه داشتم روی میکرو ریختم جواب داد.
فقط یه نکته من از مموری 4 گیگ دارم استفاده میکنم.مشکلی نداره؟؟(چون 1 گیگ نداشتم)
ممنون
اگه مطمئن هستید که سخت افزارتون با برنامه دیگه ای جواب میده – احتمالا باید پایه ای چیزی رو اشتباه تعریف کرده باشید توی این پروژه از کتابخانه های کدویژن استفاده شده است که احتمالا نباید مشکلی داشته باشند.
و این مقوله به ظرفیت حافظه هم ربطی نداره من با مموری ۱۶ گیگ هم تست کردم و مشکلی نداشتم پس از این بابت خیااتون راحت
ببنید توایع یه کد خطا بر میگردونن که معانی متفاتی دارند – اون کد خطا رو چک کنید بهتر میتونید به نتیجه برسید.
سلام
آیا میشه یه عدد مثلا دما رو ذخیره کرد و در کامپیوتر به صورت TEXT مشاهده کرد؟؟
ممنون
سلام دوست عزیز
بله میشه
برای آردوینو کتابخونه ی اس دی مناسب وجود نداره؟؟؟؟
البته منظورم اون کتابخونه ی داخل خود کامپایلر آردوینو نیست منظورم یه کتابخونه ی کم حجمه که بتونه میکرو های کوچیک تر مثل atmega8 سازگار باشه…
ممنون میشم راهنمایی کنید
درود
من این کتابخونه رو روی میکرو arm اجرا کردم با رم microsd 4GB و FAT32… موقعی که برنامه اجرا میشه ارور 5 که بمعنی fr_no_file هستش رو میده در حالی که فایل با همون اسم داخل sd card هستش و ظاهرا مثل اینکه فایل رو پیدا نمیکنه.
سلام
سخته در مورد این مشکل صحبت کنیم
با FAT16 هم یه تستی بزنید
شخصا این لایبرری را روی سخت افزار تست کردم و مشکلی نبوده
در ضمن مطمئن باشید که f_mount تونسته درست مموری و FAT را شناساییی کنه یعنی مقادیر برگشت را تست کنید
Return Values
FR_OK, FR_INVALID_DRIVE, FR_DISK_ERR, FR_NOT_READY, FR_NOT_ENABLED, FR_NO_FILESYSTEM
update: با فرمت کردن microsd مشکل به کلی حل شد …
تابع f_mount هم مقدار برگشتی اش از اول FR_OK بود و کارت بخوبی شناسایی شده بود ولی با فرمت کارت و اضافه کردن فایل جدید به رم، تابع f__open هم مقدار fr_ok رو برگردوند و عکس مورد نظر روی ال سی دی نمایش داده شد از روی رم microsd .
ممنون از پاسخگویی تون . Like
متشکر از شما
جالب بود
سایت شما بنظر من جز 5 سایت برتر آموزش الکترونیک ایران هست .
امیدوارم ادامه دار باشه …
متشکر از لطف شما و دوستانی که محتواهای خودشون را از این بستر منتقل میکنند