विषयसूची:

AVR माइक्रोकंट्रोलर फ्यूज बिट्स कॉन्फ़िगरेशन। माइक्रोकंट्रोलर की फ्लैश मेमोरी में एलईडी ब्लिंकिंग प्रोग्राम बनाना और अपलोड करना: 5 कदम
AVR माइक्रोकंट्रोलर फ्यूज बिट्स कॉन्फ़िगरेशन। माइक्रोकंट्रोलर की फ्लैश मेमोरी में एलईडी ब्लिंकिंग प्रोग्राम बनाना और अपलोड करना: 5 कदम

वीडियो: AVR माइक्रोकंट्रोलर फ्यूज बिट्स कॉन्फ़िगरेशन। माइक्रोकंट्रोलर की फ्लैश मेमोरी में एलईडी ब्लिंकिंग प्रोग्राम बनाना और अपलोड करना: 5 कदम

वीडियो: AVR माइक्रोकंट्रोलर फ्यूज बिट्स कॉन्फ़िगरेशन। माइक्रोकंट्रोलर की फ्लैश मेमोरी में एलईडी ब्लिंकिंग प्रोग्राम बनाना और अपलोड करना: 5 कदम
वीडियो: Memory card kharab ho gaya To Aisa kijiye 2024, नवंबर
Anonim
Image
Image

इस मामले में हम सी कोड में सरल प्रोग्राम बनाएंगे और इसे माइक्रोकंट्रोलर की मेमोरी में जला देंगे। हम एकीकृत विकास मंच के रूप में एटमेल स्टूडियो का उपयोग करते हुए, अपना स्वयं का कार्यक्रम लिखेंगे और हेक्स फ़ाइल संकलित करेंगे। हम अपने स्वयं के प्रोग्रामर और सॉफ्टवेयर AVRDUDE का उपयोग करके, फ्यूज बिट्स को कॉन्फ़िगर करेंगे और AVR ATMega328P माइक्रोकंट्रोलर की मेमोरी में हेक्स फ़ाइल अपलोड करेंगे।

AVRDUDE - Atmel के AVR माइक्रोकंट्रोलर की ऑन-चिप यादों को डाउनलोड करने और अपलोड करने का एक कार्यक्रम है। यह फ्लैश और ईईपीरोम को प्रोग्राम कर सकता है, और जहां सीरियल प्रोग्रामिंग प्रोटोकॉल द्वारा समर्थित है, यह फ्यूज और लॉक बिट्स को प्रोग्राम कर सकता है।

चरण 1: एटमेल स्टूडियो का उपयोग करके प्रोग्राम लिखना और हेक्स फ़ाइल संकलित करना

Atmel Studio का उपयोग करके प्रोग्राम लिखना और हेक्स फ़ाइल संकलित करना
Atmel Studio का उपयोग करके प्रोग्राम लिखना और हेक्स फ़ाइल संकलित करना
Atmel Studio का उपयोग करके प्रोग्राम लिखना और हेक्स फ़ाइल संकलित करना
Atmel Studio का उपयोग करके प्रोग्राम लिखना और हेक्स फ़ाइल संकलित करना

यदि आपके पास एटमेल स्टूडियो नहीं है, तो आपको इसे डाउनलोड और इंस्टॉल करना चाहिए:

यह प्रोजेक्ट C का उपयोग करेगा, इसलिए बेयर-बोन्स एक्ज़ीक्यूटेबल प्रोजेक्ट जेनरेट करने के लिए टेम्प्लेट सूची से GCC C एक्ज़ीक्यूटेबल प्रोजेक्ट विकल्प चुनें।

अगला, यह निर्दिष्ट करना आवश्यक है कि परियोजना किस उपकरण के लिए विकसित की जाएगी। यह परियोजना AVR ATMega328P माइक्रोकंट्रोलर के लिए विकसित की जाएगी।

Atmel Studio के मुख्य स्रोत संपादक क्षेत्र में प्रोग्राम का कोड टाइप करें। मुख्य स्रोत संपादक - यह विंडो वर्तमान प्रोजेक्ट में स्रोत फ़ाइलों के लिए मुख्य संपादक है। संपादक के पास वर्तनी जाँच और स्वतः पूर्ण सुविधाएँ हैं।

1. हमें कंपाइलर को यह बताना होगा कि हमारी चिप किस गति से चल रही है ताकि वह देरी की सही गणना कर सके।

#ifndef F_CPU

#define F_CPU 16000000UL // कंट्रोलर क्रिस्टल फ़्रीक्वेंसी (16 मेगाहर्ट्ज AVR ATMega328P) को बता रहा है #endif

2. हम प्रस्तावना को शामिल करते हैं, जहां हम अपनी अन्य फाइलों से जानकारी शामिल करते हैं, जो वैश्विक चर और कार्यों को परिभाषित करता है।

#include // हैडर पिन पर डेटा प्रवाह नियंत्रण को सक्षम करने के लिए। पिन, पोर्ट आदि को परिभाषित करता है।

#include//हेडर प्रोग्राम में डिले फंक्शन को इनेबल करने के लिए

3. प्रस्तावना के बाद मुख्य () फ़ंक्शन आता है।

मुख्य अंतर (शून्य) {

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

4. PORTB के पिन 0 को आउटपुट के रूप में सेट करें।

डीडीआरबी = 0b00000001; // PORTB1 को आउटपुट के रूप में सेट करें

हम डेटा डायरेक्शन रजिस्टर बी में बाइनरी नंबर लिखकर ऐसा करते हैं। डेटा डायरेक्शन रजिस्टर बी हमें रजिस्टर बी इनपुट या आउटपुट के बिट्स बनाने की अनुमति देता है। 1 लिखना उन्हें आउटपुट बनाता है, जबकि 0 उन्हें इनपुट बनाता है। यह होने के नाते कि हम आउटपुट के रूप में कार्य करने के लिए एक एलईडी संलग्न कर रहे हैं, हम एक बाइनरी नंबर लिखते हैं, जिससे PORT B का पिन 0 आउटपुट के रूप में बनता है।

5. लूप।

जबकि (1) {

यह कथन एक लूप है, जिसे अक्सर मुख्य लूप या ईवेंट लूप के रूप में संदर्भित किया जाता है। यह कोड हमेशा सत्य होता है; इसलिए, यह एक अनंत लूप में बार-बार निष्पादित होता है। यह कभी नहीं रुकता। इसलिए, जब तक माइक्रोकंट्रोलर से बिजली बंद नहीं होती है या प्रोग्राम मेमोरी से कोड मिटा नहीं दिया जाता है, तब तक एलईडी एक अनंत में झपकेगी।

6. पोर्ट PB0. से जुड़ी एलईडी चालू करें

PORTB= 0b00000001; // पोर्ट PB0 से जुड़ी एलईडी चालू करता है

यह लाइन, पोर्टबी के PB0 को 1 देती है। PORTB AVR चिप पर एक हार्डवेयर रजिस्टर है जिसमें 8 पिन होते हैं, PB7-PB0, जो बाएं से दाएं जाते हैं। 1 को अंत में रखने से PB0 को 1 मिलता है; यह PB0 उच्च सेट करता है जो इसे चालू करता है। इसलिए, पिन PB0 से जुड़ी एलईडी चालू होगी और प्रकाश करेगी।

7. देरी

_delay_ms (1000); // 1 सेकंड की देरी बनाता है

यह कथन 1 सेकंड की देरी पैदा करता है, जिससे एलईडी मुड़ जाती है और ठीक 1 सेकंड के लिए चालू रहती है।

8. PB0. सहित सभी B पिन बंद करें

PORTB= 0b00000000; // PB0 सहित सभी B पिन बंद करें

यह लाइन सभी 8 पोर्ट B पिन को बंद कर देती है, जिससे PB0 भी बंद हो जाता है, इसलिए LED बंद हो जाती है।

9. एक और देरी

_delay_ms (1000); // एक और 1-सेकंड की देरी बनाता है

यह पूरी तरह से 1 सेकंड के लिए बंद हो जाता है, फिर से लूप को फिर से शुरू करने से पहले और लाइन का सामना करना पड़ता है, जो इसे वापस चालू करता है, पूरी प्रक्रिया को दोहराता है। यह असीम रूप से होता है ताकि एलईडी लगातार चालू और बंद हो।

10. रिटर्न स्टेटमेंट

}

वापसी (0); // यह लाइन वास्तव में कभी नहीं पहुंची है}

हमारे कोड की अंतिम पंक्ति एक रिटर्न (0) स्टेटमेंट है। भले ही इस कोड को कभी भी निष्पादित नहीं किया जाता है, क्योंकि एक अनंत लूप है जो कभी समाप्त नहीं होता है, डेस्कटॉप कंप्यूटर पर चलने वाले हमारे प्रोग्राम के लिए, ऑपरेटिंग सिस्टम के लिए यह जानना महत्वपूर्ण है कि वे सही तरीके से चले या नहीं। इस कारण से, जीसीसी, हमारा कंपाइलर, चाहता है कि प्रत्येक मुख्य() रिटर्न कोड के साथ समाप्त हो। एवीआर कोड के लिए रिटर्न कोड की आवश्यकता नहीं होती है, जो किसी भी सहायक ऑपरेटिंग सिस्टम की फ्रीस्टैंडिंग चलाता है; फिर भी, यदि आप वापसी() के साथ मुख्य समाप्त नहीं करते हैं तो संकलक एक चेतावनी उठाएगा।

अंतिम चरण परियोजना का निर्माण है। इसका अर्थ है निष्पादन योग्य फ़ाइल (.hex) फ़ाइल उत्पन्न करने के लिए सभी ऑब्जेक्ट फ़ाइलों को संकलित करना और अंत में लिंक करना। यह हेक्स फ़ाइल डीबग फ़ोल्डर के अंदर उत्पन्न होती है जो प्रोजेक्ट फ़ोल्डर के अंदर होती है। यह हेक्स फ़ाइल माइक्रोकंट्रोलर चिप में लोड होने के लिए तैयार है।

चरण 2: माइक्रो नियंत्रक फ्यूज बिट्स के डिफ़ॉल्ट कॉन्फ़िगरेशन को बदलना

माइक्रो कंट्रोलर फ्यूज बिट्स के डिफॉल्ट कॉन्फिगरेशन को बदलना
माइक्रो कंट्रोलर फ्यूज बिट्स के डिफॉल्ट कॉन्फिगरेशन को बदलना
माइक्रो कंट्रोलर फ्यूज बिट्स के डिफॉल्ट कॉन्फिगरेशन को बदलना
माइक्रो कंट्रोलर फ्यूज बिट्स के डिफॉल्ट कॉन्फिगरेशन को बदलना
माइक्रो कंट्रोलर फ्यूज बिट्स के डिफॉल्ट कॉन्फिगरेशन को बदलना
माइक्रो कंट्रोलर फ्यूज बिट्स के डिफॉल्ट कॉन्फिगरेशन को बदलना

यह याद रखना महत्वपूर्ण है कि कुछ फ़्यूज़ बिट्स का उपयोग चिप के कुछ पहलुओं को लॉक करने के लिए किया जा सकता है और संभावित रूप से इसे ईंट कर सकता है (इसे अनुपयोगी बना सकता है)।

कुल 19 फ़्यूज़ बिट्स हैं जो ATmega328P में उपयोग किए जाते हैं, और उन्हें तीन अलग-अलग फ़्यूज़ बाइट्स में विभाजित किया जाता है। फ्यूज बिट्स में से तीन "विस्तारित फ्यूज बाइट" में निहित हैं, आठ "फ्यूज हाई बाइट" में निहित हैं, और आठ और "फ्यूज लो बाइट" में निहित हैं। एक आगे बाइट भी है जिसका उपयोग लॉक बिट्स को प्रोग्राम करने के लिए किया जाता है।

प्रत्येक बाइट 8 बिट का होता है और प्रत्येक बिट एक अलग सेटिंग या ध्वज होता है। जब हम सेटिंग की बात करते हैं, सेटिंग की नहीं, प्रोग्राम की गई, प्रोग्राम की गई फ़्यूज़ की नहीं तो हम वास्तव में बाइनरी का उपयोग कर रहे हैं। 1 का अर्थ है सेट नहीं, क्रमादेशित नहीं और शून्य का अर्थ है सेट, क्रमादेशित। फ़्यूज़ प्रोग्रामिंग करते समय आप बाइनरी नोटेशन या अधिक सामान्यतः हेक्साडेसिमल नोटेशन का उपयोग कर सकते हैं।

ATmega ३२८पी चिप्स में आरसी ऑसिलेटर में बनाया गया है जिसकी आवृत्ति ८ मेगाहर्ट्ज है। इस सेट के साथ घड़ी स्रोत और CKDIV8 फ्यूज सक्रिय के रूप में नए चिप्स भेजे जाते हैं, जिसके परिणामस्वरूप 1 मेगाहर्ट्ज सिस्टम घड़ी होती है। स्टार्टअप समय अधिकतम और टाइम-आउट अवधि सक्षम पर सेट है।

नए ATMega 328P चिप्स में आमतौर पर निम्नलिखित फ़्यूज़ सेटिंग्स होती हैं:

कम फ्यूज = 0x62 (0b01100010)

उच्च फ्यूज = 0xD9 (0b11011001)

विस्तारित फ्यूज = 0xFF (0b11111111)

हम बाहरी 16MHz क्रिस्टल के साथ ATmega 328 चिप का उपयोग करेंगे। इसलिए, हमें तदनुसार "फ्यूज लो बाइट" के बिट्स को प्रोग्राम करने की आवश्यकता है।

1. बिट्स 3-0 ऑसीलेटर पसंद को नियंत्रित करते हैं, और 0010 की डिफ़ॉल्ट सेटिंग कैलिब्रेटेड आंतरिक आरसी ऑसीलेटर का उपयोग करना है, जो हम नहीं चाहते हैं। हम चाहते हैं कि 8.0 से 16.0 मेगाहर्ट्ज तक कम पावर क्रिस्टल ऑसीलेटर ऑपरेशन हो, इसलिए बिट्स 3-1 (सीकेएसईएल [3: 1]) को 111 पर सेट किया जाना चाहिए।

२.बिट ५ और ४ स्टार्टअप समय को नियंत्रित करते हैं, और १० की डिफ़ॉल्ट सेटिंग पावर-डाउन और पावर-सेव से छह घड़ी चक्रों की स्टार्टअप देरी के लिए है, साथ ही १४ घड़ी चक्रों की अतिरिक्त स्टार्टअप देरी और रीसेट से ६५ मिलीसेकंड।

कम पावर क्रिस्टल ऑसीलेटर के लिए सुरक्षित पक्ष पर रहने के लिए, हम पावर-डाउन और पावर-सेव से 16,000 घड़ी चक्रों की अधिकतम देरी चाहते हैं, इसलिए एसयूटी [1] को 1 पर सेट किया जाना चाहिए, साथ ही अतिरिक्त स्टार्टअप देरी 14 घड़ी चक्र और रीसेट से 65 मिलीसेकंड, इसलिए SUT[0] को 1 पर सेट किया जाना चाहिए। इसके अलावा, CKSEL[0] को 1 पर सेट किया जाना चाहिए।

3. बिट 6 घड़ी के आउटपुट को PORTB0 पर नियंत्रित करता है, जिसकी हमें परवाह नहीं है। तो, बिट 6 को 1 पर सेट छोड़ा जा सकता है।

4. बिट 7 डिवाइड-बाय-8 ऑपरेशन को नियंत्रित करता है और 0 की डिफ़ॉल्ट सेटिंग में वह सुविधा सक्षम होती है, जो हम नहीं चाहते। तो, बिट 7 को 0 से 1 में बदलना होगा।

इसलिए, नया फ्यूज लो बाइट 11111111 होना चाहिए, जो हेक्साडेसिमल नोटेशन में 0xFF है।

"फ्यूज लो बाइट" के बिट्स को प्रोग्राम करने के लिए हम अपने प्रोग्रामर (https://www.instructables.com/id/ISP-Programmer-fo…) और सॉफ्टवेयर AVRDUDE का उपयोग कर सकते हैं। AVRDUDE एक कमांड-लाइन उपयोगिता है जिसका उपयोग Atmel माइक्रोकंट्रोलर से डाउनलोड करने और अपलोड करने के लिए किया जाता है।

AVRDUDE डाउनलोड करें:

सबसे पहले, हमें अपने प्रोग्रामर का वर्णन AVRDUDE की कॉन्फ़िगरेशन फ़ाइल में जोड़ना होगा। विंडोज़ पर कॉन्फ़िगरेशन फ़ाइल आमतौर पर उसी स्थान पर होती है जहां AVRDUDE की निष्पादन योग्य फ़ाइल होती है।

कॉन्फ़िगरेशन फ़ाइल avrdude.conf में टेक्स्ट पेस्ट करें:

#आईएसपीप्रोगव1

प्रोग्रामर आईडी = "ISPProgv1"; desc = "सीरियल पोर्ट बैंगिंग, रीसेट = डीटीआर एसके = आरटीएस मोसी = टीएक्सडी मिसो = सीटीएस"; टाइप = "सर्ब"; कनेक्शन_टाइप = सीरियल; रीसेट = 4; एसके = 7; मोसी = ३; मिसो = 8;;

AVRDUDE शुरू करने से पहले, हमें योजना के अनुसार माइक्रोकंट्रोलर को प्रोग्रामर से जोड़ना होगा।

डॉस प्रॉम्प्ट विंडो खोलें।

1. प्रोग्रामर की सूची देखने के लिए कि avrdude समर्थित है कमांड avrdude -c c टाइप करें। यदि सब कुछ ठीक है, तो सूची में प्रोग्रामर आईडी "ISPProgv1" होनी चाहिए

2. avrdude समर्थित Atmel उपकरणों की सूची देखने के लिए कमांड avrdude -c ISPProgv1 टाइप करें। सूची में Atmel ATMega 328P के लिए डिवाइस m328p होना चाहिए।

इसके बाद, avrdude -c ISPProgv1 -p m328p टाइप करें, कमांड avrdude को बताती है कि किस प्रोग्रामर का उपयोग किया जा रहा है और Atmel माइक्रोकंट्रोलर क्या संलग्न है। यह हेक्साडेसिमल नोटेशन में ATmega328P हस्ताक्षर प्रस्तुत करता है: 0x1e950f। यह वर्तमान में ATmega328P में फ्यूज बिट प्रोग्रामिंग को हेक्साडेसिमल नोटेशन में भी प्रस्तुत करता है; इस मामले में, फ़्यूज़ बाइट्स को फ़ैक्टरी डिफ़ॉल्ट के अनुसार प्रोग्राम किया जाता है।

इसके बाद, avrdude -c ISPProgv1 –p m328p –U lfuse:w:0xFF:m टाइप करें, यह avrdude को यह बताने के लिए एक कमांड है कि किस प्रोग्रामर का उपयोग किया जा रहा है और Atmel माइक्रोकंट्रोलर क्या संलग्न है और फ्यूज लो बाइट को 0xFF में बदलने के लिए।

अब क्लॉक सिग्नल लो पावर क्रिस्टल ऑसिलेटर से आना चाहिए।

चरण 3: ATMega328P माइक्रोकंट्रोलर की मेमोरी में प्रोग्राम को बर्न करना

ATMega328P माइक्रोकंट्रोलर की मेमोरी में प्रोग्राम को बर्न करना
ATMega328P माइक्रोकंट्रोलर की मेमोरी में प्रोग्राम को बर्न करना
ATMega328P माइक्रोकंट्रोलर की मेमोरी में प्रोग्राम को बर्न करना
ATMega328P माइक्रोकंट्रोलर की मेमोरी में प्रोग्राम को बर्न करना

सबसे पहले, AVRDUDE निर्देशिका में निर्देश की शुरुआत में हमारे द्वारा बनाए गए प्रोग्राम की हेक्स फ़ाइल की प्रतिलिपि बनाएँ।

फिर, डॉस प्रॉम्प्ट विंडो में कमांड टाइप करें avrdude –c ISPProgv1 –p m328p –u –U flash:w:[आपकी हेक्स फ़ाइल का नाम]

कमांड माइक्रोकंट्रोलर की मेमोरी में हेक्स फाइल लिखता है। अब, माइक्रोकंट्रोलर हमारे कार्यक्रम के निर्देशों के अनुसार काम करता है। चलो पता करते हैं!

चरण 4: हमारे कार्यक्रम के निर्देशों के अनुसार माइक्रोकंट्रोलर के कार्यों की जाँच करें

हमारे कार्यक्रम के निर्देशों के अनुसार माइक्रोकंट्रोलर के कार्यों की जाँच करें
हमारे कार्यक्रम के निर्देशों के अनुसार माइक्रोकंट्रोलर के कार्यों की जाँच करें
हमारे कार्यक्रम के निर्देशों के अनुसार माइक्रोकंट्रोलर के कार्यों की जाँच करें
हमारे कार्यक्रम के निर्देशों के अनुसार माइक्रोकंट्रोलर के कार्यों की जाँच करें
हमारे कार्यक्रम के निर्देशों के अनुसार माइक्रोकंट्रोलर के कार्यों की जाँच करें
हमारे कार्यक्रम के निर्देशों के अनुसार माइक्रोकंट्रोलर के कार्यों की जाँच करें

एवीआर ब्लिंकिंग एलईडी सर्किट के योजनाबद्ध आरेख के अनुसार घटकों को कनेक्ट करें।

सबसे पहले, हमें बिजली की जरूरत है, जैसा कि सभी एवीआर सर्किट करते हैं। AVR चिप के संचालन के लिए लगभग 5 वोल्ट की शक्ति पर्याप्त है। आप इसे बैटरी या डीसी बिजली की आपूर्ति से प्राप्त कर सकते हैं। हम 7 को पिन करने के लिए +5V पावर कनेक्ट करते हैं और ब्रेडबोर्ड पर पिन 8 को ग्राउंड से कनेक्ट करते हैं। दोनों पिनों के बीच, हम बिजली की आपूर्ति की शक्ति को सुचारू करने के लिए 0.1μF सिरेमिक कैपेसिटर लगाते हैं ताकि AVR चिप को एक चिकनी बिजली लाइन मिले।

डिवाइस को पावर ऑन रीसेट (पीओआर) प्रदान करने के लिए 10KΩ रोकनेवाला का उपयोग किया जाता है। जब बिजली चालू की जाती है, तो संधारित्र के आर-पार वोल्टेज शून्य हो जाएगा, इसलिए डिवाइस रीसेट हो जाता है (चूंकि रीसेट कम सक्रिय है), फिर संधारित्र VCC पर चार्ज होता है और रीसेट अक्षम हो जाएगा।

हम अपने एलईडी के एनोड को AVR पिन PB0 से जोड़ते हैं। यह ATMega328P का पिन 14 है। चूंकि यह एक एलईडी है, इसलिए हम एलईडी के प्रवाह को सीमित करना चाहते हैं ताकि यह जल न जाए। यही कारण है कि हम एलईडी के साथ श्रृंखला में 330Ω रोकनेवाला लगाते हैं। एलईडी का कैथोड जमीन से जुड़ जाता है।

16 मेगाहर्ट्ज क्रिस्टल का उपयोग Atmega328 माइक्रोकंट्रोलर के लिए घड़ी प्रदान करने के लिए किया जाता है और 22pF कैपेसिटर का उपयोग क्रिस्टल के संचालन को स्थिर करने के लिए किया जाता है।

ये सभी कनेक्शन हैं जो एलईडी को जलाने के लिए आवश्यक हैं। बिजली की आपूर्ति।

ठीक। एलईडी एक सेकंड की देरी से झपका रही है। माइक्रोकंट्रोलर का कार्य हमारे कार्यों से मेल खाता है।

चरण 5: निष्कर्ष

बेशक, यह सिर्फ एक एलईडी चमकाने के लिए एक लंबी प्रक्रिया थी, लेकिन सच्चाई यह है कि आपने बड़ी बाधाओं को सफलतापूर्वक दूर कर लिया है: एवीआर माइक्रोकंट्रोलर प्रोग्रामिंग के लिए हार्डवेयर प्लेटफॉर्म बनाना, एटमेल स्टूडियो को एकीकृत विकास मंच के रूप में उपयोग करना, एवीआरडीईई को सॉफ्टवेयर के रूप में उपयोग करना AVR माइक्रोकंट्रोलर को कॉन्फ़िगर और प्रोग्रामिंग करना।

अगर आप मेरे मूल माइक्रोकंट्रोलर प्रोजेक्ट पर अप टू डेट रहना चाहते हैं, तो मेरे YouTube को सब्सक्राइब करें! मेरे वीडियो देखना और साझा करना मैं जो करता हूं उसका समर्थन करने का तरीका है।

YouTube FOG चैनल को सब्सक्राइब करें

सिफारिश की: