1

PIC 18F87J50 を使用するプロジェクト、特に 2 つの USART チャネルとの調整で問題が発生しています。

主な問題は 2 つあります。

1.) 目標のボーレートを設定できません:

Open1USART() および Open2USART() 関数を使用して、使用している 2 つの USART チャネルを初期化しています。両方を 14,400 ボーに設定したいと思います。これらの関数は 2 つの引数を取ります。1 つ目は USART を構成するためのビット フィールドです (非同期対同期モード、8 ビット対 9 ビットなど)。2 つ目は (システム クロック レートに応じて) USART のボー レートを構成する SPBRG 値です。

私は両方を次のように呼び出しています:Open1USART(USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_LOW & USART_RX_INT_ON & USART_TX_INT_OFF, 346);

私のセットアップでは、SPBRG としての 346 は 14,400 ボーを与えるようです (1 ビットの幅が約 70us であることを O スコープで確認しました)。

問題は、これが USART 2 でしか機能しないことです。USART 1 では、同じ SPBRG 値で 57,600 のボーレートが得られます。さらに、SPBRG 値をいじってみると (実際のボーレートの影響を確認するためにスコープのタイミングを調べていると)、興味深いことがわかりました。

SPBRG の値を 0 から大きくすると、ボー レートが低下します。SPBRG を 87 にすると 57,600 ボーになり、173 -> 28,800 になりますが、約 255 でリセットされます。255 では、ボー レートは約 19,000 になります。しかし、256 では、信じられないほど高いボーレート (~1,000,000) を持っています。次に、SPBRG 番号をさらに上げると、ボー レートはさらに遅くなりますが、19,000 ボー マークを下回ることはなく、必要な 14,400 まで下がることもありません。

OK、SPBRG バイトをオーバーフローしていますね。しかし、USART 1 と 2 はまったく同じように構成されており、USART 2 で SPBRG 値 > 255 を使用できます。どちらも同じ BRGH 設定 (低) と BRG16 設定 (高) を持っています。また、この投稿 ( PIC18F2680 の UART 受信で割り込みがトリガーされていない) によると、TRISC6-7 は正しく設定することが重要なビットのようです。その投稿が示唆するようにこれらを設定しました(6低、7高)。

役立つ場合は、いくつかのコード スニペットを共有できます。

2.) 受信バイトごとに ISR がトリガーしない:

USART1 と 2 の両方で UART RX 割り込みをオンにしています。正しいボー レートで USART1 に話しかけていないので、周辺機器からの応答がありません。しかし、USART2 では 14,400 ボーで話しており、周辺機器は適切に応答しています (スコープで検証済み)。スコープを使用すると、受信すると予想される 16 バイトすべてを確認でき、タイミングは回線上で良好に見えます。ただし、このポートの RX 割り込みは、最初の 2 または 3 バイトに対してのみトリガーされます。周辺機器が何を応答しているかを知るには、8 バイトを連続して受信する必要があります... しかし、2 バイトまたは 3 バイトを超えることはありません。

したがって、割り込みはトリガーされますが、すべてのバイトではありません。

次の着信バイトの割り込みを見逃さないように、ISR をかなり短くしておく必要があることはわかっていますが、ISR をそのコア機能 (デバッグ出力の削除など) だけに分解しても、まだ表示されているだけです。最初の 3 バイト。スコープ上では、最初の 3 バイトと残りのバイトの間に違いはありません (少なくともビット タイミングでは)。最初の 3 バイトの値は、常に 0xFF です (これは予期されることです)。残りのバイトは異なる値ですが、それが私が見ることができる唯一の違いであり、ISR トリガーがない理由を実際には説明していません。上記の他の質問へのリンクは、確か​​にこの問題にも関連しているようです。しかし、ISR は常にトリガーしているわけではありません。

あなたが提供できる助けや洞察は大歓迎です。クライアントに再確認して、コードスニペットをさらに追加できるようにします.

4

0 に答える 0