5

(怠惰な場合はTL; DRの下部を参照してください)

こんにちは、私は物理コンピューティングを扱う新しい(プロトタイプ)プロジェクトを構築することを計画しています。基本的に、私はワイヤーを持っています。これらのワイヤはすべて、同時に電圧を読み取る必要があります。各ワイヤの読み取り値の差が数百マイクロ秒を超えると、ワイヤが完全に台無しになります。Arduinoは約114マイクロ秒かかります。したがって、待ち時間が読み取りの精度を歪める前に、私が読み取ることができるのは2本または3本のワイヤです。

ですから、私の計画は、一連のATTinysの「マスター」としてArduinoを使用することです。arduinoはスペースがかなり狭いですが、小さなものに比べると巨大な遊び場です。ATTiny13Aには、1kのフラッシュROM(プログラムスペース)、64バイトのRAM、および64バイトの(耐久性がなく低速の)EEPROMがあります。(サイズだけでなく価格もこれを選んでいます)

私のシステムのATTinysはあまり効果がありません。基本的に、マスターからの信号を待ってから、1本または2本のワイヤーの電圧を読み取り、RAM(または窮屈な場合はEEPROM)に保存するだけです。そして、データ用に1本のワイヤーだけを使用してマスターに送信します(それ以上のスペースはありません!)。

これまでのところ、私がしなければならないのは、(組み込みのADCを使用して)簡単な電圧読み取りコードを実装することだけです。しかし、私が心配しているこのコミュニケーションビット。そのような制約の中で通信プロトコル(1本のワイヤーを使用するだけです!)を実装することさえできると思いますか?

TL; DR:1k未満のプログラムスペースと64バイトのRAM(および64バイトのEEPROM)で、1-Wire通信プロトコルを実装することは可能だと思いますか?フィットさせるためにアセンブリにドロップする必要がありますか?

現在、WiringライブラリにリンクしているArduinoプログラムが8kを超えていることを知っているので、少し心配しています。

4

8 に答える 8

9

データを送信するだけで(受信よりも簡単です)、独自のプロトコルを選択できるため、使用可能なメモリスペースにコードを収めることは問題ありません。

私はかつて、8x14セグメントLCDディスプレイ、いくつかのLED、いくつかのボタン、シリアル(I2C)EEPROM、およびホストへのシリアルインターフェイスを含む産業用コントロールパネル用のソフトウェアを作成しました。4ビットプロセッサが使用されました。デバイスにはシリアルインターフェイスがなかったため、RS232CインターフェイスとI2Cバスの両方をソフトウェアで実装する必要がありました。その上に、Modbusプロトコル(特にCRC計算に正確なタイミングが必要)とアプリケーションプログラムがありました。

このデバイスには、128 x 4ビットのRAMと1kW、2kW、3kW、または4kWのROM(ワードあたり10ビット)が搭載されていました。最終的なプログラムのサイズは約1100ワードであったため、最小のデバイスには完全には適合しませんでした。もちろん、アセンブラーを使用しました。

ただし、複数のマイクロコントローラーを使用する代わりに、ハードウェアソリューションの使用を検討することもできます。

サンプルアンドホールド回路を使用できます。そのためには、アナログスイッチとコンデンサのアレイ、そしておそらくオペアンプが必要です。トリガーを発行して、すべての電圧をコンデンサにラッチします。次に、マスタープロセッサで電圧を読み取るために必要なだけの時間を使用できます。

更新:外付け部品をほとんどまたはまったく必要としない既製のサンプルアンドホールドアンプがあることを忘れてしまいました。これはおそらく最も簡単な解決策です。

于 2010-04-18T12:09:09.277 に答える
2

このアーキテクチャを対象とするCコンパイラを使用することはおそらく回避できますが、コンパイラに付属している環境に依存せずに、独自のランタイム環境を作成する必要があります。それは実行可能ですが、基本的に独自のミニOSを作成するための追加作業が、アセンブラーよりもCを使用することによる生産性のメリットを上回るかどうかはわかりません。

于 2010-04-18T09:42:35.960 に答える
2

プロトコルは、くすぐられたときに1つの整数を送信するのに十分なだけ複雑である必要があることを考えると、1kのプログラムスペースで十分です。マンチェスターエンコーディングを調べてください。

于 2010-04-18T09:43:27.177 に答える
1

私は同様の制約で組み込みプログラミングを行いました。私は小さなモデルでBorlandTurboC(かなり前のことです)を使用し、わずかな労力で、アセンブラーで実行できるよりもほとんどかさばらないコードを取得しました。私が言っているのは、Cを高級アセンブラとして使用することは非常に実行可能で賢明なことです。

ただし、私と同じように、Cに(小さな)ランタイム環境を提供するという問題に直面します。理想的には、スタックといくつかのレジスタを設定するだけで済みます。また、Cライブラリ用のスペースがないため、必要な関数を自分でプログラムする必要があります。

于 2010-04-18T09:27:51.813 に答える
1

はい、おそらく、コンパイラをよく知っていれば、cでうまくいくかもしれません。

できることは、コンパイラーを使用して、cコードに基づいて必要なスタンドアロン関数を出力し、それらを独自の関数で接着することです。(確かに、cランタイムセットアップを自分で行う必要があります-スタックなど)

于 2010-04-18T09:31:55.240 に答える
1

ATTiny25へのアップグレードを検討してください。これは、Atmelのユニバーサルシリアルインターフェースを含む、より高性能な8ピンAVRです。ほんの数バイトのソフトウェアがあれば、ハードウェアで1-Wireシリアル通信を行うことができます。

于 2010-05-28T19:06:32.703 に答える
1

マイクロコントローラーの山ではなく、サンプルアンドホールドハードウェアを使用しないのはなぜですか?

于 2010-05-28T19:11:10.267 に答える
1

最近、AT90USB646マスターとATtiny85スレーブを使用してマスタースレーブシステムを設計しました。明らかに、私はスレーブで作業するためのより多くのメモリを持っていましたが、私があなたと共有したかったのはこれです:

通信プロトコルに関しては、ATtiny13の未校正の内部発振器の精度が+/- 10%であることに注意してください。これは、RS-232通信などを使用できないことを意味します。

私は自分のシステムでDallas1-Wireプロトコルの変形を使用しました。スレーブ列挙などの完全なサポートを含め、Cソースコードは1626バイトにコンパイルされます。

編集:おっと、質問がとても古いことに気づいていませんでした。うまくいけば、これはまだいくつかの助けになるかもしれません。

于 2010-09-09T21:12:46.877 に答える