Come si può usare un microcontrollore che ha solo 384 byte di memoria del programma?


67

Ad esempio un PIC10F200T

Praticamente qualsiasi codice che scrivi sarà più grande di quello, a meno che non sia un chip monouso. C'è un modo per caricare più memoria di programma dalla memoria esterna o qualcosa del genere? Sono solo curioso, non vedo come questo possa essere molto utile ... ma deve essere.


6
Ci sono un sacco di applicazioni per piccoli microcontrollori, da generatori di segnali per un fine particolare, a convertitori di protocollo, ai "nodi" in un sistema di controllo più ampio, ecc, ecc,
Dave Tweed

13
Bene, un programma di scacchi richiede 672 byte, quindi non va bene. en.wikipedia.org/wiki/1K_ZX_Chess
John Burton

8
Ecco alcuni esempi di cosa si può fare con piccoli programmi (meno di 256 byte).
Hammar,

9
Cosa intendi con "a meno che non sia un chip monouso"? La maggior parte dei sistemi integrati ha un unico scopo.
Jeanne Pindar,

6
Al college, ho creato un programma di semaforo completamente funzionale per un computer 8085/8155 (max 256 byte) che ho assemblato. Aveva pulsanti di camminata e alcuni sensori che simulavano la presenza di un veicolo.
Zoredache,

Risposte:


133

Ragazzi, scendete dal mio prato!

384 byte sono un sacco di spazio per creare qualcosa di abbastanza complesso in assemblatore.

Se ripercorri la storia fino a quando i computer avevano le dimensioni di una stanza, troverai alcune incredibili abilità artistiche eseguite in <1k.

Ad esempio, leggi la classica Story of Mel - A Real Programmer . Certo, quei ragazzi avevano 4096 parole di memoria con cui giocare, gli infedeli decadenti.

Guarda anche alcune delle vecchie competizioni di demoscene in cui la sfida era quella di inserire una "introduzione" nel blocco di avvio di un floppy, con obiettivi tipici di 4k o 40k e di solito riuscendo a includere musica e animazione.

Modifica da aggiungere : risulta che puoi implementare il primo calcolatore scientifico da $ 100 al mondo in 320 parole.

Modifica per i giovani "uns:

  • Floppy = floppy disk.
  • Bootblock = 1 ° settore del floppy letto all'avvio.
  • Demoscene = gare di programmazione tra gruppi di hacker.
  • Assembler = modo elegante di programmare un dispositivo se sei troppo morbido per usare 8 interruttori a levetta e un pulsante "store".

4
La console di gioco Atari 2600 aveva solo 4 KB di spazio di archiviazione nelle cartucce di giochi ROM (anche se alcuni giochi hanno aggirato questa limitazione utilizzando il cambio banca per accedere a più di 4K).
Johnny,

1
Eoni fa ho fatto un cinguettio abbastanza realistico (abbastanza che la gente cercasse l'uccello piuttosto che sospettare il computer), il cui coraggio (ma non il codice randomizzato che gli impediva di emettere esattamente lo stesso suono ogni volta) avrebbe scosso in circa 384 byte e avevo le restrizioni aggiuntive di nessun indirizzo scrivibile e un binario zero non era permesso nel binario.
Loren Pechtel,

2
Ho bisogno di uscire di più, me lo sono ricordato da un giorno all'altro
John U

7
+1 per "La storia di Mel". Una delle cose più belle che ho letto tutta la settimana.
Justin ᚅᚔᚈᚄᚒᚔ

1
@JohnU: I primi giochi su Atari 2600 erano tutti 2K. Molti sviluppatori non hanno mai progettato giochi che andassero oltre il 4K, perché anche se i chip da 8K erano convenienti (e i carrelli di alcune aziende utilizzavano semplicemente la metà di un chip 4K) aggiungendo il cambio di banca a una carta usando uno standard (active-low chip-select) chip ha aumentato il numero di chip di supporto da uno a tre.
supercat

59

I microcontrollori sono sufficientemente economici da essere spesso utilizzati per fare cose davvero semplici che negli anni passati sarebbero state probabilmente realizzate con una logica discreta. Cose davvero semplici. Ad esempio, si potrebbe desiderare che un dispositivo accenda un'uscita per un secondo ogni cinque secondi, più precisamente di quanto sarebbe in grado di fare un timer 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

Sarebbe un'applicazione reale, utilizzabile, in meno di 32 parole (48 byte) di spazio di codice. Si potrebbero facilmente aggiungere alcune opzioni per avere alcune opzioni di temporizzazione del controllo dei pin I / O e avere ancora un sacco di spazio libero, ma anche se tutto il chip fosse esattamente quello che viene mostrato sopra potrebbe essere ancora più economico e più facile di qualsiasi alternativa usando discreto logica. A proposito, le clrwdtistruzioni potrebbero essere spostate nella subroutine, ma ciò renderebbe le cose meno robuste. Come scritto, anche se un glitch fa sì che lo stack dell'indirizzo di ritorno venga danneggiato, il watchdog non verrà alimentato fino a quando l'esecuzione non tornerà al ciclo principale. Se ciò non accade, il watchdog ripristinerà il chip dopo un paio di secondi.


9
Onestamente, potresti ottimizzare un po 'il tuo codice, dando un cattivo esempio ai bambini: 5 chiamate separate per wait1sec ??? Perdigiorno! ;)
Giovanni U

9
@JohnU: Cordiali saluti, il codice utilizza chiamate separate perché se utilizzava un contatore count-to-zero e il conteggio risultava errato, il loop potrebbe essere eseguito 255 volte anziché quattro, alimentando il watchdog una volta al secondo. Mentre sarebbe possibile proteggerlo controllando su ogni loop se il conteggio era nel range, il codice per farlo finisce per essere più complicato di cinque chiamate e cinque clrwdtistruzioni. Questa non è la disposizione del contatore più assolutamente sicura possibile, ma viene presa in considerazione la sicurezza (ad es. Evitamento clrwdtall'interno di una subroutine).
supercat

10
@ coder543: in assenza di cose come il rumore dell'alimentazione, non molto. D'altra parte, in parti senza un rilevatore brown-out, è possibile che accadano cose folli se VDD scende a un livello compreso tra la tensione di funzionamento minima e la terra, per poi tornare alla normalità. In genere, si dovrebbe cercare di garantire che qualsiasi stato in cui il dispositivo possa trovarsi si ritorni alla normalità in un periodo di tempo ragionevole. I due secondi circa per l'avvio del watchdog possono essere inevitabili, ma quattro minuti per un contatore glitch per raggiungere lo zero potrebbero essere un po 'troppo.
supercat

10
@ coder543, accadono più spesso in una demo importante di quanto tu voglia credere. Questo tipo di pensiero è necessario anche quando si costruiscono cose profondamente radicate che non hanno mezzi per chiedere aiuto o segnalare un errore. O sono inaccessibili (pensa al mare profondo o allo spazio esterno) anche se un errore è stato notato.
RBerteig,

6
@JohnU: L'ho notato, ma ho pensato che spiegare il motivo per cui ho scritto il codice mentre lo facevo potesse essere utile. Per inciso, stavo anche cercando di dimostrare che piccoli compiti possono adattarsi a un piccolo processore anche se non sono perfettamente ottimizzati.
supercat

26

"SOLO" 384 byte?

Nel lontano passato, avevo il compito di scrivere un intero sistema operativo (da solo) per un computer specializzato che serviva l'industria navale, del gasdotto e della gestione della raffineria. Il primo prodotto di questo tipo era basato su 6800 e veniva aggiornato a 6809 e desideravano un nuovo sistema operativo in combinazione con il 6809 in modo da poter eliminare i costi di licenza del sistema operativo originale. Stavano anche aumentando le dimensioni della ROM di boot a 64 byte, da 32 a 32. Se ricordo bene - ERA circa 33 anni fa! - Ho convinto gli ingegneri a darmi 128 byte in modo da poter mettere i driver di dispositivo dell'intero sistema operativo sul rom e quindi rendere l'intero dispositivo più affidabile e versatile. Questo includeva:

  • Driver della tastiera con debounce dei tasti
  • Driver video
  • Driver dell'unità disco e file system rudimentale ("abloader format" Motorola, IIRC), con capacità integrata di trattare la memoria "in banca" come se fosse uno spazio su disco veramente veloce.
  • Driver del modem (hanno ottenuto l'FSK al contrario, quindi questi modem hanno solo parlato tra loro)

Sì, tutti questi erano nudi come l'osso e ottimizzati a mano per rimuovere ogni ciclo estraneo, ma perfettamente funzionanti e affidabili. Sì, ho inserito tutto ciò nei byte disponibili - oh, ha anche impostato la gestione degli interrupt, i vari stack e inizializzato il sistema operativo in tempo reale / multitasking, richiesto all'utente le opzioni di avvio e avviato il sistema.

Un mio amico che è ancora affiliato all'azienda (il suo successore) mi ha detto alcuni anni fa che il mio codice è ancora in servizio!

Puoi fare MOLTO con 384 byte ...


2
dici boot rom e menzioni lo spostamento dei driver nella boot rom ... questo mi indica che era disponibile un supporto di memoria secondario. In questa discussione, abbiamo già stabilito che non è possibile caricare il codice dalla memoria esterna su questo PIC.
coder543,

5
@ coder543 Questo non è il punto: 384 byte sono sufficienti per fare abbastanza! La domanda originale sembrava una lamentela sul fatto che 384 non era abbastanza per fare qualcosa di utile - era più di quanto avessi bisogno - MOLTO di più - per fornire tutti i componenti fondamentali di un sistema operativo multi-tasking in tempo reale ...
Richard T,


17

Ho progettato un sensore di umidità per le piante che traccia la quantità di acqua della pianta e fa lampeggiare un LED se la pianta ha bisogno di acqua. Puoi fare in modo che il sensore apprenda il tipo di impianto e quindi cambi le sue impostazioni durante il funzionamento. Rileva bassa tensione sulla batteria. Ho esaurito flash e ram ma sono stato in grado di scrivere tutto nel codice C per far funzionare perfettamente questo prodotto.

Ho usato l'immagine di cui parli.


Ecco il codice che ho creato per il mio sensore dell'acqua dell'impianto. Ho usato pic10f220 poiché ha un modulo ADC, ha la stessa memoria di pic10f200, domani proverò a trovare lo schema.

Il codice è in spagnolo, ma è molto semplice e dovrebbe essere facilmente compreso. Quando Pic10F si riattiva dalla modalità di sospensione, verrà ripristinato, quindi è necessario verificare se si trattava di un PowerUp o di un ripristino e agire di conseguenza. L'impostazione della pianta è mantenuta nella ram poiché non si spegne mai veramente.

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

Fammi sapere se hai domande, proverò a rispondere in base a ciò che ricordo. L'ho codificato diversi anni fa, quindi non controllare le mie capacità di codifica, sono migliorate :).

Nota finale Ho usato il compilatore Hi-Tech C.


3
Sarei davvero molto interessante nel leggere come hai fatto. Hai preso qualche nota mentre lo facevi che non ti dispiacerebbe condividere sulle reti?
RhysW,

1
Ciao RhysW, credo di avere ancora il codice. In realtà è stato davvero semplice. Potrei inviarti il ​​mio codice se sei interessato. Fammi sapere. Il circuito che ho progettato è molto semplice e interessante, solo 3 resistori, un mosfet a canale p (per la protezione della batteria inversa), un cappuccio da 100 nF e un LED. Uso un diodo interno in pic10f da utilizzare come riferimento per la misurazione della batteria e per mantenere costanti le letture dell'ADC.
scrafy

1
Sembra un progetto pulito. C'è qualche possibilità che tu possa pubblicare i dettagli qui (o almeno pubblicarli da qualche parte e collegarli ad essi)?
Ilmari Karonen,

1
Ciao scrafy! Per favore, se hai qualcosa da aggiungere a una risposta, usa il link "modifica" invece di pubblicare una nuova risposta, poiché questo sito utilizza il voto e non funziona come un forum.
clabacchio

16

Una cosa che non ho mai visto menzionato: il microcontrollore che hai citato è solo $ 0,34 ciascuno in quantità di 100. Quindi, per prodotti economici, fabbricati in serie, può avere senso andare al problema di codifica aggiuntivo imposto da un'unità così limitata. Lo stesso potrebbe valere per dimensioni o consumo energetico.


2
Questo è stato esattamente il mio primo pensiero. Inoltre: se sarei una startup con un'idea chiara, ma solo poche centinaia di dollari in meno, cose come questa possono significare la differenza tra lavoro di ritorno al lavoro di giorno e lavoro di fine giorno.
phresnel,

14

Quando ero al liceo, avevo un insegnante che insisteva sul fatto che l'oscuramento della luce fosse un compito troppo difficile da affrontare per uno studente come me.

Così sfidato, ho trascorso un bel po 'di tempo a imparare e comprendere l'oscuramento della luce basato sulla fase usando triac e programmando il 16C84 dal microchip per eseguire questa impresa. Ho finito con questo codice assembly:

'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

Ovviamente dovresti modificarlo per il chip che menzioni, e forse aggiungere una routine seriale economica per l'input poiché il tuo chip non ha una porta larga 8 bit da ascoltare, ma l'idea è che un lavoro apparentemente complesso può eseguire con pochissimo codice: è possibile inserire dieci copie del programma sopra in 10F200.

Puoi trovare ulteriori informazioni sul progetto nella mia pagina Light Dimming . Per inciso, non l'ho mai mostrato al mio insegnante, ma alla fine ho fatto una serie di impianti di illuminazione per il mio amico DJ.


12

Bene, anni fa ho scritto un controller di temperatura con I / O seriale (bit-bang sull'I / O seriale perché l'MCU non aveva un UART) e un semplice interprete di comandi per parlare con il controller. MCU era un MC68HC705K1 Motorola (ora Freescale) che aveva un enorme 504 byte di memoria del programma (OTPROM) e circa 32 byte di RAM. Non meno del PIC a cui fai riferimento, ma ricordo di aver lasciato un po 'di ROM. Mi rimangono ancora alcune unità assemblate, 17 anni dopo; vuoi comprarne uno?

Quindi sì, può essere fatto, almeno in assemblea.

In ogni caso, di recente ho scritto programmi C molto semplici che probabilmente si sarebbero adattati a 384 byte se ottimizzati. Non tutto richiede un software ampio e complesso.


5

È possibile scrivere in un batter d'occhio un LED con 384 byte di memoria di programma e anche di più.

Per quanto ne so, non è possibile estendere la memoria del programma con un chip esterno (a meno che non si stia costruendo un interprete ASM completo nei 384 byte , che sarebbe lento). Tuttavia, è possibile estendere la memoria dei dati con un chip esterno (EEPROM, SRAM).


1
Non sarebbe difficile costruire un simulatore di macchine Turing in 384 byte ...
Chris Stratton,

@ChrisStratton Intendevo un interprete completo, in modo che la "memoria estesa del programma" avesse le stesse funzionalità del normale.

Sì, è quello che ho suggerito un modo per implementarlo in modo rigoroso. Il resto è solo design del compilatore ...
Chris Stratton,

7
Se si volesse che la logica del programma fosse memorizzata in una EEPROM esterna, provare a emulare il set di istruzioni PIC non sarebbe la strada da percorrere. Un approccio migliore sarebbe progettare un set di istruzioni ottimizzato per l'uso con la macchina virtuale; in effetti, questo è l'approccio che Parallax ha adottato con il suo "Basic STAMP" negli anni '90. Era un PIC con 3072 byte di spazio di codice, associato a un chip EEPROM seriale.
supercat

3
A proposito, una nota aggiuntiva sul timbro BASIC: è stato introdotto in un momento in cui i microcontrollori basati su flash o EEPROM erano relativamente rari, ma i chip EEPROM seriali erano abbastanza economici. Per applicazioni che non richiedono molta velocità, un micro a codice fisso con una parte EEPROM seriale sarebbe più economico di una EEPROM di dimensioni comparabili o di un micro basato su flash. Il design del BASIC Stamp non avrebbe senso oggi, ma era abbastanza pratico quando fu introdotto.
supercat

4

In realtà è peggio di quanto pensi. La tua pagina Mouser collegata è fonte di confusione quando specifica che questo processore ha 384 byte di memoria del programma. Il PIC10F200 in realtà ha 256 parole a 12 bit di memoria del programma.

Quindi, cosa puoi farci? Il set di istruzioni PIC a 12 bit utilizzato dai dispositivi PIC10F20 x sono tutte istruzioni a parola singola, quindi dopo aver sottratto alcune istruzioni per la configurazione del processore, viene lasciato spazio sufficiente per un programma di circa 250 passaggi. Questo è abbastanza per molte applicazioni. Probabilmente potrei scrivere un controller di lavatrice in quel tipo di spazio, per esempio.

Ho appena esaminato i compilatori PIC C disponibili e sembra che circa la metà di essi non proverà nemmeno a emettere codice per un PIC10F200. Quelli che probabilmente emettono così tanto codice del boilerplate che potresti essere in grado di scrivere solo un lampeggiatore a LED nello spazio a sinistra. Volete davvero usare il linguaggio assembly con un tale processore.


Hai ragione sulle 256 parole di istruzione. In realtà uno di questi viene ripreso con la costante di calibrazione dell'oscillatore, in modo da ottenere 255 istruzioni utilizzabili. Inoltre, il 10F200 non utilizza il solito set di istruzioni PIC 16 a 14 bit. Utilizza il set di istruzioni a 12 bit PIC 12. Tuttavia, sono d'accordo con le tue premesse di base. Ho fatto molte cose utili con un PIC 10F200. +1
Olin Lathrop

@OlinLathrop: ho chiarito la risposta. Ho ottenuto il termine PIC16 da pagina 51 del set di dati , ma ho deciso che è più chiaro fare riferimento a "il set di istruzioni a 12 bit". Il prefisso della parte non è una guida affidabile per il set di istruzioni utilizzato.
Warren Young,

0

agitando la mia canna ai miei giorni, abbiamo dovuto incidere i nostri pezzi dalla sabbia!

Nel 1976 (o giù di lì) il sistema Atari 2600 VCS era una delle "piattaforme di videogiochi" più popolari dell'epoca. In esso, il microprocessore (MOSTEK 6507) funzionava ad un ardente ~ 1 MHz e aveva **** 128 byte di RAM **.

Un secondo esempio che ricordo di un microcontrollore con RAM estremamente limitata (~ 128 byte) è stato un PIC12F utilizzato su un convertitore DC-DC. Questo micro doveva anche usare il linguaggio assembly per funzionare.


4
L'OP non sta parlando di RAM, sta parlando dello spazio del programma. Lo spazio del programma nell'Atari 2600 è nella cartuccia, non nel chip RIOT . Le 2600 ROM di programma supportate fino a 4 kiB senza cambio di banco. (E alcune cartucce commerciali hanno fatto il cambio di banca!) Come per il tuo esempio PIC12F, l'OP ti ha battuto: i dispositivi della serie PIC10F20x hanno 16 o 24 byte di SRAM.
Warren Young,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.