यदि आपके पास यहां से उपलब्ध डेटशीट की धारा 31 का वाचन है , तो चीजें आपके लिए थोड़ी स्पष्ट हो सकती हैं।
यहाँ एक सारांश है जो मुझे पता है:
पीआईओ समानांतर इनपुट / आउटपुट के लिए खड़ा है और एक बार में कई रजिस्टर पोर्ट पढ़ने और लिखने के लिए कार्यक्षमता प्रदान करता है। जहां डेटाशीट में एक रजिस्टर का उल्लेख है, उदाहरण के लिए PIO_OWER, Arduino लाइब्रेरी में उन्हें इस प्रारूप REG_PIO तक पहुंचने के लिए मैक्रोज़ हैं? _OWER कहां? उपलब्ध पोर्ट के लिए या तो ए, बी, सी या डी है।
मैं अभी भी धीमे Arduino pinMode () फ़ंक्शन का उपयोग पिनों पर इनपुट / आउटपुट सेट करने के लिए करता हूं क्योंकि यह कोड को रेजगारी आधारित रजिस्टरों जैसे REG_PIOC_OWER = 0xdeadbeef से अधिक पठनीय बनाता है, लेकिन फिर पिनों को सेट करने के लिए डायरेक्ट रजिस्टरों का उपयोग करें प्रदर्शन / तुल्यकालन। अभी तक, मैंने इनपुट के साथ कुछ भी नहीं किया है, इसलिए मेरे उदाहरण सभी आउटपुट आधारित हैं।
बुनियादी उपयोग के लिए, आप आउटपुट लाइनों को उच्च और REG_PIO? _CODR को कम सेट करने के लिए REG_PIO? _SODR का उपयोग करेंगे। उदाहरण के लिए REG_PIOC_SODR = 0x00000002 PORTC पर बिट 1 (शून्य से क्रमांकित) सेट होगा (यह देय डिजिटल पिन 33 है)। PORTC पर अन्य सभी पिन अपरिवर्तित रहते हैं। REG_POIC_CODR = 0x00000002 PORTC कम पर 1 सेट करेगा। फिर से अन्य सभी पिन अपरिवर्तित होंगे।
जैसा कि यह अभी भी इष्टतम नहीं है, या सिंक्रनाइज़ नहीं है यदि आप समानांतर डेटा के साथ काम कर रहे हैं, तो एक रजिस्टर है जो आपको एक कॉल के साथ पोर्ट के सभी 32 बिट्स लिखने की अनुमति देता है। ये REG_PIO! _ODSR हैं, इसलिए REG_PIOC_ODSR = 0x00000002 अब PORTC उच्च पर 1 बिट सेट करेगा और PORTC पर अन्य सभी बिट्स एक ही CPU निर्देश में कम सेट किए जाएंगे।
क्योंकि यह संभावना नहीं है कि आप कभी ऐसी स्थिति में होंगे जहां आपको एक ही समय में पोर्ट के सभी 32 बिट्स सेट करने की आवश्यकता होती है, आपको पिंस के वर्तमान मूल्य को संग्रहीत करने की आवश्यकता होगी, और उन लोगों को बाहर निकालने के लिए AND ऑपरेशन करें। बदलना चाहते हैं, या जो आप सेट करना चाहते हैं उसे सेट करने के लिए OR ऑपरेशन करें फिर अपना लेखन और फिर से प्रदर्शन करें, और यह इष्टतम नहीं है। इसे दूर करने के लिए, सीपीयू स्वयं आपके लिए मास्किंग करेगा। OWSR (आउटपुट राइट स्टेटस रजिस्टर) नामक एक रजिस्टर होता है, जो ODSR को लिखने वाले किसी भी बिट को OWSR में सेट बिट्स से मेल नहीं खाता है।
इसलिए, अब यदि हम REG_PIOC_OWER = 0x00000002 (यह OWSR का 1 बिट सेट करता है) और REG_PIOC_OWDR = 0xfffffd (OWSR के बिट 1 को छोड़कर सभी बिट्स को साफ करता है) और फिर REG_PIOC_ODSR = 0x00000002 पर कॉल करते हैं। PORTC और अन्य सभी बिट्स अपरिवर्तित रहते हैं। तथ्य यह है कि करने के लिए वेतन ध्यान OWER सक्षम बनाता है किसी भी बिट्स 1 की तैयारी में हैं कि मूल्य आप लिखते हैं और उस OWDR अक्षम कर देता है किसी भी बिट्स 1 की तैयारी में हैं कि मूल्य तुम लिखो में। भले ही मैं इसे पढ़ते समय इसे समझ गया था, फिर भी मैंने अपना पहला टेस्ट कोड यह सोचते हुए कोड गलती करने में कामयाब रहा कि OWDR अक्षम बिट्स जो मेरे लिखे मूल्य में 1 पर सेट नहीं थे ।
मुझे उम्मीद है कि इसने कम से कम आपको देय CPU के PIO को समझने में थोड़ी शुरुआत दी है। एक पढ़ने और एक नाटक है और यदि आपके कोई और प्रश्न हैं, तो मैं उनका उत्तर देने का प्रयास करूंगा।
संपादित करें: एक और बात ...
आप कैसे जानते हैं कि PORTs के कौन से बिट्स ड्यू की डिजिटल लाइनों के अनुरूप हैं? इसे देखें: ड्यू पिनआउट