The AVR Microcontroller and Embedded Systems Using Assembly and C

I2C / 静電容量式近接 & タッチセンサーAdafruit MPR121 / まとめ

pp.614ff. コードを整理して終わる。 https://github.com/ti-nspire/MPR121_library_for_ATmega328P ―――――――――――――――――――――――― これでThe AVR Microcontroller and Embedded Systems Using Assembly and C: Using Arduino Uno and Atmel Studioは終わりにす…

I2C / 静電容量式近接 & タッチセンサーAdafruit MPR121 / ベースラインフィルターの設定

pp.614ff. あと残っているのはベースラインフィルターのパラメーターだけである。アプリケーションノートAN3891を読んで意味はわかったが、具体的にいくつに設定すればよいのかわからない。わかったのは、FDLについてはfalling時を相対的に遅く(値を大きく)…

I2C / 静電容量式近接 & タッチセンサーAdafruit MPR121 / GPIOを使う / PWM波を生成する

pp.614ff. なぜかデータシートに記述はないが、アプリケーションノートAN3894にはPWMがらみのレジスタが掲載されている。デューティの可変範囲は1/16~15/16、PWM周期は8 ms (=1 / (32 kHz / 256))である。下のプログラムは0/16~16/16の範囲でデューティが…

I2C / 静電容量式近接 & タッチセンサーAdafruit MPR121 / GPIOを使う / LEDドライバー

pp.614ff. 今度はGPIO機能を試してみる。普通のCMOSロジック入出力だけでなく、入力時は、内部プルアップ、内部プルダウンができ、出力時は、ハイサイドのみオープンドレイン(LEDドライバー用、要するにソース専用)、ローサイドのみオープンドレイン(要する…

I2C / 静電容量式近接 & タッチセンサーAdafruit MPR121 / 自動(再)コンフィギュレーションを実行する

pp.614ff. 今度は自動(再)コンフィギュレーションを実行してみる。 充放電電流設定値CDCがグローバルデフォルト値から大きくずれて、ベースライン値が初期値とはだいぶ違う値になった。下の実行例ではターゲットレベルを181 (左に2ビットシフトすると724)に…

I2C / 静電容量式近接 & タッチセンサーAdafruit MPR121 / 各チャンネルの充放電電流 & 時間の設定値を見る

pp.614ff. 今度は、チャンネルごとの充放電電流設定値、充放電時間設定値を見てみる。まだ何も設定していないのでどちらも全部0である。したがってグローバル設定値が使われる。 #define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> #include "USARTClass.h" #incl</avr/interrupt.h></avr/io.h>…

I2C / 静電容量式近接 & タッチセンサーAdafruit MPR121 / フィルターのサンプリング回数、充放電電流 & 時間の全体設定、サンプリング間隔を見る

pp.614ff. 今度は、フィルターのサンプリング回数、充放電電流&時間の全体設定、サンプリング間隔を見てみる。書き換えも可能だがここではしない。 CDTの計算: 2^(n-2) = (2^n) * 2^(-2) = (2^n) / (2^2) = (2^n) / 4 = (1 << n) >> 2 10倍する場合: 10 * 2^…

I2C / 静電容量式近接 & タッチセンサーAdafruit MPR121 / ディバウンス回数を設定する

pp.614ff. 前回はヒステリシス特性を持たせてディバウンスしたが、ディバウンス回数そのものも0~7回の範囲で設定できる。 #define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> #include "USARTClass.h" #include "MPR121Class.h" MPR121Class pad(0x5A); // (I2C</avr/interrupt.h></avr/io.h>…

I2C / 静電容量式近接 & タッチセンサーAdafruit MPR121 / タッチ & リリース閾値を設定する

pp.614ff. タッチ閾値およびリリース閾値を設定してみる。タッチ閾値のほうをリリース閾値よりも大きくするとヒステリシス特性が得られるためディバウンスの効果がある。ここではチャンネル3だけ、タッチ閾値およびリリース閾値を設定してみた。 #define F_C…

I2C / 静電容量式近接 & タッチセンサーAdafruit MPR121 / ベースライン値を見てみる

pp.614ff. 今、チャンネル3にタッチする、リリースする、を繰り返している。 タッチかリリースかは、電極データとベースライン値との比較によって判定される。電極データのほうが小さければタッチであり、電極データのほうが大きければリリースである。ベー…

I2C / 静電容量式近接 & タッチセンサーAdafruit MPR121 / フィルター処理されたデータを見てみる

pp.614ff. フィルター処理された電極データを見てみる。データシートには「各チャンネルで測定された電圧値であり、当のチャンネルの静電容量に反比例します」とある。タッチすると、静電容量が増えて、電圧が下がる。 今、チャンネル3にタッチする、リリー…

I2C / 静電容量式近接 & タッチセンサーAdafruit MPR121 / タッチセンサーとして使う

pp.614ff.(ただしテキストとはほぼ無関係) 参考: http://ww1.microchip.com/downloads/en/DeviceDoc/AN2934-Capacitive-Touch-Sensor-Design-Guide-00002934A.pdf http://ww1.microchip.com/downloads/jp/AppNotes/01250A_JP.pdf パラメーターがたくさんあっ…

I2C / 静電容量式近接 & タッチセンサーAdafruit MPR121 / 動作確認

pp.614ff. テキストはI2C接続のリアルタイムクロックを試しているが、この組み合わせはAVR Programming: Learning to Write Software for Hardware カテゴリーの記事一覧 -のときにさんざんやったので、ここではAdafruit MPR121 静電容量センサ(12ch) - スイ…

I2C / SCL周波数を設定する

データシートによればSCL周波数はTWBR[7:0]、TWSR[1:0] (= TWPS)の各レジスタ値から次式で求まる。 SCL_freq == F_CPU / (16 + 2 * TWBR * 4^TWPS) TWBRは0~255、TWPSは0~3。 この式をTWBRについて解くと次のように変形できる。 TWBR == F_CPU / (2 * SCL_…

I2C / スレーブモードのときのプログラミング手順

pp.608-609 非公式訳 スレーブモードのときは、I2Cの初期化とデータの送受信とができなければなりません。STARTコンディションもSTOPコンディションも送信できません。スレーブデバイスはバスをlistenしながら、マスターデバイス、general callのどちらかに…

I2C / ビットレートジェネレーターユニット

ATmega328Pデータシート非公式訳 22.5.2 ビットレートジェネレーターユニット このユニットでマスターモード時のSCL周期を制御します。SCL周期は、TWI Bit Rate Register (TWBR)の設定と、TWI Status Register (TWSR)のPrescalerビットとで制御します。スレ…

I2C / マスターモードのときのプログラミング手順

pp.602-603 非公式訳 マスターモードのときは、I2Cの初期化、STARTコンディションの送信、データの送信(または受信)、STOPコンディションの送信ができなければなりません。それぞれについてもう少し詳しく説明します。 初期化する I2Cモジュールをマスターモ…

I2C / arbitration (調停)

p.596 非公式訳 I2Cプロトコルでは、同じバスに複数のマスターが存在できます。ただし複数のマスターが同時にバスを使えるわけではありません。各マスターは、現在のデータ転送が終わるのを待ってからバスの使用を開始します。しかし複数のマスターがほぼ同…

I2C / クロックストレッチ

p.596 非公式訳 I2Cプロトコルの機能の1つにクロックストレッチ(clock stretching)があります。一種のフロー制御です。アドレス指定されたスレーブは、データを処理する余裕のないときには、何らかのデータビットを受信(または送信)したあと、クロックライン…

I2C / general callアドレス0b0000 000_

p.594 非公式訳 前に述べたように、アドレス0b0000 000_はgeneral callのためのアドレスです。マスターがアドレス0b0000 000_を送信すると、すべてのスレーブはSDAラインをゼロにし、データバイトが送られてくるのを待ちます。これは、マスターからすべての…

SPI / 雷センサーAS3935 / 雷を待つ

プログラムを用意しておいて、あとはひたすら雷の発生を待つ。 https://github.com/ti-nspire/AVR/tree/master/AS3935%232/test_C #define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include "USARTClass.h" #include "AS3935SPI_Class.h" AS3935SPI_</avr/interrupt.h></util/delay.h></avr/io.h>…

SPI / 雷センサーAS3935 / 内蔵発振器を較正する

システム用としてSRCO (ノミナル1.1 MHz)、タイマー用としてTRCO (ノミナル32.768 kHz)の2つのRC発振器が内蔵されている。この2つの発振器を較正する。 注意点: アンテナの共振周波数を調整してから実行することが望ましい。 電源をオフにしたあとは毎回較正…

SPI / 雷センサーAS3935 / アンテナの共振周波数を調整する

INT (IRQ)端子からはアンテナの共振周波数が出力できる。この周波数は500 kHzでなければならない。今、LCO_FDIVはデフォルトの16分周に設定してあるので、500 kHz / 16 = 31.25 kHzになるようTUN_CAPを調整する。 これがTUN_CAP == 0 (0 pF)のとき: これがTU…

SPI / 雷センサーAS3935 / ライブラリー化 / 動作確認

すべてのレジスタに楽に触れるようライブラリーにした。もう一度チャッカマンで動作確認をする。 #define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include "USARTClass.h" #include "AS3935SPI_Class.h" AS3935SPI_Class lightning("PB2"); // 雷セ</avr/interrupt.h></util/delay.h></avr/io.h>…

SPI / 雷センサーAS3935 / 動作確認

pp.563ff. テキストは、SPI接続のLEDドライバーMAX7221で7セグLEDを駆動しているが、ここでは雷センサーAS3935を試す。SparkFun社製ブレークアウトボードを使う。 SparkFun社製ブレークアウトボード (接続図)の注意点: SPI専用。 内蔵レギュレーターは未使用…

タイマー1 / Phase and Frequency Correct PWMモード

参考: データシート 16.9.4 Phase Correct PWM Mode 16.9.5 Phase and Frequency Correct PWM Mode Phase Correct PWMモードとPhase and Frequency Correct PWMモードとの主な違いは、OCR1xレジスタがOCR1xバッファレジスタによって更新されるタイミングであ…

タイマー0 / Phase Correct PWMモード / Waveform Generationモード1

pp.529-530 non-invertingモードでのデューティは(コンペア値)×2/(255×2) = (コンペア値)/255。だからFast PWMと違ってデューティ0%にできる(invertingモード時もデューティ100%にできる)。オーバーフローフラグは、昇って降りてBOTTOM時に立つ。 ; スタック…

タイマー0 / Fast PWMモード / Waveform Generationモード7

pp.522-524 今度はWaveform Generationモード7を試してみる。TOP値をOCR0Aで指定する。したがってWaveform Generator Aは使えなくなる。 ; スタックポインタの初期化マクロ .MACRO INITSTACK LDI R20, HIGH(RAMEND) OUT SPH, R20 LDI R20, LOW(RAMEND) OUT S…

タイマー0 / Fast PWMモード / Waveform Generationモード3

pp.522-524 ; スタックポインタの初期化マクロ .MACRO INITSTACK LDI R20, HIGH(RAMEND) OUT SPH, R20 LDI R20, LOW(RAMEND) OUT SPL, R20 .ENDMACRO INITSTACK ; PD6 (OC0A), PD5 (OC0B)からPWM波を出力する。 LDI R20, (1 << PD6) | (1 << PD5) OUT DDRD, …

アナログコンパレーター / 実際に使ってみる

アナログコンパレーターについては、本書も含めて手持ちの図書には詳しい説明がなく、データシートを読むしかない。 ここでは、ADCペリフェラル / 読み取るチャンネルを切り換える -と同じようなことをアナログコンパレーターで再現してみる。2値の比較だけ…