私はATMEGA32HVBマイクロコントローラーを使用しています。このマイクロコントローラーにはセルバランシング機能があり、4つのバッテリーを直列に接続して、1つずつ使用できます。これは電源管理に非常に役立つため、別のマイクロコントローラーを使用することはできません。シリアルデバイスに簡単にインターフェイスできるように、UARTを追加する方法をいくつか提案してください。
私はATMEGA32HVBマイクロコントローラーを使用しています。このマイクロコントローラーにはセルバランシング機能があり、4つのバッテリーを直列に接続して、1つずつ使用できます。これは電源管理に非常に役立つため、別のマイクロコントローラーを使用することはできません。シリアルデバイスに簡単にインターフェイスできるように、UARTを追加する方法をいくつか提案してください。
回答:
他の人が述べたように、システムにハードウェアを追加してUART機能を提供するか、ソフトウェアでエミュレートすることができます。ハードウェア全体の設計を管理しており、別のICを追加することがオプションである場合、ハードウェアベースのアプローチを強く検討します。確かに、ビットバンギングを使用してソフトウェアUARTを機能させることはできますが、必要なタイミングを生成するためにCPUリソースを割り当てたくない場合があります。
データシートを見ると、ご使用のマイクロコントローラーはSPIとI2Cの両方を備えているように見えます(Atmelでは、Two-Wire Interface(TWI)と呼んでいます)。これらはおそらく、外部UARTを接続するために使用するのに最適なインターフェースです。このデバイスは多くのメーカーから入手できます。いくつかの例:
Exar(http://www.exar.com/connectivity/uart-and-bridging-solutions/i2c-spi-uarts)には、利用可能なSPI / I2C 1チャンネルおよび2チャンネルUARTデバイスのラインがあり、〜1.6- 3.3Vの動作範囲。これらの部品は特に使用したことはありませんが、過去にExarデバイス(並列メモリバスインターフェイスを使用)を使用しており、うまく機能しています。
NXP(http://ics.nxp.com/products/bridges/i2c.spi.slave.uart.irda.gpio/)にはSPI / I2C UART / IrDA / GPIOデバイスのラインがあり、1と2 -いくつかの電圧範囲にわたるチャネルの種類。私は過去にこれらの部品(具体的にはSC16IS762)を広範囲に使用し、大きな成功を収めました。
マキシム(http://www.maximintegrated.com/datasheet/index.mvp/id/2052)には、SPI接続のUARTであるMAX3110EおよびMAX3111Eデバイスがあります。これらのデバイスのユニークな機能の1つは、RS-232ラインドライバーが統合されていることです。そのため、UARTをロジックレベルの代わりにRS-232ライン電圧を使用するデバイス(PCなど)に接続する必要がある場合、ボードに別のラインドライバーICを追加する必要がないため、これは便利です。
ハードウェアソリューションをお探しの場合、マキシムにはマイクロコントローラへのSPIインタフェースを備えた複数のUART ICがあります(これはお客様の部品に含まれています)。MAX3100または他のオプションをご覧ください:http : //www.maximintegrated.com/products/interface/controllers-expanders/uart.cfm
ソフトウェアUARTドライバーを使用する必要があります。このUARTに期待するものに応じて、AVR305(非常にコンパクトですが、半二重の送受信をブロックする以外の機能はありません)、AVR274(割り込み駆動、かなり機能が完全)、独自のソフトウェアUARTドライバーを書くことができますたとえば、「avr software uart」をグーグルで検索して、インターネットで見つけたものを使用できます。
ソフトウェアの「UART」設計に関する簡単な注意:要件に応じて、少なくとも定性的に異なるアプローチがあります。
「すべてを引き継ぐ」ビットバングドライバは、すべての割り込みを無効にし、サイクルカウントコードを使用して各ビットをクロックします。「すべてを引き継ぐ」ドライバを使用してデータを受信するには、データが到着したときに、コントローラがそれを待つ以外に何もしていないことが必要です。
「メインループを引き継ぐ」ビットバングドライバは、サイクルカウントではなくビットタイミングにタイマーリソースを使用することを除いて、上記とほぼ同じように動作します。サービスに時間がかかりすぎない割り込みは、有効のままにしておくことができます。シリアル伝送の場合、固定レートタイマーリソースは他の目的と共有できます。ただし、シリアル受信の場合、ビットバンドライバーは、開始ビットが到着したときにタイマーをリロードして、各着信ビット時間の途中で期限切れになるようにする必要があります。
完全割り込み駆動型のビットバングドライバーは、データレートの倍数で実行される固定レートタイマーを使用し(3xと5xはどちらも4xよりも優れています)、そのタイマーを使用してすべてを実行します。このようなドライバーは、他のすべてのドライバーと同時に実行できますが、以前のドライバータイプが必要とするよりも高速なCPUが必要になります。
コントローラーの最初の2つのスタイルが決して来ないデータを永遠に待つことを避けるために、読み取りルーチンにタイムアウト値を含めるのが一般的です。コントローラーのループが「100ミリ秒まで待機している間にバイトを取得し、何も来ていない場合は他のことをしてから、次のバイトを取得する」などのことに注意してください。「get」ルーチンがタイムアウトしてからコントローラーが再び待機を開始する間にバイトが到着すると、そのバイトは失われます。通信するデバイスはその可能性を期待する必要があります。
データバイトの送信中にデータバイトが到着し始める可能性を処理できるのは、3番目のスタイルのドライバのみです。ただし、最初の2つのスタイルは、コントローラが話しかけられたときのみ話す必要がある場合に、一部の全速全二重通信プロトコルに使用できます。トリックは、着信開始ビットを待機する「データの読み取りおよび書き込み」ルーチンを使用することです。1つが検出されると、読み取りデータと書き込みがオーバーラップするため、コントローラーは着信データを調べる直前に各ビットを送信します。コントローラーは、着信開始ビットを検出すると、次の8データビットとストップビットを検索するタイミングを正確に認識し、それにより、自身のデータを出力するための時間間隔を安全に使用できることを認識します。
別の注意点:データを受信するために最初の2つのスタイルのいずれかを使用するコントローラーは、データの損失を避けるために、次のバイトの開始ビットの立ち下がりエッジの前にデータの各バイトを処理する必要があります。コントローラーが処理に少なくとも半分の時間がかかることを認識している場合、ストップビットを待つのではなく、最後のデータビットを取得したらすぐに各バイトを受け入れることで、処理に使用できる時間を最大化できます。ただし、コントローラにより多くの時間を与える別の手段として、1つではなく2つのストップビットでデータを送信するデバイスを使用すると便利です。「マークパリティ」を設定できる場合、もう1つの余分なビット時間が追加されます。たとえば115200-8-M-2での送信では、1.6倍以上の速度でデータをフィードしますが、57600-8-N-1よりも処理時間が長くなります。