AVR Programming: Learning to Write Software for Hardware

Atmel Stuidoからターゲット(書き込みデバイスのCOMポート)を削除する方法

[Tools]メニュー → [Add target...]で追加したターゲット(書き込みデバイスのCOMポート)を削除するときは: [View]メニュー → [Available Atmel Tools]の順に選択すると、[Available Tools]ペインが表示されるので、その中から不要なエントリを削除する。 ―――…

ヴィジュネル暗号

pp.437-438 これでAVR Programming: Learning to Write Software for Hardware (Make: Technology on Your Time)は終わりにする。 アルファベットだけでなくスペース(0x20)からチルダ(0x7E)までを使うことにする。テキストはエンコードとデコードとで函数を…

内蔵EEPROM / EEMEMマクロでアドレスの管理を簡易化する

pp.425ff. EEMEMマクロを使えばアドレスではなく変数名で管理できる。 宣言の順番と逆順にメモリーが確保されている。 #include <avr/io.h> #include <avr/eeprom.h> #include "USART.h" const char STR[] = "It started with a trivial-seeming observation."; const int lenOfSTR =</avr/eeprom.h></avr/io.h>…

内蔵EEPROMから何かを読み出す

pp.421ff. #include <avr/io.h> #include <avr/eeprom.h> #include "USART.h" int main(){ initUSART(); eeprom_update_byte((uint8_t *)0, 9); // [0]番地に0d9を書き込む。 eeprom_update_word((uint16_t *)1, 0xabcd); // [1]~[2]番地に0xabcdを書き込む。 char str[] = "The wor</avr/eeprom.h></avr/io.h>…

内蔵EEPROMに何かを書き込む

pp.415ff. //#include <avr/io.h> #include <avr/eeprom.h> int main(){ eeprom_update_byte((uint8_t *)0, 9); // [0]番地に0d9を書き込む。 eeprom_update_word((uint16_t *)1, 0xabcd); // [1]~[2]番地に0xabcdを書き込む。 char str[] = "The work of telegraph offices, especi</avr/eeprom.h></avr/io.h>…

しゃべる何か / .wavファイルを2ビットDPCM化する

pp.410-413 テキストには、.wavファイルを2ビットDPCM化するためのPython2スクリプトが掲載してある。そのままだとPython3では動かない。ここではLabVIEWで作ってみる。テキストと同じく、複数の.wavファイルからヘッダーファイルを生成するところまで一気に…

しゃべる何か / 2ビットDPCMデータを鳴らす

pp.396ff. 著者の用意した2ビットDPCMデータを復調し、PWMによるDDSで鳴らしてみる。2ビットDPCMデータはPROGMEMに保存しておく。 タイマー0をfast PWMモードにしてDPCM値に応じてデューティを順次変化させる、という処理をタイマー2の割り込みのタイミング…

PROGMEMに格納する排列の処理パターン

pp.400-401 複数の排列をPROGMEMに格納する。各排列の先頭アドレス(ポインタ)も別の排列にしてPROGMEMに格納する。この方法だと、[i]番目の排列という形で目的の排列へアクセスできる。 https://github.com/ti-nspire/AVR/tree/master/PROGMEM_demo #define …

定数データをプログラム領域(フラッシュメモリー)に書き込む、読み出す / 続き

pp.381ff. avr/pgmspace.hをインクルードする。 変数をconst修飾する。変数の右側にPROGMEMをつける。 pgm_read_byte()、pgm_read_word()の引数はアドレス(ポインタ)。 #define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/pgmspace.h> #include "USART.h" // 文字列</avr/pgmspace.h></util/delay.h></avr/io.h>…

定数データをプログラム領域(フラッシュメモリー)に書き込む、読み出す

pp.381ff. avr/pgmspace.hライブラリーを使う。定数データをフラッシュメモリーへ書き込むときはPROGMEMマクロを、そのデータを読み出すときはpgm_read_byte()、pgm_read_word()を使う。 const 型 変数名 PROGMEM = 値;と記述すると、値はRAMには格納されず…

開発環境の入れ換え / Atmel StudioとPololu USB AVR Programmerと

これまでは開発環境にArduino IDEを、ライターにUnoを使ってきたが、ここからは開発環境にAtmel Studioを、ライターにPololu USB AVRプログラマ v2.1 - スイッチサイエンスを使う。 手始めに工場出荷状態のATmega 328PでLチカを試す。Fuse Low ByteのCKDIV8…

Pololu USB AVR Programmer v2.1ユーザーズガイド非公式訳

原文: https://www.pololu.com/docs/pdf/0J67/pololu_usb_avr_programmer_v2.pdf Pololu USB AVR Programmer v2.1ユーザーズガイド非公式訳:

AVRのI2CとSPI / 温度センサーLM75BD、EEPROM、リアルタイムクロックDS3231によるデータロガー / 一定の秒数ごとにロギングする

「AVRのI2CとSPI / 温度センサーLM75BD、EEPROM、リアルタイムクロックDS3231によるデータロガー / アラーム割り込みのタイミングでロギングする -」ではDS3231のアラーム1を利用して任意のタイミングで日時と温度とを取得したが、今度はもっとこまかい周期…

外部クロックをタイマー1でカウントする

DS3231から出力する1Hzの方形波をタイマー1でカウントし、カウント数に応じて一定周期で何かをする。 #include <avr/io.h> #include <util/delay.h> #include "DS3231.h" #include "USART.h" volatile uint8_t periodElapsed = 0; ISR(TIMER1_OVF_vect){ periodElapsed = 1; } void i</util/delay.h></avr/io.h>…

AVRのI2CとSPI / 温度センサーLM75BD、EEPROM、リアルタイムクロックDS3231によるデータロガー / アラーム割り込みのタイミングでロギングする

以下のいずれかのタイミングでロギングするのであれば、DS3231のINT信号でAVRへ外部割り込み(またはピン変化割り込み)をかけてロギングルーチンを実行するのが簡単でよい。AVRの内蔵タイマーでも同じことはできるが、超長時間タイマーを作るのは面倒である。…

AVRのI2Cモジュール / リアルタイムクロックDS3231 / アラームを使う / 割り込み用の信号をピン変化割り込み(PCINTx)で検知する

今度はピン変化割り込み(PCINTx)で割り込む。前回の外部割り込み(INTx)とほとんど同じである。前回と同じく割り込みサービスルーチンは割り込み発生を受けてフラグを立てるだけにする。 #include <avr/io.h> #include <util/delay.h> #include "USART.h" #include "myI2Cv2.h" #inclu</util/delay.h></avr/io.h>…

AVRのI2Cモジュール / リアルタイムクロックDS3231 / アラームを使う / 割り込み用の信号を外部割り込み(INTx)で検知する

Arduino実験キットで楽ちんマイコン開発 (マイコン活用シリーズ), p.183 割り込み処理を軽くするために,外的要因の発生だけ割り込み処理で検知して,それに伴う処理は定常処理で行うという方法がよく使われます.〈略〉具体的には、割り込み処理でソフトウ…

AVRのI2Cモジュール / リアルタイムクロックDS3231 / アラームを使う / 割り込み用の信号をポーリングで監視する

前回はアラームフラグをI2C経由でポーリングしたが、今度はINT/SQW端子から出る信号そのものをAVRのPD2端子でポーリングする。INT/SQW端子はどちらのアラームも共通なので、どちらのアラームが発動したのかを知るためには結局アラームフラグも見なければなら…

AVRのI2Cモジュール / リアルタイムクロックDS3231 / アラームを使う / アラームフラグをポーリングで監視する

DS3231にはアラームが2系統ある。どちらかのアラームが発動すると、INT/SQW端子がローになる。 アラーム1は「毎秒(正秒)」「1分間に1回(秒で指定)」「1時間に1回(分、秒で指定)」「いち日に1回(時、分、秒で指定)」「ひと月に1回(日、時、分、秒で指定)」「1…

AVRのI2Cモジュール / リアルタイムクロックDS3231 / 内部温度を見てみる

DS3231には、内蔵クリスタルを温度補償するための温度センサー(10ビット分解能)が内蔵されている。その温度を見てみる。値は64秒ごとに更新される。 #include <avr/io.h> #include <util/delay.h> #include "USART.h" #include "myI2Cv2.h" #include "DS3231.h" int main(){ initUSAR</util/delay.h></avr/io.h>…

AVRのI2Cモジュール / リアルタイムクロックDS3231 / 方形波出力を見てみる

DS3231のINT/SQW端子からは、1Hz、1024Hz、4096Hz、8192Hzのいずれかの方形波が出力できる。 INTCNビットが0のとき、INT/SQW端子から方形波が出力される。 #include <avr/io.h> #include <util/delay.h> #include "USART.h" #include "myI2Cv2.h" #include "DS3231.h" int main(){ in</util/delay.h></avr/io.h>…

AVRのI2Cモジュール / リアルタイムクロックDS3231 / 32.768kHz出力を見てみる

DS3231の32kHz端子からは32.768kHz (= 215)のパルスが出せる。假にこのパルスを16ビットカウンターでカウントしたとすると、その最上位ビットが1になったときが1秒である。 #include <avr/io.h> #include <util/delay.h> #include "USART.h" #include "myI2Cv2.h" #include "DS3231.h</util/delay.h></avr/io.h>…

AVRのI2Cモジュール / リアルタイムクロックDS3231 / 時刻を設定して読み出す

参考: マイコンにプラス! シリアル拡張IC サンプルブック[基板付き] (トライアルシリーズ), pp.153ff. I2Cの章は前回で終わったがもう少し続ける。今度はリアルタイムクロックDS3231を使ってみる。時計として使うだけなら00h-06h番地の全7バイトを読み書きす…

AVRのI2CとSPI / 温度センサーLM75BDとEEPROMとによるデータロガー / ちゃんとしたデータロガーにする

pp.361ff. 今度はテキストを参考にメニューを追加するなどしてもっとちゃんとしたデータロガーにしてみる。これでChapter 17 I2Cはおおむね終わりである。 一度中断してもまたデータロギングが再開できるよう下のようにしておく。 EEPROMの0~1H番地に、次に…

AVRのI2CとSPI / 温度センサーLM75BDとEEPROMとによるデータロガー / データを取得してEEPROMに書き込む

pp.361ff. LM75 (I2C)で取得した温度データをEEPROM (SPI)に記録してみる。1秒おきにデータを取得してEEPROMに書き込む、という処理を何回か繰り返したあと、書き込んだ値を一気に全部読み出す。結局ここではUSART、SPI、I2Cという3種類のシリアル通信を一度…

AVRのI2Cモジュール / 温度センサーLM75BD / ライブラリー化

pp.361ff. (ほかにマイコンにプラス! シリアル拡張IC サンプルブック[基板付き] (トライアルシリーズ), pp.115ff.) 同じI2Cバスに温度センサーを4つぶら下げて動作確認をする。I2Cライブラリーは、テキストのサンプルをもとにクラス化した。 ▶LM75サンプルフ…

AVRのI2Cモジュール / 温度センサーLM75BD / I2Cでとにかくデータを読み出してみる

pp.361ff. (ほかにマイコンにプラス! シリアル拡張IC サンプルブック[基板付き] (トライアルシリーズ), pp.115ff.) LM75のOS端子はOvertemperature Shutdown output (オープンドレイン)。 ↑ Wはwrite、Sはrepeated start、Rはread、aはacknowledge、~aはnot …

AVRのSPIモジュール / ディジタルポテンショメーターAD8402ARZ50 / ライブラリー化

pp.339ff. これもライブラリーにしておく。MISOがなく、しかもチャンネルとワイパーの位置とを指定するだけなのでシンプルきわまりない。 ワイパーの位置は電源オン時は不定である。!RS (リセット)信号をアサートした直後は中間位置(0x80, 0d128)に来る。 こ…

AVRのSPIモジュール / ディジタルポテンショメーターAD8402ARZ50

p.339ff. 今度は、SPIで何かを書き込んでみる / ディジタルポテンショメーターAD8402ARZ50を制御する -(LabVIEW版)で使ったディジタルポテンショメーターAD8402ARZ50をAVRのSPIモジュールで動かしてみる。50 kΩが2個入っている。 チャンネル指定用の2ビット…

AVRのSPIモジュール / EEPROM 25LC256 / ライブラリー化

pp.339ff. (ほかに逆引き PIC電子工作 やりたいこと事典, pp.146-150) ライブラリーにしておく。 ▶EEPROM25_256サンプルファイルを開く/閉じる ▶EEPROM25_256ライブラリーを開く/閉じる