電子デバイスの「ハート」または最も単純なプログラミングSilicon Labs C8051F320についてのストーリーの続き

少し前に、Silicon Labs C8051F320マイクロコントローラーをベースにした自分のクラフトに関する記事を書きました。 最も簡単なタスクのためにこのマイクをプログラミングすることについて話します。

画像



カットの下の詳細。





そのため、以前の記事で小さなスカーフについて話しました。これは将来のデバイスの基礎になるはずです。 マイクロコントローラ自体と、ファームウェア、電源などのリセット用に設計された小型のボディキットを収容します。 このデバイスが私たちの仕事で実行することになっていたタスクの1つは、研究スタンドでいくつかのデバイスを制御することでした。 実際、タスクはそれほど複雑ではなかったため、ミクロンのファームウェアはUSBやその他の特定のものを操作するなどの複雑なソリューションを必要としませんでしたが、今後このファームウェアを解析することで、同様のマイクを使用して勉強する必要がある人に役立つ可能性があります(私の友人は、51番目のカーネルのプログラミング方法または作業方法を学んでいるようです。 しかし、まず最初に。



挑戦する




タスクは非常にシンプルに設定されました-最もシンプルなオン/オフのリモートデバイスをマイクロコントローラーから整理し、操作間に必要な遅延を整理します。 理論的には、これらの遅延をUSB経由でPCから管理する必要がありましたが、後で判明したように、これはそれほど重要ではありません。



ハードウェア




この問題を解決するには、デバイスのハードウェア部分を実装する必要がありました。これは、「ハート」自体がボード上に何も運ばず、元々周辺ボードによって調整されるように設計されていたためです。 この記事はファームウェアに関するものなので、ハードウェアには特に焦点を当てませんが、それでも、図を完成させるために、そのスキームと簡単な説明を示します。



合計で6個のリモートデバイスがあり、そのうち3個は光ファイバー通信で制御され、2個はリレーを介して制御され、1個は5ボルトの単純なパルスで制御されました。 私たちの上司はすべてが賢明に行われることを好まないため、有能な仕事にお金を割り当てたくないため、回路図はすぐにひざの上に積み上げられたので、そこに小さな欠陥がある可能性があります。 彼女がいる。







デバイスに変更が計画されていないことを確認した後、または、「ああ、ましょう...」がないことを当局に確認してから、完全に新しい回路を作成する必要があります。その後、プリント基板の作成に取り掛かります。 私はすでにお金の不足について話したので、私はすべてが即興の要素から作られたと言うだけです-ボードは古いPCBの一部から膝の上にエッチングされ、要素はパントリーで見つかりました。 一般的に、完全な荒廃。 NII、他に言うべきこと...一般的に、結果は写真に表​​示されます:











ちなみに、「ああ、レッツ...」が起こったので、いくつかの小さなスカーフをリベットし、このスカーフでトラックをカットし、すべてを鼻でつなぐ必要がありましたが、ポストはそれについてではありません。



ソフトウェア部


ソフトウェア部分の説明は、いくつかのサブ項目で構成されているため、内容について読みやすく理解しやすくなっています。



作業アルゴリズム


アルゴリズムはフェルトブーツと同じくらい簡単です:





アルゴリズムが選択され、ハードウェア部分の準備ができたら、マイクロコントローラーの構成とプログラム可能性に進みます。



マイクロコントローラーの構成


SILabsで気に入っているのは、マイクロコントローラーの初期化、構成、フラッシュ、および直接デバッグを行うためのプログラムという形でたくさんの便利な機能があることです。 そのため、 サイトからMKの初期構成用のプログラムを取得して実行します。 設定で必要なミクロンを選択し、構成を開始します。











MKを構成するプロセスでは、I / Oポートを構成して、初期状態でそれらに論理ゼロを設定し、タイマーカウンターを必要な間隔に設定し(EMNIPを50マイクロ秒に設定します)、タイマーからの割り込みを有効にします。 私はすべてを正確に覚えていない、私は長い間それをやった、私はほんの一例を示します。 [プロパティ]メニューで、必要な項目を選択し、開くウィンドウが表示されます。ここで、必要なすべてのパラメーターがGUIで構成されています。







[OK]をクリックすると、すべての設定がコードとともにウィンドウにコピーされます。 MKをセットアップしましたが、コンフィギュレーターを閉じることを急いでいません。そこで必要になります。 同じサイト Silicon Labs IDEからダウンロードし MKをフラッシュします。 起動します。



ここには微妙な違いがあります。KeilC51からコンパイラを使用して使用する必要があります。 これにこだわるのではなく、これがどのように行われるかの写真を見せてください。 [プロジェクト-ツールチェーン統合]メニューを開き、主要なコンパイラへのパスを指定します。







コンフィギュレータを開き、結果のコードをそこからIDEにコピーします。



//--------------------------------------------------------------------------------// // Initialization of timer // //--------------------------------------------------------------------------------// void timerInit(void) { TMOD = 0x10; TMR2CN = 0x24; TF2LEN = 1; TMR2RLL = 0xCF; TMR2RLH = 0xFF; TMR2L = 0xCF; TMR2H = 0xFF; T2SPLIT = 0; T2SOF = 0; ET2 = 1; TMR2 = 0xffff; // set to reload immediately ET2 = 1; // enable Timer2 interrupts TR2 = 1; // start Timer2 } //--------------------------------------------------------------------------------// // Initialization of ports I/O // //--------------------------------------------------------------------------------// void portIOInit(void) { P1MDOUT = 0x7F; XBR1 = 0x40; P0 = 0x00; P1 = 0x00; P2 = 0x00; } //------------------------------------------------------------------------------// // Interrupts init // //------------------------------------------------------------------------------// void interruptsInit(void) { IP = 0x20; IE = 0xA0; } //----------------------------------------------------------------------------- // SYSCLK_Init //----------------------------------------------------------------------------- // // This routine initializes the system clock to use the internal 24.5MHz / 8 // oscillator as its clock source. Also enables missing clock detector reset. // void SYSCLK_Init (void) { OSCICN = 0xC3; // configure internal oscillator for // its lowest frequency RSTSRC = 0x04; // enable missing clock detector } //------------------------------------------------------------------------------// // Device init // //------------------------------------------------------------------------------// void deviceInit(void) { // disable watchdog timer PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer SYSCLK_Init(); timerInit(); portIOInit(); interruptsInit(); EA = 1; // enable global interrupts //------------------------------------------------------------------------------// // Main function // //------------------------------------------------------------------------------// void main(void) { _delay1 = 0; _delay2 = 19980; _widthImp = 20; _cDelay = 0; _state = ST_IDLE; deviceInit(); while(1) { }; } }
      
      







メインタスクの実装


したがって、MKが構成され、メインタスクの実装に進みます。着信信号を確認し、シーケンスを実行します。



この関数のアルゴリズムは次のとおりです-50マイクロ秒ごとにクリックのタイマーを開始します。 コントローラーの現在の状態を担当するグローバル変数_stateを作成します。 デフォルトでは、0に等しくします。 最初の状態。 defineを使用して、MKの残りの状態をより読みやすくします。



 #define ST_IDLE 0 #define ST_DELAY_0 1 #define ST_RNT_START 2 #define ST_DELAY_1 3 #define ST_RNT_STOP 4
      
      







割り込みテーブルのコントローラーデータシートを見て、必要なタイマーの割り込みにはベクター(数値)5があることがわかります。関数を実装するコード:



 //------------------------------------------------------------------------------// // Timer ISR // //------------------------------------------------------------------------------// void timerISR (void) interrupt 5 { TF2H = 0; TF2L = 0; // Clear Timer2 interrupt flag switch(_state) { case ST_IDLE: if (_inputPulse == 0) { _state = ST_DELAY_0; _cDelay = 0; } break; case ST_DELAY_0: _cDelay++; if (_cDelay>=_delay1) { _state = ST_RNT_START; _rntStart = ON; _cDelay = 0; } break; case ST_RNT_START: _cDelay++; if (_cDelay >= _widthImp) { _state = ST_DELAY_1; _rntStart = OFF; _cDelay = 0; } break; case ST_DELAY_1: _cDelay++; if (_cDelay >= _delay2) { _state = ST_RNT_STOP; _rntStop = ON; _cDelay = 0; } break; case ST_RNT_STOP: _cDelay++; if (_cDelay >= _widthImp) { _state = ST_IDLE; _rntStop = OFF; _cDelay = 0; } break; default: _state = ST_IDLE; break; }
      
      







それで、私たちは何をしていますか? タイマーをクリックするたびに、MKのステータスを確認します。 0の場合、入力に開始信号があるかどうかを確認します。 (inputPulse == 1)の場合-シーケンスを実行します。 信号間の遅延の長さは、タイマーのクリック数によって制御され、ステータス処理コードの各クリックでチェックします。 作業サイクル全体の終わりに、MKを状態0に戻し、次の着信信号を待ちます。



ファームウェア




MKは、ボタンをクリックするだけで同じIDEから簡単にコンパイルおよびフラッシュされます。 プログラマーをボードに接続し(前の記事を参照)、電源を入れ、[接続]ボタンを押し、次に[コードのダウンロード]ボタンを押します。 これで、MKがステッチされました。 ここからMKで実行するコードを実行するには、[Go]ボタンをクリックします。 ここでは、オシロスコープの結果を考慮して、ブレークポイントを設定し、ブレークポイントでデバッグセッションを実行できます。





ボタンは図に示されており、異なる色でラベル付けされています。



おわりに





ご覧のとおり、このMKを使用する場合、すべてがそれほど複雑ではありません。 この投稿は誰かがそれを理解するのに役立つと思います。



All Articles