Bagaimana orang dapat menggunakan mikrokontroler yang hanya memiliki 384 byte memori program?


67

Misalnya PIC10F200T

Hampir semua kode yang Anda tulis akan lebih besar dari itu, kecuali jika itu adalah chip tujuan tunggal. Apakah ada cara untuk memuat lebih banyak memori program dari penyimpanan eksternal atau sesuatu? Saya hanya ingin tahu, saya tidak melihat bagaimana ini bisa sangat berguna ... tetapi harus begitu.


6
Ada banyak aplikasi untuk mikrokontroler kecil, dari generator sinyal tujuan khusus, ke konverter protokol, ke "node" dalam sistem kontrol yang lebih besar, dll., Dll.
Dave Tweed

13
Program bermain catur membutuhkan 672 byte, jadi itu tidak bagus. en.wikipedia.org/wiki/1K_ZX_Chess
John Burton

8
Berikut adalah beberapa contoh dari apa yang dapat dilakukan dengan program kecil (kurang dari 256 byte).
hammar

9
Apa maksud Anda, "kecuali itu chip tujuan tunggal"? Mayoritas sistem embedded adalah tujuan tunggal.
Jeanne Pindar

6
Kembali di perguruan tinggi, saya membangun program lampu lalu lintas yang berfungsi penuh untuk komputer 8085/8155 (maks 256 byte) yang saya kumpulkan. Itu tombol berjalan, dan beberapa sensor yang akan mensimulasikan kehadiran kendaraan.
Zoredache

Jawaban:


133

Anda anak-anak, keluar dari halaman saya!

384 byte adalah banyak ruang untuk membuat sesuatu yang cukup kompleks di assembler.

Jika Anda menggali kembali sejarah hingga saat komputer seukuran ruangan, Anda akan menemukan beberapa karya seni yang benar-benar menakjubkan yang dieksekusi dalam <1k.

Misalnya, baca Story of Mel - A Programmer klasik . Diakui, orang-orang itu memiliki 4096 kata memori untuk dimainkan, orang-orang kafir yang dekaden.

Lihat juga beberapa kompetisi demoscene lama di mana tantangannya adalah memasukkan "intro" ke dalam bootblock floppy, target tipikal adalah 4k atau 40k dan biasanya mengatur untuk memasukkan musik dan animasi.

Sunting untuk ditambahkan : Ternyata Anda dapat menerapkan kalkulator ilmiah $ 100 pertama di dunia dalam 320 kata.

Edit untuk anak muda 'uns:

  • Floppy = floppy disk.
  • Bootblock = Sektor pertama floppy baca saat bootup.
  • Demoscene = kompetisi pemrograman antar kelompok peretas.
  • Assembler = cara mewah memprogram perangkat jika Anda terlalu lunak untuk menggunakan 8 sakelar sakelar dan tombol "simpan".

4
Konsol game Atari 2600 hanya memiliki penyimpanan 4KB dalam kartrid game ROM (meskipun beberapa game berhasil mengatasi batasan ini dengan menggunakan transfer bank untuk mengakses lebih dari 4K).
Johnny

1
Beberapa tahun yang lalu saya membuat kicauan burung yang cukup realistis (cukup bahwa orang mencari burung daripada mencurigai komputer), nyali yang (tetapi bukan kode pengacakan yang membuatnya tidak membuat suara yang persis sama setiap kali) akan mengguncang sekitar dalam 384 byte dan saya memiliki batasan tambahan tidak ada alamat yang dapat ditulis dan byte nol tidak diizinkan dalam biner.
Loren Pechtel

2
Saya perlu keluar lebih banyak, mengingat ini dari masa lalu - screen saver dalam 368 byte: aminet.net/package/util/blank/368blanker
John U

7
+1 untuk "The Story of Mel". Salah satu hal terbesar yang pernah saya baca sepanjang minggu.
Justin ᚅᚔᚈᚄᚒᚔ

1
@ JohnU: Beberapa game pertama di Atari 2600 semuanya 2K. Banyak pengembang tidak pernah merancang game apa pun yang melampaui 4K, karena meskipun chip 8K terjangkau (dan beberapa gerobak perusahaan hanya menggunakan setengah dari chip 4K) menambahkan pengalihan bank ke kartu menggunakan standar (chip aktif-rendah pilih) chip meningkatkan jumlah chip dukungan dari satu menjadi tiga.
supercat

59

Mikrokontroler cukup murah sehingga sering digunakan untuk melakukan hal-hal sederhana yang pada tahun-tahun sebelumnya lebih mungkin dilakukan dengan logika diskrit. Hal yang sangat sederhana. Sebagai contoh, seseorang mungkin ingin perangkat untuk menyalakan output selama satu detik setiap lima detik, lebih tepatnya dari 555 timer akan mampu melakukannya.

  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

Itu akan menjadi nyata, dapat digunakan, aplikasi, dalam waktu kurang dari 32 kata (48 byte) ruang kode. Seseorang dapat dengan mudah menambahkan beberapa opsi untuk memiliki beberapa pin I / O untuk mengontrol opsi pengaturan waktu dan masih memiliki banyak ruang untuk disisihkan, tetapi meskipun semua chip melakukan persis seperti yang ditunjukkan di atas, mungkin masih lebih murah dan lebih mudah daripada alternatif lain menggunakan diskrit. logika. BTW, clrwdtinstruksi bisa dipindahkan ke subrutin, tetapi hal itu akan membuat hal-hal yang kurang kuat. Seperti yang tertulis, bahkan jika sebuah kesalahan menyebabkan tumpukan alamat pengirim rusak, anjing penjaga tidak akan diberi makan sampai eksekusi kembali ke loop utama. Jika itu tidak pernah terjadi, anjing penjaga akan mengatur ulang chip setelah beberapa detik.


9
Jujur, Anda bisa sedikit mengoptimalkan kode Anda, memberikan contoh buruk kepada anak-anak - 5 panggilan terpisah ke wait1sec ??? Pemboros! ;)
John U

9
@JohnU: FYI, kode menggunakan panggilan terpisah karena jika menggunakan penghitung hitung-ke-nol dan penghitungannya menjadi kacau, loop mungkin berjalan 255 kali daripada empat, sambil memberi makan anjing penjaga sekali per detik. Meskipun dimungkinkan untuk mencegah hal itu dengan memeriksa pada setiap loop apakah hitungannya dalam kisaran, kode untuk melakukan itu ternyata lebih rumit daripada lima panggilan dan lima clrwdtinstruksi. Ini bukan pengaturan counter yang paling pasti gagal, tetapi beberapa pertimbangan diberikan untuk masalah keselamatan (misalnya penghindaran clrwdtdalam subrutin).
supercat

10
@ coder543: Dengan tidak adanya hal-hal seperti kebisingan catu daya, tidak terlalu. Di sisi lain, di bagian-bagian tanpa detektor berwarna kecoklatan, semua hal gila mungkin terjadi jika VDD jatuh ke level antara tegangan operasi minimum dan arde, dan kemudian naik kembali ke normal. Orang umumnya harus mencoba memastikan bahwa keadaan apa pun di mana perangkat menemukan dirinya akan kembali normal dalam periode waktu yang wajar. Dua detik atau lebih bagi pengawas untuk menendang mungkin tidak dapat dihindari, tetapi empat menit untuk penghitung kesalahan untuk mencapai nol mungkin agak banyak.
supercat

10
@ coder543, mereka lebih sering terjadi pada demo penting daripada yang ingin Anda percayai. Pemikiran seperti ini juga diperlukan ketika membangun hal-hal yang tertanam dalam yang tidak memiliki sarana untuk meminta bantuan atau melaporkan kesalahan. Atau tidak dapat diakses (pikirkan laut dalam atau luar angkasa) bahkan jika kesalahan diketahui.
RBerteig

6
@ JohnU: Saya memang menyadarinya, tetapi membayangkan bahwa menjelaskan mengapa saya menulis kode seperti yang saya lakukan mungkin bisa membantu. Kebetulan, saya juga mencoba untuk menunjukkan bahwa tugas-tugas kecil dapat ditampung dalam prosesor kecil bahkan jika mereka tidak dioptimalkan dengan sempurna.
supercat

26

"HANYA" 384 byte?

Jauh di masa lalu, saya memiliki tugas menulis seluruh sistem operasi (sendiri) untuk komputer khusus yang melayani industri manajemen kapal, pipa, dan kilang. Produk seperti pertama perusahaan berbasis 6800 dan sedang ditingkatkan ke 6809, dan mereka ingin OS baru untuk pergi bersama dengan 6809 sehingga mereka dapat menghilangkan biaya lisensi dari sistem operasi asli. Mereka juga meningkatkan ukuran boot rom ke 64 byte, naik dari 32. Jika saya ingat dengan benar - itu sekitar 33 tahun yang lalu! - Saya meyakinkan para insinyur untuk memberikan saya 128 byte sehingga saya dapat menempatkan driver perangkat sistem operasi keseluruhan pada rom dan dengan demikian membuat seluruh perangkat lebih dapat diandalkan dan serbaguna. Ini termasuk:

  • Pengemudi keyboard dengan debounce kunci
  • Driver video
  • Driver drive disk dan sistem file yang belum sempurna (Motorola "format abloader", IIRC), dengan kemampuan built-in untuk memperlakukan memori "banked" seolah-olah itu adalah ruang disk yang sangat cepat.
  • Driver Modem (mereka mendapatkan FSK mundur, jadi modem ini hanya berbicara satu sama lain)

Ya, semua ini adalah tulang kosong yang didapatnya, dan dioptimalkan dengan tangan untuk menghilangkan setiap siklus asing, tetapi sangat bisa digunakan dan dapat diandalkan. Ya, saya menyemir semua itu ke byte yang tersedia - oh, itu JUGA mengatur penanganan interupsi, berbagai tumpukan, dan menginisialisasi sistem operasi real-time / multi-tasking, mendorong pengguna pada opsi boot, dan mem-boot sistem.

Seorang teman saya yang masih berafiliasi dengan perusahaan (penggantinya) mengatakan kepada saya beberapa tahun yang lalu bahwa kode saya masih dalam pelayanan!

Anda dapat melakukan BANYAK dengan 384 byte ...


2
Anda mengatakan boot rom, dan Anda menyebutkan memindahkan driver ke boot rom ... ini menunjukkan kepada saya bahwa ada media penyimpanan sekunder yang tersedia. Dalam diskusi ini, kami telah menentukan bahwa Anda tidak dapat memuat kode dari penyimpanan eksternal pada PIC ini.
coder543

5
@ coder543 Itu melenceng: 384 byte sudah cukup untuk melakukan cukup banyak! Pertanyaan aslinya berbunyi seperti keluhan bahwa 384 tidak cukup untuk melakukan sesuatu yang bermanfaat - itu lebih dari yang saya butuhkan - BANYAK lebih banyak - untuk menyediakan semua komponen dasar dari sistem operasi multi-tugas waktu-nyata ...
Richard T


17

Saya merancang sensor kelembaban untuk tanaman yang melacak jumlah air yang dimiliki tanaman dan berkedip LED jika tanaman membutuhkan air. Anda dapat membuat sensor mempelajari jenis tanaman dan dengan demikian mengubah pengaturannya saat berjalan. Ini mendeteksi tegangan rendah pada baterai. Saya kehabisan flash dan ram tetapi mampu menulis semuanya dalam kode C untuk membuat produk ini berfungsi dengan sempurna.

Saya menggunakan pic10f yang Anda sebutkan.


Ini kode yang saya buat untuk Sensor Air Tanaman saya. Saya menggunakan pic10f220 karena memiliki modul ADC, ia memiliki memori yang sama dengan pic10f200, saya akan mencoba mencari skema besok.

Kode ini dalam bahasa Spanyol, tetapi sangat sederhana dan harus mudah dipahami. Ketika Pic10F bangun dari mode tidur, ia akan mengatur ulang sehingga Anda harus memeriksa apakah itu PowerUp atau reset dan bertindak sesuai. Pengaturan pabrik disimpan dalam ram karena tidak pernah benar-benar mati.

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

Beritahu saya jika Anda memiliki pertanyaan, saya akan mencoba menjawab berdasarkan apa yang saya ingat. Saya mengkodekan ini beberapa tahun yang lalu jadi jangan periksa kemampuan coding saya, mereka telah meningkat :)

Catatan Akhir. Saya menggunakan kompiler Hi-Tech C.


3
Sebenarnya saya akan sangat menarik dalam membaca bagaimana Anda melakukan ini. Apakah Anda membuat catatan sama sekali saat Anda melakukannya sehingga Anda tidak keberatan berbagi di web?
RhysW

1
Halo RhysW, saya yakin saya masih memiliki kode. Sebenarnya sangat sederhana. Saya bisa mengirimkan kode saya kepada Anda jika Anda tertarik. Biarkan aku tahu. Rangkaian yang saya rancang sangat sederhana dan keren, hanya 3 resistor, satu mosfet saluran-p (untuk perlindungan baterai terbalik), tutup 100nF dan LED. Saya menggunakan dan dioda internal di pic10f untuk digunakan sebagai referensi pengukuran baterai dan menjaga pembacaan ADC konstan.
Scrafy

1
Itu terdengar seperti proyek yang rapi. Apakah ada kemungkinan Anda dapat memposting detailnya di sini (atau setidaknya mempostingnya di suatu tempat dan menautkannya)?
Ilmari Karonen

1
Halo menakutkan! Harap, jika Anda memiliki sesuatu untuk ditambahkan ke jawaban, gunakan tautan "edit" alih-alih memposting jawaban baru, karena situs ini menggunakan pemungutan suara dan tidak berfungsi seperti forum.
clabacchio

16

Satu hal yang belum saya lihat disebutkan: Mikrokontroler yang Anda sebutkan hanya $ 0,34 masing-masing dalam jumlah 100. Jadi untuk produk murah yang diproduksi secara massal, masuk akal untuk pergi ke masalah pengkodean tambahan yang dikenakan oleh unit terbatas tersebut. Hal yang sama berlaku untuk ukuran atau konsumsi daya.


2
Itu persis pikiran pertama saya. Juga: Jika saya akan menjadi startup dengan ide yang rapi, tetapi hanya beberapa ratus dolar longgar, hal-hal seperti ini dapat berarti perbedaan antara mendapatkan-kembali-ke-hari-pekerjaan dan berhenti-hari-pekerjaan.
phresnel

14

Ketika saya masih di sekolah menengah, saya memiliki seorang guru yang bersikeras bahwa peredupan cahaya adalah tugas yang terlalu sulit bagi siswa seperti saya untuk atasi.

Dengan demikian menantang saya menghabiskan cukup banyak waktu untuk belajar dan memahami peredupan cahaya berbasis fase menggunakan triac, dan pemrograman 16C84 dari microchip untuk melakukan hal ini. Saya berakhir dengan kode perakitan ini:

'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

Tentu saja Anda perlu memodifikasi ini untuk chip yang Anda sebutkan, dan mungkin menambahkan rutin serial murah untuk input karena chip Anda tidak memiliki port lebar 8 bit untuk didengarkan, tetapi idenya adalah bahwa pekerjaan yang tampaknya rumit dapat dilakukan dalam kode yang sangat sedikit - Anda dapat memasukkan sepuluh salinan dari program di atas ke dalam 10F200.

Anda dapat menemukan lebih banyak informasi proyek di halaman Peredupan Cahaya saya . Kebetulan saya tidak pernah menunjukkan ini kepada guru saya, tetapi akhirnya melakukan sejumlah rig pencahayaan untuk teman DJ saya.


12

Nah, bertahun-tahun yang lalu saya menulis pengontrol suhu dengan serial I / O (menggedor serial I / O karena MCU tidak memiliki UART) dan juru bahasa perintah sederhana untuk berbicara dengan pengontrol. MCU adalah Motorola (sekarang Freescale) MC68HC705K1 yang memiliki 504 byte memori program (OTPROM) dan sekitar 32 byte RAM. Tidak sesederhana PIC yang Anda referensi, tapi saya ingat ada beberapa ROM yang tersisa. Saya masih memiliki beberapa unit rakitan yang tersisa, 17 tahun kemudian; mau beli satu?

Jadi ya, itu bisa dilakukan, setidaknya dalam perakitan.

Bagaimanapun, saya telah menulis program C yang sangat sederhana baru-baru ini yang mungkin akan muat di dalam 384 byte ketika dioptimalkan. Tidak semuanya membutuhkan perangkat lunak yang besar dan kompleks.


5

Anda dapat menulis blink LED dengan memori program 384 bytes, dan bahkan lebih.

Sejauh yang saya tahu, tidak mungkin untuk memperpanjang memori program dengan chip eksternal (kecuali jika Anda sedang membangun juru bahasa ASM penuh dalam 384 byte , yang akan lambat). Dimungkinkan untuk menambah memori data dengan chip eksternal (EEPROM, SRAM).


1
Tidak akan sulit untuk membangun simulator mesin Turing dalam 384 byte ...
Chris Stratton

@ ChrisStratton yang saya maksud adalah juru bahasa penuh, sehingga 'memori program yang diperluas' akan memiliki fitur yang sama seperti biasanya.

Ya, itulah yang saya sarankan untuk diterapkan dengan ketat. Sisanya hanya desain kompiler ...
Chris Stratton

7
Jika seseorang ingin logika program disimpan dalam EEPROM eksternal, mencoba untuk meniru set instruksi PIC tidak akan menjadi cara untuk pergi. Pendekatan yang lebih baik adalah merancang set instruksi yang dioptimalkan untuk digunakan dengan mesin virtual; memang, itulah pendekatan yang Parallax ambil dengan "Basic STAMP" mereka di tahun 1990-an. Itu adalah PIC dengan 3072 byte ruang kode, dipasangkan dengan chip EEPROM serial.
supercat

3
BTW, catatan tambahan tentang cap BASIC: diperkenalkan pada saat mikrokontroler berbasis flash atau berbasis EEPROM relatif jarang, tetapi chip seri EEPROM cukup murah. Untuk aplikasi yang tidak membutuhkan banyak kecepatan, micro kode tetap dengan bagian EEPROM serial akan lebih murah daripada EEPROM berukuran sebanding atau mikro berbasis flash. Desain BASIC Stamp tidak masuk akal hari ini, tetapi cukup praktis ketika diperkenalkan.
supercat

4

Ini sebenarnya lebih buruk daripada yang Anda pikirkan. Halaman Mouser Anda yang ditautkan membingungkan karena menentukan prosesor ini memiliki memori program 384 byte. PIC10F200 sebenarnya memiliki 256 kata 12-bit memori program.

Jadi, apa yang dapat Anda lakukan dengan itu? Set instruksi PIC 12-bit yang digunakan oleh perangkat PIC10F20 x semuanya adalah instruksi satu kata, jadi setelah Anda mengurangi beberapa instruksi untuk pengaturan prosesor, Anda memiliki ruang yang cukup untuk program sekitar 250 langkah. Itu cukup untuk banyak aplikasi. Saya mungkin bisa menulis pengontrol mesin cuci di ruang semacam itu, misalnya.

Saya baru saja melihat ke kompiler PIC C yang tersedia, dan sepertinya sekitar setengah dari mereka bahkan tidak akan mencoba untuk mengeluarkan kode untuk PIC10F200. Mereka yang mungkin mengeluarkan kode boilerplate begitu banyak sehingga Anda mungkin hanya dapat menulis flasher LED di ruang yang tersisa. Anda benar-benar ingin menggunakan bahasa rakitan dengan prosesor seperti itu.


Anda benar tentang 256 kata instruksi. Sebenarnya salah satunya diambil dengan konstanta kalibrasi osilator, sehingga Anda mendapatkan 255 instruksi yang dapat digunakan. Juga, 10F200 tidak menggunakan set instruksi PIC 16 14-bit yang biasa. Ini menggunakan set instruksi 12-bit PIC 12. Namun, saya setuju dengan premis dasar Anda. Saya telah melakukan banyak hal berguna dengan PIC 10F200. +1
Olin Lathrop

@ OlinLathrop: Saya sudah mengklarifikasi jawabannya. Saya mendapatkan istilah PIC16 dari halaman 51 dari lembar data , tetapi saya telah memutuskan lebih jelas untuk hanya merujuk ke "set instruksi 12-bit." Awalan bagian bukan panduan yang dapat diandalkan untuk set instruksi yang digunakan.
Warren Young

0

Mengayunkan tongkat saya di hari saya, kami harus menggosok bit kami sendiri dari pasir!

Pada tahun 1976 (atau sekitar itu) sistem Atari 2600 VCS adalah salah satu "platform video game" yang paling populer saat itu. Di dalamnya, mikroprosesor (MOSTEK 6507) berjalan pada kecepatan ~ 1 MHz dan memiliki **** 128 byte RAM **.

Contoh kedua yang saya ingat dari mikrokontroler dengan RAM yang sangat terbatas (~ 128 byte) adalah PIC12F yang digunakan pada konverter DC-DC. Mikro ini juga harus menggunakan bahasa rakitan agar dapat berjalan sama sekali.


4
OP tidak berbicara tentang RAM, dia berbicara tentang ruang program. Ruang program di Atari 2600 ada di kartrid, bukan di chip RIOT . 2600 ROM program yang didukung hingga 4 kiB tanpa transfer bank. (Dan beberapa kartrid komersial tidak ! Melakukan switching bank) Sebagai contoh PIC12F Anda, OP mendapat Anda mengalahkan: perangkat seri PIC10F20x memiliki 16 atau 24 byte SRAM.
Warren Young
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.