قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

احمد شهيد جواد
:: مهندس متميز ::
تاريخ التسجيل: Apr 2015
الدولة: العراق
المشاركات: 324
نشاط [ احمد شهيد جواد ]
قوة السمعة:0
قديم 27-04-2018, 08:25 AM المشاركة 1   
افتراضي خزن متغير float في الايبروم Twitter FaceBook Google+



السلام عليكم ,, كيف الحال اخوتي الاعزاء

اريد حفظ متغير من نوع float في الايبروم .. حاولت ان احول قيمة المتغير الى رقم صحيح ومن ثم حفظه في الايبروم وعند القراءة اعيد تحويله لكسر . هكذا

كود:
      int y;
      float i=74.501;
      
      y= =i*1000;
      
      EEPROM_Write(0,y/100);
      EEPROM_Write(1,y%100);
      
      0Delay_ms(6);
      y=(EEPROM_Read(1)*255)+EEPROM_Read(0);
y=y/1000;

وعند التنفيذ كانت النتيجة هكذا



تم تشفيت الكسر الى اول بتات .. لا اعلم لماذا ؟ هل إن المتغير float 4 byat والمتغير int 2 byte اثر في ذلك ؟

------------------------------------------------------------------------------------------

بالبحث في الانترنيت وجدت هذا الكود

كود:
typedef unsigned char byte;
typedef unsigned int word;

float Eeprom_Read_Float(word addr)
{
      float result;
byte *ptr= (byte *)&result;E
      byte i;

      for (i=0;i<4;i++)
          *(ptr++)=Eeprom_Read(addr++);

      return result;
}

void Eeprom_Write_Float(word addr,float data_)
{
      byte *ptr= (byte *)&data_;
      byte i;

      for (i=0;i<4;i++)
          {  Eeprom_Write(addr++,*(ptr++));}
}
لم افهم كيف ينفذ , وبالذات هذا الامر

كود:
 byte *ptr= (byte *)&result;
فلو تفضل احد الاخوة بشرح كيفية عمله ...

تحياتي للجميع


التعديل الأخير تم بواسطة : احمد شهيد جواد بتاريخ 27-04-2018 الساعة 08:34 AM
اعلانات

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:408
قديم 28-04-2018, 05:52 AM المشاركة 2   
افتراضي


المشكلة أنك لا تعلم كم علامة عشرية فى المتغير لتستخدم هذه الطريقة لذا أمامك حلان
إما تحدد العلامات العشرية برقمين أو ثلاث و من ثم تعلم انك ستضرب فى 100 أو 1000 بحسب الدقة المطلوبة ثم تقسم على ذات الرقم

أو الحل الآخر أن تستخدم الدوال
Lo
Hi
Higher
Highest
,وهى تعطى بالترتيب البايت الأقل فالأعلى فالأعلى فالأعلى
بها تقرأ الاربع بايتات للمتغير و تحفظهم فى EEPROM ثم عند الحاجة تقرأ البايتات الأربع من EEPROM و بذات الدوال تعيد تركيب المتغير مرة أخرى
فى ملف المساعدة شرح وافى لهم فى قسم
Built-in Routines

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً احمد شهيد جواد ( شكر العضو على هذه المشاركة )
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:408
قديم 28-04-2018, 06:03 AM المشاركة 3   
افتراضي


معذرة لم الحظ الجزء الخاص بال pointer
هل جربت هذا الكود و قام بالعمل كما يجب؟؟
فى البدء فكرت فى ال pointer كحل ولكم عندما قرأته وجدت انه عندما يشير إلى متغير فإن الزيادة ++ لا تزيد بواحد ولكن تزيد بعدد البايتات المكون منها هذا المتغير أى تشير للمتغير التالى (مثلا لو مصفوفة)
ربما هذا للتحايل على هذا الموضوع و الزيادة ببايت كل مرة بدلا من 4

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً احمد شهيد جواد ( شكر العضو على هذه المشاركة )

احمد شهيد جواد
:: مهندس متميز ::
تاريخ التسجيل: Apr 2015
الدولة: العراق
المشاركات: 324
نشاط [ احمد شهيد جواد ]
قوة السمعة:0
قديم 29-04-2018, 10:32 AM المشاركة 4   
افتراضي


السلام عليكم استاذ ماجد ,, شكرا جزيلاً لحضرتك لما تبذله معي من وقت وما تمنحني اياه من علماً نافع ...

استخدمت الدوال التي ذكرتها . حيث كتبت

كود:
void store_float(unsigned int adres, float sayi){
eeprom_write(adres,lo(sayi));
delay_ms(20);
eeprom_write(adres+1,hi(sayi));
delay_ms(20);
eeprom_write(adres+2,higher(sayi));
delay_ms(20);
eeprom_write(adres+3,highest(sayi));
delay_ms(20);
}


float read_float(unsigned int adres){
float th;
lo(th)=eeprom_read(adres);
hi(th)=eeprom_read(adres+1);
higher(th)=eeprom_read(adres+2);
highest(th)=eeprom_read(adres+3);
return th;
}
وقمت بأستدعاء دالة built_in

كود:
#include <built_in.h>
والنتيجة كانت





عمل على اكمل وجه في المحاكاة

ولكن في العملي لم يعمل بل بمجرد استدعاء دالة القراءة المايكرو يتجمد

وهذا الكود كاملا
كود:
#include <built_in.h>
//#include <eprom.h>


sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D4 at RB2_bit;
sbit LCD_D5 at RB3_bit;
sbit LCD_D6 at RB4_bit;
sbit LCD_D7 at RB5_bit;

sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D7_Direction at TRISB5_bit;

#define relay1           portd.f7
#define relay2           portd.f6
#define relay3           portd.f5
#define relay4           portd.f4
#define relay5           portc.f7
#define led_check        portd.f1



#define relay1_dir       trisd.f7
#define relay2_dir       trisd.f6
#define relay3_dir       trisd.f5
#define relay4_dir       trisd.f4
#define relay5_dir       trisc.f7
#define led_check_dir    trisd.f1

#define sw1              portc.f2
#define sw2              portc.f3
#define sw3              portd.f0

#define sw1_dir          trisc.f2
#define sw2_dir          trisc.f3
#define sw3_dir          trisd.f0

#define led_low              portc.f4
#define led_normal           portd.f3
#define led_high             portd.f2

#define led_low_dir           trisc.f4
#define led_normal_dir        trisd.f3
#define led_high_dir         trisd.f2

char x=0;  float read_sensor_input; float read_sensor_output;
char txt[15]; char txt1[15];  char normal=0;    int ss;
char over[8];          char edit=0;
char flag_data[8];     char rrr=0;  float mm=0;  char yy=0;
int time_data[8];
float factor=74.23;      unsigned long save_data;
typedef unsigned char byte;
typedef unsigned int word;
void micro()
{
 
 
 lcd_init();
 lcd_cmd(1);
 lcd_cmd(12);
 
 ADC_Init();
 TRISA.F3=1;
 TRISA.f5=1;
 relay1_dir=0;
 relay2_dir=0;
 relay3_dir=0;
 relay4_dir=0;
 relay5_dir=0;

 
 sw1_dir=1;
 sw2_dir=1;
 sw3_dir=1;
 
 led_low_dir=0;
 led_normal_dir=0;
 led_high_dir=0;
 
 led_low=1;
 led_normal=1;
 led_high=1;
 
 relay1=0;
 relay2=0;
 relay3=0;
 relay4=0;
 relay5=0;
 led_check_dir=0;
 led_check=0;
 lcd_out(1,4, "HELLOoo");


 for(x=0;x<6;x++){ led_check=!led_check; Delay_ms(500);}

  lcd_cmd(1);
}



void store_float(unsigned int adres, float sayi){
eeprom_write(adres,lo(sayi));
delay_ms(20);
eeprom_write(adres+1,hi(sayi));
delay_ms(20);
eeprom_write(adres+2,higher(sayi));
delay_ms(20);
eeprom_write(adres+3,highest(sayi));
delay_ms(20);
}


float read_float(unsigned int adres){
float th;
lo(th)=eeprom_read(adres);
hi(th)=eeprom_read(adres+1);
higher(th)=eeprom_read(adres+2);
highest(th)=eeprom_read(adres+3);
return th;
}

void read_analoge()
{
 read_sensor_input=0.0;

 for(x=0;x<50;x++)
 {
 
 read_sensor_input+=adc_read(3);


 Delay_ms(1);
  }
 read_sensor_input=read_sensor_input/50;

}
void set_factor()
{

  lcd_cmd(1);
 
 while(1)
 {
  lcd_out(1,1,"factor=");
  floatToStr(factor,txt);

        for(x=0;x<14;x++)
    {

   if(txt[x]!=' '){lcd_chr_cp(txt[x]);}

    }
    
   
    if(sw1==1){ Delay_ms(250); factor=factor+1.0;edit=1;}

    if(sw2==1){ Delay_ms(250); factor=factor-1.0;edit=1;}


    if(sw3==1){ Delay_ms(250); store_float(0,factor); lcd_cmd(1); lcd_out(1,1,"Data Seved"); Delay_ms(1500); lcd_cmd(1);return;}
    }

}
 
 
void main() 
{
  micro();

  Delay_ms(100);
  

  factor=  read_float(0);
  while(1)
  {

 if(sw3){ Delay_ms(250); set_factor();}
 
 if(sw1){ Delay_ms(250); read_float(0);}
   

   
     read_analoge();
  
   read_sensor_input=(read_sensor_input*5000)/1023;

    read_sensor_input/=1000;

    floatToStr(read_sensor_input,txt);
    lcd_out(1,1,"Vson=");
     for(x=0;x<14;x++)
    {

   if(txt[x]!=' '){lcd_chr_cp(txt[x]);}

    }

    read_sensor_input*= factor;

    floatToStr(read_sensor_input,txt);
    lcd_out(2,1,"Vin=");
     for(x=0;x<14;x++)
    {

   if(txt[x]!=' '){lcd_chr_cp(txt[x]);}


    }
  
  
  
  
   

   // &#199;&#225;&#227;&#209;&#205;&#225;&#201; &#199;&#225;&#199;&#230;&#225;&#236;
    ////////////////////////////////////////////////////
    if( read_sensor_input>95 && read_sensor_input <110)
    {
     relay2=1;

     relay1=0; relay3=0; relay4=0; relay5=0; //relay6=0;
    }
   //////////////////////////////////////////////////////

   // &#199;&#225;&#227;&#209;&#205;&#225;&#201; &#199;&#225;&#203;&#199;&#228;&#237;&#201;
   ///////////////////////////////////////////////////////
 else  if( read_sensor_input >110 && read_sensor_input < 124)
   {

    relay2=1; relay5=1;

    relay1=0; relay3=0; relay4=0; //relay6=0;
   }
 // &#199;&#225;&#227;&#209;&#205;&#225;&#201; &#199;&#225;&#203;&#199;&#225;&#203;&#201;
 /////////////////////////////////////////////////////////
 else if( read_sensor_input>124 && read_sensor_input<141)
 {

 relay1=1; relay2=1;

 relay3=0; relay4=0; relay5=0;   // relay6=0;

 }

 // &#199;&#225;&#227;&#209;&#205;&#225;&#201; &#199;&#225;&#209;&#199;&#200;&#218;&#201;
 //////////////////////////////////////////////////////////
 else if( read_sensor_input>142 && read_sensor_input<=160)
 {
 relay1=1; relay2=1;  relay5=1;

  relay3=0;  relay4=0; //relay6=0;
 }

 // &#199;&#225;&#227;&#209;&#205;&#225;&#201; &#199;&#225;&#206;&#199;&#227;&#211;&#201;
 //////////////////////////////////////////////////////////
 else if( read_sensor_input>161 && read_sensor_input<169)
 {
  relay3=1;

  relay1=0; relay2=0; relay4=0; relay5=0; //relay6=0;
 }

 // &#199;&#225;&#227;&#209;&#205;&#225;&#201; &#199;&#225;&#211;&#199;&#207;&#211;&#201;
 //////////////////////////////////////////////////////////
 else if( read_sensor_input>170 && read_sensor_input<190)
 {
  relay3=1; relay5=1;

  relay1=0; relay2=0; relay4=0; //relay6=0;
 }

 // &#199;&#225;&#227;&#209;&#205;&#225;&#201; &#199;&#225;&#211;&#199;&#200;&#218;&#201;
 /////////////////////////////////////////////////////////
 else if( read_sensor_input>191 && read_sensor_input<210)
 {
  relay4=1; relay5=1;


  relay1=0; relay2=0; relay3=0; //relay6=0;
 }

 else if( read_sensor_input>210 && read_sensor_input<245)
 {
  relay4=0; relay5=0;


  relay1=0; relay2=0; relay3=0; //relay6=0;
 }

 //&#199;&#225;&#227;&#209;&#205;&#225;&#201; &#199;&#225;&#203;&#199;&#227;&#228;&#201;
 ////////////////////////////////////////////////////////////


  else if( read_sensor_input>245 && read_sensor_input <270)
 {

  relay1=0; relay2=0; relay3=0; relay4=0; relay5=1;  // relay6=0;

 }
 Delay_ms(100);
 if( read_sensor_input<180)
 {
  led_low=0;   led_high=1; led_normal=1;
 }
 
  if( read_sensor_input>180 && read_sensor_input<245)
 {
  led_low=1;   led_high=1; led_normal=0;
 }
 
  if( read_sensor_input>245)
 {
  led_low=1;   led_high=0; led_normal=1;
 }
    
  

  }
  
}


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:408
قديم 30-04-2018, 06:39 AM المشاركة 5   
افتراضي


معذرة أخى الكريم لا أجد فى الكود شيء لكن قد يفيد زيادة التأخير عن 20 مللى ثانية لأنه مرتبط أساسا بالكريستال و أى خطأ فى تعريفها يولد خطأ فى الزمن الفعلى فضلا عن انخفاض دقته اصلا
عادة ما أفعله هو عندما أجرب وظيفة جديدة مثل lo,high الخ و اجد مشكلة كهذه ، اقوم بعمل برنامج صغير فيه فقط رقم معروف مثل 22/7 و نتيجته معلومة و بأى حاسبة تجدها ثم اكتبه على الشاشة على سطر و احفظه فىEEPROM ثم استدعيه و اكتب النتيجة
لو بها خطأ الجأ للمنتدى الخاص يالشركة و اسأل عن هذه الوظيفة فربما الخطأ فيها

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 08:27 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025