Як може хтось використовувати мікроконтролер, який має лише 384 байти програмної пам'яті?


67

Наприклад, PIC10F200T

Практично будь-який код, який ви пишете, буде більшим за це, якщо тільки це не чіп однієї цілі. Чи є можливість завантажити більше пам'яті програми із зовнішнього сховища чи щось таке? Мені просто цікаво, я не бачу, як це може бути дуже корисним ... але це повинно бути.


6
Є багато додатків для маленьких мікроконтролерів, від генераторів сигналів спеціального призначення, конвертери протоколів, в «вузли» у більшій системі управління і т.д., і т.д.,
Дейв Tweed

13
Ну програма шахової гри займає 672 байти, так що це не добре. en.wikipedia.org/wiki/1K_ZX_Chess
Джон Бертон

8
Ось кілька прикладів того, що можна зробити за допомогою крихітних програм (менше 256 байт).
hammar

9
Що ви маєте на увазі, "якщо це єдиний цільовий чіп"? Більшість вбудованих систем мають єдине призначення.
Жанна Піндар

6
Ще в коледжі я створив повністю функціональну програму світлофора для 8085/8155 комп'ютера (макс. 256 байт), який я зібрав. На ній були кнопки прогулянки та деякі датчики, які б імітували наявність транспортного засобу.
Зоредаче

Відповіді:


133

Діти, зійдіть з моєї галявини!

384 байти - це достатньо місця, щоб створити щось досить складне в асемблері.

Якщо ви перекопаєтеся в історію до того, коли комп’ютери були розміром кімнати, ви знайдете кілька справді дивовижних подвигів артистизму, виконаних у <1k.

Наприклад, прочитайте класичну історію Мела - справжнього програміста . Щоправда, у цих хлопців було 4096 слів пам’яті, щоб грати, декадентські невірні.

Подивіться також на деякі старі змагання з демосцену, де завданням було вписати «вступ» у завантажувальний блок дискети, типовими цілями є 4k або 40k і зазвичай вдається включити музику та анімацію.

Редагувати, щоб додати : Виявляється, ви можете впровадити перший у світі науковий калькулятор у 100 слів у 320 слів.

Редагування для молодих людей:

  • Дискета = дискета.
  • Bootblock = 1-й сектор дискети, прочитаний під час завантаження.
  • Демосцен = змагання з програмування серед хакерських груп.
  • Assembler = фантазійний спосіб програмування пристрою, якщо ви занадто м'які, щоб використовувати 8 тумблерів та кнопку "зберігати".

4
Ігрова консоль Atari 2600 мала лише 4 КБ пам’яті в ігрових картриджах ROM (хоча деякі ігри обходили це обмеження, використовуючи банківські комутації для доступу більше 4 Кб).
Джонні

1
Еони тому я зробив досить реалістичну щебетання птахів (достатньо, щоб люди шукали птаха, а не підозрювали про комп'ютер), кишки якого (але не рандомізуючий код, який утримував його від того, щоб кожен раз видавати абсолютно однаковий звук) брякали приблизно в 384 байтах, і у мене були додаткові обмеження без записуваних адрес, і нульовий байт не дозволявся в двійковій.
Лорен Печтел

2
Мені потрібно вийти більше, згадав про це ще з того дня - заставка в 368 байт: aminet.net/package/util/blank/368blanker
Джон U

7
+1 за "Історію Мела". Одна з найбільших речей, яку я читав весь тиждень.
Джастін ᚅᚔᚈᚄᚒᚔ

1
@JohnU: Перші кілька ігор на Atari 2600 були 2K. Багато розробників ніколи не розробляли жодних ігор, що виходили за рамки 4K, тому що навіть незважаючи на те, що 8K фішки були доступними (а візки деяких компаній просто використовували половину чіпа 4K), додаючи банківські перемикання на карту за допомогою стандартного (active-low chip-select) чіп збільшив кількість мікросхем підтримки з однієї до трьох.
supercat

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 байт) кодового простору. Можна легко додати декілька варіантів, щоб мати кілька варіантів часу керування введенням-виведеннями та ще багато місця для запасного, але навіть якщо весь чіп зробив саме те, що показано вище, він все одно може бути дешевшим та простішим за будь-яку альтернативу з використанням дискретних логіка. До речі, clrwdtінструкції можна було б перенести в підпрограму, але це зробило б речі менш надійними. Як написано, навіть якщо глюк призводить до пошкодження стека зворотної адреси, сторожовий пес не буде подаватися, поки виконання не повернеться до основного циклу. Якщо цього ніколи не відбудеться, сторожовий пес скине чіп через пару секунд.


9
Чесно кажучи, ви могли трохи оптимізувати свій код, подавши дітям поганий приклад - 5 окремих дзвінків на wait1sec ??? Wastrel! ;)
Іван У

9
@JohnU: FYI, код використовує окремі дзвінки, тому що якщо він використовував лічильник відліку до нуля, і підрахунок збився, цикл може працювати 255 разів, а не чотири, під час годування сторожової собаки один раз на секунду. Хоча можна було б уберегтися від цього, перевіряючи на кожному циклі, чи є кількість ліній в діапазоні, але це зробити в кінцевому підсумку складніше, ніж п’ять викликів та п'ять clrwdtінструкцій. Це не найбезпечніша безпечна схема лічильника, але деяке врахування приділяється питанням безпеки (наприклад, уникненню в clrwdtрамках підпрограми).
supercat

10
@ coder543: За відсутності таких речей, як шум від живлення, не дуже. З іншого боку, у частинах без сповіщувача коричневого кольору можливі всілякі божевільні речі, якщо VDD впаде на рівень між мінімальною робочою напругою та землею, а потім повернеться до норми. Як правило, слід намагатися гарантувати, що будь-який стан, в якому може опинитися пристрій, повернеться до нормального стану за розумний проміжок часу. Дві секунди або близько того, щоб сторожовий собака бив, може бути неминучим, але чотири хвилини, коли глюковий лічильник досяг нуля, може бути небагато.
supercat

10
@ coder543, вони трапляються частіше на важливій демонстрації, ніж ви хочете вірити. Такий спосіб мислення також необхідний, коли будуєш глибоко вбудовані речі, які не мають можливості закликати допомогу або повідомити про помилку. Або недоступні (думайте, глибоке море чи космос), навіть якщо помилку помітили.
RBerteig

6
@JohnU: Я це помітив, але подумав, що пояснення, чому я написав код, як це було, може бути корисним. До речі, я також намагався показати, що невеликі завдання можуть вміщуватися в невеликому процесорі, навіть якщо вони не оптимізовані абсолютно ідеально.
supercat

26

"ТІЛЬКИ" 384 байти?

Зрештою, я мав завдання написати всю операційну систему (для себе) для спеціалізованого комп'ютера, який обслуговував судноплавство, трубопровід та галузь управління нафтопереробним заводом. Перший подібний продукт компанії був заснований на 6800 і був модернізований до 6809, і вони хотіли, щоб нова ОС була сумісна з 6809, щоб вони могли усунути ліцензійні витрати оригінальної операційної системи. Вони також накопичували розмір завантажувального диска до 64 байт, порівняно з 32. Якщо я пригадую правильно - це було 33 роки тому! - Я переконав інженерів дати мені 128 байт, щоб я міг поставити драйвери пристроїв усієї операційної системи на ром і таким чином зробити весь пристрій більш надійним та універсальним. Сюди входили:

  • Драйвер клавіатури з розблокуванням клавіш
  • Відеодрайвер
  • Драйвер дисковода та рудиментарна файлова система (Motorola "формат завантажувача", IIRC), з вбудованою здатністю обробляти "банківську" пам'ять так, ніби це дійсно швидкий простір на диску.
  • Драйвер модему (вони отримали FSK назад, тому ці модеми спілкувалися лише між собою)

Так, всі вони були настільки ж голими, як у них, і оптимізовані для ручного усунення кожного стороннього циклу, але ідеально справні та надійні. Так, я підключив все це до наявних байтів - о, він ТАКОЖ налаштував обробку переривань, різні стеки та ініціалізував операційну систему в режимі реального часу / багатозадачність, спонукав користувача до параметрів завантаження та завантажив систему.

Мій друг, який досі пов'язаний з компанією (її правонаступницею), сказав мені кілька років тому, що мій код все ще використовується!

Ви можете зробити багато з 384 байтами ...


2
Ви кажете завантажувальний rom, і ви згадуєте про переміщення драйверів на завантажувальний диск ... це вказує на мене, що був доступний вторинний носій інформації. У цій дискусії ми вже визначили, що ви не можете завантажувати код із зовнішнього сховища на цей PIC.
coder543

5
@ coder543 У цьому пропущено суть: 384 байти достатньо, щоб зробити дуже багато! Первісне запитання звучало як скарга на те, що 384 було недостатньо, щоб зробити щось корисне - це було більше, ніж мені потрібно, - МНОГО більше - щоб забезпечити всі основні компоненти операційної системи в реальному часі, багатозадачних операцій ...
Річард Т

21

Ви можете використовувати це для дуже малих програм (наприклад, затримка запуску блоку живлення , заміна 555 таймера , керування на основі тріака , миготіння світлодіодів тощо) з меншою площею, ніж вам потрібно з логічними воротами або 555 таймером.


3
Я щойно помітив, що ці перші два приклади були з самого Stack! гарно зіграно.
coder543

9
+1 для згадування сліду. Іноді розмір - це все.
embedded.kyle

17

Я створив датчик вологості для рослин, який відстежує кількість води, яку має рослина, і блимає світлодіодом, якщо рослині потрібна вода. Ви можете змусити датчик дізнатися тип рослини і тим самим змінити його настройки під час роботи. Він виявляє низьку напругу на акумуляторі. У мене не вистачило спалаху та оперативної пам’яті, але я зміг записати все в код C, щоб цей продукт працював бездоганно.

Я використав pic10f, який ви згадуєте.


Ось код, який я зробив для свого датчика води рослин. Я використав pic10f220 оскільки у нього є модуль АЦП, він має ту ж пам’ять, що і pic10f200, я спробую знайти схематичне завтра.

Код є іспанською, але він дуже простий і його слід легко зрозуміти. Коли Pic10F прокинеться зі сплячого режиму, він скинеться, тож вам доведеться перевірити, був він PowerUp або скидання, і діяти відповідно. Встановлення рослини зберігається в барані, оскільки воно ніколи насправді не вимикає.

ГОЛОВНИ.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);   
    }   
}   

ОСНОВНА

/*
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

Повідомте мене, якщо у вас є питання, я спробую відповісти на основі того, що я пам’ятаю. Я кодував це кілька років тому, тому не перевіряйте мої навички кодування, вони покращилися :).

Заключна примітка. Я використовував компілятор Hi-Tech C.


3
Мені б насправді було цікаво читати, як ти це зробив. Чи взагалі ви робили якісь нотатки, коли ви робили це, що ви не були б проти поділитися на веб-сайтах?
RhysW

1
Привіт RhysW, я вважаю, що у мене все ще є код. Насправді це було дуже просто. Я можу надіслати вам свій код, якщо вас цікавить. Дай мені знати. Схему, яку я сконструював, дуже проста і крута, всього 3 резистора, один p-канальний мосфет (для захисту акумуляторної батареї), кришка 100nF та світлодіод. Я використовую і внутрішній діод у pic10f, щоб використовувати як орієнтир для вимірювання акумулятора та підтримувати постійні показання АЦП.
scrafy

1
Це звучить як акуратний проект. Чи є ймовірність, що ви можете опублікувати деталі тут (або принаймні розмістити їх десь і покласти на них)?
Ільмарі Каронен

1
Здрастуйте, scrafy! Будь ласка, якщо у вас є що додати до відповіді, скористайтеся посиланням "редагувати", а не публікувати нову відповідь, оскільки цей сайт використовує голосування і не працює як форум.
clabacchio

16

Одне, що я ще не бачив: Мікроконтролер, який ви згадали, становить лише 0,34 долара кожен у кількості 100. Тож для дешевих продуктів масового виробництва може бути сенс звернутися до додаткової проблеми кодування, накладеної таким обмеженим пристроєм. Те саме може стосуватися розміру або енергоспоживання.


2
Це була саме моя перша думка. Також: Якщо я став би стартапом із акуратною ідеєю, але лише кілька сотень баксів розпущеним, подібні речі можуть означати різницю між поверненням до дня та відмовою від роботи.
phresnel

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.

Додаткову інформацію про проект ви можете знайти на моїй сторінці Light Dimming . Між іншим, я ніколи цього не показував своєму вчителю, але в кінцевому підсумку робив декілька освітлювальних установок для мого друга-діджея.


12

Ну, років тому я написав регулятор температури з послідовним входом / виводом (біт-тремтіння послідовного вводу-виводу, оскільки в MCU не було UART) та простий інтерпретатор команд, щоб поговорити з контролером. MCU була Motorola (тепер Freescale) MC68HC705K1, яка мала колосальні 504 байти програмної пам'яті (OTPROM) і близько 32 байт оперативної пам'яті. Не так багато, як PIC, на який ви посилаєтесь, але я пам’ятаю, що залишився ROM. У мене ще залишилося кілька зібраних одиниць, через 17 років; хочете придбати один?

Так що так, це можна зробити, принаймні, в зборах.

У будь-якому випадку, я нещодавно написав дуже прості програми на С, які, ймовірно, помістилися б у 384 байти при оптимізації. Не все вимагає великого, складного програмного забезпечення.


5

Можна написати блимаючи світлодіод з програмною пам'яттю 384 байти та навіть більше.

Наскільки я знаю, розширити пам'ять програми зовнішньою мікросхемою неможливо (якщо ви не будуєте повний інтерпретатор ASM у 384 байтах , що буде повільно). Можна також розширити пам'ять даних за допомогою зовнішнього чіпа (EEPROM, SRAM).


1
Було б важко побудувати тренажер машини Тьюрінга в 384 байти ...
Кріс Страттон

@ChrisStratton Я мав на увазі повного перекладача, щоб "розширена програмна пам'ять" мала ті самі функції, що і звичайна.

Так, саме для цього я запропонував засіб жорсткої реалізації. Решта - лише дизайн компілятора ...
Кріс Страттон

7
Якщо хотілося, щоб логіка програми зберігалася у зовнішньому EEPROM, спроба емуляції набору інструкцій PIC не була б дорогою. Кращим підходом було б розробити набір інструкцій, оптимізований для використання з віртуальною машиною; Дійсно, це такий підхід, який Parallax застосував зі своїм «Основним STAMP» у 1990-х. Це був PIC з 3072 байтами кодового простору, поєднаний з послідовним чіпом EEPROM.
supercat

3
До речі, додаткова примітка про марку BASIC: вона була введена в той час, коли мікроконтролери на базі флеш-бази або EEPROM були порівняно рідкісними, але серійні мікросхеми EEPROM були досить дешевими. Для додатків, яким не потрібна велика швидкість, мікрофіксація з фіксованим кодом із послідовною частиною EEPROM була б дешевшою порівняно за розміром EEPROM або мікросхеми на базі флеш-пам'яті. Дизайн штампу BASIC не мав би сенсу сьогодні, але він був досить практичним, коли він був представлений.
supercat

4

Це насправді гірше, ніж ти думаєш. Ваша пов’язана сторінка Mouser викликає заплутаність, коли вона визначає, що цей процесор має 384 байти пам'яті програми. PIC10F200 насправді містить 256 12-бітних слів програмної пам'яті.

Отже, що з цим можна зробити? Набір команд PIC 12-біт використовується PIC10F20 х пристроїв все інструкції з одного слова, так що після того, як ви віднімати кілька інструкцій для установки процесора, ви залишили достатньо місця для програми близько 250 кроків. Цього достатньо для безлічі застосувань. Я, мабуть, міг написати контролер пральної машини в такому просторі, наприклад.

Я просто переглянув доступні компілятори PIC C, і, схоже, приблизно половина з них навіть не намагатиметься випромінювати код для PIC10F200. Ті, хто, мабуть, виставив стільки кодового коду, що ви можете лише написати світлодіодний спалах у вільному місці. Ви дуже хочете використовувати мову складання з таким процесором.


Ви маєте рацію щодо 256 слів інструкцій. Насправді одна з них займається постійною калібрувальною генерацією осцилятора, тож ви отримуєте 255 інструкцій, що використовуються. Крім того, 10F200 не використовує звичайний 14-бітний набір інструкцій PIC 16. Він використовує 12-бітний набір інструкцій PIC 12. Однак я погоджуюся з вашими основними передумовами. Я зробив багато корисних речей з PIC 10F200. +1
Олін Латроп

@OlinLathrop: Я уточнив відповідь. Я отримав термін PIC16 зі сторінки 51 бази даних , але я вирішив, що зрозуміліше просто звернутися до "12-бітного набору інструкцій". Префікс частини не є надійним посібником до використовуваного набору інструкцій.
Воррен Янг

0

махаючи моєю тростиною в день, нам довелося вирізати власні шматочки з піску!

У 1976 році (або після цього) система Atari 2600 VCS була однією з найпопулярніших "платформ відеоігор" того часу. У ньому мікропроцесор (MOSTEK 6507) працював на палаючій ~ 1 МГц і мав **** 128 байт оперативної пам'яті **.

Другим прикладом, на який я згадую мікроконтролер з надзвичайно обмеженою оперативною пам’яттю (~ 128 байт), був PIC12F, що використовується на перетворювачі постійного струму. Цей мікрофон також повинен був використовувати мову складання, щоб взагалі працювати.


4
ОП не говорить про оперативну пам'ять, він говорить про програмний простір. Простір програми в Atari 2600 знаходиться в картриджі, а не в чіпі RIOT . 2600 підтримуваних програмних ПЗУ до 4 кіБ, без комутації банку. (А деякі комерційні патрони зробили ! Зробити перемикання банку) Що стосується вашого прикладу PIC12F, ОП отримали ви б'єте: пристрої серії PIC10F20x мають 16 або 24 байт SRAM.
Воррен Янг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.