すべてにご挨拶。
最初の部分では、オフィス用に収集する情報パネル自体の概念を調べました(ネットワークトポロジなど、重要な機器へのアクセスを必要としない灰色のサブネットを含むなど、一部のサーバーでは正常に監視することは困難です)インターネットですが、テレフォニーサービス、特に
TDMと
E1の操作性は、その作業に依存します。
これで、トピックを続けるのに十分な資料が蓄積されました。
これはインジケーターがどのように見えるかです:

プロジェクトの最後に、説明付きのコード全体が表示されます。
コードは、
WTFPLの下でライセンスされています。
ライセンスに関する情報、およびイーサネットモジュールENC28J60のコードについては、
Lifeloverに感謝します。
プロジェクトはまだ完了していないため、継続されます。
残念ながら、現時点ではデバイスはまだ組み立てられておらず、私はかなり待たなければなりませんでした(開発中、ボードの製造と消耗品の購入の両方で不快な問題に遭遇しました)。
表示モジュールは準備ができています(2/3)。ただし、それらを操作することしかできません。 LEDディスプレイを使用した作品の部分的に組み立てられた「ライブラリ」。
2つのコントローラー間の相互作用のためのインターフェースはありませんが(ここでの質問は、ハブロフスク市民の改善方法です-私自身はUARTを介して実装する傾向があります)。
興味のある方-猫へようこそ。
警告:写真がたくさん。
現時点では、情報の表示を担当するモジュールのみが正常に機能しています。
動的表示(125Hzのオーダーのリフレッシュレート)を実装しました。 モジュールはATmega48コントローラー(metekte-
ATmega1284p上 )から制御されます。 どちらも12 MHzのクロック周波数と3.3Vの電力で動作します(microSDカードとイーサネットモジュールとの互換性のため)。 表示モジュールの電源-5V 0〜2.2A /モジュール、つまり、画面がいっぱいのときは10Wを少し超える必要があります。
通常の操作(たとえば、クロック/カレンダーモード)では、デバイスは最小限の電力を消費します)。
現時点では、栄養の問題が関連していますが、私はオプションに傾いています:
48V(PoE)-> 5V(フライバック)-> 3.3V(LDO)。
計算によると、3.3V電源回路は、0.5Aを超える電流(イーサネットモジュール(〜150-250mA)と2つのコントローラー(20mAを超えない)、SDカード(測定しなかったが50mAを超えない)、リアルタイムクロックの共同動作) (DS1307)、後者は5Vから電力フィルターを介して給電する予定ですが)。
これで、タイトルと同じ写真ですが、トリミングなしの2つの識別モジュールが収集されます。 下の写真。
非表示のテキスト
2つのディスプレイモジュールが連動しました。
デバイスの一般的な概念は、最初の投稿から多少修正されました。 これで、通常どおり、マスター(ATMefa1284p)とスレーブ(ATMega48)の2つのプロセッサーで構成されます。 CPUボードはまだ準備ができていません(周辺機器がまだ完全に選択されておらず、すべてを何度もやり直したくないので)。 現在、サウンドに関していくつかの質問があります。たとえば、ネットワークからストリーミングオーディオ(8ビット、〜22kHz)を直接再生するのに悩む価値があるのでしょうか、それともアイデアを捨てるのは簡単ですか? SDカードからオーディオファイルを読み取るオプションは魅力的ですが、ここではそれらを管理するという問題もあります(ネットワークから直接カードにダウンロードする可能性があります)。 おそらく、2番目のオプションに焦点を当てます。
ウィザードは、ネットワークサポート、サウンド(おそらく)、および(おそらく)単純なtelnetアクセスを担当します。
後で、ネットワークを介して(手の直接性が十分にある場合)、またはSDカード(むしろ、SPIモードのuSD)からソフトウェアの更新を実装しようとします。 手がブレッドボードを収集するために到達しません。
少し前のインジケーターボード
非表示のテキスト

私は知っている、かなり怖い。
それらの3つがあります。
電子基板は、腐食するまで処理中です。 現像中にフォトレジストは洗い流されます。
別の失敗の写真:(現在20)。 この方法はまだ私に与えられていないようです。
非表示のテキスト
これまでに行われた最高のことは...残念ながら、破損しています。 縞模様と不均一なレジスト層が陰湿なビジネスを行いました。
多くの場合、次のような結果になります。

PN-VSCH-50の3年間の暴露は...非常に悲しいです。
最初は、アダプター付きのボードが1つ計画されていましたが、後にアダプターを完全に放棄し、より便利なものに切り替えることが決定されました。 配線板を選びました。 ラフですが、問題は解決します。
電子基板アセンブリ
非表示のテキスト
ボード自体、トランジスタキーの配列、シフトレジスタは既にはんだ付けされています。

すべての行と列でも動作します。

デバッグ中。
何らかの理由で、文字列はエラーとともに表示されます。 (非推奨)
upd 2014-05-11 :「画面」全体の行のソフトスクロールを受け取ったため、ディスプレイの「ドライバー」を無効にすることができました。
今日
ここで小さな勝利を見ることができ
ます 。
VCへのリンクをおpoびしますが、ビデオをアップロードする別の場所をまだ見つけていません。 誰かが私に言う場合-私は感謝します。
2番目のインジケーターボードが準備されています-すべてのコンポーネントは既に組み立てられており、マトリックス自体をはんだ付けするために残ります。コードは...批判を受けるまで、それで終了します。 現在、画面の寸法を任意に変更することはすでに可能であり、これはそのパフォーマンスに影響しません(合理的な制限内)。
RAMの使用量は最小限です。 テキスト(またはグラフィックス、ただし1フレーム)のバッファーの下にのみ、いくつかのペネマティック。 512バイトの使用可能なRAMに収まります。
upd 2014-06-02 :2つのインジケーターの準備ができており、コードは数回の動きでインジケーターにスケーリングされます
-1つの定義を変更してプロジェクトを再構築します。 写真は高かった。
制御コードは機能しますが、2つのコントローラーで処理するためにまだシャープ化されていません。 ブレッドボードでは、1つのコントローラーでのみ動作し、2番目のコントローラーは順番に待機します。 48番目のメガにはJTAGがないため、ハードウェアでのデバッグははるかに困難になります。 コントローラボードを組み立てる前に、すべてのバグを修正しようとします。
「隣の」コントローラーのソフトウェアをフラッシュドライブから更新できるかどうかという疑問が生じました。 最も便利な方法(接続が簡単という事実から-microSD / SPIですが、独自のブートローダーを作成する必要があります)。 今、私はマスターに接続された標準ISPインターフェースを介してスレーブのファームウェアのオプションを考えています(マスターが「スクリーンドライバー」ソフトウェアを更新できるように、両方のコントローラーとジャンパーにプログラミング用のコネクターを出力する必要があります。
SPIを使用したインジケーターの管理に関するヒントを
提供してくれた
Alexeyslavに感謝します。 このオプションは考慮されましたが、誤って忘れられました。 これで、コントローラーの「leg-jump」の方法でデータが出力されます。
\\ただし、消費するリソースは少ないため、それほど致命的ではありません。
\\新しいオプションを説明するとき-信号のプロットを表示しようとします。
コードのビット:
led.h // : (3*9)*8 // 27*8 = 216 . #define MATRIX_COUNT 16 // #define ARRAY_SIZE MATRIX_COUNT * 8 // . #define VisibleChars ARRAY_SIZE / 6 #define LED_MODE_OFF 0 #define LED_MODE_TXT_SCROLL 1 #define LED_MODE_TXT_NO_SCROLL 2 #define LED_MODE_IMG 3 #define LED_MODE_MAX LED_MODE_IMG void LED_Reset(void); // . , . void LED_PushBits(unsigned char DataByte, unsigned char Bits); // . void LED_FirstLine(void); // . void LED_NextLine(void); // ( ) void LED_Sync(void); // "" - , "Latch" . "". //char HEX(unsigned char dataNibble); // // HEX ( [0..15], ). void LED_DrawChar(uint8_t CharN, uint8_t LineNum, uint8_t ShowCols); // . . (, , ) void LED_DrawString(void); // . 1ms (1000/8 = 125Hz), , 2 (500/8 = 62.5Hz) //void LED_NewString(alarm_packet_t *data); // . , , , . void LED_DrawImg(void); // . , . . // , 8 ( , ). void LED_Poll(void); // , "", . // , , . // . // - .
led.c #include "led.h" //#define TextScrollMS 50 uint8_t DataArray[ARRAY_SIZE]; // . uint8_t CurrMode; // : {0=, 1= , 2= , 3=} uint8_t CurrLength; // ( ). uint8_t CurrLine; // int16_t CurrSkipChars; // // 127 ( 128-), ... int16. uint8_t CurrColSkip; // ( ) volatile uint8_t TextScrollDelayMS; volatile uint16_t LastMS; void LED_SetMode(uint8_t NewMode) { if (NewMode <= LED_MODE_MAX) { CurrMode = NewMode; } else { CurrMode = LED_MODE_OFF; }; }; void LED_Poll(void){ if (CurrMode == LED_MODE_OFF) { return; }; if (CurrMode == LED_MODE_TXT_SCROLL) { LED_DrawString(); }; if (CurrMode == LED_MODE_TXT_NO_SCROLL) { LED_DrawString(); }; if (CurrMode == LED_MODE_IMG) { LED_DrawImg(); }; }; void LED_Reset(void) { char t; CurrLine = 0; CurrSkipChars = -VisibleChars; LED_PORT |= (1<<LED_OE); // Z- LED_PORT |= (1<<LED_DATA_V); // . for (t=0;t<8;t++) { LED_PORT |= (1<<LED_C_V); // 0 LED_PORT &= ~(1<<LED_C_V); // , . }; LED_PORT &= ~(1<<LED_OE); // Z- .. }; void LED_PushBits(unsigned char DataByte, unsigned char Bits) { while (Bits > 0) // { Bits--; // 1 if (DataByte & 0x80) // = 1 ( ) { LED_PORT |= (1<<LED_DATA_H); // "Data" } else { LED_PORT &= ~(1<<LED_DATA_H); // - }; LED_PORT |= (1<<LED_C_H); // LED_PORT &= ~(1<<LED_C_H); // 1 . DataByte <<= 1; // 1. }; // , . }; void LED_FirstLine(void) { LED_PORT &= ~(1<<LED_DATA_V); // LED_PORT |= (1<<LED_C_V); // LED_PORT &= ~(1<<LED_C_V); // . LED_PORT |= (1<<LED_DATA_V); // // LED_Sync(); // }; void LED_NextLine(void) { LED_PORT |= (1<<LED_C_V); // LED_PORT &= ~(1<<LED_C_V); // . CurrLine++; // CurrLine &= 0x07; // 7 // , if (CurrLine==0) { LED_FirstLine(); // , , if (((ticks_count - LastMS) > TextScrollDelayMS)|(ticks_count < LastMS)) { LastMS = ticks_count; // if (CurrMode == LED_MODE_TXT_SCROLL) { CurrColSkip--; // 1 if (CurrColSkip == 255) // , .. { CurrColSkip = 5; // 5/6 ... CurrSkipChars++; // 1 . }; // if (CurrSkipChars > CurrLength) { // (- ) CurrSkipChars = -VisibleChars; }; } else { CurrColSkip = 0; CurrSkipChars = 0; }; }; }; }; void LED_Sync(void) { // LED_PORT |= (1<<LED_OE); // Z- LED_PORT |= (1<<LED_LATCH); // LED_PORT &= ~(1<<LED_LATCH); // . . LED_PORT &= ~(1<<LED_OE); // . . }; void LED_DrawChar(uint8_t CharN, uint8_t LineNum, /*uint8_t SkipCols,*/ uint8_t ShowCols) { unsigned char temp = 0; unsigned char cols; cols = ShowCols; // if (cols == 0) { return; }; if (CharN == 168) { // temp = pgm_read_byte(&CharsRu[65][LineNum]); }; if (CharN == 184) { // temp = pgm_read_byte(&CharsRu[66][LineNum]); }; if (CharN > 191) { // temp = pgm_read_byte(&CharsRu[CharN-192][LineNum]); }; if ((CharN > 32)&(CharN <= 126)) { // temp = pgm_read_byte(&Chars[CharN-32][LineNum]); }; // RAM. , +1 (, 1 .... , ). LED_PushBits(temp, cols); // }; void LED_DrawString(void) { int16_t First; // int16_t Last; // int16_t SymbolsSkip; // // , . uint8_t i; // "i" - 40 ! uint8_t EndedWithChar; // , ... . SymbolsSkip = CurrSkipChars-1; // while (SymbolsSkip < 0) { SymbolsSkip ++; // 0 LED_PushBits(0, 6); // ( ). }; // . // , . if (CurrSkipChars <= 0) // { First = -1; // . } else { First = CurrSkipChars-2; // - -2 // // . }; Last = First + CurrSkipChars + VisibleChars; // . // ( ) if (Last > First) { // , if (Last > CurrLength-1) { // . Last = CurrLength-1; // , . // , ( ) + - - 1 // -1 - , , . SymbolsSkip = VisibleChars + CurrSkipChars - Last - 1; }; if (SymbolsSkip > 0) { EndedWithChar = 0; } else { EndedWithChar = 1; }; // - , , . // 1 ... for (i = First+1; i < Last; i++) { // , . LED_DrawChar(DataArray[i], CurrLine, 6); }; // ... , . if (EndedWithChar) { LED_DrawChar(DataArray[Last], CurrLine, 6-CurrColSkip); } else { LED_DrawChar(DataArray[Last], CurrLine, 6); }; // .. if (SymbolsSkip > 0) { // // ,... for (i=1;i<SymbolsSkip;i++) { // ... . LED_PushBits(0, 6); }; // - - . LED_PushBits(0, 6-CurrColSkip); }; }; LED_Sync(); // . LED_NextLine(); // . }; void LED_DrawImg(void) { uint8_t i; // // - *8 ( ) // . for (i = CurrLine*MATRIX_COUNT; i<CurrLine*(MATRIX_COUNT+1); i++) { // ... , 8 . LED_PushBits(DataArray[i], 8); }; // , MATRIX_COUNT . // . LED_Sync(); // . LED_NextLine(); // . };