PIC में कई बाहरी व्यवधानों का उपयोग करना


9

मैंने कई प्रोजेक्ट्स के लिए PIC16F877( डेटाशीट ) का उपयोग किया है । एक ही बाहरी पिन परिवर्तन में रुकावट के लिए, आप PORTB0रुकावट का उपयोग कर सकते हैं । लेकिन अब मुझे एक सर्किट में 8 स्वतंत्र बाहरी पिन परिवर्तन में रुकावट का समर्थन करने की आवश्यकता है।

डेटशीट में यह कहा गया है कि इसमें 15 व्यवधान हैं PIC16F877, लेकिन मुझे लगता है कि इनकी गिनती टाइमर ओवरफ्लो इंटरप्ट आदि सहित की जाती है ... जो इस मामले में बेकार हैं।

INTCONरजिस्टर के बारे में डेटाशीट यही कहती है ।

यहां छवि विवरण दर्ज करें

क्या मुझे बिट 0 का उपयोग करके 4 स्वतंत्र व्यवधान हो सकते हैं RBIF? यह में परिवर्तन का प्रतिनिधित्व करते हैं PB7:PB4। मैं यह कैसे पहचान सकता हूं कि कौन सी पिन बदली गई है, क्या यह बाधित दिनचर्या में पोर्ट मूल्य को पढ़ने से है?

यहां तक ​​कि मुझे ऊपर से सकारात्मक जवाब मिले, मुझे 8 इंटरप्ट की आवश्यकता है? बेशक मैं अभी भी बदलाव के INTEलिए उपयोग कर सकता हूं PORTB0। फिर 4 + 1 = 5, लेकिन अन्य 3 के बारे में क्या? (हालांकि सभी 8 इंटरप्ट इवेंट्स एक ही प्रकार के होते हैं, 4 + 1 + 3 = 8बात बदसूरत लगती है, है ना?)

8-पिन की निगरानी करने वाले माइक्रो-नियंत्रक अन्य से कोई अन्य भारी कार्य अपेक्षित नहीं है। (अन्य कार्यों के बारे में बात करते हुए, इसे अलग-अलग काउंटर चर का एक सेट बनाए रखना होगा और अक्सर पीसी क्रमिक रूप से लगभग 4 बाइट्स प्रसारित करना होगा)

किसी भी सुझाव का स्वागत है। यहां तक ​​कि अगर यह अधिक अनुकूल एक के लिए माइक्रो-नियंत्रक को बदलने के बारे में है (लेकिन उह .. मुझे PICएस से दूर जाने के लिए न कहें )।


2
इंटरप्ट का उपयोग किए बिना, आप मुख्य कार्यक्रम में पिन की निगरानी कर सकते हैं। लेकिन हालांकि यह सही नहीं है। एक विकल्प के रूप में, आप Arduino के लिए जा सकते हैं। हालांकि यह PIC नहीं है, यह बहुत आसान है, आप आसानी से समझ जाएंगे क्योंकि आप PIC से पहले ही परिचित हैं।
अनुबिस

1
यदि आप RBIE इंटरप्ट का उपयोग करते हैं तो आप हर बार पिछले मूल्य को बफर कर सकते हैं और एक XOR को ढूंढ सकते हैं जो बदल गया है। निष्पादित करने के लिए बहुत तेज होना चाहिए।
पीटर जे

@PeterJ मुझे यह समझ में नहीं आया। बफर जो मूल्य?
कोडनेम SC

@PeterJ महान! प्रतीक्षा ...
कोडनेम SC

1
एक तरीका यह है कि एक बाहरी पिन पर बाहरी संकेतों को संयोजित करने के लिए बाहरी 8-इनपुट गेट (जैसे पुराने दिनों में 74LS30) का उपयोग किया जाए। चूंकि 74 (HC) 30 एक NAND गेट है, जिसके लिए आपको सभी इनपुट्स की आवश्यकता होती है जो कि उच्च अवस्था में होता है - उन्हें भी पोर्ट पिन से कनेक्ट करने की आवश्यकता होगी ताकि आप पहचान सकें कि पोर्ट को पढ़कर कौन से इंटरप्ट्स सक्रिय थे।
ब्रायन ड्रमंड

जवाबों:


3

यह एक विचार को समझाने के लिए C छद्म कोड है। यह उपयोग करता है और अनन्य या बाहर काम करने के लिए जो पिन बदल गया है और एक आरबीआईई बाधा के भीतर आपके अलग-अलग हैंडलर को बुलाएगा। इस बात पर निर्भर करता है कि आवेदन कितना महत्वपूर्ण है, आप यह जांचना चाहते हैं कि PIC कैसे पोर्ट को बदलने जैसी स्थितियों को संभालती है, जबकि व्यवधान यह सुनिश्चित करने के लिए निष्पादित कर रहा है कि आप किसी भी घटना को याद नहीं करेंगे।

int old_port_b;

void isr_handler()
{
    int new_port_b, changed_pins;
    new_port_b = read_port_b();
    changed_pins = new_port_b ^ old_port_b;
    if (changed_pins | 1)
        rb0_hander();
    if (changed_pins | 2)
        rb1_hander();
        // ... etc
    old_port_b = new_port_b;
}

int main()
{
    old_port_b = read_port_b();
    enable_interrupt();
}

मुझे मिल गया, धन्यवाद! लेकिन वह सटीक उत्तर नहीं है जिसकी मुझे तलाश है। इस तरह, आप RB7:RB4केवल 4 पिन की निगरानी कर सकते हैं । लेकिन मैं 8 पिनों की निगरानी करने का तरीका पूछ रहा हूं। कोई उपाय?
कोडेन SC SC

मुझे लगता है कि वहाँ एक कारण है कि आप RB0 - RB7 का उपयोग नहीं कर सकते हैं ऊपर के लिए काम करना चाहिए? अन्यथा मैं वास्तव में एक तरह से सोच भी नहीं सकता, यदि कोड को जल्दी से ट्रिगर करना महत्वपूर्ण नहीं है तो आप एक टाइमर अवरोध (या सिर्फ मुख्य लूप) में कोड की उपरोक्त शैली का उपयोग कर सकते हैं।
पीटर जे

उस PIC के लिए, यदि आपको ऐसा करने के लिए इंटरप्ट का उपयोग करने की आवश्यकता है, तो RB4: RB7 पर XOR चाल, और RB0 के लिए चार इंटरप्ट: RB3 जाने का रास्ता है। यदि आपको रुकावट की आवश्यकता नहीं है, तो अपने कोड में पूरे पोर्ट को प्रदूषित करें, या यदि आपको एक कठिन नमूना दर की आवश्यकता है, तो मतदान को संभालने के लिए एक टाइमर इंटरप्ट का उपयोग करें
स्कॉट सीडमैन

and four interrupts for the RB0:RB3? PIC16F877 RB1:RB3एह के लिए किसी भी व्यवधान का समर्थन नहीं करते ?
कोडनेम SC

मुझे याद आया कि डेटाशीट में, मैं मान रहा था कि यह पूरे पोर्ट को कवर कर ले। लेकिन मैंने आपकी दूसरी टिप्पणी के बारे में एक बार प्रति सेकंड देखा, इसलिए मुझे लगता है कि आप इसे अपने मुख्य लूप में चलाना बेहतर समझेंगे। व्यवधान के साथ आपको निष्पादन के दौरान किसी भी बिंदु पर अद्यतन करने वाले चर का ध्यान रखना होगा और बीच में चलने पर पिन परिवर्तनों को कैसे संभालना है। यह वास्तव में ऐसा लगता है कि यह सिर्फ वास्तविक लाभ के लिए इसे जटिल करेगा। केवल एक अपवाद मैं सोच सकता था कि क्या आप नींद में रुकावट का उपयोग करना चाहते हैं, इस स्थिति में आपको उन्हें MUX हार्डवेयर करने की आवश्यकता होगी।
पीटर जे

1

उस हिस्से में केवल 4 पिन-चेंज इंटरप्ट हैं और कुछ अन्य जिन्हें आप चुनिंदा किनारों पर सेट कर सकते हैं। एक रणनीति बाहरी रूप से 8 बिट मूल्य में परिवर्तन का पता लगाने के लिए होगी, फिर बेमेल पर बाधित होगी। यह हार्डवेयर में गड़बड़ हो जाता है, लेकिन वास्तव में आप क्या चाहते हैं।

जिन महत्वपूर्ण मापदंडों का आपने उल्लेख नहीं किया है, वे आपको पिन परिवर्तन पर प्रतिक्रिया देने के लिए कितने तेज़ हैं, और पिन बदलने के लिए न्यूनतम समय क्या होगा यह मान्य है। उत्तरों के आधार पर, आप फर्मवेयर में एक नियमित व्यवधान के आधार पर मतदान कर सकते हैं। 16F877 5 मेगाहर्ट्ज निर्देश दर पर चल सकता है, और एक परिवर्तन के लिए जाँच केवल कुछ निर्देश लेगा। मान लें कि आपने प्रत्येक 50 निर्देशों को बाधित किया है। यह प्रोसेसर समय के एक अच्छे हिस्से को अग्रभूमि कोड पर छोड़ देगा। बाधा दर 100 kHz और अवधि 10 100 होगी। बेशक अग्रभूमि कोड को तब भी परिवर्तन ध्वज को देखने और इसके बारे में कुछ करने की आवश्यकता होती है, इसलिए प्रतिक्रिया समय 10 code से अधिक होगा, लेकिन आपने कुछ भी नहीं कहा है कि जब परिवर्तन का पता चलता है तो आपको क्या करने की आवश्यकता है। अगर यह सिर्फ मानव समय में जवाब देने की जरूरत है,


लापता विवरण के बारे में क्षमा करें। जैसा कि अपेक्षित प्रतिक्रिया दर once per secondपर्याप्त होगी। जब एक पिन परिवर्तन (केवल एक किनारे, बढ़ते हुए) का पता लगाया जाता है, तो एक काउंटर (चर) बढ़ाना पड़ता है। मुख्य लूप में, इसे काउंटर मानों की निगरानी करनी होती है और जब एक निश्चित मूल्य से अधिक हो जाता है, तो चार बाइट्स USARTको पीसी के माध्यम से प्रेषित करना पड़ता है । फिर संबंधित काउंटर मान को शून्य पर रीसेट करें। इतना ही आसान। मुझे लगता है कि मतदान का विकल्प ठीक रहेगा?
कोडेन SC SC

2
एक बार प्रति सेकंड ! तो क्या सभी के लिए तड़प रहा है? यह आसानी से समय-समय पर मतदान के साथ किया जाता है। फिर क्या दिक्कत है?
ओलिन लेट्रोप

उम ... मैं हालांकि यह सबसे अच्छा होगा क्योंकि उनमें से 8 और भी हैं, प्रतिक्रिया की भविष्यवाणी नहीं की जा सकती (लेकिन उस मूल्य को न्यूनतम माना जा सकता है)। हे! लोग गलतियाँ कर सकते हैं, ठीक है: ..(
कोडनेम SC

1

आप 8-इनपुट गेट NAND का उपयोग @Brian Drummond द्वारा किए गए INT पिन पर एक बाधा को बढ़ाने के लिए कर सकते हैं और अपने रुकावट स्रोतों को 8-बिट समानांतर-इन / सीरियल-आउट शिफ्ट रजिस्टर जैसे "74HC165N" से जोड़ सकते हैं, इसलिए आपको इसकी आवश्यकता होगी रुकावट के बाद शिफ्ट रजिस्टर से डेटा पढ़ने के लिए और इससे आपको अपने वास्तविक रुकावट स्रोत के बारे में जानकारी मिलेगी ... यह सबसे तेज़ तरीका नहीं हो सकता है, लेकिन इसका विस्तार करना आसान है और अधिक नहीं तो 5 पिन का उपयोग करेंगे, और यदि आप एड्रेस कंट्रोलिंग सिस्टम (MUX, LATCH, ...) जोड़ते हैं, तो आपको रुकावट अधिसूचना के लिए केवल एक पाइन की आवश्यकता होगी और विभिन्न संसाधनों के लिए अन्य पिनों का अलग-अलग समय पर पुन: उपयोग किया जा सकता है;)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.