اطلاعیه

Collapse
No announcement yet.

کتابخانه ff.h

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    پاسخ : کتابخانه ff.h

    نوشته اصلی توسط POLESTAR
    تابع ششم f_lseek

    کد:
    FRESULT f_lseek (
     FIL* FileObject,  /* Pointer to the file object structure */
     DWORD Offset    /* File offset in unit of byte */
    );


    (افست بایت,اشاره گر فایل)f_lseek
    هست
    حالا این تابع چیه و به چه درد میخوره؟
    برای پرش به بایتی در دیتای فایلی که قبلا باز کردیم و قراره خونده یا نوشته بشه به کار میره

    کجا باید ازش استفاده کرد؟
    اگر بخواهیم دیتای فایلی رو از یه ادرس خاصی به جز ادرس جاری بنوسیم یا بخونیم از این تابع باید استفاده کنیم

    ورودی و خروجی هاش؟
    دو تا ورودی داره
    1 : اشاره گر فایل FileObject یه اشاره گر به متغیری که باید قبل از این تابع از نوع استراکچر FIL تعریف شده باشه
    2 : مقدار ادرس دیتایی که باید فایل از این ادرس خونده یا نوشته بشه

    و یک خروجی خطا داره که 6 حالت داره
    FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT
    توضیح خطا ها هم مثل توابع قبلی هست

    برای استفاده از این تابع باید FS_MINIMIZE_ کوچکتر از 3 باشد
    جناب اسدی با عرض پوزش یک پرسش:
    من محتویات یه فایل txt رو خوندم و از تابع f_lseek هم برای پریدن به بایت دیگه استفاده کردم اما هر کاری کردم نتونستم خط بعدی از متن داخل فایل رو بخونم. در صورت امکان این رو هم آموزش بدین :applause:
    سپاس

    دیدگاه


      پاسخ : کتابخانه ff.h

      دستوری برای خواندن خط وجود نداره
      اگه خواستی این کار را انجام بدی باید بایت به بایت بخونی و به بایت CR و LF که رسیدی یک خط خواندی

      بایت LF مقدار 0x0A
      بایت CR مقدار 0x0D

      موفق باشید
      امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

      دیدگاه


        پاسخ : کتابخانه ff.h

        نوشته اصلی توسط Abbas Sarami
        دستوری برای خواندن خط وجود نداره
        اگه خواستی این کار را انجام بدی باید بایت به بایت بخونی و به بایت CR و LF که رسیدی یک خط خواندی

        بایت LF مقدار 0x0A
        بایت CR مقدار 0x0D

        موفق باشید
        واقعا سپاس گزارم جواب داد :wow:

        دیدگاه


          پاسخ : کتابخانه ff.h

          ببخشید من هنوز یه مشکل دارم :cry:
          من طبق توضیحات شما و با فرض این که طول خط مشخص هست آخر هر خط 2 بایت دیگه هم در نظر گرفتم و از روی اون 2 بایت پرش کردم و ادامه فایل رو خوندم. اما نتونستم خود بایت های LF و CR رو بخونم. چه جوری میشه اونا رو خوند؟

          دیدگاه


            پاسخ : کتابخانه ff.h

            نوشته اصلی توسط Sina.psh
            ...اما نتونستم خود بایت های LF و CR رو بخونم. چه جوری میشه اونا رو خوند؟
            منظورتون چیه؟
            CR و LF هر دو بایت هستند
            شما هنگام تایپ وقتی کلید Enter را میزنی این دو بایت به متن شما اضافه میشه و یک خط جدید ایجاد میشه
            مثلاً یک متن این شکلی داریم:
            کد:
            1234
            5678
            وقتی بایت های این فابل متنی را ببینی این شکلی هست(مقادیر هگز):
            کد:
            31 32 33 34 0D 0A 35 36 37 38
            موفق باشید
            امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

            دیدگاه


              پاسخ : کتابخانه ff.h

              منظورم این بود که
              متغیر هایی که برای خوندن تعیین کردم از نوع char هستند که تابع f_read بایت به بایت اطلاعات رو میخونه و توی اونا قرار میده مثلا ;[Char buff1 [16 که محتویاتشون کاراکتر های اسکی هستند (هر چی تو فایل نوشتم) نه کد hex و روی lcd نمایششون میدم
              به اون 2 بایت هم که میرسم اصلا نمیدونم چه چیزی دقیقا خونده میشه کد hex ؟ دسیمال؟! اسکی؟ با هر مقداری هم که مقایسه میکنم با 0x0A ، 0x0D ، 26 و ... جواب نمیده قابل نمایشم که نیست اصلا نمیدونم عدده یا رشته!
              با هر روشی رفتم نشد

              دیدگاه


                پاسخ : کتابخانه ff.h

                برنامه را بذار ببینم چیکار کردی
                امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                دیدگاه


                  پاسخ : کتابخانه ff.h

                  ببخشید یه کم نا مرتبه :mrgreen:

                  کد:
                  #include <mega32.h>
                  #include <ff.h>
                  #include <stdio.h>
                  #include <delay.h>
                  #include <string.h>
                  
                  #asm 
                   .equ __lcd_port=0x1B
                  #endasm
                  
                  #include <lcd.h>
                  
                  
                  
                  FATFS fs;   // Work area (file system object) for logical drive
                  FIL ftest;   // file objects
                  char lcd_buff[32];
                  
                  /*---------------------------------------------------------*/
                  /* 100Hz timer interrupt generated by OC2         */
                  /*---------------------------------------------------------*/
                  interrupt [TIM2_COMP] void timer2_comp_isr(void)
                  {
                    disk_timerproc();  /* Drive timer procedure of low level disk I/O module */
                  }
                  
                  
                  
                  FRESULT scan_files (char *path){
                  
                  FRESULT res;
                  FILINFO fno;
                  DIR dir;
                  int i;
                  char *fn; 
                  
                  #if _USE_LFN
                    static char lfn[_MAX_LFN + 1];
                    fno.lfname = lfn;
                    fno.lfsize = sizeof(lfn);
                  #endif
                  
                    res = f_opendir(&dir, path);            // Open the directory
                    if (res == FR_OK) {
                      i = strlen(path);
                      for (;;) {
                        res = f_readdir(&dir, &fno);          // Read a directory item
                        if (res != FR_OK || fno.fname[0] == 0) break; // Break on error or end of dir
                        if (fno.fname[0] == '.') continue; 
                  
                  #if _USE_LFN
                        fn = *fno.lfname ? fno.lfname : fno.fname;
                  #else
                        fn = fno.fname;
                  #endif 
                  
                        if (fno.fattrib & AM_DIR) {          // It is a directory
                          sprintf(&path[i], "/%s", fn);
                          res = scan_files(path);
                          if (res != FR_OK) break;
                          path[i] = 0;
                        } else {                    // It is a file.
                            printf("\n%s/%s", path, fn);
                          // sprintf(lcd_buff,"%s/%s", path, fn);
                          // sprintf(lcd_buff, "%s", fn);
                            
                        }
                      }
                    }
                  
                    return res;
                  }
                  
                  void main(void){
                    char filename[15]="Data.txt";
                    unsigned int bw;     // File R/W count
                    char buff[16];
                    char buff2[16];
                    char buff3[16];
                    char buff4[16]; 
                    char buff6[16];
                    char buff7[10];
                    char buff5[10];
                    char path[16]; 
                    UCSRB=0x18;
                    UCSRC=0x86;
                    UBRRL=0x33;
                    OCR2 = 78-1;    // Timer2: 100Hz interval (OC2)
                    TCCR2 = 0b00001111;
                      TIMSK=0x80;  
                      DDRB=1;
                      DDRC.0=1;
                      PORTC.0=1;
                    #asm("sei")
                    lcd_init(16);
                    lcd_clear();
                    PORTC.0=0;                   
                    lcd_gotoxy(0,0);
                    lcd_putsf("SD Card init...");
                    
                    if(disk_initialize(0)==STA_NOINIT)
                     while(1); // stop! if card was not present or was not detected currectly
                      delay_ms(1000);
                      PORTC.0=1;
                      lcd_clear();
                      f_mount(0,&fs); 
                      //    f_mkfs(0,1,512);
                      //    f_mkdir(filename);
                      f_open(&ftest, filename, FA_OPEN_EXISTING | FA_READ);
                  
                      f_read(&ftest, buff, 3, &bw);
                      ftest.fptr=4;
                      f_lseek(&ftest, ftest.fptr);
                      f_read(&ftest, buff2, 3, &bw);
                      ftest.fptr=8;
                      f_lseek(&ftest, ftest.fptr);
                      f_read(&ftest, buff3, 3, &bw);
                      ftest.fptr=12;
                      f_lseek(&ftest, ftest.fptr);
                      f_read(&ftest, buff4, 3, &bw);
                      ftest.fptr=15;
                      f_lseek(&ftest, ftest.fptr);
                      f_read(&ftest, buff5, 1, &bw);
                      ftest.fptr=16;
                      f_lseek(&ftest, ftest.fptr);
                      f_read(&ftest, buff7, 1, &bw);
                      ftest.fptr=17;
                      f_lseek(&ftest, ftest.fptr);
                      f_read(&ftest, buff6, 16, &bw);
                      f_close(&ftest);
                      scan_files (path);
                      f_mount(0, NULL);
                      PORTC.0=0;
                      lcd_gotoxy(0,0);
                      lcd_puts(buff);
                      lcd_gotoxy(4,0);
                      lcd_puts(buff2);
                      lcd_gotoxy(8,0);
                      lcd_puts(buff3);
                      lcd_gotoxy(12,0);
                      lcd_puts(buff4);
                      
                      while(1);              
                  }
                  این محتویات txt:
                  کد:
                  120 243 212 181
                  0123456789abcde
                  برای همین 4 تا 3 بایتی رو خوندم (خط اول txt)

                  دیدگاه


                    پاسخ : کتابخانه ff.h

                    شما میتونی از تابع f_gets استفاده کنید:
                    کد:
                    TCHAR* f_gets (
                     TCHAR* buff, /* [OUT] Read buffer */
                     int len,   /* [IN] Size of the read buffer */
                     FIL* fp   /* [IN] File object */
                    );
                    همانطور که مشخصه تابع یک اشاره گر بافر برای دیتا می گیره TCHAR* buff
                    حداکثر طول خط را باید بهش بدهید int len
                    و اشاره گر فایل مورد نظر را FIL* fp

                    خروجی تایع رشته خوانده شده از خط هست
                    در انتهای بافر خوانده شده کرکتر 0\ اضافه میشه (null)
                    هنگامی که خطی خوانده نشه ، برای اشاره گر بافر مقدار null برمیگردونه

                    برای دسترسی به این تابع باید در فایل ffconf.h پارامتر USE_STRFUNC_ را مقدار دهی کنید:
                    0 = غیر فعال
                    1 = حساس به r\n\
                    2 = حساس به n\

                    موفق باشید

                    امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                    دیدگاه


                      پاسخ : کتابخانه ff.h

                      نوشته اصلی توسط Abbas Sarami
                      دستوری برای خواندن خط وجود نداره
                      ...
                      بابت این پست عذرخواهی میکنم ، اطلاعی از توابع string نداشتم :redface:

                      موفق باشید
                      امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                      دیدگاه


                        پاسخ : کتابخانه ff.h

                        نفرمایید از توجه و راهنماییتون شدیدا سپاسگذارم :biggrin:

                        دیدگاه


                          پاسخ : کتابخانه ff.h

                          فایل اکسل که شاید نشه ولی تو فایل بدون فرمت راحت میشه
                          در زیر این نقاب چیزی بیشتر از گوشت هست. در زیر این نقاب یک ایده هست و ایده ها ضدگلوله هستند.

                          1-به اندازه ی باورهای هر کسی ؛ با او حرف بزن …. بیشتر که بگویی ، تو را احمق فرض خواهد کرد …!!!
                          2-تنها دو گروه نمى توانند افکار خود را عوض کنند: دیوانگان تیمارستان و مردگان گورستان.
                          3-آدم ها مثل عکس ها هستند: زیاد بزرگشون کنی ، کیفیتشون میاد پایین!

                          دیدگاه


                            پاسخ : کتابخانه ff.h

                            دوستان من به لطف آقای بیرامی و راهنمایی‌هاشون تونستم یک چیزایی بنویسم البته یکم قانون گریزی هم از حرفای ایشون کردم.
                            سوالی که الان دارم من وقتی از A2D سیگنال رو میخونم خیلی زود میخونه و توی فایل ورد ذخیره می‌کنه و مشکلی نیست، مشکل من سر اینه که همش یک عدد ذخیره میشه.
                            بطور مثال وقتی ورودی سینوسی با فرکانس‌های متفاوتی به مدار میدم و میزنم کد هگز رو ذخیره کنه،مثلا با یک فرکانس فقط 20، با فرکانس دیگر فقط 80، فرکانس دیگر فقط F6 ذخیره میشه. میخواستم ببینم راه حل شما اساتید عزیز در این باره چیه؟

                            اینم کد برنامه

                            کد:
                            #include <ff.h>
                            
                            #include <stdio.h>
                            
                            #include <mega32a.h>
                            
                            #include <delay.h>
                            
                            #include <alcd.h>
                            
                            #define ADC_VREF_TYPE 0x20
                            
                            #define T1_OVF_FREQ 100
                            #define T1_PRESC 1024L
                            #define T1_INIT (0x10000L-(_MCU_CLOCK_FREQUENCY_/(T1_PRESC*T1_OVF_FREQ)))
                            
                            FRESULT res;
                            unsigned int nbytes;
                            FATFS drive;
                            FIL file;
                            char path3[]="0:/new.doc";
                            unsigned char ADC_buffer[16];
                            unsigned char lcd_buf[32];
                            unsigned char digital=0;
                            /* error message list */
                            flash char * flash error_msg[]=
                            {
                            "", /* not used */
                            "FR_DISK_ERR",
                            "FR_INT_ERR",
                            "FR_INT_ERR",
                            "FR_NOT_READY",
                            "FR_NO_FILE",
                            "FR_NO_PATH",
                            "FR_INVALID_NAME",
                            "FR_DENIED",
                            "FR_EXIST",
                            "FR_INVALID_OBJECT",
                            "FR_WRITE_PROTECTED",
                            "FR_INVALID_DRIVE",
                            "FR_NOT_ENABLED",
                            "FR_NO_FILESYSTEM",
                            "FR_MKFS_ABORTED",
                            "FR_TIMEOUT"
                            };
                            
                            /* display error message and stop */
                            void error(FRESULT res)
                            {
                            if ((res>=FR_DISK_ERR) && (res<=FR_TIMEOUT))
                              sprintf(lcd_buf,"%p",error_msg[res]);
                              lcd_clear();
                              lcd_puts(lcd_buf); 
                              delay_ms(2000);
                            }
                            
                            
                            
                            interrupt [TIM1_OVF] void timer_comp_isr(void)
                            {
                            /* re-initialize Timer1 */
                            TCNT1H=T1_INIT>>8;
                            TCNT1L=T1_INIT&0xFF;
                            /* card access low level timing function */
                            disk_timerproc();
                            }
                            
                            interrupt [ADC_INT] void adc_isr(void)
                            {
                            //unsigned char adc_data;
                            
                            //adc_data=ADCH;
                            
                            }
                            
                            void main(void)
                            {
                            TCCR1A=0x00;
                            TCCR1B=(1<<CS12)|(1<<CS10);
                            TCNT1H=T1_INIT>>8;
                            TCNT1L=T1_INIT&0xFF;
                            TIMSK=1<<TOIE1;
                            TWCR=0x00;
                            ADMUX=ADC_VREF_TYPE;
                            ADCSRA=0xED;
                            SFIOR&=0x1F;
                            delay_ms(1000);
                            #asm("sei")
                            
                            lcd_init(16);
                            
                            
                            lcd_clear();
                            if ((res=f_mount(0,&drive))==FR_OK)
                              lcd_putsf("FAT mounted = OK");  
                            else error(res);
                            delay_ms(2000);
                                    
                            PORTA=0x00;
                            DDRA=0x00;
                             
                            PORTB=0x00;
                            DDRB=0x00;
                             
                            PORTC=0x00;
                            DDRC=0x00;
                             
                            PORTD=0x00;
                            DDRD=0x00;
                            
                            
                            TCCR0=0x00;
                            TCNT0=0x00;
                            OCR0=0x00;
                            
                            
                            ICR1H=0x00;
                            ICR1L=0x00;
                            OCR1AH=0x00;
                            OCR1AL=0x00;
                            OCR1BH=0x00;
                            OCR1BL=0x00;
                            
                            
                            ASSR=0x00;
                            TCCR2=0x00;
                            TCNT2=0x00;
                            OCR2=0x00;
                            
                            MCUCR=0x00;
                            MCUCSR=0x00;
                            
                            
                            
                            
                            UCSRB=0x00;
                            
                            ACSR=0x80;
                            
                            
                            SPCR=0x00;
                            
                            
                            
                            lcd_init(16);
                            
                            
                            #asm("sei")
                            lcd_clear();
                            if ((res=f_open(&file,path3,FA_WRITE))==FR_OK)
                              lcd_putsf("File opened new");  
                            else error(res);
                            delay_ms(2000);
                            while (1)
                               {
                               // Place your code here
                               digital=ADCH;
                               sprintf(ADC_buffer,"%X \r",digital);
                               f_write(&file,ADC_buffer,16,&nbytes);
                               f_sync(&file);
                               }
                            }
                            ممنون

                            دیدگاه


                              پاسخ : کتابخانه ff.h

                              درست شد.
                              مشکل از تنظیمات A2D بود که حل شد. :job: :nice: :nice: :nice:

                              دیدگاه


                                پاسخ : کتابخانه ff.h

                                سلام به همه
                                بر آخرین منجی صلوات
                                دوستان توی این کتابخونه من بدجوری گیر کردم!
                                من با Atmel Studio مینویسم و با اینکه اصل کتابخونه با gcc هست اما هنوز کارم راه نیفتاده
                                من کلیه فایلهای زیر رو از پوشه avr_complex بر میدارم و توی یک پوشه به نام libff که توی پوشه اصلی پروژست میریزمشون:
                                کد:
                                diskio.h
                                ff.h
                                ffconf.h
                                integer.h
                                بعدم دو فایل زیر رو باز از پوشه avr_complex بر میدارم و توی محیط اصلی پروژه قرار میدم و بعدم از طریق add و existing item به پروژه اضافشون میکنم:
                                کد:
                                ff.c
                                mmc_avr.c
                                تغییری به ffconf.h نمیدم چون لازم نیست به غیر از گاهی که مقدار زیر رو صفر می کنم:
                                کد:
                                #define	_FS_TINY		1
                                بعدم توی فایل هایی که پسوندشون c هست هر کدوم که فایل دیگه ای رو اینکلود کردن رو پشت اسم فایل انکلود شده اسم پوشه رو مینویسم مثل زیر:
                                کد:
                                #include "libff/ff.h"			
                                #include "libff/diskio.h"
                                اون فایل هاییم که پسوندشون h هست چون توی پوشه ای هستن که بقیه فایلها با پسوند h هم پیششون هست اگر فایلی انکلود کرده باشن رو هیچ تغییری نمیدم
                                بعدم برنامه زیر رو کامپایل میکنم که هیچ error یی نمیده اما توی پروتئوس و عمل کار نمیکنه
                                کد:
                                #include <avr/io.h>
                                #define F_CPU 8000000UL
                                #include <util/delay.h>
                                #include <avr/interrupt.h>
                                // LCD Configuration
                                #define LCD_BUS HANDGLASS_LCD_4BIT_4LINE_5X7
                                #define LCD_RW_STATE 0
                                #define LCD_SIZE  (20*4)
                                #define LCD_SPEED 3
                                #define LCD_DDR DDRC
                                #define LCD_PORT PORTC
                                #include "handglass_alphabet_lcd.h"
                                //////////////////////////////////////////////////////////////////////////
                                #include "libff/ff.h"		/* Declarations of FatFs API */
                                
                                FATFS FatFs;		/* FatFs work area needed for each volume */
                                FIL Fil;			/* File object needed for each open file */
                                
                                int main (void)
                                {
                                	UINT read_num,read_counter,buffer[16];
                                
                                 	lcd_init();
                                 	
                                 	lcd_gotoxy(1,1);
                                 	lcd_put("Read Micro SD");
                                 	lcd_gotoxy(2,1);
                                 	lcd_put("mahdi rahi");
                                 	_delay_ms(500);
                                 	lcd_clear();
                                 	lcd_put("Init Drive");
                                 	
                                 	while (disk_initialize(0)!=FR_OK) _delay_ms(100);
                                 	lcd_put("-->OK");
                                 	_delay_ms(500);
                                 	lcd_clear();
                                 	lcd_put("mount Drive");
                                 	
                                 	while (f_mount(&FatFs, "", 0)!=FR_OK) _delay_ms(100);
                                 	
                                 	lcd_put("-->OK");
                                 	_delay_ms(500);
                                 	lcd_clear();
                                 	lcd_put("Open File");
                                 	
                                 	while (f_open(&Fil, "newfile.txt", FA_WRITE | FA_CREATE_ALWAYS) !=FR_OK) _delay_ms(100);
                                 	
                                 	lcd_put("-->OK");
                                 	_delay_ms(500);
                                 	lcd_clear();
                                 	lcd_put("Read File");
                                 	
                                 	read_num=512;
                                 	while (f_read(&Fil,buffer,read_num,&read_counter)!=FR_OK) _delay_ms(100);
                                 	
                                 	lcd_put("-->OK");
                                 	_delay_ms(500);
                                 	lcd_clear();
                                 	lcd_put("Close File");
                                 	
                                 	while (f_close(&Fil)!=FR_OK) _delay_ms(100);
                                 	
                                 	lcd_put("-->OK");
                                 	_delay_ms(500);
                                 	lcd_clear();
                                 	lcd_put(buffer);
                                 	_delay_ms(500);
                                 	
                                 	
                                 	while(1)
                                 	{
                                	 	
                                 	}
                                }
                                
                                /*---------------------------------------------------------*/
                                /* User Provided RTC Function called by FatFs module    */
                                
                                DWORD get_fattime (void)
                                {
                                	/* Returns current time packed into a DWORD variable */
                                	return	 ((DWORD)(2013 - 1980) << 25)	/* Year 2013 */
                                	| ((DWORD)7 << 21)				/* Month 7 */
                                	| ((DWORD)28 << 16)				/* Mday 28 */
                                	| ((DWORD)0 << 11)				/* Hour 0 */
                                	| ((DWORD)0 << 5)				/* Min 0 */
                                	| ((DWORD)0 >> 1);				/* Sec 0 */
                                }
                                اینم از مداری که میبندم به همراه فایل پروتئوس:
                                http://uploadazad.com/uploads/pgn0_new_folder.zip


                                از pff.h تونستم جواب بگیرم اما توی کارم به ff.h احتیاج دارم
                                لطفا کمک کنین :sad:
                                ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ*فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
                                شهید دکتر مصطفی چمران
                                اللهم صل علی محمد و ال محمد و عجل فرجهم
                                ; C is not for children

                                دیدگاه

                                لطفا صبر کنید...
                                X