AVR Programming: Learning to Write Software for Hardware (Make Community, LLC)

inputモード / スイッチを押すたびに何かをトグルする / 簡易的なチャタリング防止を施す

テキストのExample 6-3 (p.117)は、もう少し凝った方法でチャタリングを防いでいるが、ここではArduinoをはじめよう 第3版 (Make:PROJECTS) (pp.42-43)を参考に単にスイッチが落ち着くまで待つ方法にした。 #include <avr/io.h> #include <util/delay.h> int main(void){ uint8_t was</util/delay.h></avr/io.h>…

inputモードを試す

DDRxレジスタは初期状態では全部のビットが0 (inputモード)である。 PORTxレジスタはinputモードのときとoutputモードのときとで働きが異なるため注意が必要である。 inputモードのときにPORTxレジスタの任意のビットをセットすると、そのビットに対応してい…

USART / 音を鳴らす

Example 5-4 serialOrgan.c listing on pp.102-103のコアな部分のみを実行してみる。 https://github.com/ti-nspire/AVR/tree/master/serialOrgan //#include <avr/io.h> //#include <util/delay.h>U extern "C" { #include "organ.h" #include "USART.h" #include "scale16.h" //#in</util/delay.h></avr/io.h>…

USART / レジスタを少しいじってみる / パリティビットを加えてみる

これが偶数パリティにしたとき 今'a' (= 0b01100001)を送り返している。'a' (= 0b01100001)は1の数が3であるので、パリティビットを1にすることで1の数を偶数個にしている。 今度は'c' (= 0b01100011)を送り返している。'c' (= 0b01100011)は1の数が4である…

USART / レジスタを少しいじってみる / ストップビット数を変えてみる

AVRから何かを2回連続して送り返して確かめてみる。 これがストップビット数を1 (デフォルト)にしたとき これがストップビット数を2にしたとき #include <avr/io.h> /* extern "C" { #include "USART.h" } */ // 1バイトの各ビットを任意の順番に並べ換えるための函数</avr/io.h>…

USART / レジスタを少しいじってみる / データビット数を変えてみる

デフォルトは8ビットであるが7ビットに変えてみる。 データビット数が8のとき。 データビット数が7のとき。 #include <avr/io.h> /* extern "C" { #include "USART.h" } */ // 1バイトの各ビットを任意の順番に並べ換えるための函数。 uint8_t byte2pos(uint8_t oneByt</avr/io.h>…

USART / レジスタを少しいじってみる / ボーレートを変えてみる

UBRR0H、UBRR0Lの両レジスタでボーレートを変えてみる。 これが4800ボーのとき。1ビットの幅は約0.2 msec (≒ 1 sec/4800)。 これが38.4kボーのとき。1ビットの幅は約26 μsec (≒ 1 sec/38400)。 #include <avr/io.h> /* extern "C" { #include "USART.h" } */ // 1バイ</avr/io.h>…

USART関連のレジスタ

USART関連のレジスタは6本ある。 UDR0は送受データの格納されるレジスタ。DはData。 UBRR0H、UBRR0Lはボーレートを設定するレジスタ。BRはBaud Rate。 UCSR0A~Cは制御&ステータスレジスタ。CSはControl & Status。 UDRn (USART Data Rgister n) 送受するデ…

USARTペリフェラルを使う

テキストのサンプルコード(Example 5-1. serialLoopback.c, pp.83-84)を少し変えた。 シリアルポートから1バイトを受信し、それをそのままシリアルポートから送り返すとともに、ポートBに接続してある8個のLEDに2進数(点灯が1、消灯が0)としても表示する。 i…

ビット演算 / 特定のビットだけに何かをしてそれ以外にはさわらない

|がbitwise OR、&がbitwise AND、^がbitwise XOR、~がbitwise NOT。 #include <stdio.h> // 1バイトデータを2進数の数「字」として表示するための函数。 void printByteAsBin(unsigned char oneByte){ unsigned char binStr[8]; unsigned char mask = 128; // 0b 1000</stdio.h>…

POV

配線のし易さを優先し、端子の並びに合わせてバイトデータのほうを並べ替える。 #include <avr/io.h> #include <util/delay.h> // 1バイトデータの各ビットを任意の順番に並べ替えるための函数 uint8_t byte2pos(uint8_t oneByte, uint8_t *pos){ uint8_t mask = 128; // 0b 1000 000</util/delay.h></avr/io.h>…

素のAVRに何かをフラッシュする / ArduinoをAVR書き込み器として使う

ArduinoをAVR書き込み器に利用して何かをArduino IDEから素のAVR (ブートローダーを持たないAVR)に書き込んでみる。 テキストは168をターゲットにしているがここでは328を使った。発振子は外づけせずに内部発振器を使って8 MHz動作とする。 AVR書き込み器に…

Arduinoの良さを全然活かさないLチカ

.ino (594バイト) #define whichBit (1 << 5) void setup(){ DDRB = whichBit; // PB5 (ArduinoのD13)のIOをOUTにする。Data Direction Register while(1){ PORTB ^= whichBit; // ループするたびにPB5のステータスを反転する。Port Output Register Thing d…

さまざまな開発環境

4つの選択肢がある。 Atmel Studioを使う。規模が大きすぎる。慣れるのに時間がかかる。 WinAVRを使う。2010年にプロジェクトが凍結されたが現在も利用可能。 単体のAVRクロスコンパイラーを使う。Elliotはこれを推奨している。 Arduinoをそのまま使う。たと…