क्या AVR के UART को परागण नहीं करने का कोई तरीका है?


10

मैं एक और AVR से UART पर डेटा प्राप्त कर रहा हूं। हालाँकि मैं अन्य सामान कर रहा हूँ, इसलिए UART को लगातार मतदान करते रहना नहीं चाहता। मुझे पता है कि व्यवधान हैं, लेकिन मैं केवल एक को पूरा प्राप्त करने के लिए देख सकता हूं, जो मुझे लगता है कि मुझे अभी भी हस्तांतरण पूरा करने के लिए चुनाव करने की आवश्यकता है।


1
स्थानांतरण आरंभ करने के लिए आपको मतदान की आवश्यकता क्यों होगी? वैसे भी, प्रसारण के पूरा होने के लिए भी व्यवधान हैं। मैं AVR में बहुत अधिक नहीं हूं, लेकिन इन्हें "TX खाली" या "FIFO खाली" या FIFO थ्रेशोल्ड या समान कहा जा सकता है।
यूजीन Sh।

जवाबों:


20

AVRs पर RXC और TXC (RX और TX दोनों) के लिए इंटरप्ट वैक्टर हैं। जब तक आप नहीं चाहते, आपको इनका चुनाव नहीं करना चाहिए।

इस पर AVRFreaks की एक अच्छी पोस्ट है, और इसलिए निर्माता करता है ।


3
मैं सभी होने वाला था "क्यों AppNote लिंक माइक्रोचिप के लिए इंगित करता है, यह एक Atmel उत्पाद है!" मुझे विश्वास नहीं हो रहा है कि मैंने कभी नहीं सुना कि माइक्रोचिप ने Atmel खरीदा है, आप 5 साल के लिए माइक्रोकंट्रोलर्स से दूर रहते हैं ...
Zac Faragher

2
@ZacFaragher NXP + फ्रीस्केल + क्वालकॉम। एनालॉग + एलटी। पर + फेयरचाइल्ड। Infineon + आईआर। पिछले 1-2 वर्षों में यह सब। अपने सबसे खराब / केवल प्रतियोगी को खोजें, फिर उनके साथ विलय करें, बहुत ज्यादा।
लुंडिन

1
@ लुंडिन क्वालकॉम एनएक्सपी नहीं हुआ है, और किसी भी अधिक सक्रिय सार्वजनिक विचार के तहत प्रकट नहीं होता है । यह अभी भी हो सकता है, या कुछ और हो सकता है - सभी समय के बाद था जब यह डायलॉग था जो Atmel खरीदने जा रहा था।
क्रिस स्ट्रैटन

2

इंटरप्ट रुटीन डेटा को बफर में डाल देता है (पुट के साथ एक सर्कुलर बफर और पॉइंटर्स अच्छी तरह से काम करता है)। मुख्य लूप यह देखने के लिए जांचता है कि क्या बफर में डेटा है और जब है, तो इसे बाहर निकालता है। मुख्य लूप अन्य चीजें कर सकता है, लेकिन बीच बफर ओवरफ्लो से पहले डेटा की जांच और हटाने की आवश्यकता होती है (जब पुट मिल जाता है)।

यह संकलित नहीं होगा, लेकिन यह विधि दिखाता है।

char circ_buf[BUFFER_SIZE];
int get_index, put_index;

void initialize(void) {
    get_index = 0;
    put_index = 0;
}

isr serial_port_interrupt(void) {                       // interrupt
    circ_buf[put_index++] = SERIAL_PORT_REGISTER;
    if(put_index==get_index) error("buffer overflow");  // oops
    if(put_index==BUFFER_SIZE) put_index = 0;           // circular buffer
}

void background routine(void) {
    while(put_index!=get_index) {                       // or if()
        ch = circ_buf[get_index++];
        // do something with ch
        if(get_index==BUFFER_SIZE) get_index = 0;
        }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.