タグ付けされた質問 「attiny」

ATtinyはAtmelの小型、低電力8ビットRISCマイクロコントローラーのファミリーです。一般的に、より小さなArduinoプロトタイピングプラットフォームボードとプロジェクトで見られます。

2
ブートローダーの書き込み後にATTiny85が機能しない
ATTiny85に問題があります。私はそれをプログラムするためにISPとしてArduinoを使用していることを言及しなければなりません。 クロック速度を1MHzから20MHzに上げる必要があると判断するまで、私のATTinyは問題なく機能したので、BoardsメニューからATTiny85を20MHzで選択し、Tools> Burn Bootloaderをクリックしました。しかし、今は私のATTinyがまったく機能しないため、それは愚かでした。スケッチをアップロードできず、試してみると次のメッセージが表示されます。 avrdude: Yikes! Invalid device signature. Double check connections and try again, or use -F to override this check. だからあなたへの私の質問は、私がしたことをリセットする方法はありますか?それとも、20MHzで動作させるには?

2
マイクロコントローラが損傷しているかどうかをどのように判断できますか?
私の「ジャンクパーツ」箱にいくつかのマイクロコントローラーが置かれています。それらのいくつかは、それらをプログラミングした後、奇妙な振る舞いを示したときに到着したと思います。それ以来、たとえば、コンパイラで誤った最適化を行うと、このような奇妙な動作がどのように引き起こされるかについて、多くのことを学びました。一方、一部のマイクロコントローラーは、静電気や許容電圧の範囲外などが原因で十分に損傷している可能性があります。したがって、正常に動作しているマイクロコントローラーもあると思います。 すべてを捨てる前に、私は疑問に思いました。マイクロコントローラーをテストして、それがまだ良いかどうかを判断する比較的簡単な方法はありますか? 特にマイクロは、DIPバージョンとSOICバージョンの両方であるAtmel ATTiny13、ATTiny26、およびATTiny2313です。

1
ループが離れて最適化されている間
マイクロコントローラープログラムに次のコードがあります。 // Wait for ADC conversion to complete while ( ( ADCSRA && _BS( ADSC ) ) == _BS( ADSC ) ) {} ADCSRAは、アナログ変換が完了するとその値を変更するレジスタであり、ビットがクリアされるのを待ちたい場所です。このビットは、変換が完了したことを示します。 結果のアセンブリコードを見ると、ループ全体が1つの命令に置き換えられています。 in r24, 0x06 ; ADCSRA レジスタは読み込まれますが、その値はテストされていません!? プログラムを不必要に遅延させることなく、レジスターを再チェックし続けるようコンパイラーに指示するには、C ++コードをどのように変更する必要がありますか? 私はavr-gccツールチェーンを使用しています。 編集: 私は次のようにコードを変更しました(Thnx:lhballoti): while ( ( ADCSRA & _BS( ADSC ) ) == _BS( ADSC ) ) …

1
実行中にATmegaまたはATtinyデバイスの署名を読み取ることはできますか?
ATtinyまたはATmegaをプログラミングする間、avrdudeはデバイス署名を出力します、この例ではそれはATtinyです。 avrdude: Device signature = 0x1e910a C ++コード(avr-gcc)を使用して、実行中のデバイスでこの署名を読み取ることはできますか?ATmega1280については、それについて書く29.6.10の章がありますが、C ++でそれをコード化する方法に少し戸惑っています。 デバイスがデバイスIDを制御PCに送り返して、PCがそれを決定できるようにしたいと考えています。
8 arduino  atmega  linux  attiny  c++ 

7
MCUを使用した0〜1MHz(0.25Hz分解能)方形波の測定
0から1MHzの範囲で変化し、0.25Hzの分解能を持つ方形波の周波数を測定する必要があります。 私はまだどのコントローラーを決定していませんが、それはおそらく20ピンAttinyの1つでしょう。 通常、より低い周波数の信号を測定する方法は、タイマーキャプチャモードで設定された2つのタイマーを使用して、外部信号の立ち上がりエッジで割り込みを行うように設定し、別のタイマーを毎秒割り込みするように設定することにより、前のタイマーは1秒後のレジスタ値をカウントします信号の周波数に等しくなります。 ただし、この方法は明らかに0.25Hzの解像度で0〜1MHzの範囲の信号をキャプチャするには機能しません。これには22ビットカウンターが必要です(AFAIK 8ビットマイクロには8/16ビットカウンターしかない)。 私が持っていたアイデアの1つは、信号をマイクロに適用する前に分割することでしたが、信号を61で除算する必要があるため、これは実際的ではなく、周波数は61秒ごとにしか更新できず、数秒ごとにしたい場合があります。 頻度を4秒ごとに更新できる別の方法はありますか? 更新: 最も簡単な解決策は、外部割り込みまたはタイマーキャプチャを使用して、信号の立ち上がりエッジで割り込みを行いisr、変数の型をインクリメントすることですlong int。4秒ごとに変数を読み取ります(0.25Hzまでの周波数を測定できるようにするため)。 アップデート2: JustJeffが指摘したように、8ビットMCUは1MHz信号に追いつくことができないため、すべての立ち上がりエッジで割り込みを中断し、long int... 私はtimororrが提案した方法を選びました。実装に取り​​掛かったら、投稿して結果を共有します。ご提案いただきありがとうございます。 経過報告: ここで紹介するアイデアのいくつかをテストし始めました。まず、vicatcuのコードを試しました。頻度の計算後にTCNT1がクリアされないという明らかな問題がありました-大したことではありません... 次に、コードをデバッグするときに、約2〜7回の頻度で計算されたタイマー1(外部イベントをカウントするように構成されたタイマー)のオーバーフローカウントが2だけ短いことに気付きました。これをタイマー0 ISRのレイテンシに置き、ifステートメントブロックをISRからメイン(以下のスニペットを参照)に移動して、ISRにフラグを設定することにしました。いくつかのデバッグは、最初の測定は問題ないが、その後の読み取りごとに、タイマー1のオーバーフローカウントが2を超えることを示しました。これは説明できません。 int main() { while(1) { if(global_task_timer_ms > 0 && (T0_overflow == 1)) { global_task_timer_ms--; T0_overflow = 0; } ..... } } 次に私はティムロスの提案を実装しようとすることを決めました。Atmega16の唯一の16ビットタイマーが外部信号の立ち上がりエッジをキャプチャするために使用されているため、必要な間隔(各timer_isr割り込みの間に約15ms)を生成するには、2つの8ビットタイマーをカスケードする必要があります。 オーバーヘッドのほとんどがタイマーにシフトされ、CPUが処理する短い残りが1つしかないため、このソリューションが機能し、はるかに効率的だと思いました。しかし、私が期待していたほど正確ではなかったため、測定値は約70Hzだけ前後にシフトしましたが、高周波数では問題にはなりませんが、低周波数では許容できません。私は問題の分析に多くの時間を費やしませんでしたが、2つの16ビットタイマーを備えた非常に遅い8051コントローラーにtimrorrsの提案と同様の構成を実装しており、結果は非常に正確だったため、タイマーのカスケード構成はそれほど正確ではないようです。 これでvicatcuの提案に戻りましたが、周波数計算をTimer 0 isr (下のスニペットを参照)に移動しました。このコードにより、一貫して適度に正確な測定が行われました。少しの校正で、精度は約+/- 10Hzになります。 ISR(TIMER0_OVF_vect) { TCNT0 = …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.