অ-উদ্বায়ী মেমোরিতে বার বার লিখুন Write


10

আমি এমন একটি ডিভাইস ডিজাইন করছি যা তাপমাত্রা পরিবর্তনের সাথে সাথে এটির দৈহিক অবস্থানটি স্বয়ংক্রিয়ভাবে সামঞ্জস্য করে। যদি ডিভাইসটি এটি বন্ধ হয় বা পাওয়ারটি সংযোগ বিচ্ছিন্ন হয় তবে ডিভাইসটির এটি শেষ তাপমাত্রা এবং অবস্থানটি মনে রাখা দরকার। EEPROM এ এই মানগুলি সংরক্ষণ করার ক্ষমতা আমার আছে তবে সমস্যাটি হচ্ছে অবস্থান এবং তাপমাত্রা খুব দ্রুত পরিবর্তন হতে পারে। আমি যদি প্রতিবারের পরে EEPROM এ টেম্পটি লিখি এবং পোস্ট করি তবে তারা পরিবর্তিত হয়েছে (১) ফার্মওয়্যারটি কিছুটা কমিয়ে ফেলবে এবং (২) সম্ভবত এক বা দুই বছর পরে ইপ্রোমকে মেরে ফেলবে। সুতরাং আমি যেমন দেখছি আমার বিকল্পগুলি নীচে রয়েছে ...

1) শক্তি হারিয়ে যাওয়ার পরে অল্প সময়ের জন্য ডিভাইসটি চালিত রাখার জন্য ক্যাপাসিটার / ব্যাটারি ব্যবহার করুন যাতে আমি কেবল সেই সময়ে EEPROM এ মান লিখতে পারি। আমি এটি পছন্দ করি না কারণ বোর্ড ক্ষুধার্ত ক্ষুধার্ত এবং এতে বড় ক্যাপ লাগবে। এবং আমার কাছে এক টন ফাঁকা জায়গা নেই। এবং আমি কোনও ব্যাটারি এবং ব্যাটারি ধারক / বা একটি বড় ক্যাপের অতিরিক্ত দাম চাই না।

2) EEPROM এর পরিবর্তে এফ-র‌্যাম ব্যবহার করুন যাতে আমি এটি না ছড়িয়ে কয়েক বিলিয়ন বার লিখতে পারি। আমি এই বিকল্পটি পছন্দ করি না কারণ এফআরএম EEPROM এর চেয়ে বেশ খানিকটা ব্যয়বহুল এবং এটি একটি উত্পাদন পণ্যের জন্য (কেবল একটি নয়)।

3) প্রতি 5 মিনিট বা তার পরে কেবলমাত্র অবস্থান এবং তাপমাত্রা লিখুন। এইভাবে আমার সর্বদা মোটামুটি সাম্প্রতিক অবস্থান / টেম্প রেকর্ড করা আছে তবে আমি প্রতি সেকেন্ডে লিখছি না যাতে আমার প্রোগ্রামটি ধীর হয়ে না যায় এবং ইপ্রোম তত দ্রুত মারা যায় না। এটি আমার সেরা বিকল্প মত মনে হচ্ছে।

অন্য কারও কি এমন কোনও পরামর্শ রয়েছে যা আমি ভাবছি না?


5
শুধু একটা প্রশ্ন. যদি ডিভাইসটি স্বয়ংক্রিয়ভাবে এটির শারীরিক অবস্থানটি সামঞ্জস্য করে তবে আপনাকে শেষ তাপমাত্রা কেন মনে রাখা দরকার? আপনি যখন আবার ডিভাইসে শক্তি প্রয়োগ করেন, তখন এটি তাপমাত্রা আপডেট করে না এবং এর অবস্থানটি সামঞ্জস্য করে না?
ড্যানিয়েল গ্রিলো

1
আমি ড্যানিয়েলের সাথে একমত আপনি যদি বিদ্যুৎ হ্রাস করেন এবং পরিবেষ্টনের তাপমাত্রা তীব্রভাবে পরিবর্তিত হয়? পাওয়ার আপ করার পরে, আপনি যদি সর্বশেষ সংরক্ষিত টেম্প / অবস্থান ব্যবহার করেন তবে আপনি যে কোনও উপায়ে ভুল জায়গায় থাকতে পারবেন এবং ডিভাইসটি নির্বিশেষে চলন্ত শেষ হবে। আপনার প্রশ্নের তালিকায় নেই এমন আরও কোনও প্রয়োজনীয়তা আছে কি?
ডেভ

EEPROM অনুমানটি কী - কতজন চক্র লেখেন?
জেসন এস

উত্তর:


10

আপনার কি কি প্রয়োজন একটি কৌশল বলা হয় পরিধান সমতলকরণ । এটি প্রতিবার EEPROM একই স্থানে আপনার ডেটা লিখবে না, তবে বিভিন্ন অবস্থান ব্যবহার করতে কিছু অ্যালগরিদম ব্যবহার করে। আমি জটিল পোশাক সমতলকরণ অ্যালগরিদমগুলি সম্পর্কে পড়েছি তবে নীচের সহজ পদ্ধতিটি কেন কাজ করবে না তা আমি জানতাম না।

আপনার ডেটাতে একটি 24-বিট কাউন্টার যুক্ত করুন, যাতে আপনার ডেটা ব্লক উদাহরণস্বরূপ 8 বাইট দীর্ঘ হয়। একটি পৃষ্ঠাগুলি 24AA64 32 বাইট দীর্ঘ, তাই একটি 64kb EEPROM চিপের 256 পৃষ্ঠাগুলি ঝুলিতে আছে। ডাটাশিট থেকে:

"৩২ বাইটেরও কম রাইট লেখার সময় বাকী পৃষ্ঠার ডেটা বাইট করার সাথে সাথে সতেজ করা হয়। এটি পুরো পৃষ্ঠাকে একটি লেখার চক্র সহ্য করতে বাধ্য করবে, এই কারণেই প্রতি পৃষ্ঠায় সহনশীলতা নির্দিষ্ট করা হয়েছে।"

সুতরাং 32 বাইট পৃষ্ঠার চেয়ে ছোট ব্লক ডেটা ব্লকগুলি ব্যবহার করা বোধগম্য নয়।

প্রথম পৃষ্ঠার কাউন্টার দেখুন। যদি এটি শূন্য হয় তবে আপনি সেই পৃষ্ঠার সর্বাধিক সংখ্যক লেখার চক্র ব্যবহার করেছেন, সুতরাং আপনি পরবর্তী পৃষ্ঠায় যান এবং সেই কাউন্টারটি পরীক্ষা করে দেখুন। আপনি কোনও পাল্টা> শূন্য না পাওয়া পর্যন্ত পুনরাবৃত্তি করুন। আপনি বর্তমানে এটি পৃষ্ঠাটি ব্যবহার করছেন That's মাইক্রোচিপের EEPROM- এ 1 মিলিয়ন চক্রের সহনশীলতা রয়েছে, যা আপনি 64kb EEPROM- এ প্রতি ব্লকে সর্বাধিক 32 বাইটের প্রদত্ত উদাহরণ সহ 256 মিলিয়নে উন্নীত করতে পারেন। এটি আপনার পণ্যকে ছাড়িয়ে যাওয়ার পক্ষে যথেষ্ট হতে হবে: আপনি প্রতি 5 সেকেন্ডে একবার লিখলে 40 বছর (!))

আপনি আপনার EEPROM প্রথম ব্যবহারের জন্য আরম্ভ করতে চাইবেন। আপনি কখন কীভাবে জানবেন যে কখন তা। আরম্ভের পরে অনন্য স্বাক্ষর লিখতে শেষ পৃষ্ঠাটি ব্যবহার করুন। স্বাক্ষর উপস্থিত থাকলে প্রতিটি পাওয়ার-আপ দেখুন। এটি না হলে ডিভাইসটি আরম্ভ করতে হবে। আপনি প্রতিটি পৃষ্ঠায় 0xF4240 (1 মিলিয়ন) এর সাথে কাউন্টারটি প্রিসেট করতে পারেন বা 0xFF এ সবকিছু সাফ করতে পারেন এবং আপনি পৃষ্ঠাটি প্রথম ব্যবহার করার সময় 0xF4240 লিখতে পারেন।
একটি EEPROM প্রারম্ভিক করা প্রয়োজন কারণ উত্পাদন / পরীক্ষা প্রক্রিয়াতে কখনও কখনও এটিতে একটি নির্দিষ্ট প্যাটার্ন লেখা হয়।

সম্পাদনা
পরিধান সমতলকরণ আপনার সমস্যার সমাধানের উচিত, কিন্তু আমি এখনও ক্যাপাসিটরের সমাধান মন্তব্য করতে চান। আপনি বলছেন যে বোর্ডটি ক্ষমতার জন্য ক্ষুধার্ত, তবে সম্ভবত আপনি মাইক্রোকন্ট্রোলার / ইপ্রোমের শক্তিটিকে বোর্ডের বাকী অংশ থেকে একটি ডায়োড দিয়ে আলাদা করতে পারেন। মূল শক্তি চলে গেলে আপনার সম্ভবত কয়েকটি এমএ প্রয়োজন হবে। 24AA64 একটি পৃষ্ঠ 5 মিমি এরও কম লিখবে, তারপরে 10 এমএ এবং 100 মিভি এর একটি অনুমোদিত ভোল্টেজ ড্রপ আপনার প্রয়োজন

সি=আমিটিΔভী=10মিএকজন5মিগুলি100মিভী=500μএফ

একটি ছোট সুপার ক্যাপ সঙ্গে সহজ।

আরও পড়তে
ডেটাশিট 24AA64
EEPROM ধৈর্য


EEPROM এর ধৈর্য্য প্রতি পৃষ্ঠায় দেওয়া হয়েছে (কমপক্ষে 24AA64 এবং আমি ব্যবহার করেছি এমন অন্যান্য EEPROM- এর জন্য)। 24AA64 একটি 32-বাইট পৃষ্ঠা নির্দিষ্ট করে, তাই গণনা প্রতি পৃষ্ঠায় হওয়া উচিত, প্রতি ব্লক নয়।
সাদ

@ সাড - সঠিক। আমার উত্তরে স্থির।
স্টিভেন্ভ

4

1) একবার আপনি লেখার প্রক্রিয়া শুরু করার পরে, আপনাকে কেবলমাত্র এমসিইউ / ইপ্রোমকে শক্তি সরবরাহ করতে হবে এবং নিশ্চিত হওয়া উচিত যে নিয়ন্ত্রণের লাইনগুলি গণ্ডগোলিত না হয় - I2C সম্ভবত এসপিআই এর চেয়ে পছন্দনীয়। কয়েক মিলি সেকেন্ডের জন্য কেবল কয়েকটি এমএ প্রয়োজন যাতে কোনও বড় ক্যাপটি না হয় এবং লেখার শুরু হওয়ার পরে আপনি এমসিইউটিকে ঘুমিয়ে রাখতে পারেন। 3) আপনি সম্ভবত কিছু বুদ্ধি প্রয়োগ করতে পারেন, উদাহরণস্বরূপ একটি হোল্ড অফ - একবার লিখিত এটি সর্বদা একটি নির্দিষ্ট সময় ধরে রাখে অন্য একটি লেখা ঘটতে পারে। বা অপেক্ষা til মান লেখার আগে কিছু সময়ের জন্য স্থিতিশীল।
আপনি বেশ কয়েকটি স্থানে ডেটা ছড়িয়েও ধৈর্য বাড়িয়ে তুলতে পারেন। মাইক্রোচিপে তাদের ইপ্রোমগুলির জন্য ধৈর্য্যের গণনা করার জন্য কিছু সরঞ্জাম এবং অ্যাপোটোটস রয়েছে যা দরকারী হতে পারে।


4
ধৈর্য সম্পর্কে মাইক্রোচিপ অ্যাপ নোট: ww1.microchip.com/downloads/en/appNotes/01019A.pdf অ্যাপনোট থেকে আপনি অপারেটিং ভোল্টেজ 5v থেকে 3.5v এ হ্রাস করে প্রায় 2x সহ্য করতে পারেন।
ভ্যানডে

1
আপনি যদি আপনার প্রথম পদ্ধতিটি ব্যবহার করেন তবে নিশ্চিত হয়ে নিন যে অস্থির মেমরির কাছে লেখাটি আপনার সিস্টেমে একবার শুরু হওয়ার পরে, অর্থাৎ শুরু হয় priority বাধাগুলি আপনার মানগুলিকে মাঝের লেখার পরিবর্তন করতে বা মাইক্রোকে অন্য কোনও প্রক্রিয়াজাতকরণ শুরু করতে পারে না যা আপনাকে সময়োপযোগী করে তোলে। আপনার পাওয়ারটি নিচে নেওয়ার সাথে সাথে আপনি দূষিত মানগুলি লিখবেন না এটি সর্বাধিক গুরুত্বপূর্ণ। তদ্ব্যতীত, মানগুলির উপর একটি সিআরসি আপনাকে দুর্নীতির ঘটনা ঘটেনি তা নিশ্চিত করতে সহায়তা করবে, তবে ডিফল্ট ব্যবহারের মতো আপনি যদি সিদ্ধান্ত নেন তবে কী করা উচিত decide
মার্টিন

3

আমি একটি ব্লক-ওরিয়েন্টেড ফ্ল্যাশ ডিভাইস ব্যবহার করার পরামর্শ দেব এবং মোড ফ্ল্যাগ হিসাবে প্রতিটি ব্লক থেকে একটি করে বাইট ব্যবহার করব। আক্রমণকারী হিসাবে বজায় রাখুন যে প্রায় সমস্ত মোড ফ্ল্যাগ প্রোগ্রাম করা হবে; কেবলমাত্র একটি ব্লক থাকবে যেখানে মোডের পতাকাটি প্রোগ্রাম করা হয়নি তবে পূর্ববর্তী ব্লকের (প্রয়োজনীয় হলে মোড়ানো)। সেই ব্লকটি হ'ল সাম্প্রতিকতম ডেটাগুলির সাথে একটি। যখন সেই ব্লকটি পূর্ণ হয়ে যায়, নীচের ব্লকটি মুছে ফেলুন (নোটটি মুছে ফেলা মুছে ফেলার সময় কোনও ডেটা সংমিশ্রণ করতে পারে এবং আক্রমণকারীটি এখনও ধরে রাখতে পারে তা নোট করুন), একবার মুছে ফেলার পরে প্রোগ্রামটি মোড ফ্ল্যাগ ব্যবহার করত যা ব্যবহৃত হত সর্বশেষ ব্লক হতে।

ফ্ল্যাশের সরবরাহকে যথেষ্ট পরিমাণে সুরক্ষিত করা দরকার এটি নিশ্চিত করার জন্য যে কোনও বাইট প্রোগ্রাম করার যে কোনও প্রচেষ্টা সফল হয় বা সম্পূর্ণরূপে ব্যর্থ হয়, তবে কোনও মুছে চক্র বিঘ্নিত হয়ে যথেচ্ছ ডেটা পূর্ণ করে একটি ব্লক রেখে যায় তা বিবেচনা করে না, যেহেতু একটি ডাটা এন্ট্রি লেখার পরবর্তী প্রচেষ্টা সেই ব্লকটিকে আবার মুছে ফেলবে।

যদি আপনার ডেটা 16 বিট হয় তবে একটি 64Kx8 চিপ 32,000 এর বেশি এন্ট্রি ধারণ করবে। প্রতি সেকেন্ডে একটি এন্ট্রি লিখলে চিপটি প্রায় 2.7 বার পূরণ হবে। এমনকি "কেবল" 10 কে মুছা চক্রের সহনশীলতা সহ একটি চিপ 10 বছরেরও বেশি সময় ধরে চলবে। বৃহত্তর চিপ বা ১০০ কে সহিষ্ণুতা সহ একটি ব্যবহারের ফলে আনুপাতিকভাবে কার্যকর জীবন বাড়বে।


2

1) সম্ভবত সহজ বিকল্প, যদিও এটির জন্য হার্ডওয়্যার পরিবর্তনের প্রয়োজন হতে পারে। আমি পিবিসি সংশোধন না করে এটি অর্জন করেছি কেবলমাত্র ডিকপলিং ক্যাপগুলি বাড়িয়ে এবং ব্রাউন-আউটে বাধা দিয়ে।

2) আপনি চিহ্নিত করেছেন, এফআরএম সঙ্গে সমস্যা দাম!

3) আপনার তাপমাত্রা এবং অবস্থানের তথ্যের অস্থিরতার উপর নির্ভর করে, মানটি পরিবর্তিত হয় তবে আপনি কেবল লেখার দ্বারা ধৈর্য বাড়িয়ে তুলবেন। আপনি প্রতি সেকেন্ডে একবারে তাপমাত্রার নমুনা নিচ্ছেন, তবে এটি যদি প্রতি 5 মিনিটের মধ্যে কেবল পরিবর্তন হয়, সমস্যাটি সমাধান হয়ে যায়।


1

আমি আমার প্রকল্পে এই সমস্যাটি কীভাবে সমাধান করেছি তা এখানে:

অব্যবহৃত স্লটগুলির বিটমাস্ক এবং মানটির জন্য বেশ কয়েকটি স্লট ধরে রাখতে ফ্ল্যাশের 1 সেক্টর সংরক্ষণ করুন।

আমি যে বিটমাস্কটি ব্যবহার করেছি তা 16 বাইট দীর্ঘ ছিল, তাই মানগুলি রাখার জন্য আমার কাছে 128 স্লট ছিল।

বিটমাস্ক সকলের কাছে আরম্ভ করা হয়, এটি ফ্ল্যাশ শর্তে মুছে ফেলা রাষ্ট্র।

আপনি যখন নতুন মান লিখতে চান, বিটমাস্কে পড়ুন এবং প্রথম বিটটি খুঁজে বের করুন a এটি স্লট নম্বর যেখানে আপনি মান লিখবেন। এটিকে ব্যবহৃত হিসাবে চিহ্নিত করার জন্য সেই বিটটি শূন্যে পরিবর্তন করুন এবং বিটমাস্কটিকে প্রথমে মুছে ফেলা না করে ফ্ল্যাশে ফিরে লিখুন। এরপরে, বিটমাস্কের পরেও ফ্ল্যাশটি মোছা না করে স্লটে মানটি লিখুন।

এইভাবে, আপনি ফ্ল্যাশ রাইটিং চক্রটিকে 128 বার বাড়িয়ে নতুন বিটমাস্ক লিখে কেবল এক থেকে শূন্যে পরিবর্তন নিয়েছেন।

যদি পুরো বিটমাস্ক 0 হয় তবে ফ্ল্যাশ সেক্টরটি মুছুন এবং নতুন করে শুরু করুন।


3
আমি আপনাকে হতাশ করতে পারি, তবে আপনি যখন কিছুটা ফ্ল্যাশ করেন তখন পুরো সেক্টরটি ওভাররাইট করা হয়। আপনার সমাধানটি খুব শীঘ্রই 'বিটমাস্ক' সেক্টরটিকে মৃত করে দেবে।
আন্দ্রেজস ক্যানিকভস

1
আপনি যদি ফ্ল্যাশটি মুছবেন না, আপনি সেক্টরের জন্য 10 কে মুছা চক্রটি ব্যবহার করবেন না। আপনার যদি 0x7F মান হয় এবং আপনি 0x3F মান লিখেন তবে ফলাফলটি 0x3F হবে। এটি বিটমাস্ককে আপ টু ডেট রাখে, তবে ফ্ল্যাশটি মুছবে না। মুছাটি কেবল তখনই ঘটে যখন পুরো বিটমাস্কটি 0 হয়
রবার্ট

আমি যদি ভুল হয়, আসুন আলোচনা করা যাক। আমি এখানে খারাপ উত্তর চাই না এবং আমি আমার প্রকল্পে খারাপ ডিজাইন চাই না।
রবার্ট

আমার মনে হয় রবার্ট ঠিক আছে। আমার মাইক্রোকন্ট্রোলারে আপনি একবারে কেবল 4 বাইট লিখতে পারবেন তবে প্রয়োজনীয় বিটগুলি শূন্যে সেট করা আছে। তাদের 1 এ ফিরে আসার একমাত্র উপায় হ'ল 1 কে ব্লক ফাঁকা। এটি কেবল মুছে যাওয়ার চক্রগুলি যা ফ্ল্যাশ পরে ...
টিম

এটি প্রতিটি ধরণের মেমরির এবং এমনকি মেমরি বিক্রেতার জন্য পৃথক হতে পারে। আমি দেখেছি EEPROMs অবশ্যই পৃষ্ঠাটি মুছে ফেলতে হবে এবং প্রতিটি লেখার জন্য এটি পুনরায় লিখতে হবে। আমি ফ্ল্যাশ মেমরি দেখেছি আপনি বিটগুলি লিখতে পারেন যা পৃষ্ঠা মুছে না ফেলে এখনও 1 টি।
mjh2007
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.