AVR Assembly language-Simple Example

असेंब्ली भाषेत एव्हीआर का प्रोग्राम करायचा हे मागील लेखात तुम्ही वाचले आहे. या लेखात एक साधा पण महत्वाचा असा- एल्इडी दिवा उघडझाप करणारा प्रोग्राम- तुम्ही समजून घेणार आहात. त्यासाठी अर्थातच असेंब्ली भाषा वापरलेली आहे.

मुख्य प्रोग्राम

वर दाखवलेल्या चित्रात मुख्य प्रोग्राम असेंब्ली भाषेत लिहिलेला दाखवला आहे. तो नीट पाहून तुमच्या एडिटर मधे टाइप करा. चित्रात दाखवलेली ओळ क्रमांक तुम्ही टाइप करायची नसून तुमचा एडिटर (कदाचित) ती स्वतःच दाखवेल. त्या प्रोग्राम मधील प्रत्येक ओळीबद्दल पुढे माहिती विषद केली आहे.

  1. ओळ क्रमांक 34 वर सुरुवात लेबल ने होते. मुख्य प्रोग्रामच्या सबरूटीनचे नाव आहे blink.
  2. blink हे लेबल असल्यामुळे ओळीच्या सुरुवातीलाच येेते. लेबलपुढे ” : ” हे चिन्ह (कोलन) टाकणे अनिवार्य आहे.
  3. लेबल नंतर निळ्या रंगात दिलेली sbi ही सूचना (set bit immediate) पुढे लगेच येणारे बिट (PORTB,PB5-पोर्ट बी वरील ५ वे बिट) लॉजिक एक (5 volts) या पातळीवर नेण्याची सूचना कंट्रोलरच्या मेंदूला करते. ही सूचना कार्यान्वित झाली की हे बिट व याला जोडलेला एल्इडी प्रकाशित होतो.
  4. ओळ क्र. 35 वर, एक सेकंद थांबण्यासाठी onesec नावाचे सबरूटीन वापरासाठी बोलावले (rcall = relative call) आहे. ही सूचना कार्यान्वित झाली की या एक सेकंदासाठी एल्इडी प्रकाशित रहातो.
  5. ओळ क्र. 36 वर cbi (clear bit immediate)ही सूचना दिली जाते. त्याचा परिणाम म्हणून PORTB,PB5 हे बिट लॉजिक लेव्हल 0 (0 Volts) ला नेले जाते. म्हणजेच एल्इडी दिवा बंद होतो.
  6. ओळ क्र. 37 वर, एक सेकंद थांबण्यासाठी onesec नावाचे सबरूटीन वापरासाठी बोलावले (rcall = relative call) आहे. ही सूचना कार्यान्वित झाली की या एक सेकंदासाठी एल्इडी बंद रहातो.
  7. ओळ क्रमांक 38 वर rjmp ही सूचना (relative jump) दिली आहे. या सूचनेमुळे कंट्रोलरचा मेंदू ओळ क्रमांक 34 वरील blink या लेबलच्या अनुरोधाने उडी मारतो व पुन्हा एकदा तेथील “sbi PORTB,PB5″ ही सूचना कार्यान्वित करतो.
  8. अशा रीतीने ओळ क्रमांक 34 ते 38 या ओळीतच कंट्रोलरचा मेंदू सतत फिरत राहतो आणि एल्इडी दिव्याची उघडझाप चालू राहते.

प्रोग्रामचा प्रारंभ

वर दाखवलेल्या चित्रात कोणत्याही एव्हीआर असेंब्ली प्रोग्रामचा प्रारंभ कसा व्हायला हवा हे दाखवले आहे. ओळींचे क्रमांक पाहिले तर प्रोग्रामचा हा भाग वर सांगितलेल्या मुख्य भागाच्या आधी येतो हे स्पष्ट होईल. त्यातील प्रत्येक ओळीचा अर्थ पुढे विषद केला आहेः-

  1. ओळ क्र. 25 वर setup हे लेबल दिले आहे.
  2. ओळ क्र. 26 वर ;init stack ही कॉमेंट दिली आहे. स्टॅकची रचना मेमरीत कशी असावी ते setup मधे ठरवले गेले आहे.
  3. ओळ क्र. 27 वर मेमरीच्या पत्त्यातील जास्त महत्वाचा बाइट (upper byte)  temp (या प्रोग्राममधे r16) या रजिस्टर मधे कॉपी केला आहे.
  4. ओळ क्र. 28 मधे temp या रजिस्टर मधून हा आकडा जास्त महत्वाच्या स्टॅक पॉइंटर बाइट मधे नेला आहे.
  5. ओळ क्र. 29 व 30 मधे वरील प्रक्रिया पुन्हा  पत्त्यातील कमी महत्वाच्या बाइटवर केली आहे.
  6. ओळ क्रमांक 31 वर b या पोर्टचे direction register वापरून त्यातील ५ वे बिट (ज्याला बाहेरून led जोडला आहे) आउटपुट म्हणून जाहीर केले आहे.

इतर पार्श्वभूमी

वर दाखवलेल्या चित्रात एव्हीआर चिपचे विविध इंटररप्ट सुरुवातीला कसे नियंत्रित करावे लागतात हे दाखवले आहे. त्यातील ओळींचा अर्थ पुढे सांगितला आहे.

  1. .CSEG हा आदेश (directive) असेंब्लर या संगणकीय प्रणालीसाठी आहे. कंट्रोलरच्या मेंदूसाठी नाही. त्याचा अर्थ- “या पुढील आज्ञा कंट्रोलरच्या कायमच्या मेमरीत साठवण्यासाठी आहेत.” असा होतो. कायमच्या मेमरीत प्रोग्राम साठवला जातो.
  2. ओळ क्र. 2 वर .org 0000 असा आदेश दिला आहे. हा आदेश (directive) क्ंट्रोलरला नसून या प्रोग्रामची असेंब्ली करणाऱ्या असेंब्लर या संगणकीय प्रणालीला दिला आहे. त्याचा अर्थ- “0000 या प्रोग्राम मेमरीपासून आता प्रोग्रामची सुरुवात होत आहे.” -असा आहे.
  3. कंट्रोलरला पॉवर मिळाली की लगेच कोणत्याही परिस्थितीत कंट्रोलरचा मेंदू 0000 या कायम मेमरीच्या सुरुवातीला उडी मारतो व तेथे दिलेल्या आज्ञेचे पालन करतो.
  4. ओळ 3 वर (0000 या पत्त्यावर) अतिशय महत्वाची सूचना दिली आहे. ती सूचना कंट्रोलरच्या मेंदूला setup या ठिकाणी (कायमच्या मेमरीतील setup या पत्त्यावर) उडी मारायला सांगते.
  5. कायमच्या मेमरीतील या पुढचे पत्ते विविध इंटररप्ट कार्यासाठी वापरले जातात. पण या प्रोग्राम मधे आपण त्यापैकी कोणताच इंटररप्ट वापरू इच्छित नाही. म्हणून या सर्व प्त्यांवर reti (return interrupt) ही आज्ञा दिली आहे. त्यामुळे कोणत्याही कारणाने या पत्त्यांवर उडी मारली तरी कोणतेही अनपेक्षित कार्य न करता मेंदू मुळच्या ठरलेल्या कामाला निघून जातो.
  6. या नंतरच मुख्य प्रोग्रामला सुरुवात होते.