कोई भी माइक्रोकंट्रोलर का उपयोग कैसे कर सकता है जिसमें केवल 384 बाइट्स प्रोग्राम मेमोरी है?


67

उदाहरण के लिए एक PIC10F200T

वस्तुतः आपके द्वारा लिखा गया कोई भी कोड इससे बड़ा होगा, जब तक कि यह एक ही उद्देश्य चिप न हो। क्या बाहरी भंडारण या कुछ और से अधिक प्रोग्राम मेमोरी लोड करने का कोई तरीका है? मैं बस उत्सुक हूं, मैं नहीं देखता कि यह कैसे उपयोगी हो सकता है ... लेकिन यह होना चाहिए।


6
छोटे माइक्रोकंट्रोलर्स के लिए आवेदन पत्र के बहुत सारे, विशेष प्रयोजन के संकेत जनरेटर से प्रोटोकॉल कन्वर्टर्स करने के लिए, कर रहे हैं, के लिए "नोड्स" एक बड़ा नियंत्रण प्रणाली में, आदि, आदि,
डेव ट्वीड

13
वैसे शतरंज खेलने का कार्यक्रम 672 बाइट लेता है, इसलिए यह अच्छा नहीं है। en.wikipedia.org/wiki/1K_ZX_Chess
जॉन बर्टन

8
यहां छोटे कार्यक्रमों (256 बाइट्स से कम) के साथ क्या किया जा सकता है, इसके कुछ उदाहरण दिए गए हैं
हमार

9
आपका क्या मतलब है, "जब तक कि इसका एकल उद्देश्य चिप न हो"? अधिकांश एम्बेडेड सिस्टम एकल उद्देश्य हैं।
जीनी पिंडर

6
कॉलेज में वापस, मैंने 8085/8155 कंप्यूटर (अधिकतम 256 बाइट्स) के लिए पूरी तरह कार्यात्मक ट्रैफिक लाइट प्रोग्राम बनाया, जिसे मैंने इकट्ठा किया। इसमें वॉक बटन और कुछ सेंसर थे जो किसी वाहन की उपस्थिति का अनुकरण करेंगे।
बजे Zoredache

जवाबों:


133

तुम बच्चों, मेरे लॉन से उतरो!

384 बाइट्स असेंबलर में कुछ काफी जटिल बनाने के लिए बहुत जगह है।

यदि आप इतिहास के माध्यम से वापस खुदाई करते हैं जब कंप्यूटर एक कमरे के आकार थे, तो आपको <1k में निष्पादित कलात्मकता के कुछ सही अद्भुत कारनामे मिलेंगे।

उदाहरण के लिए, मेल की क्लासिक कहानी - एक वास्तविक प्रोग्रामर पढ़ें । निस्संदेह, उन लोगों के पास स्मृति के 4096 शब्द थे, जिनके साथ डिकेडेंट काफिर थे।

कुछ पुरानी डिमोसिन प्रतियोगिताओं को भी देखें जहां चुनौती एक फ्लॉपी के बूटलॉक में "इंट्रो" फिट करने के लिए थी, विशिष्ट लक्ष्य 4k या 40k है और आमतौर पर संगीत और एनीमेशन को शामिल करने के लिए प्रबंध करते हैं।

जोड़ने के लिए संपादित करें : पता चलता है कि आप 320 शब्दों में दुनिया के पहले $ 100 वैज्ञानिक कैलकुलेटर को लागू कर सकते हैं ।

युवा के लिए संपादित करें 'uns:

  • फ्लॉपी = फ्लॉपी डिस्क।
  • बूटब्लॉक = फ्लॉपी का पहला सेक्टर बूटअप में पढ़ा जाता है।
  • डेमोसिन = हैकर समूहों के बीच प्रोग्रामिंग प्रतियोगिताएं।
  • असेंबलर = डिवाइस को प्रोग्रामिंग करने का फैंसी तरीका यदि आप 8 टॉगल स्विच और "स्टोर" बटन का उपयोग करने के लिए बहुत नरम हैं।

4
अटारी 2600 गेम कंसोल में ROM गेम कारतूस में केवल 4KB स्टोरेज था (हालांकि कुछ गेम्स ने इस सीमा के आसपास बैंक स्विचिंग का उपयोग करके 4K से अधिक उपयोग किया गया था)।
जॉनी

1
Eons पहले मैंने एक बहुत ही यथार्थवादी पक्षी-चिंप बनाया (पर्याप्त है कि लोग कंप्यूटर पर संदेह करने के बजाय पक्षी की तलाश करते थे), हिम्मत की (लेकिन यादृच्छिक कोड नहीं है जो इसे हर बार एक ही ध्वनि बनाने से बचाए रखा है) लगभग 384 बाइट्स में और मेरे पास बिना किसी योग्य पते के अतिरिक्त प्रतिबंध थे और बाइनरी में एक शून्य बाइट की अनुमति नहीं थी।
लोरेन Pechtel

2
मुझे और बाहर निकलने की ज़रूरत है, दिन में इसे पीछे से याद किया - 368 बाइट्स में स्क्रीन सेवर: aminet.net/package/util/blank/368blanker
John U

7
"मेल की कहानी" के लिए +1। सबसे बड़ी चीजों में से एक जो मैंने पूरे सप्ताह पढ़ी है।
जस्टिन ᚅᚔᚈᚄᚒᚔ

1
@ जॉन: अटारी 2600 पर पहले कुछ गेम सभी 2K थे। कई डेवलपर्स ने कभी भी 4K से आगे जाने वाले किसी भी गेम को डिज़ाइन नहीं किया, क्योंकि भले ही 8K चिप्स सस्ती थीं (और कुछ कंपनियों की गाड़ियां केवल एक 4K चिप का आधा इस्तेमाल करती थीं) एक मानक (सक्रिय-कम चिप-चयन) का उपयोग करके कार्ड में बैंक-स्विचिंग जोड़ते हैं चिप ने समर्थन चिप्स की संख्या को एक से तीन तक बढ़ा दिया।
सुपरकैट

59

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

  movwf OSCCON
mainLp:
  ; Set output low
  clrf  GPIO
  movlw 0xFE
  movwf TRIS
  clrwdt
  call  Wait1Sec
  clrwdt
  call  Wait1Sec
  clrwdt
  call  Wait1Sec
  clrwdt
  call  Wait1Sec
  ; Set output high
  bsf   GPIO,0
  clrwdt
  call  Wait1Sec
  goto  mainLp
Wait1Sec:
  movlw 6
  movwf count2
  movlw 23
  movwf count1
  movlw 17
  movwf count0
waitLp:
  decfsz count0
   goto   waitLp
  decfsz count1
   goto   waitLp
  decfsz count2
   goto   waitLp
  retlw  0

यह कोड स्थान के 32 शब्दों (48 बाइट्स) से कम में वास्तविक, प्रयोग करने योग्य, अनुप्रयोग होगा। कुछ आई / ओ पिन्स कंट्रोल टाइमिंग विकल्पों में से कुछ के लिए आसानी से कुछ विकल्प जोड़ सकते हैं और अभी भी बहुत सारे कमरे खाली करने के लिए हैं, लेकिन भले ही सभी चिप ने ठीक किया हो, जो कि ऊपर दिखाया गया है, फिर भी असतत का उपयोग करके किसी भी विकल्प की तुलना में सस्ता और आसान हो सकता है। तर्क। BTW, clrwdtनिर्देशों को उप-केंद्र में स्थानांतरित किया जा सकता है, लेकिन ऐसा करने से चीजें कम मजबूत होंगी। जैसा कि लिखा गया है, भले ही एक गड़बड़ भ्रष्ट रिटर्न प्राप्त करने के लिए रिटर्न-एड्रेस स्टैक का कारण बनता है, तब तक वॉचडॉग को खिलाया नहीं जाएगा जब तक कि मुख्य लूप पर वापस नहीं आ जाता। यदि ऐसा कभी नहीं होता है, तो वॉचडॉग कुछ सेकंड के बाद चिप को रीसेट कर देगा।


9
ईमानदारी से, आप अपने कोड को थोड़ा अनुकूलित कर सकते हैं, बच्चों के लिए एक बुरा उदाहरण सेट कर सकते हैं - Wait1sec के लिए 5 अलग-अलग कॉल ??? ख़राबी! ;)
जॉन यू

9
@ जॉन: एफवाईआई, कोड अलग-अलग कॉल का उपयोग करता है क्योंकि अगर उसने एक काउंटर-टू-जीरो काउंटर का उपयोग किया और गिनती गड़बड़ हो गई, तो लूप चार के बजाय 255 बार चल सकता है, जबकि वॉचडॉग को प्रति सेकंड एक बार खिलाया जाता है। हालांकि यह संभव होगा कि प्रत्येक लूप पर जाँच करके कि क्या गिनती रेंज में थी, ऐसा करने वाला कोड पाँच कॉल और पाँच clrwdtनिर्देशों से अधिक जटिल होता है । यह संभवत: सबसे अधिक विफल-विफल काउंटर व्यवस्था नहीं है, लेकिन कुछ विचार सुरक्षा मुद्दों (जैसे एक सबरूट के clrwdtभीतर का परिहार ) को दिया जाता है ।
सुपरकैट

10
@ कोडर 543: बिजली-आपूर्ति के शोर जैसी चीजों के अभाव में, बहुत कम नहीं। दूसरी ओर, ब्राउन-आउट डिटेक्टर के बिना भागों में, सभी प्रकार की पागल चीजों के लिए संभव है यदि वीडीडी न्यूनतम ऑपरेटिंग वोल्टेज और जमीन के बीच एक स्तर तक गिरता है, और फिर वापस सामान्य हो जाता है। आम तौर पर यह सुनिश्चित करने का प्रयास करना चाहिए कि कोई भी राज्य जिसमें डिवाइस खुद को पाता है वह उचित अवधि में सामान्य में वापस आ जाएगा। वॉचडॉग को किक करने के लिए दो सेकंड या तो अपरिहार्य हो सकता है, लेकिन एक गड़बड़ काउंटर के लिए शून्य तक पहुंचने के लिए चार मिनट का समय थोड़ा अधिक हो सकता है।
सुपरकैट

10
@ कोडर 543, वे एक महत्वपूर्ण डेमो पर अधिक बार होते हैं जितना आप विश्वास करना चाहते हैं। गहरी एम्बेडेड चीजों का निर्माण करते समय इस तरह की सोच की भी आवश्यकता होती है जिसमें मदद के लिए कॉल करने या त्रुटि की रिपोर्ट करने का कोई साधन नहीं होता है। या दुर्गम हैं (गहरे समुद्र या बाहरी स्थान के बारे में सोचें) भले ही कोई त्रुटि नजर आए।
RBerteig

6
@ जॉन: मैंने इसे नोटिस किया था, लेकिन यह समझा कि मैंने कोड क्यों लिखा, क्योंकि मैं सहायक हो सकता था। संयोग से, मैं यह भी दिखाने की कोशिश कर रहा था कि छोटे कार्य एक छोटे प्रोसेसर में फिट हो सकते हैं, भले ही वे पूरी तरह से अनुकूलित न हों।
सुपरकाट

26

"केवल" 384 बाइट्स?

दिन में वापस, मेरे पास एक विशेष कंप्यूटर के लिए एक संपूर्ण ऑपरेटिंग सिस्टम (खुद से) लिखने का काम था जो जहाज, पाइपलाइन और रिफाइनरी प्रबंधन उद्योग को सेवा देता था। कंपनी का पहला ऐसा उत्पाद 6800 आधारित था और इसे 6809 में अपग्रेड किया जा रहा था, और वे चाहते थे कि एक नया ओएस 6809 के साथ जाए ताकि वे मूल ऑपरेटिंग सिस्टम की लाइसेंस लागत को समाप्त कर सकें। वे बूट ब्यूट के आकार को 64 बाइट तक उछाल रहे थे, 32 से ऊपर। अगर मुझे सही याद है - तो यह लगभग 33 साल पहले था! - मैंने इंजीनियरों को मुझे 128 बाइट देने के लिए मना लिया, ताकि मैं पूरे ऑपरेटिंग सिस्टम के डिवाइस ड्राइवरों को रोम पर रख सकूं और इस तरह पूरे डिवाइस को अधिक विश्वसनीय और बहुमुखी बना सकूं। इसमें शामिल हैं:

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

हां, ये सभी नंगे-हड्डियों के रूप में थे जो इसे प्राप्त करते हैं, और प्रत्येक बाहरी चक्र को हटाने के लिए हाथ से अनुकूलित किया जाता है, लेकिन पूरी तरह से सेवा करने योग्य और विश्वसनीय है। हां, मैंने उस सभी को उपलब्ध बाइट्स में बदल दिया - ओह, इसमें ALSO ने इंटरप्ट हैंडलिंग, विभिन्न स्टैक की स्थापना की, और रीयल-टाइम / मल्टी-टास्किंग ऑपरेटिंग सिस्टम को इनिशियलाइज़ किया, बूट विकल्प पर उपयोगकर्ता को प्रेरित किया, और सिस्टम को बूट किया।

मेरा एक दोस्त जो अभी भी कंपनी (इसके उत्तराधिकारी) से जुड़ा है, उसने कुछ साल पहले मुझे बताया था कि मेरा कोड अभी भी सेवा में है!

आप 384 बाइट्स के साथ बहुत कुछ कर सकते हैं ...


2
आप बूट रोम कहते हैं, और आप बूट ड्राइवर पर चलते ड्राइवरों का उल्लेख करते हैं ... यह मुझे इंगित करता है कि द्वितीयक भंडारण माध्यम उपलब्ध था। इस चर्चा में, हम पहले ही यह निर्धारित कर चुके हैं कि आप इस PIC पर बाह्य संग्रहण से कोड लोड नहीं कर सकते।
कोडर 543 21

5
@ coder543 यह बात याद आती है: 384 बाइट्स काफी कुछ करने के लिए पर्याप्त है! मूल प्रश्न एक शिकायत की तरह पढ़ा गया कि 384 उपयोगी कुछ भी करने के लिए पर्याप्त नहीं था - यह मेरी ज़रूरत से ज़्यादा था - एक बहुत अधिक - एक वास्तविक समय, मल्टी-टास्किंग ऑपरेटिंग सिस्टम के सभी बुनियादी घटकों को प्रदान करने के लिए ...
रिचर्ड टी

21

आप इसका उपयोग बहुत छोटे अनुप्रयोगों के लिए कर सकते हैं (उदाहरण के लिए विलंबित PSU प्रारंभ , 555 टाइमर प्रतिस्थापन , triac- आधारित नियंत्रण , एलईडी ब्लिंकिंग आदि ...) छोटे पदचिह्न के साथ तर्क गेट्स या 555 टाइमर की आवश्यकता होगी।


3
मैंने अभी देखा कि वे पहले दो उदाहरण स्टैक के ही थे! बहुत बढ़िया।
कोडर 543

9
पायदान का उल्लेख करने के लिए +1। कभी-कभी आकार ही सब कुछ होता है।
एम्बेडेड

17

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

मैंने आपके द्वारा उल्लिखित pic10f का उपयोग किया।


यहाँ कोड है जो मैंने अपने प्लांट वॉटर सेंसर के लिए बनाया है। मैंने pic10f220 का उपयोग किया है क्योंकि इसमें ADC मॉड्यूल है, इसमें pic10f200 के समान मेमोरी है, मैं कल योजनाबद्ध खोजने की कोशिश करूंगा।

कोड स्पेनिश में है, लेकिन इसका बहुत सरल और आसानी से समझा जाना चाहिए। जब Pic10F स्लीप मोड से उठता है, तो यह रीसेट हो जाएगा ताकि आपको यह जांचना पड़े कि क्या यह पावरअप या रीसेट है और तदनुसार कार्य करें। संयंत्र की स्थापना को राम में रखा गया है क्योंकि यह वास्तव में कभी शक्तियां नहीं है।

main.c

/*
Author: woziX (AML)

Feel free to use the code as you wish. 
*/

#include "main.h"

void main(void) 
{  
    unsigned char Humedad_Ref;
    unsigned char Ciclos;
    unsigned char Bateria_Baja;
    unsigned char Humedad_Ref_Bkp;

    OSCCAL &= 0xfe;             //Solo borramos el primer bit
    WDT_POST64();                   //1s
    ADCON0 = 0b01000000;
    LEDOFF();
    TRIS_LEDOFF(); 

    for(;;) 
    {  
        //Se checa si es la primera vez que arranca
        if(FIRST_RUN())
        {
            Ciclos = 0;
            Humedad_Ref = 0;
            Bateria_Baja = 0;
        }

        //Checamos el nivel de la bateria cuando arranca por primera vez y cada 255 ciclos.
        if(Ciclos == 0)
        {
            if(Bateria_Baja)
            {
                Bateria_Baja--;
                Blink(2);
                WDT_POST128();
                SLEEP();
            }       

            if(BateriaBaja())
            {
                Bateria_Baja = 100;     //Vamos a parpadear doble por 100 ciclos de 2 segundos
                SLEEP();
            }
            Ciclos = 255;
        }   

        //Checamos si el boton esta picado
        if(Boton_Picado)
        {
            WDT_POST128();
            CLRWDT();
            TRIS_LEDON(); 
            LEDON();
            __delay_ms(1000);   
            TRIS_ADOFF();
            Humedad_Ref = Humedad();
            Humedad_Ref_Bkp = Humedad_Ref;
        }   

        //Checamos si esta calibrado. Esta calibrado si Humedad_Ref es mayor a cero
        if( (!Humedad_Ref) || (Humedad_Ref != Humedad_Ref_Bkp) )
        {
            //No esta calibrado, hacer blink y dormir
            Blink(3);
            SLEEP();
        }   

        //Checamos que Humedad_Ref sea mayor o igual a 4 antes de restarle 
        if(Humedad_Ref <= (255 - Offset_Muy_Seca))
        {
            if(Humedad() > (Humedad_Ref + Offset_Muy_Seca)) //planta casi seca
            {
                Blink(1);
                WDT_POST32();
                SLEEP();    
            }       
        }

        if(Humedad() >= (Humedad_Ref))  //planta seca
        {
            Blink(1);
            WDT_POST64();
            SLEEP();    
        }   

        if(Humedad_Ref >= Offset_Casi_Seca )
        {
            //Si Humedad_Ref es menor a Humedad, entonces la tierra esta seca. 
            if(Humedad() > (Humedad_Ref - Offset_Casi_Seca))  //Planta muy seca
            {
                Blink(1);
                WDT_POST128();
                SLEEP();    
            }
        }

        SLEEP();
    }  
} 

unsigned char Humedad (void)
{
    LEDOFF();
    TRIS_ADON();
    ADON();
    ADCON0_CH0_ADON();
    __delay_us(12); 
    GO_nDONE = 1;
    while(GO_nDONE);
    TRIS_ADOFF();
    ADCON0_CH0_ADOFF();
    return ADRES;
}   

//Regresa 1 si la bateria esta baja (fijado por el define LOWBAT)
//Regresa 0 si la bateria no esta baja
unsigned char BateriaBaja (void)
{
    LEDON();                
    TRIS_ADLEDON();
    ADON();
    ADCON0_ABSREF_ADON();
    __delay_us(150);        //Delay largo para que se baje el voltaje de la bateria 
    GO_nDONE = 1;
    while(GO_nDONE);
    TRIS_ADOFF();
    LEDOFF();
    ADCON0_ABSREF_ADOFF();  
    return (ADRES > LOWBAT ? 1 : 0);
}   

void Blink(unsigned char veces)
{
    while(veces)
    {
        veces--;
        WDT_POST64();
        TRIS_LEDON(); 
        CLRWDT();
        LEDON();
        __delay_ms(18); 
        LEDOFF();
        TRIS_ADOFF();
        if(veces)__delay_ms(320);   
    }   
}   

MAIN.H

/*
Author: woziX (AML)

Feel free to use the code as you wish. 
*/

#ifndef MAIN_H
#define MAIN_H

#include <htc.h>
#include <pic.h>

 __CONFIG (MCPU_OFF  & WDTE_ON & CP_OFF & MCLRE_OFF & IOSCFS_4MHZ ); 

#define _XTAL_FREQ              4000000
#define TRIS_ADON()             TRIS = 0b1101
#define TRIS_ADOFF()            TRIS = 0b1111
#define TRIS_LEDON()            TRIS = 0b1011
#define TRIS_LEDOFF()           TRIS = 0b1111
#define TRIS_ADLEDON()          TRIS = 0b1001


#define ADCON0_CH0_ADON()          ADCON0 = 0b01000001;     // Canal 0 sin ADON
#define ADCON0_CH0_ADOFF()       ADCON0 = 0b01000000;       // Canal 0 con adON
#define ADCON0_ABSREF_ADOFF()    ADCON0 = 0b01001100;       //Referencia interna absoluta sin ADON
#define ADCON0_ABSREF_ADON()     ADCON0 = 0b01001101;       //referencia interna absoluta con ADON

//Llamar a WDT_POST() tambien cambia las otras configuracion de OPTION
#define WDT_POST1()   OPTION = 0b11001000
#define WDT_POST2()   OPTION = 0b11001001
#define WDT_POST4()   OPTION = 0b11001010
#define WDT_POST8()   OPTION = 0b11001011
#define WDT_POST16()  OPTION = 0b11001100
#define WDT_POST32()  OPTION = 0b11001101
#define WDT_POST64()  OPTION = 0b11001110
#define WDT_POST128() OPTION = 0b11001111

#define Boton_Picado    !GP3
#define FIRST_RUN()     (STATUS & 0x10) //Solo tomamos el bit TO

//Offsets
#define Offset_Casi_Seca  5
#define Offset_Muy_Seca   5

 //Low Bat Threshold
#define LOWBAT                    73
/*
Los siguientes valores son aproximados
LOWBAT  VDD
50      3.07
51      3.01
52      2.95
53      2.90
54      2.84
55      2.79
56      2.74
57      2.69
58      2.65
59      2.60
60      2.56
61      2.52
62      2.48
63      2.44
64      2.40
65      2.36
66      2.33
67      2.29
68      2.26
69      2.23
70      2.19
71      2.16
72      2.13
73      2.10
74      2.08
75      2.05
76      2.02
77      1.99
78      1.97
*/


#define LEDON()                 GP2 = 0; //GPIO = GPIO & 0b1011
#define LEDOFF()                GP2 = 1; //GPIO = GPIO | 0b0100
#define ADON()                  GP1 = 0; //GPIO = GPIO & 0b1101
#define ADOFF()                 GP1 = 1; //GPIO = GPIO | 0b0010

unsigned char Humedad (void);
unsigned char BateriaBaja (void);
void Delay_Parpadeo(void);
void Blink(unsigned char veces);

#endif

मुझे पता है कि अगर आपके कोई प्रश्न हैं, तो मुझे याद रखने के आधार पर उत्तर देने का प्रयास करेंगे। मैंने इसे कई साल पहले कोडित किया था इसलिए मेरे कोडिंग कौशल की जांच न करें, उन्होंने सुधार किया है :)।

अंतिम नोट। मैंने हाई-टेक सी कंपाइलर का इस्तेमाल किया।


3
मैं वास्तव में पढ़ने में दिलचस्प होगा कि आपने यह कैसे किया। क्या आप कोई भी नोट ले रहे थे जब आप यह कर रहे थे कि आप जाले पर साझा करना बुरा नहीं मानेंगे?
RhysW

1
हैलो RhysW, मुझे विश्वास है कि मेरे पास अभी भी कोड है। यह वास्तव में वास्तव में सरल था। यदि आप रुचि रखते हैं तो मैं आपको अपना कोड भेज सकता हूं। मुझे बताएं। मेरे द्वारा तैयार किया गया सर्किट बहुत ही सरल और शांत है, केवल 3 रेसिस्टर्स, एक पी-चैनल मॉस्फ़ेट (रिवर्स बैटरी प्रोटेक्शन के लिए) 100nF कैप और एक एलईडी। मैं बैटरी माप के लिए एक संदर्भ के रूप में उपयोग करने के लिए और एडीसी रीडिंग को स्थिर रखने के लिए pic10f में आंतरिक डायोड का उपयोग करता हूं।
scrafy

1
यह एक साफ-सुथरी परियोजना की तरह लगता है। क्या कोई मौका है कि आप यहां विवरण पोस्ट कर सकें (या कम से कम उन्हें कहीं पोस्ट करें और उन्हें लिंक करें)?
इल्मरी करोनें

1
हैलो स्क्रीफी! कृपया, यदि आपके पास उत्तर में जोड़ने के लिए कुछ है, तो एक नया उत्तर पोस्ट करने के बजाय "संपादित करें" लिंक का उपयोग करें, क्योंकि यह साइट मतदान का उपयोग करती है और एक मंच की तरह काम नहीं करती है।
clabacchio

16

एक बात जिसका मैंने उल्लेख नहीं किया है: आपके द्वारा उल्लेखित माइक्रोकंट्रोलर 100 की मात्रा में केवल $ 0.34 है। इसलिए सस्ते, बड़े पैमाने पर उत्पादित उत्पादों के लिए, इस तरह की सीमित इकाई द्वारा लगाए गए अतिरिक्त कोडिंग मुसीबत में जाने के लिए समझ में आ सकता है। वही आकार या बिजली की खपत पर लागू हो सकता है।


2
यही मेरा पहला विचार था। इसके अलावा: अगर मैं एक नीट विचार वाला एक स्टार्टअप होगा, लेकिन केवल कुछ सौ रुपये ढीले होंगे, तो इस तरह से सामान का मतलब हो सकता है कि दिन-प्रतिदिन की नौकरी और नौकरी छोड़ने के बीच का अंतर।
फॉटेनलाइन

14

जब मैं हाई स्कूल में था, मेरे पास एक शिक्षक था जिसने जोर देकर कहा था कि एक छात्र के लिए लाइट डिमिंग बहुत मुश्किल काम था, जैसे कि मैं निपट सकता हूं।

इस प्रकार चुनौती दी गई कि मैंने बहुत समय बिताया है कि यह ट्राइक्स का उपयोग करते हुए प्रकाश आधारित डिमिंग और सीखने के चरण को समझ सके और इस करतब को करने के लिए माइक्रोचिप से 16C84 की प्रोग्रामिंग की। मैं इस विधानसभा कोड के साथ समाप्त हुआ:

'Timing info:
'There are 120 half-cycles in a 60Hz AC waveform
'We want to be able to trigger a triac at any of 256 
'points inside each half-cycle.  So:
'1 Half cycle takes 8 1/3 mS
'1/256 of one half cycle takes about 32.6uS
'The Pause function here waits (34 * 0xD)uS, plus 3uS overhead
'Overhead includes CALL PAUSE.
'This was originally assembled using Parallax's "8051 style" 
'assembler, and was not optimized any further.  I suppose
'it could be modified to be closer to 32 or 33uS, but it is
'sufficient for my testing purposes.

list 16c84

    movlw   0xFD     '11111101
    tris    0x5      'Port A
    movlw   0xFF     '11111111
    tris    0x6      'Port B
WaitLow:             'Wait for zero-crossing start
    btfss   0x5,0x0  'Port A, Bit 1
    goto    WaitLow  'If high, goto WaitLow
WaitHigh:            'Wait for end of Zero Crossing
    btfsc   0x5,0x0  'Port A, Bit 1
    goto    WaitHigh 'If low, goto waitHigh
    call    Pause    'Wait for 0xD * 34 + 3 uS
    bcf     0x5,0x1  'Put Low on port A, Bit 1
    movlw   0x3      'Put 3 into W
    movwf   0xD      'Put W into 0xD
    call    Pause    'Call Pause, 105 uS
    bsf     0x5,0x1  'Put High on Port A, Bit 1
    decf    0xE      'Decrement E
    movf    0x6,W    'Copy Port B to W
    movwf   0xD      'Copy W to 0xD
    goto    Start    'Wait for zero Crossing
Pause:               'This pauses for 0xD * 34 + 3 Micro Seconds
                     'Our goal is approx. 32 uS per 0xD
                     'But this is close enough for testing
    movlw   0xA      'Move 10 to W
    movwf   0xC      'Move W to 0xC
Label1:
    decfsz  0xC      'Decrement C
    goto    Label1   'If C is not zero, goto Label1
    decfsz  0xD      'Decrement D
    goto    Pause    'If D is not zero, goto Pause
    return           'Return

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

आप मेरे लाइट डिमिंग पेज पर अधिक परियोजना की जानकारी पा सकते हैं । संयोग से मैंने कभी भी अपने शिक्षक को यह नहीं दिखाया, लेकिन अपने डीजे मित्र के लिए कई तरह के प्रकाश रिग्स करने का काम किया।


12

खैर, सालों पहले मैंने सीरियल I / O के साथ एक तापमान नियंत्रक लिखा था (धारावाहिक I / O को थोड़ा-सा पीटना क्योंकि MCU में UART नहीं था) और नियंत्रक से बात करने के लिए एक साधारण कमांड दुभाषिया। MCU एक मोटोरोला (अब Freescale) MC68HC705K1 था जिसमें प्रोग्राम मेमोरी (OTPROM) की 504 बाइट्स और लगभग 32 बाइट्स RAM थी। आपके द्वारा संदर्भित PIC जितना छोटा नहीं है, लेकिन मुझे याद है कि कुछ ROM बचे हुए हैं। मेरे पास अभी भी कुछ इकट्ठी इकाइयाँ बची हैं, 17 साल बाद; एक खरीदना चाहते हैं?

तो हाँ, यह किया जा सकता है, कम से कम विधानसभा में।

किसी भी मामले में, मैंने हाल ही में बहुत सरल सी प्रोग्राम लिखे हैं जो कि अनुकूलित होने पर संभवतः 384 बाइट्स के अंदर फिट होंगे। नहीं सब कुछ बड़े, जटिल सॉफ्टवेयर की आवश्यकता है।


5

आप 384 बाइट्स प्रोग्राम मेमोरी के साथ एक ब्लिंक को एक एलईडी लिख सकते हैं, और इससे भी अधिक।

जहां तक ​​मुझे पता है, प्रोग्राम मेमोरी को बाहरी चिप के साथ विस्तारित करना संभव नहीं है (जब तक कि आप 384 बाइट्स में पूर्ण एएसएम दुभाषिया का निर्माण नहीं कर रहे हैं , जो धीमा होगा)। यद्यपि एक बाहरी चिप (EEPROM, SRAM) के साथ डेटा मेमोरी का विस्तार करना संभव है।


1
384 बाइट्स में ट्यूरिंग मशीन सिम्युलेटर का निर्माण करना कठिन नहीं होगा ...
क्रिस स्ट्रैटन

@ChrisStratton मेरा मतलब था कि एक पूर्ण दुभाषिया, ताकि 'विस्तारित प्रोग्राम मेमोरी' में सामान्य रूप में एक जैसी विशेषताएं हों।

हां, यह वही है जो मैंने कसकर लागू करने का सुझाव दिया था। बाकी है सिर्फ कंपाइलर डिज़ाइन ...
क्रिस स्ट्रैटन

7
यदि कोई बाहरी लॉजिक EEPROM में संग्रहीत किया जाना चाहता है, तो PIC निर्देश सेट का अनुकरण करने का प्रयास करने का तरीका नहीं होगा। एक बेहतर दृष्टिकोण एक निर्देश सेट डिजाइन करना होगा जो वर्चुअल मशीन के साथ उपयोग के लिए अनुकूलित था; वास्तव में, यह वही दृष्टिकोण है जो 1990 के दशक में पारलैक्स ने अपने "बेसिक STAMP" के साथ लिया था। यह कोड स्थान के 3072 बाइट्स के साथ एक PIC था, जिसे एक सीरियल EEPROM चिप के साथ जोड़ा गया था।
सुपरकैट

3
BTW, BASIC स्टैम्प के बारे में एक अतिरिक्त टिप्पणी: यह ऐसे समय में पेश किया गया था जब फ्लैश आधारित या EEPROM आधारित माइक्रोकंट्रोलर तुलनात्मक रूप से दुर्लभ थे, लेकिन सीरियल EEPROM चिप्स काफी सस्ते थे। ऐसे अनुप्रयोगों के लिए जिन्हें अधिक गति की आवश्यकता नहीं थी, एक सीरियल EEPROM भाग के साथ एक निश्चित-कोड माइक्रो एक तुलना-योग्य EEPROM या फ्लैश-आधारित माइक्रो से सस्ता होगा। बेसिक स्टैम्प का डिज़ाइन आज समझ में नहीं आएगा, लेकिन जब इसे पेश किया गया था तो यह काफी व्यावहारिक था।
सुपरकैट

4

यह वास्तव में आपके विचार से भी बदतर है। जब आप इस प्रोसेसर को प्रोग्राम मेमोरी के 384 बाइट्स के रूप में निर्दिष्ट करते हैं, तो आपका लिंक किया हुआ मूसर पेज भ्रमित कर रहा है। PIC10F200 में वास्तव में कार्यक्रम मेमोरी के 256 12-बिट शब्द हैं

तो, आप इसके साथ क्या कर सकते हैं? 12 बिट पीआईसी अनुदेश सेट PIC10F20 द्वारा इस्तेमाल किया एक्स उपकरणों सब एक-शब्द निर्देश दिए गए हैं, ताकि आप प्रोसेसर सेटअप के लिए कुछ निर्देश घटाना के बाद, आप लगभग 250 कदम की एक कार्यक्रम के लिए पर्याप्त जगह के साथ छोड़ दिया जाता है। यह बहुत सारे अनुप्रयोगों के लिए पर्याप्त है। मैं शायद उस तरह के अंतरिक्ष में वॉशिंग मशीन नियंत्रक लिख सकता हूं, उदाहरण के लिए।

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


आप 256 निर्देश शब्दों के बारे में सही हैं। वास्तव में उनमें से एक को थरथरानवाला अंशांकन निरंतर के साथ लिया जाता है, इसलिए आपको 255 उपयोग योग्य निर्देश मिलते हैं। इसके अलावा, 10F200 सामान्य PIC 16 14-बिट अनुदेश सेट का उपयोग नहीं करता है। यह PIC 12 12-बिट अनुदेश सेट का उपयोग करता है। हालाँकि, मैं आपके मूल परिसर से सहमत हूँ। मैंने PIC 10F200 के साथ बहुत सारी उपयोगी चीजें की हैं। +1
ओलिन लेथ्रोप

@ ओलिनथ्रोप: मैंने उत्तर स्पष्ट कर दिया है। मुझे डेटशीट के पेज 51 से PIC16 शब्द मिला है , लेकिन मैंने फैसला किया है कि यह "12-बिट इंस्ट्रक्शन सेट" को संदर्भित करने के लिए स्पष्ट है। भाग उपसर्ग उपयोग किए गए निर्देश सेट के लिए एक विश्वसनीय गाइड नहीं है।
वारेन यंग

0

मेरे दिन में मेरे गन्ने को लहराते हुए , हमें रेत से बाहर अपने चूतड़ों को खोदना पड़ा!

1976 (या उसके बाद) में अटारी 2600 वीसीएस प्रणाली उस समय के सबसे लोकप्रिय "वीडियो गेम प्लेटफार्मों" में से एक थी। इसमें, माइक्रोप्रोसेसर (MOSTEK 6507) धधकते हुए ~ 1 मेगाहर्ट्ज पर चला गया और इसमें **** 128 बाइट्स RAM ** थी।

एक दूसरा उदाहरण जो मुझे बेहद सीमित रैम (~ 128 बाइट्स) वाले एक माइक्रोकंट्रोलर की याद दिलाता है, वह DC12-DC कनवर्टर पर इस्तेमाल होने वाला PIC12F था। इस माइक्रो को भी विधानसभा भाषा का उपयोग करना था ताकि सभी को चलाया जा सके।


4
ओपी रैम के बारे में बात नहीं कर रहा है, वह प्रोग्राम स्पेस के बारे में बात कर रहा है। अटारी 2600 में प्रोग्राम स्पेस कारतूस में है, न कि RIOT चिप में । 2600 समर्थित प्रोग्राम रोम बिना बैंक स्विचिंग के 4 kiB तक चलता है। (और कुछ वाणिज्यिक कारतूस ने बैंक स्विचिंग किया!) अपने PIC12F उदाहरण के लिए, ओपी ने आपको हरा दिया: PIC10F20x श्रृंखला के उपकरणों में SRAM के 16 या 24 बाइट्स हैं।
वॉरेन यंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.