मैं Atmel AVR माइक्रोकंट्रोलर के Timer1, या तो AtMega328 का उपयोग करने की कोशिश कर रहा हूं, जैसा कि Arduino, या ATTiny85 में उपयोग किया जाता है, दो घड़ी संकेतों का उत्पादन करने के लिए जो एक दूसरे के दर्पण चित्र हैं। जिस आवृत्ति को मैं उत्पन्न करने की कोशिश कर रहा हूं वह एक चर 1 मेगाहर्ट्ज से 2 मेगाहर्ट्ज या उससे अधिक है जो आउटपुट पिन को टॉगल करने के लिए कोड का उपयोग करके ऐसा करने के लिए बहुत अधिक है जब तक कि मैं नियंत्रक में लगभग कुछ नहीं करना चाहता। इसलिए मैं संबंधित पिंस पर सीधे टाइमर आउटपुट का उपयोग करना चाहता हूं। मैं जीसीसी टूलकिन का उपयोग कर रहा हूं ताकि अरडिनो लाइब्रेरी या भाषा द्वारा सीमित न हो।
Atmega328 में Timer1 के साथ दो पिन जुड़े हैं और मैं उनमें से दो समान 1MHz से 2MHz सिग्नल प्राप्त कर सकता हूं। हालाँकि डेटशीट यह कहती है कि मुझे एक उल्टा तरंग मिल सकता है, यह मुझे भ्रमित कर रहा है। मैं दो सिग्नल प्राप्त करने में सक्षम हूं जो 1 मेगाहर्ट्ज पर अलग-अलग ड्यूटी साइकल हैं, टिमर 1 के साथ पीडब्लूएम सेटिंग्स का उपयोग करते हैं, लेकिन दोनों सिग्नल एक ही समय में उच्च जाते हैं, छोटा एक पहले कम हो जाता है। यह मेरी परियोजना की सेवा नहीं करता है। मुझे पीडब्लूएम पल्स चौड़ाई भिन्नता की भी आवश्यकता नहीं है, मुझे बस दो समान "क्लॉक" प्रकार के विपरीत चरण के संकेतों की आवश्यकता है, बस।
मैं ऐसा करने के लिए किसी से मेरे लिए कोड लिखने के लिए नहीं कह रहा हूं, मुझे सिर्फ यह बताने की जरूरत है कि टाइमर के कौन से मोड / झंडे मुझे टाइमर से जुड़े दो पिनों में से एक पर एक साधारण उल्टे तरंग दे। यदि संभव हो तो मैं आउटपुट में से किसी एक के लिए बाहरी इनवर्टिंग सर्किट का उपयोग करने से बचना चाहता हूं जब तक कि यह एकमात्र विकल्प न हो।
यदि यह एटटी में संभव है, तो यह और भी बेहतर होगा। ATTiny में एक टाइमर से जुड़े 2 पिन भी हैं, लेकिन मुझे यकीन नहीं है कि इसमें ATMega के समान विकल्प हैं।
मेरे पास पहले से ही 20 मेगाहर्ट्ज का क्रिस्टल और कैपेसिटर पीसीबी पर जुड़ा हुआ है और 20 मेगाहर्ट्ज की घड़ी ATMega328 पर मज़बूती से काम कर रही है। ATTiny85 PCB पर मेरे पास 8 MHz क्रिस्टल है और यह मज़बूती से काम भी कर रहा है।
कृपया मदद कीजिए। धन्यवाद।
अद्यतन : उत्तर और टिप्पणियों में अब तक कुछ अवैध धारणाएं हैं, शायद मुझे स्पष्ट करना चाहिए: ध्यान दें कि मैंने अपने मूल पोस्ट में कहा है कि मैं 20 मेगाहर्ट्ज घड़ी का उपयोग कर रहा हूं, 8 मेगाहर्ट्ज का नहीं , और यह भी कि मुझे PWM की आवश्यकता नहीं है ।
एकमात्र मोड जो एक उच्च पर्याप्त आउटपुट आवृत्ति देता है वह सीटीसी मोड लगता है क्योंकि पीडब्लूएम मोड 2 मेगाहर्ट्ज आउटपुट के लिए काम नहीं कर रहे हैं। क्या CTC मोड में या तो टाइमर 1 आउटपुट A, या आउटपुट B, इनवर्ट करने का कोई तरीका है?
मैंने अब अपने कोड की जांच करने के लिए अपने स्वयं के 20 मेगाहर्ट्ज बोर्ड के बजाय एक मानक Arduino Uno (ATMega328, 16 MHz) पर स्विच किया है, और यह 9 और 10, टाइमर से CTC मोड में एक अच्छी स्थिर 2 मेगाहर्ट्ज घड़ी के लिए मेरा कोड है। 1 आउटपुट पिन:
#define tick 9
#define tock 10
void setup() {
pinMode(tick, OUTPUT);
pinMode(tock, OUTPUT);
TCCR1A = _BV(COM1A0) | _BV(COM1B0) ; // activate both output pins
TCCR1B = _BV(WGM12)| 1; // set CTC mode, prescaler mode 1
// various frustrating attempts to invert OC1B failed. What do I put here?
OCR1A = 3; // set the counter max for 2 MHz
}
void loop() {
}
दोनों पिनों के लिए आस्टसीलस्कप निशान समान हैं और सिंक में, मैं दोनों में से किसी भी संकेत को कैसे प्राप्त कर सकता हूं? डेटाशीट में इनवर्ट मोड CTC मोड में कुछ नहीं करने के लिए प्रकट होता है। क्या मैं डेटाशीट को गलत पढ़ रहा हूं, या क्या मुझे कम आवृत्ति और पीडब्लूएम मोड का उपयोग करने के लिए मजबूर किया जाएगा?
मेरी मूल क्वेरी में एक विशिष्ट "बाउंटी" प्रश्न जोड़ने के लिए:
इसलिए मुझे अपने कोड में ऊपर से क्या बदलाव करने की आवश्यकता है, इसे बनाने के लिए पिन 9 और 11 पर पूरी तरह से उल्टे संकेत देने के लिए 16 मेगाहर्ट्ज घड़ी के लिए उच्चतम संभव आवृत्ति पर , चाहे वह 2 मेगाहर्ट्ज है या नहीं?
मैं अभी के लिए एक मानक Arduino Uno के साथ रहूंगा, ताकि मेरे होमस्पून बोर्ड द्वारा कोई त्रुटि मोड पेश नहीं किया जा सके, और इसलिए कि कोई भी arduino वाला व्यक्ति मेरे कोड को ऊपर आज़मा सकता है और पुष्टि कर सकता है कि यह मेरे बताए अनुसार काम करता है और जैसा मैंने नहीं किया है जरुरत!