問題タブ [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.
arduino - Arduinoブートローダー
誰かがArduinoブートローダーがどのように機能するか説明できますか?私はここで高レベルの答えを探していません。コードを読んで、その要点を理解しました。
Arduino IDEとブートローダーコードの間で発生する一連のプロトコルの相互作用があり、最終的には、シリアルインターフェイスを介して送信されるプログラムでフラッシュを自己プログラムする多数のインラインアセンブリ命令が生成されます。
私がはっきりしていないのは270行目です。
...これは、関数ポインタの宣言およびNULLへの初期化として認識しています。ブートローダーがユーザーがロードしたコードの実行に委任することを目的とした場所で、app_startへの後続の呼び出しがあります。
確かに、app_start
これをすべてまとめるには、ある時点でNULL以外の値を取得する必要があります。ブートローダーのコードにそれが表示されていません...ブートローダーによってロードされるプログラムによって魔法のようにリンクされていますか?ブートローダーのメインは、チップのリセット後のソフトウェアへのエントリポイントであると思います。
70ほどのアセンブリ行にまとめられているのは、メインプログラムにapp_startが実際にどこにあるかを伝えるシークレットデコーダーリングである必要がありますか?それとも、Arduino IDEによって利用されている暗黙の知識ですか?私が知っているのは、誰かがapp_startを0以外の場所を指すように変更しない場合、ブートローダーコードはそれ自体で永久にスピンするだけだということです...それで、トリックは何ですか?
編集
ブートローダーコード用の個別のメモリスペースを持たないTinyAVRにブートローダーを移植することに興味があります。ブートローダーのコードが特定のヒューズ設定とチップサポートに依存していることが明らかになったので、私が本当に知りたいのは、それらのヒューズとハードウェアがないチップにブートローダーを移植するのに何が必要かということだと思います。サポート(ただし、セルフプログラミング機能はまだあります)?
c - C文字をバイナリとして読み取る
これは実際、私がavrを使用して取り組んでいるプロジェクトの一部です。私はtwiを介してDS1307リアルタイムクロックICとインターフェースしています。情報を一連の8文字として報告します。次の形式で返されます。
私がやりたいのは、時間の各部分を取り、それを少しずつ読んでいくことです。私はこれを行う方法を考えることができません。基本的に、ビットが1の場合はLEDを点灯しますが、0の場合は点灯しません。
ビットシフトによってそれを行うためのかなり簡単な方法があると思いますが、それを行うためのロジックに指を置くことはできません。
timer - タイマー割り込み内からのAVR長時間実行コード
2分ごとに実行する必要のあるコードがありますが、これは十分に単純なようです。問題は、タイマー内から長時間実行されるプロセスをトリガーすると、タイマーが不安定になるようです。助言がありますか。
私のCの知識はそれほど素晴らしいものではないので、いくつかの基本的なアイデアを手伝ってください。MCUはAtmelMega128Lです
長時間実行されるプロセスは、Telit GSMデバイスを介した(UART1を介した)http呼び出しです。これはそれ自体でうまく機能しますが、他のプロセスを監視する必要があるため、メインループから実行する必要があります。
c++ - AVRでは論理的な右シフトは2の累乗で速いですか?
2の累乗でシフトすると、論理的な右シフトの実行が速くなるかどうかを知りたいです。
たとえば、
より速く
皆さんの最初の反応は、このような小さなことについて心配する必要はないということです。正しいアルゴリズムとコレクションを使用して、重要な桁を削減していることを感謝します。私はあなたに完全に同意しますが、私は本当に組み込みチップ(ATMega328)からできる限りのことを絞り出そうとしています-私はちょうど「woohoo!」に値するパフォーマンスシフトを得ました。除算をビットシフトに置き換えることで、これが重要になることをお約束します。
microcontroller - デバイスプログラミングに興味があります。どこから始めれば
私はC++に対して優れたコマンドを持っていますが、デバイスプログラミングについては何もしていません。私はデジタルロジックデザインについていくつかの基本的な理解を持っています。しかし、私はエレクトロニクスの完全な初心者です。現在、マイクロコントローラプログラミングに大きな関心を持っています。
どこから始めれば ?
マイクロコントローラーでプログラムを実行するために、電子機器に関する膨大な知識は必要ないと思います。
Linuxを使用しています。そして私はKeilをダウンロードしました。Wineを介して実行しようとしたことはありません。私はそれをWindowsで実行しました。しかし、コードがどのように機能するかは私には完全には明らかではありません。LogicはCで書かれているように理解できますが、それでも私には霧のようです。
クイックキックスタートが必要です。
vb.net - AVRdude は、VB でオンザフライで HEX ファイルを暗号化/復号化します。
こんにちは、ATTiny チップ用の HEX コード ファイルを解読し、AVRDude コマンド ライン インターフェイスを使用してプログラミングしようとしています。問題は、ユーザーがいつでも HEX ファイルが何であるかを確認できないようにすることです。
VB.net 暗号化は、サーバーに配置する前に HEX ファイルを暗号化し、プログラムがサーバーからファイルをダウンロードした後に復号化し、復号化された HEX ファイルを表示せずにプログラムを実行できますか?
当然のことながら、HEX ファイルは ATTiny チップにプログラムされている間は暗号化されたままにできないので、ハード ディスクに一時ファイルを書き込むことを心配することなく、プログラム内でプログラムされる元の HEX ファイルを作成できるようにするにはどうすればよいでしょうか。ドライブしてから削除しますか?(その一時ファイルを実行した後にプログラムを閉じることができ、ナビゲートして開いてコードを見ることができるため)
どんな助けでも素晴らしいでしょう!:o)
デビッド
c - ダイレクトデジタルシンセシスにおける線形補間
私はCでマイクロコントローラーDDSプロジェクトに取り組んでおり、出力値を平滑化するために線形補間を計算する方法を理解するのに問題があります。現在のプログラムで
は、24ビットアキュムレータの上位8ビットを、8ビット出力値の配列へのインデックスとして使用しています。アキュムレータの中間バイトと下位バイトを取得し、配列の「前」と「次」の値の間に値を生成する関数を考え出す必要があります。これは高速ハードウェアでは十分に簡単ですが、マイクロコントローラーを使用しているので、浮動小数点演算や除算を行わないようにする必要があります。
これらの制限があるため、2つの8ビット入力番号と2つの入力値の間の「距離」を表すアキュムレータの下位2バイから8ビット補間値を取得する方法がわかりません。アドバイスをよろしくお願いします!
明確化
DDS=ダイレクトデジタルシンセシス
DDSでは、位相アキュムレータを使用してルックアップテーブルから波形が生成されます。位相アキュムレータには通常、整数成分と小数成分が含まれています。整数コンポーネントは、ルックアップテーブルへのインデックスとして使用されます。単純なDDS実装では、小数部分は無視されますが、高品質の出力では、小数コンポーネントを使用して、隣接するルックアップテーブル値間の補間(通常は線形補間)が行われます。上記の質問では、特定の分数fの2つのルックアップテーブル値間でこの線形補間を効率的に実行する方法を検討しています。ここで、は0 <= f < 1
です。
c - avr-gcc 3.4.0 と avr-gcc 4.3.x 間のバイナリ互換性
gcc3 でビルドされた可能性があるライブラリにリンクするアプリケーションを継承しました。または、imagecraft コンパイラを使用することもできます。その情報は天国のビットフィールドに消えてしまい、アプリをリンクするための libXXX.a ライブラリが残っています。libXXX.a を再コンパイルできません。これには、imagecraft や他の場所からの特定の不明なヘッダーが必要なためです。これは、ある時点で私の環境に遍在していた可能性がありますが、現在はどこにも見つかりません。
私の質問は、私のアプリを avr-gcc バージョン 3.4.0 (およびその「特別な」libXXX へのリンク) でコンパイルした結果、動作するバイナリ イメージが得られた場合、他のすべての部分をコンパイルできると期待するのは合理的ですか? avr-gcc 4 を使用した私のアプリ (このアクションには、いくつかの非常に優れた実証済みの利点があります)、libXXX とリンクしても、動作するプログラムを取得できますか?
基本的に、それはすべて次のように要約されます: avr-gcc バイナリは、「avr-gcc 3.something である可能性がある謎のコンパイラ X」と互換性がありますか?
正直なところ、アプリの残りの部分を avr-gcc4 でコンパイルしてライブラリにリンクし、結果が機能することを確認しましたが、どのような副作用や癖に気をつければよいでしょうか?
scons - SCons ターゲットとして avrdude コマンドを実行する
SCons から avrdude をターゲットに呼び出せるようにしたいです。たとえば、runningscons erase-device
はそのために avrdude コマンドを実行する必要があります。
avrdude を呼び出す Builder オブジェクトを作成し、それらを環境に追加することで、これを実行しようとしています。
このコードでは、scons は常に何もすることがないと言って終了します。env.EraseDevice()
これは、コードが示されている方法で、これらのビルダー (およびenv.WriteFuses()
)にソース ファイルを提供していないためだと思います。したがって、SCons は呼び出す必要がないと見なします。
ということで次にやってみました。私は既存のファイル名を 2 つの Builder に渡して、scons を満足させましたが、それは必要ありませんでした。ここでの問題は、avrdude を使用するscons write-fuses
、 、またはその他のターゲットを実行するかどうかに関係なく、scons がヒューズを書き込もうとしているかのように動作することです。scons erase-flash
たとえば、私が渡したファイル名がfoo.hexの場合、scons は「avrdude」がfoowrite-fuses
という出力ファイルを生成するはずだったと考えているため、毎回ターゲットを実行する必要があると考えていますが、そのファイルは生成されることはありません。
また、これを行うということは、デバイスを消去したりヒューズ ビットをプログラムしたりする前に、16 進ファイルをビルドする必要があることを意味しますが、これは通常は必要ありません。
入力用のソースを必要とせず、出力を生成しないターゲットを SCons で作成するにはどうすればよいですか?
ありがとう!
c - タイマーのヘルプが必要
過去2週間、タイマーと割り込みを学び、ATMEGA2560のLEDを点滅させるプログラムを(私の理解で)書き込もうとしていますが、何をしてもTCNT0がインクリメントされず、ISR()関数が呼び出されることはありません。どこが間違っているのか、どうすれば修正できますか? これが私のコードです: