প্রোগ্রামের মেমরির কেবল 384 বাইট রয়েছে এমন কেউ কীভাবে একটি মাইক্রোকন্ট্রোলার ব্যবহার করতে পারেন?


67

উদাহরণস্বরূপ একটি PIC10F200T

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


6
ক্ষুদ্রতর মাইক্রোকন্ট্রোলারদের জন্য, বিশেষ উদ্দেশ্যে সিগন্যাল জেনারেটর থেকে শুরু করে প্রোটোকল রূপান্তরকারী, বৃহত্তর নিয়ন্ত্রণ ব্যবস্থায় "নোড" ইত্যাদি ইত্যাদি প্রচুর অ্যাপ্লিকেশন রয়েছে
ডেভ ট্যুইড

13
ভাল একটি দাবা খেলার প্রোগ্রাম takes 67২ বাইট নেয় তাই এটি ভাল নয়। en.wikedia.org/wiki/1K_ZX_Chess
জন বার্টন

8
ক্ষুদ্র প্রোগ্রামগুলি (256 বাইটের চেয়ে কম) দিয়ে কী করা যায় তার কয়েকটি উদাহরণ এখানে
হামার

9
আপনার অর্থ কী, "যদি না এটি একক উদ্দেশ্যমূলক চিপ হয়"? এম্বেড থাকা সিস্টেমগুলির বেশিরভাগই একক উদ্দেশ্য।
জিনে পিন্ডার

6
কলেজে ফিরে, আমি একত্রিত একটি 8085/8155 কম্পিউটারের (সর্বোচ্চ 256 বাইট) জন্য একটি সম্পূর্ণ কার্যকরী ট্র্যাফিক লাইট প্রোগ্রাম তৈরি করেছি। এটিতে ওয়াক বোতাম এবং কিছু সেন্সর ছিল যা কোনও গাড়ির উপস্থিতি অনুকরণ করে।
জোরডাচি

উত্তর:


133

বাচ্চারা, আমার লন থেকে নাম!

এসেম্বলারের ক্ষেত্রে বেশ জটিল কিছু তৈরি করতে 384 বাইট প্রচুর জায়গা।

আপনি যখন ইতিহাস ঘুরে দেখেন কম্পিউটারগুলি যখন কোনও ঘরের আকারের ছিল, আপনি <1k তে কার্যকরভাবে কিছু শিল্পকলার বিস্ময়কর অস্তিত্ব খুঁজে পাবেন।

উদাহরণস্বরূপ, মেল এর ক্লাসিক গল্প পড়ুন - একটি বাস্তব প্রোগ্রামার । স্বীকারোক্তিহীন, এই ছেলেরা ক্ষয়কারী কাফেরদের সাথে খেলতে মেমরির 4096 শব্দ ছিল had

এছাড়াও পুরানো কিছু ডেমোসেসিন প্রতিযোগিতা দেখুন যেখানে চ্যালেঞ্জটি ছিল একটি ফ্লপি, সাধারণ টার্গেটগুলি 4 কে বা 40 কে এবং সাধারণত সংগীত এবং অ্যানিমেশন অন্তর্ভুক্ত করার জন্য পরিচালনা করতে বুটব্লকটির মধ্যে একটি "পরিচয়" ফিট করা।

যুক্ত করার জন্য সম্পাদনা করুন : দেখা যাচ্ছে আপনি 320 শব্দে বিশ্বের প্রথম 100 ডলার বৈজ্ঞানিক ক্যালকুলেটর প্রয়োগ করতে পারেন ।

অল্প বয়স্কদের জন্য সম্পাদনা করুন:

  • ফ্লপি = ফ্লপি ডিস্ক।
  • বুটব্লক = ফ্লপির প্রথম সেক্টরটি বুটআপে পড়ুন।
  • ডেমোসেসিন = হ্যাকার গ্রুপগুলির মধ্যে প্রোগ্রামিং প্রতিযোগিতা।
  • অ্যাসেমব্লার = কোনও ডিভাইস প্রোগ্রামিংয়ের অভিনব উপায় যদি আপনি 8 টগল স্যুইচ এবং "স্টোর" বোতামটি ব্যবহার করতে খুব নরম হন।

4
আটারি 2600 গেম কনসোলটিতে রম গেম কার্টিজগুলিতে কেবল 4KB স্টোরেজ ছিল (যদিও কিছু গেম 4K এর বেশি অ্যাক্সেসের জন্য ব্যাংক স্যুইচিং ব্যবহার করে এই সীমাবদ্ধতার আশেপাশে পেয়েছিল)।
জনি 21

1
ইউনস আগে আমি একটি সুন্দর বাস্তববাদী পাখি-চিপ তৈরি করেছি (লোকেরা কম্পিউটারটিকে সন্দেহ করার পরিবর্তে পাখিটির সন্ধান করেছিল), যেগুলি (তবে এলোমেলো কোড নয় যা প্রতিবারের মতো একই শব্দ বানানো থেকে বিরত থাকতে পারে) গর্জন করত প্রায় 384 বাইটে এবং আমার কাছে কোনও লিখনযোগ্য ঠিকানার অতিরিক্ত বিধিনিষেধ ছিল এবং বাইনারিটিতে শূন্য বাইটের অনুমতি ছিল না।
লরেন পেচটেল

2
আমাকে আরও বাইরে বেরিয়ে আসা দরকার, এটি দিনের বেলা থেকে মনে পড়ে
জন ইউ

7
"মেলের গল্প" এর জন্য +1। আমি পুরো সপ্তাহে পড়েছি এমন একটি দুর্দান্ত জিনিস।
জাস্টিন ᚅᚔᚈᚄᚒᚔ

1
@ জোহানু: আতারি 2600 এ প্রথম কয়েকটি গেমস সমস্ত 2K ছিল। অনেক বিকাশকারী কখনও 4K এর বাইরে চলে এমন কোনও গেমস ডিজাইন করেনি, কারণ 8K চিপগুলি সাশ্রয়ী মূল্যের (এবং কিছু সংস্থার কার্টগুলি কেবল 4K চিপের অর্ধেক ব্যবহৃত ছিল) স্ট্যান্ডার্ড (অ্যাক্টিভ-লো চিপ-সিলেক্ট) ব্যবহার করে কোনও কার্ডে ব্যাংক-স্যুইচিং যোগ করে চিপ সমর্থন চিপের সংখ্যা এক থেকে তিনে বাড়িয়েছে।
সুপারক্যাট

59

মাইক্রোকন্ট্রোলাররা পর্যাপ্ত সস্তা যে তারা প্রায়শই সত্যিকারের সহজ কাজ করতে ব্যবহৃত হয় যা বিগত বছরগুলিতে সম্ভবত যুক্তিযুক্ত যুক্তি দিয়ে করা হত। সত্যিই সহজ জিনিস। উদাহরণস্বরূপ, কেউ প্রতি পাঁচ সেকেন্ডের জন্য একটি সেকেন্ডের জন্য একটি আউটপুট চালু করার জন্য একটি ডিভাইস চান, 555 টাইমার এটি করতে সক্ষম হতে পারে তার চেয়ে আরও স্পষ্টভাবে।

  movwf OSCCON
mainLp:
  ; Set output low
  clrf  GPIO
  movlw 0xFE
  movwf TRIS
  clrwdt
  call  Wait1Sec
  clrwdt
  call  Wait1Sec
  clrwdt
  call  Wait1Sec
  clrwdt
  call  Wait1Sec
  ; Set output high
  bsf   GPIO,0
  clrwdt
  call  Wait1Sec
  goto  mainLp
Wait1Sec:
  movlw 6
  movwf count2
  movlw 23
  movwf count1
  movlw 17
  movwf count0
waitLp:
  decfsz count0
   goto   waitLp
  decfsz count1
   goto   waitLp
  decfsz count2
   goto   waitLp
  retlw  0

কোড স্পেসের 32 টি শব্দের (48 বাইট) এর চেয়ে কম ক্ষেত্রে এটি একটি আসল, ব্যবহারযোগ্য, অ্যাপ্লিকেশন হবে। কেউ সহজেই কিছু আই / ও পিন নিয়ন্ত্রণের সময় সংক্রান্ত বিকল্পগুলি পেতে কয়েকটি বিকল্প যুক্ত করতে পারে এবং এখনও প্রচুর পরিমাণে অবকাশ রাখে, তবে সমস্ত চিপটি উপরে প্রদর্শিত যা সঠিকভাবে দেখা যায় তা এখনও বিযুক্ত ব্যবহারের বিকল্পের চেয়ে সস্তা এবং সহজ হতে পারে even যুক্তি। বিটিডাব্লু, clrwdtনির্দেশাবলী সাবরোটিনে স্থানান্তরিত হতে পারে, তবে এটি করা জিনিসগুলিকে কম শক্ত করবে। যেমনটি লেখা আছে, এমনকি যদি কোনও ভুলের কারণে রিটার্ন-ঠিকানা স্ট্যাকটি দূষিত হয়, তবুও ওয়াচডোগটি মূল লুপে ফিরে না আসা পর্যন্ত খাওয়ানো হবে না। যদি তা কখনও না ঘটে, ওয়াচডগ কয়েক সেকেন্ড পরে চিপটি পুনরায় সেট করবে।


9
সত্য, আপনি আপনার কোডটি কিছুটা অনুকূল করতে পারেন, বাচ্চাদের কাছে একটি খারাপ উদাহরণ স্থাপন করেছেন - 5 পৃথক কল ওয়েট 1 সেকেলে ??? অকর্মণ্য লোক! ;)
জন ইউ

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

10
@ কোডার ৫৩৩: বিদ্যুৎ সরবরাহের গোলমালের মতো জিনিসের অভাবে, খুব বেশি নয়। অন্যদিকে, বাদামি আউট ডিটেক্টরবিহীন অংশগুলিতে, ভিডিডি সর্বনিম্ন অপারেটিং ভোল্টেজ এবং স্থলভাগের মধ্যে যদি একটি স্তরে পড়ে এবং তারপরে স্বাভাবিক অবস্থায় ফিরে আসে তবে সমস্ত ধরণের পাগল হয়ে যাওয়া সম্ভব। একজনকে সাধারণত এটি নিশ্চিত করার চেষ্টা করা উচিত যে ডিভাইসটি যে কোনও রাজ্যে নিজেকে আবিষ্কার করতে পারে তা যুক্তিসঙ্গত সময়ে স্বাভাবিক অবস্থায় ফিরে আসবে। ওয়াচডগটি কিক ইন করার জন্য দুই সেকেন্ড বা তার জন্য অনাবশ্যক হতে পারে, তবে শূন্যে পৌঁছানোর জন্য একটি গ্লিটড কাউন্টারের জন্য চার মিনিট কিছুটা বেশি হতে পারে।
সুপারক্যাট

10
@ কোডার ৫৩৩, আপনার বিশ্বাসের চেয়ে কোনও গুরুত্বপূর্ণ ডেমোতে এগুলি প্রায়শই ঘটে। সাহায্যের জন্য কল করার বা ত্রুটির প্রতিবেদন করার কোনও উপায় নেই এমন গভীরভাবে এম্বেড থাকা জিনিসগুলি তৈরি করার সময় এই ধরণের চিন্তাভাবনাও প্রয়োজন। অথবা অ্যাক্সেসযোগ্য (গভীর সমুদ্র বা বাহ্যিক স্থান বিবেচনা করুন) এমনকি কোনও ত্রুটি নজরে না আসলেও।
আরবেরটিগ 21

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

26

"কেবল" 384 বাইট?

দিন ফিরে, আমার জাহাজ, পাইপলাইন এবং শোধনাগার পরিচালনার শিল্পে বিশেষায়িত কম্পিউটারের জন্য একটি সম্পূর্ণ অপারেটিং সিস্টেম (নিজের দ্বারা) লেখার কাজ ছিল। কোম্পানির প্রথম এ জাতীয় পণ্যটি 00৮০০ ভিত্তিক ছিল এবং এটি 80৮০৯-তে উন্নীত করা হয়েছিল এবং তারা চাইছিল যে একটি নতুন ওএস along৮০৯-এর সাথে চলুক যাতে তারা মূল অপারেটিং সিস্টেমের লাইসেন্স ব্যয়কে সরিয়ে দিতে পারে। তারাও বুট রোমের আকার 64৪ বাইটে বাড়িয়ে দিচ্ছিল, ৩২ থেকে উপরে I আমি যদি সঠিকভাবে মনে করি - এটি প্রায় ৩৩ বছর আগে! - আমি ইঞ্জিনিয়ারদের আমাকে 128 বাইট দেওয়ার জন্য রাজি করিয়েছিলাম যাতে আমি পুরো অপারেটিং সিস্টেমের ডিভাইস ড্রাইভারগুলিকে রোমে রাখতে পারি এবং এভাবে পুরো ডিভাইসটিকে আরও নির্ভরযোগ্য এবং বহুমুখী করে তুলতে পারি। এর মধ্যে রয়েছে:

  • কীবোর্ড ড্রাইভার কী ডিবাউন সহ
  • ভিডিও ড্রাইভার
  • ডিস্ক ড্রাইভ ড্রাইভার এবং অবিরাম ফাইল সিস্টেম (মটোরোলা "অ্যাবলোডার ফর্ম্যাট", আইআইআরসি), "ব্যাঙ্কড" মেমরির সাথে অভ্যন্তরীণ দক্ষতার সাথে এমনভাবে ব্যবহার করা হয় যেন এটি সত্যই দ্রুত-ডিস্ক-স্পেস।
  • মডেম ড্রাইভার (তারা এফএসকে পিছনের দিকে পেয়েছে, সুতরাং এই মডেমগুলি কেবল একে অপরের সাথে কথা বলে)

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

আমার এক বন্ধু যিনি এখনও সংস্থার সাথে সম্পর্কিত (এর উত্তরসূরী) কয়েক বছর আগে আমাকে বলেছিলেন যে আমার কোডটি এখনও পরিষেবাতে রয়েছে!

আপনি 384 বাইট সহ অনেক কিছু করতে পারেন ...


2
আপনি বুট রোম বলছেন, এবং আপনি বুট রোমের উপরে চালকগণের কথা উল্লেখ করেছেন ... এটি আমার কাছে বোঝায় যে সেখানে একটি দ্বিতীয় স্টোরেজ মাধ্যম ছিল। এই আলোচনায়, আমরা ইতিমধ্যে নির্ধারণ করেছি যে আপনি এই PIC এ বাহ্যিক স্টোরেজ থেকে কোড লোড করতে পারবেন না।
কোডার 5৩৩

5
@ কোডার ৫৩৩ পয়েন্টটি মিস করেছে: 384 বাইট বেশ কিছু করার জন্য যথেষ্ট! আসল প্রশ্নটি অভিযোগের মতো পড়বে যে 384 দরকারী কিছু করার জন্য যথেষ্ট ছিল না - এটি আমার প্রয়োজনের চেয়ে বেশি ছিল - অনেক বেশি - একটি রিয়েল-টাইম, মাল্টি-টাস্কিং অপারেটিং সিস্টেমের সমস্ত মৌলিক উপাদান সরবরাহ করার জন্য ...
রিচার্ড টি

21

আপনি লজিক গেট বা 555 টাইমারের চেয়ে আপনার ছোট পায়ের ছাপ সহ খুব ছোট অ্যাপ্লিকেশনগুলির (উদাহরণস্বরূপ বিলম্বিত পিএসইউ স্টার্ট , 555 টাইমার রিপ্লেসমেন্ট , ট্রায়াক-ভিত্তিক নিয়ন্ত্রণ , এলইডি ব্লমিং ইত্যাদি ...) ব্যবহার করতে পারেন ।


3
আমি কেবল লক্ষ্য করেছি যে এই প্রথম দুটি উদাহরণ স্ট্যাক থেকেই ছিল! ভালো খেলেছ.
কোডার 543

9
পদচিহ্ন উল্লেখ করার জন্য +1। কখনও কখনও আকার সব হয়।
এম্বেড

17

আমি উদ্ভিদের জন্য একটি আর্দ্রতা সেন্সর ডিজাইন করেছি যা উদ্ভিদের পরিমাণ মতো জলের পরিমাণ ট্র্যাক করে এবং যদি উদ্ভিদকে পানির প্রয়োজন হয় তবে একটি এলইডি জ্বলজ্বল করে। আপনি সেন্সরটিকে উদ্ভিদের প্রকারটি শিখতে এবং এভাবে চলার সময় এর সেটিংস পরিবর্তন করতে পারেন। এটি ব্যাটারিতে কম ভোল্টেজ সনাক্ত করে। আমি ফ্ল্যাশ এবং র‌্যামের বাইরে চলে গেলাম তবে এই পণ্যটিকে নির্বিঘ্নে কাজ করতে সি কোডে সমস্ত কিছু লিখতে সক্ষম হয়েছি।

আপনি যে পিক 10f উল্লেখ করেছেন তা আমি ব্যবহার করেছি।


আমার প্লান্ট ওয়াটার সেন্সরের জন্য কোডটি আমি এখানে দিয়েছি। আমি pic10f220 ব্যবহার করেছি যেহেতু এটির একটি এডিসি মডিউল রয়েছে, এটি পিক 10f200 এর মতোই মেমরি পেয়েছে, আমি আগামীকাল স্কিম্যাটিকটি সন্ধান করার চেষ্টা করব।

কোডটি স্প্যানিশ ভাষায়, তবে এটি খুব সহজ এবং সহজেই বোঝা উচিত। যখন Pic10F স্লিপ মোড থেকে জেগে উঠবে তখন এটি পুনরায় সেট হবে যাতে আপনাকে এটি পাওয়ারআপ বা রিসেট কিনা তা যাচাই করতে হবে এবং সেই অনুসারে কাজ করুন। গাছের সেটিংটি মেষে রাখা হয় কারণ এটি সত্যিকার অর্থে ক্ষয় হয় না।

MAIN.C

/*
Author: woziX (AML)

Feel free to use the code as you wish. 
*/

#include "main.h"

void main(void) 
{  
    unsigned char Humedad_Ref;
    unsigned char Ciclos;
    unsigned char Bateria_Baja;
    unsigned char Humedad_Ref_Bkp;

    OSCCAL &= 0xfe;             //Solo borramos el primer bit
    WDT_POST64();                   //1s
    ADCON0 = 0b01000000;
    LEDOFF();
    TRIS_LEDOFF(); 

    for(;;) 
    {  
        //Se checa si es la primera vez que arranca
        if(FIRST_RUN())
        {
            Ciclos = 0;
            Humedad_Ref = 0;
            Bateria_Baja = 0;
        }

        //Checamos el nivel de la bateria cuando arranca por primera vez y cada 255 ciclos.
        if(Ciclos == 0)
        {
            if(Bateria_Baja)
            {
                Bateria_Baja--;
                Blink(2);
                WDT_POST128();
                SLEEP();
            }       

            if(BateriaBaja())
            {
                Bateria_Baja = 100;     //Vamos a parpadear doble por 100 ciclos de 2 segundos
                SLEEP();
            }
            Ciclos = 255;
        }   

        //Checamos si el boton esta picado
        if(Boton_Picado)
        {
            WDT_POST128();
            CLRWDT();
            TRIS_LEDON(); 
            LEDON();
            __delay_ms(1000);   
            TRIS_ADOFF();
            Humedad_Ref = Humedad();
            Humedad_Ref_Bkp = Humedad_Ref;
        }   

        //Checamos si esta calibrado. Esta calibrado si Humedad_Ref es mayor a cero
        if( (!Humedad_Ref) || (Humedad_Ref != Humedad_Ref_Bkp) )
        {
            //No esta calibrado, hacer blink y dormir
            Blink(3);
            SLEEP();
        }   

        //Checamos que Humedad_Ref sea mayor o igual a 4 antes de restarle 
        if(Humedad_Ref <= (255 - Offset_Muy_Seca))
        {
            if(Humedad() > (Humedad_Ref + Offset_Muy_Seca)) //planta casi seca
            {
                Blink(1);
                WDT_POST32();
                SLEEP();    
            }       
        }

        if(Humedad() >= (Humedad_Ref))  //planta seca
        {
            Blink(1);
            WDT_POST64();
            SLEEP();    
        }   

        if(Humedad_Ref >= Offset_Casi_Seca )
        {
            //Si Humedad_Ref es menor a Humedad, entonces la tierra esta seca. 
            if(Humedad() > (Humedad_Ref - Offset_Casi_Seca))  //Planta muy seca
            {
                Blink(1);
                WDT_POST128();
                SLEEP();    
            }
        }

        SLEEP();
    }  
} 

unsigned char Humedad (void)
{
    LEDOFF();
    TRIS_ADON();
    ADON();
    ADCON0_CH0_ADON();
    __delay_us(12); 
    GO_nDONE = 1;
    while(GO_nDONE);
    TRIS_ADOFF();
    ADCON0_CH0_ADOFF();
    return ADRES;
}   

//Regresa 1 si la bateria esta baja (fijado por el define LOWBAT)
//Regresa 0 si la bateria no esta baja
unsigned char BateriaBaja (void)
{
    LEDON();                
    TRIS_ADLEDON();
    ADON();
    ADCON0_ABSREF_ADON();
    __delay_us(150);        //Delay largo para que se baje el voltaje de la bateria 
    GO_nDONE = 1;
    while(GO_nDONE);
    TRIS_ADOFF();
    LEDOFF();
    ADCON0_ABSREF_ADOFF();  
    return (ADRES > LOWBAT ? 1 : 0);
}   

void Blink(unsigned char veces)
{
    while(veces)
    {
        veces--;
        WDT_POST64();
        TRIS_LEDON(); 
        CLRWDT();
        LEDON();
        __delay_ms(18); 
        LEDOFF();
        TRIS_ADOFF();
        if(veces)__delay_ms(320);   
    }   
}   

MAIN.H

/*
Author: woziX (AML)

Feel free to use the code as you wish. 
*/

#ifndef MAIN_H
#define MAIN_H

#include <htc.h>
#include <pic.h>

 __CONFIG (MCPU_OFF  & WDTE_ON & CP_OFF & MCLRE_OFF & IOSCFS_4MHZ ); 

#define _XTAL_FREQ              4000000
#define TRIS_ADON()             TRIS = 0b1101
#define TRIS_ADOFF()            TRIS = 0b1111
#define TRIS_LEDON()            TRIS = 0b1011
#define TRIS_LEDOFF()           TRIS = 0b1111
#define TRIS_ADLEDON()          TRIS = 0b1001


#define ADCON0_CH0_ADON()          ADCON0 = 0b01000001;     // Canal 0 sin ADON
#define ADCON0_CH0_ADOFF()       ADCON0 = 0b01000000;       // Canal 0 con adON
#define ADCON0_ABSREF_ADOFF()    ADCON0 = 0b01001100;       //Referencia interna absoluta sin ADON
#define ADCON0_ABSREF_ADON()     ADCON0 = 0b01001101;       //referencia interna absoluta con ADON

//Llamar a WDT_POST() tambien cambia las otras configuracion de OPTION
#define WDT_POST1()   OPTION = 0b11001000
#define WDT_POST2()   OPTION = 0b11001001
#define WDT_POST4()   OPTION = 0b11001010
#define WDT_POST8()   OPTION = 0b11001011
#define WDT_POST16()  OPTION = 0b11001100
#define WDT_POST32()  OPTION = 0b11001101
#define WDT_POST64()  OPTION = 0b11001110
#define WDT_POST128() OPTION = 0b11001111

#define Boton_Picado    !GP3
#define FIRST_RUN()     (STATUS & 0x10) //Solo tomamos el bit TO

//Offsets
#define Offset_Casi_Seca  5
#define Offset_Muy_Seca   5

 //Low Bat Threshold
#define LOWBAT                    73
/*
Los siguientes valores son aproximados
LOWBAT  VDD
50      3.07
51      3.01
52      2.95
53      2.90
54      2.84
55      2.79
56      2.74
57      2.69
58      2.65
59      2.60
60      2.56
61      2.52
62      2.48
63      2.44
64      2.40
65      2.36
66      2.33
67      2.29
68      2.26
69      2.23
70      2.19
71      2.16
72      2.13
73      2.10
74      2.08
75      2.05
76      2.02
77      1.99
78      1.97
*/


#define LEDON()                 GP2 = 0; //GPIO = GPIO & 0b1011
#define LEDOFF()                GP2 = 1; //GPIO = GPIO | 0b0100
#define ADON()                  GP1 = 0; //GPIO = GPIO & 0b1101
#define ADOFF()                 GP1 = 1; //GPIO = GPIO | 0b0010

unsigned char Humedad (void);
unsigned char BateriaBaja (void);
void Delay_Parpadeo(void);
void Blink(unsigned char veces);

#endif

আপনার যদি প্রশ্ন থাকে তবে আমাকে জানান, আমি যা মনে করি তার উপর ভিত্তি করে উত্তর দেওয়ার চেষ্টা করব। আমি বেশ কয়েক বছর আগে এই কোড করেছিলাম তাই আমার কোডিং দক্ষতা যাচাই করবেন না, তারা উন্নতি করেছে :)।

চূড়ান্ত নোট। আমি হাই-টেক সি সংকলক ব্যবহার করেছি।


3
আপনি কীভাবে এটি করেছিলেন তা পড়তে আমি সত্যিই আগ্রহী হব। আপনি যখন ওয়েবগুলি ভাগ করে নিতে আপত্তি করবেন না তখন এটি করার সময় আপনি কি কোনও নোট নিয়েছিলেন?
রাইসডাব্লু 2'13

1
হ্যালো রাইসডাব্লু, আমি বিশ্বাস করি আমার কাছে এখনও কোড রয়েছে। এটা আসলে খুব সহজ ছিল। আপনি আগ্রহী হলে আমি আপনাকে আমার কোড পাঠাতে পারতাম। আমাকে জানতে দাও. আমি যে সার্কিটটি ডিজাইন করেছি তা খুব সহজ এবং শীতল, কেবল 3 টি প্রতিরোধক, একটি পি-চ্যানেল মোসফেট (বিপরীত ব্যাটারি সুরক্ষার জন্য) একটি 100nF ক্যাপ এবং একটি এলইডি। ব্যাটারি পরিমাপের জন্য রেফারেন্স হিসাবে ব্যবহার করতে এবং এডিসি রিডিংগুলি অবিচ্ছিন্ন রাখতে আমি পিক 10 এফ এবং অভ্যন্তরীণ ডায়োড ব্যবহার করি।
শে

1
এটি একটি ঝরঝরে প্রকল্পের মতো শোনাচ্ছে। আপনি এখানে বিশদ পোস্ট করার কোনও সুযোগ আছে (বা কমপক্ষে সেগুলি কোথাও পোস্ট করে তাদের লিঙ্ক করতে পারেন)?
ইলমারি করোনেন

1
হ্যালো স্ক্রাইফ! দয়া করে, আপনার যদি কোনও উত্তর যুক্ত করার মতো কিছু থাকে তবে নতুন উত্তর পোস্ট করার পরিবর্তে "সম্পাদনা" লিঙ্কটি ব্যবহার করুন, কারণ এই সাইটটি ভোটদান ব্যবহার করে এবং ফোরামের মতো কাজ করে না।
ক্লাবচিও

16

একটি জিনিস যা আমি উল্লেখ করতে দেখিনি: আপনি যে মাইক্রোকন্ট্রোলারটি উল্লেখ করেছেন তা হ'ল প্রতিটি মাত্রার পরিমাণ মাত্র ০.০৪ ডলার। এটি একই আকার বা বিদ্যুত ব্যবহারের ক্ষেত্রে প্রযোজ্য।


2
এটা আমার প্রথম চিন্তা ছিল। এছাড়াও: যদি আমি একটি ঝরঝরে ধারণা দিয়ে একটি স্টার্টআপ হয়ে উঠি তবে কেবল কয়েকশো টাকা আলগা, এর মতো স্টাফের অর্থ গেট-টু-ডু-জব এবং দিন-চাকরির মধ্যে পার্থক্য can
ফ্রেসেল

14

আমি যখন হাই স্কুলে ছিলাম, তখন আমার একজন শিক্ষক ছিলেন যে জোর দিয়েছিল যে হালকা ম্লান হওয়া আমার পক্ষে সামলানো যেমন কোনও শিক্ষার্থীর পক্ষে খুব কঠিন কাজ।

এইভাবে চ্যালেঞ্জ করে আমি ট্র্যাকগুলি ব্যবহার করে পর্যায়ভিত্তিক আলোকসজ্জা শিখতে এবং বোঝার বেশ কিছুটা সময় ব্যয় করেছি এবং এই কীর্তিটি সম্পাদন করতে মাইক্রোচিপ থেকে 16C84 প্রোগ্রামিং করেছি। আমি এই সমাবেশ কোডটি দিয়ে শেষ করেছি:

'Timing info:
'There are 120 half-cycles in a 60Hz AC waveform
'We want to be able to trigger a triac at any of 256 
'points inside each half-cycle.  So:
'1 Half cycle takes 8 1/3 mS
'1/256 of one half cycle takes about 32.6uS
'The Pause function here waits (34 * 0xD)uS, plus 3uS overhead
'Overhead includes CALL PAUSE.
'This was originally assembled using Parallax's "8051 style" 
'assembler, and was not optimized any further.  I suppose
'it could be modified to be closer to 32 or 33uS, but it is
'sufficient for my testing purposes.

list 16c84

    movlw   0xFD     '11111101
    tris    0x5      'Port A
    movlw   0xFF     '11111111
    tris    0x6      'Port B
WaitLow:             'Wait for zero-crossing start
    btfss   0x5,0x0  'Port A, Bit 1
    goto    WaitLow  'If high, goto WaitLow
WaitHigh:            'Wait for end of Zero Crossing
    btfsc   0x5,0x0  'Port A, Bit 1
    goto    WaitHigh 'If low, goto waitHigh
    call    Pause    'Wait for 0xD * 34 + 3 uS
    bcf     0x5,0x1  'Put Low on port A, Bit 1
    movlw   0x3      'Put 3 into W
    movwf   0xD      'Put W into 0xD
    call    Pause    'Call Pause, 105 uS
    bsf     0x5,0x1  'Put High on Port A, Bit 1
    decf    0xE      'Decrement E
    movf    0x6,W    'Copy Port B to W
    movwf   0xD      'Copy W to 0xD
    goto    Start    'Wait for zero Crossing
Pause:               'This pauses for 0xD * 34 + 3 Micro Seconds
                     'Our goal is approx. 32 uS per 0xD
                     'But this is close enough for testing
    movlw   0xA      'Move 10 to W
    movwf   0xC      'Move W to 0xC
Label1:
    decfsz  0xC      'Decrement C
    goto    Label1   'If C is not zero, goto Label1
    decfsz  0xD      'Decrement D
    goto    Pause    'If D is not zero, goto Pause
    return           'Return

অবশ্যই আপনার উল্লেখ করা চিপের জন্য আপনাকে এটিটি সংশোধন করতে হবে, এবং ইনপুটটির জন্য সম্ভবত একটি সস্তা সিরিয়াল রুটিন যুক্ত করতে হবে কারণ আপনার চিপটিতে শোনার জন্য 8 বিট প্রশস্ত বন্দর নেই, তবে ধারণাটি একটি আপাতদৃষ্টিতে জটিল কাজ হতে পারে খুব সামান্য কোডে সম্পন্ন করুন - আপনি উপরের প্রোগ্রামটির দশ কপি 10F200 এ ফিট করতে পারবেন।

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


12

ঠিক আছে, কয়েক বছর আগে আমি সিরিয়াল I / O দিয়ে একটি তাপমাত্রা নিয়ামক লিখেছিলাম (সিরিয়াল I / O কে বিট-ব্যাং করায় কারণ MCU এর একটি UART ছিল না) এবং নিয়ামকের সাথে কথা বলার জন্য একটি সাধারণ কমান্ড দোভাষী। এমসিইউ ছিল একটি মোটোরোলা (বর্তমানে ফ্রেসকেল) এমসি 68 এইচসি 705 কে 1 যা পুরোপুরি 504 বাইট প্রোগ্রাম মেমরি (ওটিপিআরএম) এবং প্রায় 32 বাইট র‌্যাম ছিল। আপনি যে পিআইসি রেফারেন্স করেছেন তার চেয়ে সামান্য নয়, তবে আমার মনে আছে কিছু রম রেখে গেছে। আমার 17 বছর পরে এখনও কয়েকটি সংঘবদ্ধ ইউনিট বাকি আছে; একটি কিনতে চান?

হ্যাঁ, এটি করা যেতে পারে, কমপক্ষে সমাবেশে।

যাই হোক না কেন, আমি সম্প্রতি খুব সাধারণ সি প্রোগ্রাম লিখেছি যা সম্ভবত অনুকূলিত হয়ে গেলে 384 বাইটের মধ্যে ফিট হতে পারে। প্রতিটি কিছুর জন্য বড়, জটিল সফ্টওয়্যার প্রয়োজন হয় না।


5

আপনি 386 বাইট প্রোগ্রাম মেমরি এবং আরও অনেক কিছু দিয়ে একটি পলক একটি এলইডি লিখতে পারেন।

যতদূর আমি জানি, প্রোগ্রামের মেমরিটি কোনও বাহ্যিক চিপ দিয়ে প্রসারিত করা সম্ভব নয় (যদি না আপনি 384 বাইটে একটি পূর্ণ এএসএম ইন্টারপ্রেটার তৈরি করেন যা ধীর হবে)। যদিও বাহ্যিক চিপ (EEPROM, SRAM) দিয়ে ডেটা মেমরি প্রসারিত করা সম্ভব।


1
384 বাইটে টুরিং মেশিন সিমুলেটর তৈরি করা কঠিন হবে না ...
ক্রিস স্ট্রাটন

@ ক্রিসট্রেটটন আমার অর্থ একটি সম্পূর্ণ দোভাষী আছে, যাতে 'বর্ধিত প্রোগ্রাম মেমোরি' স্বাভাবিকের মতো একই বৈশিষ্ট্য ধারণ করে।

হ্যাঁ, এটিই আমি দৃ tight়ভাবে প্রয়োগের একটি উপায় বলেছিলাম। বাকিটি কেবল সংকলক ডিজাইন ...
ক্রিস স্ট্রাটন

7
যদি কেউ কোনও বহিরাগত EEPROM এ প্রোগ্রাম যুক্তি রাখতে চান তবে PIC নির্দেশ সেটটি অনুকরণ করার চেষ্টা করা উপায় হবে না। আরও ভাল পদ্ধতির একটি নির্দেশ সেট নকশা করা যা ভার্চুয়াল মেশিনের সাথে ব্যবহারের জন্য অনুকূলিত হয়েছিল; ১৯৯০ এর দশকে প্যারালাক্স তাদের "বেসিক স্ট্যাম্প" নিয়ে যে বাস্তবায়ন করেছিলেন তা প্রকৃতপক্ষে। এটি একটি পিআইসি ছিল 3072 বাইট কোড স্পেস সহ, সিরিয়াল ইপ্রোম চিপের সাথে জুটিবদ্ধ।
সুপারক্যাট

3
বেসিক স্ট্যাম্প সম্পর্কে অতিরিক্ত নোট বিটিডব্লিউ: এটি এমন সময়ে প্রবর্তিত হয়েছিল যখন ফ্ল্যাশ-ভিত্তিক বা ইপ্রোম-ভিত্তিক মাইক্রোকন্ট্রোলার তুলনামূলকভাবে বিরল ছিল, তবে সিরিয়াল ইপ্রোম চিপগুলি বেশ সস্তা ছিল। যে অ্যাপ্লিকেশনগুলির পক্ষে খুব বেশি গতির প্রয়োজন হয় না তাদের জন্য সিরিয়াল EEPROM অংশযুক্ত একটি স্থির-কোড মাইক্রো তুলনামূলক আকারের EEPROM বা ফ্ল্যাশ-ভিত্তিক মাইক্রো থেকে সস্তা হবে। বেসিক স্ট্যাম্পের নকশাটি আজ বোঝা যাচ্ছিল না, তবে এটি চালু হওয়ার সময় এটি বেশ ব্যবহারিক ছিল।
সুপারক্যাট

4

এটি আসলে আপনি যা ভাবেন তার চেয়ে খারাপ। আপনার লিঙ্কযুক্ত মাউসার পৃষ্ঠাটি বিষয়গুলি বিভ্রান্ত করছে যখন যখন এই প্রসেসরটিকে প্রোগ্রাম মেমরির 384 বাইট রয়েছে হিসাবে নির্দিষ্ট করে। PIC10F200 আসলে প্রোগ্রামের মেমরির 256 12-বিট শব্দ রয়েছে।

তো, আপনি এটি দিয়ে কি করতে পারেন? 12-বিট আমাদের PIC নির্দেশ সেট PIC10F20 দ্বারা ব্যবহৃত এক্স ডিভাইসের সব একক শব্দ নির্দেশাবলী হয়, তাই আপনি প্রসেসর সেটআপ জন্য কয়েক নির্দেশাবলী বিয়োগ করার পর, আপনি 250 সম্পর্কে পদক্ষেপ প্রোগ্রামের জন্য পর্যাপ্ত স্থান অবশিষ্ট করছি। এটি প্রচুর অ্যাপ্লিকেশনগুলির জন্য যথেষ্ট। উদাহরণস্বরূপ, আমি সম্ভবত সেই ধরণের জায়গায় একটি ওয়াশিং মেশিন নিয়ামক লিখতে পারি।

আমি কেবল উপলভ্য পিক সি সি সংকলকগুলি সন্ধান করেছি এবং দেখে মনে হচ্ছে তাদের প্রায় অর্ধেকই একটি পিক 10 এফ 200 এর জন্য কোড নির্গমন করার চেষ্টা করবে না। যাঁরা সম্ভবত এত বেশি বয়লারপ্লেট কোড রেখেছেন যাতে আপনি কেবল বামে স্থানটিতে একটি LED ফ্ল্যাশার লিখতে সক্ষম হতে পারেন। আপনি সত্যিই এই জাতীয় প্রসেসরের সাহায্যে সমাবেশ ভাষা ব্যবহার করতে চান।


আপনি 256 নির্দেশের শব্দ সম্পর্কে ঠিক বলেছেন right প্রকৃতপক্ষে তাদের মধ্যে একটি দোলক ক্রমাঙ্কন ধ্রুবক সঙ্গে নেওয়া হয়, যাতে আপনি 255 ব্যবহারযোগ্য নির্দেশাবলী পান। এছাড়াও, 10F200 সাধারণ পিআইসি 16 14-বিট নির্দেশিকা সেট ব্যবহার করে না। এটি পিআইসি 12 12-বিট নির্দেশিকা সেট ব্যবহার করে। যাইহোক, আমি আপনার প্রাথমিক প্রাঙ্গনে সম্মত। আমি একটি পিআইসি 10F200 দিয়ে প্রচুর দরকারী জিনিস করেছি। +1
অলিন ল্যাথ্রপ

@ অলিনল্যাথ্রপ: আমি উত্তরটি পরিষ্কার করে দিয়েছি। আমি পৃষ্ঠা 51 থেকে PIC16 মেয়াদ পেয়েছিলাম datashseet , কিন্তু আমি এটা পরিস্কার শুধু পড়ুন করার সিদ্ধান্ত নিয়েছে করেছি "12-বিট নির্দেশ সেট।" অংশ উপসর্গ ব্যবহৃত নির্দেশ সেট একটি নির্ভরযোগ্য গাইড নয়।
ওয়ারেন ইয়ং

0

আমার দিনে আমার বেতের তরঙ্গায়িত করতে, আমাদের বালির বাইরে বিটগুলি ছড়িয়ে দিতে হয়েছিল!

1976 সালে (বা তার আশেপাশে) আতারি 2600 ভিসিএস সিস্টেম ছিল সেই সময়ের অন্যতম জনপ্রিয় "ভিডিও গেম প্ল্যাটফর্ম"। এতে, মাইক্রোপ্রসেসর (মোস্টেক 6507) জ্বলজ্বলকারী ~ 1 মেগাহার্টজ এ দৌড়েছিল এবং র‌্যামের **** 128 বাইট ছিল ** had

দ্বিতীয় উদাহরণ যে আমি অত্যন্ত সীমাবদ্ধ র‌্যাম (~ 128 বাইট) সহ একটি মাইক্রোকন্ট্রোলারের কথা স্মরণ করি এটি একটি ডিসি-ডিসি কনভার্টারে ব্যবহৃত একটি পিক 12 এফ ছিল। এই মাইক্রোটিও চালানোর জন্য সমাবেশ ভাষা ব্যবহার করতে হয়েছিল।


4
ওপি র‌্যামের কথা বলছে না, সে প্রোগ্রাম স্পেসের কথা বলছে। অ্যাটারি 2600 এ প্রোগ্রামের স্থানটি কার্ট্রিজে রয়েছে, আরআইওটি চিপে নেই । ব্যাংক স্যুইচিং ছাড়াই 2600 টি সমর্থিত প্রোগ্রাম আরওএম 4 কিবি অবধি রয়েছে। (এবং কিছু বাণিজ্যিক কার্তুজের হয়নি ! ব্যাঙ্ক সুইচিং করতে) আপনার PIC12F উদাহরণ হিসাবে, ওপি এর পেয়েছিলাম আপনাকে আঘাত: PIC10F20x সিরিজের ডিভাইসের র্যাম এর 16 অথবা 24 বাইট আছে।
ওয়ারেন ইয়ং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.