問題タブ [avr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++関数でプリミティブデータ型を渡すためのベストプラクティス
バイトストリームをプリミティブ型に逆シリアル化するavrチップ用の関数を書いています。できるだけ一般的な方法でそれを実行したいと思いますが、逆シリアル化するタイプを決定するためのベストプラクティスは何であるか疑問に思いました。私がこれまでに持っているアイデアには、次のものがあります。
選択肢A:
選択肢B:
選択肢C:
選択肢D:
これを行うための最良の方法に関するアイデアはありますか?おそらく私が見落としていたより簡単な方法。
c++ - 倍精度型のないCコンパイラで倍精度IEEE浮動小数点を解析します
私は8ビットAVRチップを使用しています。64ビットdoubleのデータ型はありません(doubleは32ビットfloatにマップされるだけです)。ただし、シリアルで64ビットのdoubleを受信するため、シリアルで64ビットのdoubleを出力する必要があります。
64ビットのdoubleを32ビットのfloatに変換し、キャストせずに元に戻すにはどうすればよいですか?32ビットと64ビットの両方の形式はIEEE754に準拠します。もちろん、32ビット浮動小数点に変換すると精度が低下すると思います。
64ビットから32ビットのfloatに変換するために、私はこれを試しています:
1.0や2.0のような数値の場合、上記は機能しますが、1.1を64ビットのdoubleとして渡すことでテストした場合、出力は少しずれていました(文字通り、しゃれではありません!)。私のテスト。見る:
c - Cプログラム(AVR)でアセンブリISRを作成するにはどうすればよいですか?
私の他の質問に続いて、このC(AVR)コードの最適化を支援しますか?:)、私は自分のCプログラム内のアセンブリでISRを実装する方法の仕組みを本当に知らないことに気づきました。グーグルで検索しましたが、あまり便利なものは見つかりませんでした。
基本的に、Cプロジェクトで他のすべて(割り込みを発生させるためのレジスタを含む)を設定したいのですが、自分が書いたアセンブリコードを割り込みで実行したいのです。
それが助けになるなら、私はWindows上でAVRスタジオ6を使用しています。ファイルを使う必要があると言われましたが.s
、それ以外はどうしたらいいのかよくわかりません。基本的な構造は次のとおりですか?
TIMER1_COMPA_vect割り込みが発生したときにアセンブリを実行したい場合(これはCでのISRの名前です)。それとも私は完全に軌道に乗っていないのですか?私がする必要があることの基本的なテンプレートは何ですか?または、それがばかげた質問である場合、私がより多くの情報を見つけることができるリンクはありますか?
timer - 1つのピンだけでArduino16ビットPWMを使用できますか?
Arduino Duemilanoveがあり、内部16ビットタイマーを使用して、ピン10ではなくピン9でPWMを実行します(プロジェクトには、ピン10を使用する必要があるWifiシールドがあります)。
ピン9で信号を送信するが、ピン10には触れないようにタイマーを設定することは可能ですか?
c - avrアセンブリの配列へのポインタによる配列へのアクセス
CとASMを組み合わせてAVRマイクロコントローラーをプログラミングしていますが、少し問題があります。
Cコードに次のコードがあります。
(amplitudes32 / 64は基本的にルックアップテーブルです)
また、振幅を振幅32に等しくしたい場合もあれば、振幅64に等しくしたい場合もあります。
私は行くことによってこれをやっています
amplitudes = amplitudes32;
私のcコードで。
次に、ASM割り込みルーチンで、次のように配列のアドレスを読み込みます。
次に、特定のポートへの特定のインデックスにある配列の値を取得するために、さらにいくつかの命令を実行します。ただし、出力を確認すると、正しく機能しておらず、予期しないものが表示されます。配列が何で構成されていても同じことがamplitudes
わかります。すべてゼロの配列を指している場合でも同じです。
アセンブリコードをに変更した場合
その後、期待どおりに動作します。しかし、私が言ったように、私は異なる時間に異なるルックアップテーブルを持っている必要があり、速度の問題のために割り込みルーチン内でその決定を下すことができないので、配列「変数」を持つことができればいいでしょう割り込みが使用するCコードを変更する可能性があります。
私は何が間違っているのですか?
c - このコードを説明してください
誰でもこのコードを説明できますか?
avr - USART受信用にFreeRTOSで新しいタスクを作成する
AVRプロジェクトの開発IDEとしてAVRStudio5でEVK1105開発ボードを使用しています。FreeRTOSを使用しています。このボードには3つのUSARTポートがあります。1つの外部モジュールがUSART-RS232モードを介してAVR32ボードに接続されています。それは、19230ボーレート、7データビット、奇数パリティ、ストップビット1、および通常チャネルモードでUSART0上のボードに連続シリアルデータを送信します。この目的のために新しいタスクを作成しました。9データバイトごとに、「\n」と「\r」を送信します。そのため、私のタスクでは、文字列バッファに9データバイトを収集し続け、それをUSART1で送信します。受信ポートであるUSAR0からデータを収集するためにポーリング方式を使用しています。しかし、私はデータの受信で問題に直面しています。タイミングの問題なのか、データ収集中にスケジューラーがタスクを切り替えるのかわかりません。しかし、必要なデータが得られません。
トラブルシューティングとしてすでに確認したことは次のとおりです。1。外部モジュールをPCハイパーターミナルに接続すると、完璧な結果が得られます。2. USART0からの受信を使用するのと同じことを実装し、受信したものはすべてFreeRTOSを使用しない場合と同じようにUSART1に送信されます。それはうまくいきます。
何が間違っているのか考えてみてください。キューを使用してTxタスクとRxタスクの間で通信し、USART0からUSART1に文字列バッファを渡します。キューの処理に問題がありますか?キューのトラブルシューティングを行うにはどうすればよいですか?
RxTaskの無限タスクループで50msの遅延を使用しています。問題が発生する可能性はありますか?遅延を使用しないと、OSがクラッシュします。タイミングの問題が発生しないように、FreeRTOSで新しいタスクを作成するためのいくつかの良い方法を提案してください。
c++ - AVR-割り込みベクトルとグローバル変数
私はATmega32を使用して32msごとに割り込みをかけ、任意の処理を行っていますが、これは今のところそれほど重要ではありません。
私はtimer0のタイマーオーバーフローを使用して割り込みを行っています。これは予測どおりに完全に機能します。
私の問題は、グローバル変数があることです。
volatile int isSampling;
それは割り込みベクタに書き込まれていません。volatile
コンパイラの最適化の可能性を排除するために整数が必要であると読みましたが、それを宣言しましたがvolatile
、まだ機能していません。
問題の原因となっている問題のあるコードを見つけましたが、なぜそれが原因であるのかわかりません。メインのwhileループから削除するloadValue(studentID[i])
と、コードは予測どおりに機能します。しかし、私がそれを元に戻すと、それは再び壊れます。
arm - Atmega と ARM UART 接続。奇妙な振る舞い
ですから、AVR だけに関係のない複雑な問題ですが、その問題は Atmega にあると思います。
uClinux で動作する ARM NUC745 ベースの FOSCAM WI-FI カメラを持っています。そのカメラには、私の Atmega ボードに接続されている UART ポートがあります。ARM ボードの UART がコンソールの出力と入力に使用されるのと同時に。
カメラが提供する Web インターフェイスを介してコマンドを送信できます。このコマンドは、UART を介して ARM ボードを介して Atmega ボードに送信されます。
Atmega が ARM から UART に送られるデータを読み取るためのプログラムを作成しました。そして、すべてのデータは Atmega によって受信されるようです。受信したデータに関して、Atmega は UART を介して Atmega から ARM ボードにデータを送信しました。VMLAB では、オシロスコープにデータが出ていることがわかります。しかし、ARM ボードはそのデータを受信しません。Atmega ボードを ARM ボードから切り離し、ARM ボードを iMac の端末に接続すると、Atmega から送信されたすべてのデータが端末にすばやく表示され、ARM ボード用に作成したプログラムがすべてのデータを受信します。
かなり奇妙な行動です。ターミナル接続と Atmega シリアル接続が異なるようで、その理由がわかりません:(((
申し訳ありませんが、コードを適切にフォーマットできませんでした
これがAtmegaのコードです
そしてARM Linux用のコード
誰かがこれで私を助けてくれますか