اطلاعیه

Collapse
No announcement yet.

مشکل راه اندازی lm35 و کارت microSD

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

    مشکل راه اندازی lm35 و کارت microSD

    سلام
    من تو یه پروژه باید دما و ساعت و تاریخ رو هر مثلا 5 دقیقه روی مموری کارد ذخیره کنم که سخت افزار رو ساختم و راه اندازی اولیه شده ولی دوتا مشکل دارم:

    1 - من به خاطر microSD تغذیه میکرو (مگا32) رو 3.3 دادم ولی تغذیه سنسور دمای lm35 رو 5 ولت (در دیتاشیتش گفته 4.5 تا 5.5) ولی دما رو اشتباه نشون میده حدود 45 تا 50 درجه.(من اومدم از رفرنس 2.56 داخلی استفاده کردم) و به صورت زیر دما رو بدست آوردم:
    کد:
    temp = read_adc(0);
    temp = (temp*2.56 / 1023)*100;
    2- من میخوام دما و زمان رو به صورت زیر در مموری ذخیره کنم:

    ولی فقط یک خط ذخیره میشه و در لحظه بعدی جایگزین دمای قبلی میشه به این صورت :
    من در این پروژه از زبان C و کتابخانه کدویژن استفاده میکنم.
    عملیات خواندن دما و تاریخ و ساعت و ذخیره در مموری توسط تابع زیر انجام میشه:
    کد:
    void write_data()
    {  
       
      unsigned char hour,min,sec,week_day,day,month,year,temp; 
      /* read the time from the RTC */
      rtc_get_time(&hour,&min,&sec);  
      /* read the date from the RTC */
      rtc_get_date(&week_day,&day,&month,&year); 
      // read adc
      temp = read_adc(0);
      temp = (temp*2.56 / 1023)*100;
      sprintf(text,"%2d:%02d...%2d/%02d/%d ---> Temp=%02d ",hour,min,day,month,2000+year,temp); 
      
      /* mount logical drive 0: */
      if ((res=f_mount(0,&fat))==FR_OK)
        printf("Logical drive 0: mounted OK\r\n");
      else
        /* an error occured, display it and stop */
        error(res);
      /* create a new file in the root of drive 0:
      and set write access mode */
      if ((res=f_open(&file,path,FA_CREATE_ALWAYS | FA_WRITE))==FR_OK)
        printf("File %s created OK\r\n",path);
      else
        /* an error occured, display it and stop */
        error(res);         
    
      // moves the file read/write pointer
      f_lseek(&file, 40); 
      
      /* write some text to the file,
      without the NULL string terminator sizeof(data)-1 */
      if ((res=f_write(&file,text,sizeof(text)-1,&nbytes))==FR_OK)
        printf("%u bytes written of %u\r\n",nbytes,sizeof(text)-1);
      else
        /* an error occured, display it and stop */
        error(res); 
    
      /* close the file */
      if ((res=f_close(&file))==FR_OK)
        printf("File %s closed OK\r\n",path);
      else
        /* an error occured, display it and stop */
        error(res);
    }
    ممنون میشم راهنمایی بفرمایید

    #2
    پاسخ : مشکل راه اندازی lm35 و کارت microSD

    این تابع را چه موقعی فراخوان میکنید؟
    چرا 40 کرکتر اول را خالی گذاشتی؟
    کد:
    f_lseek(&file, 40);
    دستور f_open را از این تابع بیرون بکش (هردفعه نیازی به باز کردن فایل نیست)
    فقط اول برنامه این کار را انجام بده
    کد:
    if ((res=f_open(&file,path,FA_CREATE_ALWAYS | FA_WRITE))==FR_OK)...
    انتهای string را با CR+LF تموم کن
    کد:
    sprintf(text,"%02d:%02d...%02d/%02d/%04d ---> Temp=%02d \r\n",hour,min,day,month,2000+year,temp);
    موفق باشید
    امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

    دیدگاه


      #3
      پاسخ : پاسخ : مشکل راه اندازی lm35 و کارت microSD

      نوشته اصلی توسط Abbas Sarami
      این تابع را چه موقعی فراخوان میکنید؟
      چرا 40 کرکتر اول را خالی گذاشتی؟
      کد:
      f_lseek(&file, 40);
      دستور f_open را از این تابع بیرون بکش (هردفعه نیازی به باز کردن فایل نیست)
      فقط اول برنامه این کار را انجام بده
      کد:
      if ((res=f_open(&file,path,FA_CREATE_ALWAYS | FA_WRITE))==FR_OK)...
      انتهای string را با CR+LF تموم کن
      کد:
      sprintf(text,"%02d:%02d...%02d/%02d/%04d ---> Temp=%02d \r\n",hour,min,day,month,2000+year,temp);
      موفق باشید
      سلام استاد
      ...من این تابع رو هر 5 دقیقه فراخوانی میکنم تا اطلاعات دما و زمان رو ثبت کنه
      ...من 40 کاراکتر رو به این خاطر خالی گذاشتم که طول رشته من حدود 31 کاراکتر است و چند تا هم space
      ...اگه از دستور open استفاده نکنم باید فایل رو نبندم و بجاش از دستور sync استفاده کنم تا تغییرات ذخیره بشه
      ...انتهای string رو CR+LF گذاشته بودم ، فرقی نکرد برداشتم!(نمیره خط بعدی)

      این کارها رو انجان داده بودم ولی نتیجه نداده بود.
      فکر کنم باید هردفعه محتویات فایل txt رو بخونم وطولش رو اندازه بگیرم بعد بپرم به انتهاش ولی نمیدونم چه جوری باید این کار رو بکنم.

      دیدگاه


        #4
        پاسخ : مشکل راه اندازی lm35 و کارت microSD

        ایراد برنامه شما بستن و باز کردن هر دفعه فایل هست
        مراحلی که شما طی میکنید اینه :
        1-بازکردن فایل
        2-پرش 40 بایت از اول فایل
        3-نوشتن در فایل
        4-بستن فایل
        این روند هرچقدر تکرار بشه باز هم یک خط مینویسه (کاملاً واضحه)
        اگه از دستور open استفاده نکنم باید فایل رو نبندم و بجاش از دستور sync استفاده کنم تا تغییرات ذخیره بشه
        بله دقیقاً باید همین کار را انجام بدهید
        نیازی نیست هر دفعه f_mount را فراخوان کنید ، این تابع را در ابتدای برنامه و پس از disk_init و یا در مواقعی که بازکردن فایل به مشکل بر میخوره (مثل جاهایی که (error(res نوشتید) فراخوان کنید

        این کد را تست کن ، من خودم شرایط تست را ندارم
        این همون برنامه خودته، فقط به دستور f_lseek توجه کن
        کد:
        void write_data()
        {  
          unsigned char hour,min,sec,week_day,day,month,year,temp; 
          /* read the time from the RTC */
          rtc_get_time(&hour,&min,&sec);  
          /* read the date from the RTC */
          rtc_get_date(&week_day,&day,&month,&year); 
          // read adc
          temp = read_adc(0);
          temp = (temp*2.56 / 1023)*100;
          sprintf(text,"%02d:%02d...%02d/%02d/%d ---> Temp=%02d\r\n",hour,min,day,month,2000+year,temp); 
          
        
          /* write some text to the file,
          without the NULL string terminator sizeof(data)-1 */
          
        	
        	
        	  /* create a new file in the root of drive 0: and set write access mode */
          if ((res=f_open(&file,path,FA_CREATE_ALWAYS | FA_WRITE))==FR_OK)
            printf("File %s created OK\r\n",path);
          else
            /* an error occured, display it and stop */
            error(res); 
        
          // moves the file pointer to end of file
          if(file.fsize>0) f_lseek(&file, file.fsize-1); 
        	
        	
        	
        	if ((res=f_write(&file,text,sizeof(text)-1,&nbytes))==FR_OK)
            printf("%u bytes written of %u\r\n",nbytes,sizeof(text)-1);
          else
            /* an error occured, display it and stop */
            error(res);
        
        
        
          /* close the file */
          if ((res=f_close(&file))==FR_OK)
            printf("File %s closed OK\r\n",path);
          else
            /* an error occured, display it and stop */
            error(res); 	  
        }
        موفق باشید
        امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

        دیدگاه


          #5
          پاسخ : مشکل راه اندازی lm35 و کارت microSD

          ممنون که جواب دادید
          متاسفانه فعلا سخت افزارم مشکل پیدا کرده و کار نمیکنه
          دارم روش کار میکنم.
          نتیجه رو اینجا اعلام میکنم

          دیدگاه

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