بازدیدها: 1919
EEPROM خارجي:
توسط ميكرو كنترلر AVR شما مي توانيد داده هاي خود را در يك حافظه خارجي ذخيره كنيد. كه من در اينجا نحوي پيكره بندي و برنامه نويسي آن را براي آيسي هاي EEPROM با مد سريال I2C خواهم گفت.
در پروتكل I2C ما تنها از دو سيم براي خواندن و نوشتن اطلاعات استفاده مي كنيم كه يك سيم آن به پايه SCL مشهور مي باشد كه روي اين پايه توسط ميكرو ما يك كلاك پالس با فركانس مشخص (بستگي به نوع EEPROM دارد) توليد مي كنيم. اين پايه اين كلاك را به EEPROM مي دهد و كه EEPROM بر اساس اين پالس ساعت داده ها را مي خواند و مي نويسد.
سيم دوم آن SDA مي باشد كه در واقع ما توسط اين پايه اطلاعات خانه هاي حافظه و محتواي داده را به EEPROM مي فرستيم و يا دريافت مي كنيم. از جمله اطلاعات يا شماره خانه حافظه و بعد اطلاعات خواندن و نوشتن و بعد هم فرستادن و يا دريافت كردن اطلاعات مي باشد.
اكنون به پيكره بندي EEPROM در محيط بيسكام مي پردازيم:
تعيين پايه هاي SCL و SDA :
Config Scl= x
Config Sda= x
در اينجا x يكي از پين هاي يك پورت مي باشد. مثلا PORTB.0 , PORTB.1 بستگي به طراحي خودتان دارد.
تعيين نرخ بيتي سريال و فركانس كلاك پالس و …
نرخ بيتي برابر با 9600 بيت بر ثانيه $baud= 9600
اندازه حافظه بافر Config Serialout = Buffered , Size = 254
تعيين كلاك پالس 400 كيلو هرتزي Config I2cdelay = 1
عدد 161 براي خواندن از EEPROM Const Xeeread = 161
عدد 160 براي نوشتن در EEPROM Const Xeewrite = 160
توضيح برنامه:
در خط اول من به دلخواه نويسه LCD رو خاموش كردم و بعد هم پاكش كردم.
هدف از اين برنامه نحوي ارسال و دريافت داده به EEPROM هست بنابراين من مي خوام تاريخ امروز كه دارم اينو مي نويسم رو در EEORPM از خانه 20 نوشتم و بعد هم اونو خوندم و رو روي LCD نمايش داد. كه روند كار به صورت زير هست:
Address = 20 : C = 0
While Address < 30
Tmp = Lookup(c , Text)
Aa = High(address)
Bb = Low(address)
Gosub Writeeepromserial
Incr Address
Incr C
Wend
ابتدا به متغيير Address مقدار ثابت 20 رو دادم كه اين عدد ميشه خانه 20 EEPROM و اولين خانه اي كه اولين ديتا درونش نوشته ميشه بعد هم اومدم يه حلقه While ايجاد كردم و براش يه شرط هم گذاشتم يعني گفتم تا زماني كه Address برابر با 30 نشده دستورات توي حلقه رو تكرار كن! حالا عدد 30 چي؟ گفتيم مي خوام اولين خانه شروع 20 باشه و ما هم 10 ديتاي 8 بيتي داريم كه بايد نوشته بشه پس 10+20 ميشه 30.
در خط بعدي ما از جدول Lookup استفاده كرديم يعني ما اون تاريخ رو در جدولي با ليبل Text نوشتيم و بعد هم براي فراخواني اونها از يك شمارنده كه ردون حلقه هست استفاده كرديم به اين صورت كه ابتدا C=0 قرار داديم يعني ميگه اولين ديتاي جدول Text رو بخون و درون متغيير tmp قرار بده حال مي رسيم به دو دستور:
Aa = High(address) , Bb = Low(address)
از اين دستور براي توليد آدرس استفاده مي كنيم كه متغيير آدرس يك داده از نوع WORD مي باشد بنابر اين با قرار دادن آدرس خانه مورد نظر و بالا و پايين كردن آن آدرس ايجاد مي شود. حال ما ديتا را آماده كرديم و آدرس رو هم آماده كرديم و كافي كه اين اطلاعات رو براي EEPROM بفرستيم كه به كمك زير برنامه Writeeepromserial اين كار رو انجام مي ديم. و در خط بعدي هم يك واحد به شمارنده يعني C و يك واحد هم به Address اضافه مي كنيم تا در نوبت بعد ديتاي جديد و آدرس جديد ايجاد شود.
قسمت خوان از EEPROM هم شبيه به نوشتن هست با اين تفاوت كه از زير برنامه Readeepromserial استفاده مي شود.
زير برنامه هاي Readeepromserial و Writeeepromserial تقربيا براي اينگونه استفاده كردن از EEPROM ثابت هستند فقط در قسمت waitms 10 اين 10 ميلي ثانيه تاخير بستگي به نوع EEPROM دارد. ما آيسي هايي داريم كه 1 ميلي ثانيه نياز دارند و بعضي هم 5 و بعضي هم 10 ميلي ثانيه …
EEPROMداخلي:
براي استفاده از EEPROM داخلي از دو دستور زير مي توانيد استفاده نماييد يكي براي خواندن و يكي هم براي نوشتن. نكته: حتما بين هر خوندن و يا نوشتن بايد 5 ميلي ثانيه تاخير بزاريم تا عمليات نوشتن تكميل شود.
Readeeprom Mgh1 , 10 : Waitms 5
Writeeeprom Mgh2 , 10 : Waitms 5
در دستور اولي محتواي خانه 10 از EEPROM داخلي خوانده مي شود و درون متغيير MGH1 ريخته مي شود.
در دستور دومي محتواي متغيير mgh2 در خانه 10 از EEPROM داخلي نوشته مي شود.
1 Comment
با سلام.عالی بود .خیلی ممنونم.کاش من هم میتونستم تجربیاتم در اختیار دیگران بزارم.خدا بهتون خیر برکت و از همه مهمتر سلامتی بدهد.