わずか384バイトのプログラムメモリしかないマイクロコントローラーをどのように使用できますか?


67

たとえば、PIC10F200T

単一の目的のチップでない限り、実質的にあなたが書くコードはそれよりも大きくなります。外部ストレージなどからより多くのプログラムメモリをロードする方法はありますか?私はただ興味があります、これがどのように非常に役立つかわかりません...しかし、そうでなければなりません。


6
専用の信号発生器からの小さなマイクロコントローラのためのアプリケーションの多くが、等などの「ノード」より大きい制御システムにおいて、、、、プロトコル変換器に、ある
デイブツイード

13
チェスをするプログラムは672バイトかかるので、それは良くありません。en.wikipedia.org/wiki/1K_ZX_Chess
ジョンバートン

8
小さなプログラム(256バイト未満)でできることのいくつか示します。
ハンマー

9
「単一目的のチップでない限り」とはどういう意味ですか?組み込みシステムの大部分は単一の目的です。
ジャンヌピンダー

6
大学に戻って、私は自分が組み立てた8085/8155コンピューター(最大256バイト)用の完全に機能する信号機プログラムを作成しました。歩行ボタンと、車両の存在をシミュレートするセンサーがいくつかありました。
ゾレダチェ

回答:


133

あなたの子供たち、私の芝生を降りてください!

384バイトは、アセンブラーで非常に複雑なものを作成するための十分なスペースです。

コンピューターが部屋の大きさであった時代まで歴史を掘り下げると、<1kで実行された芸術性の本当に素晴らしい偉業を見つけることができます。

たとえば、古典的なStory of Mel-A Real Programmerを読んでください。確かに、それらの男たちは、退廃的な異教徒たちと遊ぶための4096語の記憶を持っていました。

また、「イントロ」をフロッピーのブートブロックに収めることが課題であった典型的なデモシーンコンペもご覧ください。典型的なターゲットは4kまたは40kで、通常は音楽とアニメーションを含めることができます。

編集して追加世界初の100ドルの科学計算用電卓を320語で実装できることがわかりました。

若い 'unsの編集:

  • フロッピー=フロッピーディスク。
  • ブートブロック=起動時に読み取られるフロッピーの最初のセクター。
  • デモシーン=ハッカーグループ間のプログラミングコンテスト。
  • アセンブラー= 8つのトグルスイッチと「ストア」ボタンを使用するにはソフトすぎる場合にデバイスをプログラムするための派手な方法。

4
Atari 2600ゲームコンソールには、ROMゲームカートリッジに4KBのストレージしかありませんでした(ただし、一部のゲームは、バンクスイッチングを使用して4K以上にアクセスすることでこの制限を回避しました)。
ジョニー

1
ずっと前に、私はかなり現実的な鳥のさえずりを作りました(人々がコンピューターを疑うのではなく鳥を探しているほどです)、その根性(しかし、毎回まったく同じ音を出さないようにするランダム化コードではありません)約384バイトで、書き込み可能なアドレスがないという追加の制限があり、バイナリではゼロバイトは許可されませんでした。
ローレンペクテル

2
私は一日で戻ってからこれを覚えて、より多くのアウト取得する必要があります- 368のバイト単位でのスクリーンセーバー:aminet.net/package/util/blank/368blanker
ジョン・U

7
「メルの物語」の+1。私が一週間読んだ中で最高のことの一つ。
ジャスティン

1
@JohnU:Atari 2600の最初のいくつかのゲームはすべて2Kでした。多くの開発者は、8Kチップが手頃な価格で(そして一部の企業のカートは4Kチップの半分を使用しただけで)標準(アクティブローチップ選択)を使用してカードに銀行切り替えを追加したため、4Kを超えるゲームを設計しませんでしたchipは、サポートチップの数を1から3に増やしました。
スーパーキャット

59

マイクロコントローラーは十分に安価であるため、過去数年ではディスクリートロジックで行われていた可能性が非常に高い単純なことを実行するためによく使用されます。本当にシンプルなもの。たとえば、555タイマーでできるよりも正確に、デバイスに5秒ごとに1秒間出力をオンにしたい場合があります。

  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バイト)未満のコードスペースで、実際に使用できるアプリケーションになります。いくつかのオプションを簡単に追加して、いくつかのI / Oピンでタイミングオプションを制御し、十分な余裕を持たせることができますが、チップがすべて上記のとおりであったとしても、ディスクリートを使用する他の選択肢よりも安くて簡単かもしれません論理。ところで、clrwdt命令をサブルーチンに移動することもできますが、そうすると物事の堅牢性が低下します。書かれているように、グリッチによってリターンアドレススタックが破損したとしても、実行がメインループに戻るまでウォッチドッグはフィードされません。それが起こらない場合、ウォッチドッグは数秒後にチップをリセットします。


9
正直なところ、コードを少し最適化して、子供に悪い例を設定することができます-wait1secへの5つの個別の呼び出し??? ワスレル!;)
ジョンU

9
@JohnU:FYI、コードは個別の呼び出しを使用します。カウントツーゼロカウンターを使用してカウントがグリッチされた場合、ループは4回ではなく255回実行され、ウォッチドッグに1秒間に1回送られます。カウントが範囲内にあるかどうかを各ループで確認することにより、これを防ぐことができますが、そのためのコードは5つの呼び出しと5つのclrwdt命令よりも複雑になります。これは可能な限り絶対的なフェールセーフカウンター配置ではありませんが、安全性の問題(clrwdtサブルーチン内での回避など)を考慮します。
supercat

10
@ coder543:電源ノイズのようなものがない場合、そうではありません。一方、電圧低下検出器のない部分では、VDDが最小動作電圧とグランドの間のレベルまで低下し、その後通常に戻ると、あらゆる種類の異常な事態が発生する可能性があります。一般に、デバイスが自分自身を見つける可能性のある状態が、合理的な期間内に正常に戻ることを保証するよう努める必要があります。ウォッチドッグが起動するのに2秒程度かかることは避けられないかもしれませんが、グリッチカウンターがゼロに達するまでに4分かかる場合があります。
supercat

10
@ coder543、彼らはあなたが信じるよりも重要なデモでより頻繁に発生します。この種の思考は、助けを求めたりエラーを報告したりする手段のない深く埋め込まれたものを構築するときにも必要です。または、エラーに気付いたとしてもアクセスできない(深海や宇宙を考える)。
RBerteig

6
@JohnU:気づきましたが、どうしてコードを書いたのかを説明しておくと役に立つかもしれません。ちなみに、私は小さなタスクが完全に最適化されていなくても小さなプロセッサに収まることを示しようとしていました。
supercat

26

「オンリー」384バイト?

昔、私は船、パイプライン、製油所管理業界にサービスを提供する特殊なコンピューター用にオペレーティングシステム全体を(自分で)書く仕事をしていました。同社の最初の製品は6800ベースで6809にアップグレードされていたため、元のオペレーティングシステムのライセンスコストをなくすために6809に新しいOSを追加したかったのです。彼らはまた、ブートROMのサイズを32バイトから64バイトに増やしました。正しく思い出せば、それは約33年前でした!-オペレーティングシステムのデバイスドライバー全体をROMに配置して、デバイス全体の信頼性と汎用性を高めることができるように、エンジニアに128バイトを提供するよう説得しました。これに含まれるもの:

  • キーデバウンス付きキーボードドライバー
  • ビデオドライバー
  • ディスクドライブドライバーと初歩的なファイルシステム(Motorola "abloader format"、IIRC)、「バンク」メモリを本当に高速なディスクスペースであるかのように処理する機能が組み込まれています。
  • モデムドライバー(FSKを逆方向に取得したため、これらのモデムは相互に通信するだけでした)

はい、これらはすべて必要最低限​​の機能であり、余分なサイクルをすべて取り除くように手作業で最適化されていますが、完全に保守可能で信頼性があります。はい、すべてを利用可能なバイトに押し込みました-ああ、割り込み処理、さまざまなスタックを設定し、リアルタイム/マルチタスクオペレーティングシステムを初期化し、ユーザーにブートオプションを促し、システムを起動しました。

まだ会社と提携している私の友人(後継者)が、数年前に私のコードがまだ使用中であると私に言った!

あなたは384バイトでLOTを行うことができます...


2
ブートROMと言い、ドライバーをブートROMに移動することを言います...これは、使用可能なセカンダリストレージメディアがあったことを示しています。この説明では、このPICの外部ストレージからコードをロードできないことを既に決定しています。
coder543

5
@ coder543ポイントを逃します:384バイトで十分です。より多くのLOT - -リアルタイム、マルチタスクオペレーティングシステムのすべての基本的なコンポーネントを提供することを...それは私が必要以上だった-元の質問は、384が役に立つ何かをするのに十分ではなかったという苦情のように読めます
リチャードT

21

これは、ロジックゲートや555タイマーで必要なサイズよりも小さなフットプリントで、非常に小さなアプリケーション(遅延PSU起動555タイマー交換トライアックベースの制御、LED点滅など)に使用できます。


3
最初の2つの例はStack自体からのものであることに気付きました。よくやった。
coder543

9
フットプリントについて言及する場合は+1。時にはサイズがすべてです。
embedded.kyle

17

植物の水分量を追跡し、植物に水が必要な場合はLEDを点滅させる、植物用の湿度センサーを設計しました。センサーにプラントのタイプを学習させ、実行中にその設定を変更できます。バッテリーの低電圧を検出します。フラッシュとRAMを使い果たしましたが、Cコードですべてを記述して、この製品を問題なく動作させることができました。

あなたが言及したpic10fを使用しました。


これが私の植物水センサー用に作成したコードです。ADCモジュールがあり、pic10f200と同じメモリを持っているため、pic10f220を使用しました。明日、回路図を見つけようとします。

コードはスペイン語ですが、非常にシンプルであり、簡単に理解できるはずです。Pic10Fがスリープモードから復帰すると、Pic10Fはリセットされるため、パワーアップまたはリセットであったかどうかを確認し、それに応じて行動する必要があります。プラントの設定は実際にはパワーダウンしないため、RAMに保持されます。

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

質問があれば教えてください、私が覚えていることに基づいて答えようとします。数年前にこれをコーディングしたので、コーディングスキルをチェックしないでください。改善されました:)。

最終ノート。Hi-Tech Cコンパイラを使用しました。


3
私は実際にあなたがこれをどのようにしたかを読むことに本当に興味があるでしょう。あなたがそれをしている間、あなたはウェブ上で共有することを気にしないだろうというメモを取りましたか?
RhysW

1
こんにちはRhysW、私はまだコードを持っていると信じています。実際には本当に簡単でした。あなたが興味を持っているなら、私はあなたに私のコードを送ることができました。お知らせ下さい。私が設計した回路は非常にシンプルでクールで、抵抗は3つ、pチャネルMOSFET(逆バッテリ保護用)、100nFキャップ、LEDのみです。pic10fの内部ダイオードを使用して、バッテリー測定の基準として使用し、ADCの読み取り値を一定に保ちます。
スクレイピング

1
それはきちんとしたプロジェクトのように聞こえます。ここに詳細を投稿できる(または少なくともどこかに投稿してリンクできる)可能性はありますか?
イルマリカロネン

1
こんにちわ!このサイトは投票を使用しており、フォーラムのように機能しないため、回答に追加するものがある場合は、新しい回答を投稿する代わりに「編集」リンクを使用してください。
クラバッキオ

16

私が言及したことはありませんが、あなたが言及したマイクロコントローラーはそれぞれ100個でわずか0.34ドルです。したがって、安価で大量生産された製品の場合、そのような限られたユニットによって課せられる余分なコーディングの問題に行くことは理にかなっています。同じことがサイズまたは電力消費にも当てはまる場合があります。


2
それがまさに私の最初の考えでした。また、私がきちんとしたアイデアを持ったスタートアップになっても、数百ドルしか負けないなら、このようなことは、get-back-to-day-jobとquit-day-jobの違いを意味します。
フレネル

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ビット幅のポートがないため、入力用の安価なシリアルルーチンを追加する必要がありますが、アイデアは一見複雑な仕事ができるということです非常に少ないコードで実行できます-上記プログラムのコピーを10個、10F200に収めることができます。

私のLight Dimmingページでより多くのプロジェクト情報を見つけることができます。ちなみに、私はこれを先生に見せたことはありませんでしたが、結局、DJの友人のために多くの照明器具をやることになりました。


12

さて、何年も前に、シリアルI / O(MCUにUARTがなかったためにシリアルI / Oをビットバンギング)と、コントローラーと通信する簡単なコマンドインタープリターを備えた温度コントローラーを作成しました。MCUは、なんと504バイトのプログラムメモリ(OTPROM)と約32バイトのRAMを備えたMotorola(現在のフリースケール)MC68HC705K1でした。参照するPICほどではありませんが、ROMが残っていることを覚えています。17年後、まだいくつかの組み立てられたユニットが残っています。買いたい?

ええ、それは少なくともアセンブリでできます。

いずれにせよ、最適化するとおそらく384バイト以内に収まると思われる非常に単純なCプログラムを最近作成しました。すべてが大規模で複雑なソフトウェアを必要とするわけではありません。


5

384バイトのプログラムメモリでLEDを点滅させることができます。

私の知る限り、外部チップでプログラムメモリを拡張することはできません(384バイトで完全なASMインタープリターを構築している場合を除き、低速になります)。ただし、外部チップ(EEPROM、SRAM)でデータメモリを拡張することは可能です。


1
チューリングマシンシミュレータを384バイトで構築するのは難しくありません...
クリスストラットン

@ChrisStratton私は完全なインタープリターを意味していたので、「拡張プログラムメモリ」は通常と同じ機能を持ちます。

はい、しっかりと実装する手段を提案しました。残りはちょうど、コンパイラの設計...である
クリス・ストラットン

7
プログラムロジックを外部EEPROMに保存したい場合、PIC命令セットをエミュレートしようとしてもうまくいきません。より良いアプローチは、仮想マシンでの使用に最適化された命令セットを設計することです。実際、それが、Parallaxが1990年代に「Basic STAMP」で採用したアプローチです。シリアルEEPROMチップとペアになった3072バイトのコードスペースを持つPICでした。
supercat

3
ところで、BASICスタンプに関する追加のメモ:フラッシュベースまたはEEPROMベースのマイクロコントローラーが比較的まれであったときに導入されましたが、シリアルEEPROMチップはかなり安価でした。それほど速度を必要としないアプリケーションの場合、シリアルEEPROMパーツを備えた固定コードマイクロは、同等のサイズのEEPROMまたはフラッシュベースのマイクロよりも安価です。ベーシックスタンプのデザインは今日では意味がありませんが、導入されたときには非常に実用的でした。
supercat

4

実際には、あなたが思っているよりも悪いです。リンクされたマウサーページは、このプロセッサが384バイトのプログラムメモリを持っていると指定した場合、混乱を招く問題です。PIC10F200には、実際には256個の12ビットワードのプログラムメモリがあります。

それで、あなたはそれで何ができますか?12ビットPIC命令セット PIC10F20ので使用されるXのデバイスはすべて、単一ワード命令なので、あなたがプロセッサのセットアップのためのいくつかの指示を減算した後、あなたは約250ステップのプログラムのために十分なスペースを残しています。多くのアプリケーションにはこれで十分です。たとえば、そのようなスペースに洗濯機のコントローラーを書くことができます。

私は利用可能なPIC Cコンパイラを調べたところ、それらの半分はPIC10F200のコードを出力しようとさえしないようです。おそらく非常に多くの定型コードを出しているので、残っているスペースにしかLEDフラッシャーを書くことができないかもしれません。あなたは本当にそのようなプロセッサでアセンブリ言語を使いたいです。


あなたは256命令語について正しいです。実際には、そのうちの1つが発振器校正定数で使用されるため、255の使用可能な命令が得られます。また、10F200は通常のPIC 16 14ビット命令セットを使用しません。PIC 12 12ビット命令セットを使用します。しかし、私はあなたの基本的な前提に同意します。PIC 10F200を使って多くの便利なことをしました。+1
オリンラスロップ

@OlinLathrop:答えを明確にしました。datashseetの 51ページからPIC16用語を取得しましたが、「12ビット命令セット」を参照する方が明確だと判断しました。パーツプレフィックスは、使用する命令セットの信頼できるガイドではありません。
ウォーレンヤング

0

私の日に振って、私たちは砂から自分のビットをエッチングしなければなりませんでした!

1976年(またはその周辺)に、Atari 2600 VCSシステムは、当時最も人気のあった「ビデオゲームプラットフォーム」の1つでした。その中で、マイクロプロセッサ(MOSTEK 6507)は、1 MHzの超高速で実行され、**** 128バイトのRAM **を搭載していました。

RAMが非常に限られている(〜128バイト)マイクロコントローラーを思い出す2番目の例は、DC-DCコンバーターで使用されるPIC12Fでした。このマイクロも、まったく実行するためにアセンブリ言語を使用する必要がありました。


4
OPはRAMのことではなく、プログラムスペースのことです。Atari 2600のプログラムスペースは、RIOTチップではなくカートリッジにあります。2600は、バンク切り替えなしで最大4 kiBのプログラムROMをサポートしていました。(そして、一部の市販のカートリッジバンク切り替えを行いました!)PIC12Fの例に関しては、OPがあなたを打ち負かしました:PIC10F20xシリーズデバイスは16バイトまたは24バイトのSRAMを持っています。
ウォーレンヤング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.