
縁側をご利用いただく際のルール&マナー集を用意いたしました
ユーザーの皆様に楽しくご参加いただけるよう、主に投稿時の注意点などをまとめています。
ご投稿の前には必ずご一読をお願いいたします。詳しくはこちら⇒「縁側 ルール&マナー」
紹介文
手始めにUncompatino(ATmega328P Arduino UNO 準互換)を勉強していきたいと思います。

ATmega328p系の割り込みについて
大元のSREG(ステータスレジスタ)のビット7のIに1を書き、各割り込みレジスタの許可ビットを1として初めて、割り込み事象が発生する。2段構えになっているので気をつけてください。
2015/1/21 22:10 [1681-32]

**************************************
txinit()の説明
**************************************
142 void
143 txinit(void)
144 {
145 if (txn >= TXBSZ)
146 sysdown(200); // tx buffer
overflow has been detected.
147 txn = 0;
148 txr = TXBSZ;
149 }
txn、txrはint型の変数です。TXBSZは1100と定義された定数です。字面からすると送信バッファ
サイズのことでしょう。
txnがTXBSZ(バッファサイズ)以上なら、オーバーフローが起こったと判定して、sysdown(200)を
実行します。そうでなければ何もしません。
txnに0、txrにTXBSZを代入します。
2015/1/21 22:12 [1681-33]

**************************************
sysdown()の説明
**************************************
1240 void
1241 sysdown(int dly) // dly .. in msec
1242 {
1243 int i;
1244 byte s;
1245
1246 SPCR = 0x00; // disable SPI
1247 TCCR0B = 0x00; // stop timer0
1248 TCCR0A = 0x02; // ctc mode
1249 TIMSK0 = 0x00; // Disable all timer0
irqs
1250 TIFR0 = 0x07; // clear flags
1251 TCNT0 = 0x00;
1252 OCR0A = 250 - 1;
1253 TCCR0B = 0x03; // start timer0 pre
= 1/64 i.e 250kHz
1254
1255 s = 0;
1256 while(true) {
1257 if (++s & 1)
1258 PORTB |= 0x20; // D13 == HI
GH (LED on)
1259 else
1260 PORTB &= 0xdf; // D13 =
= LOW (LED off)
1261 for(i = 0; i < dly; i++) {
1262 while((TIFR0 & 2) == 0)
1263 ;
1264 TIFR0 = 0x07; // clear flag
s
1265 }
1266 }
1267 }
この関数なのですが、システムダウンが起きたらそれをリカバーするという目的
ではなく、LEDを点滅してシステムダウン状態ですよという表示をするためのもの
みたいです。
i, sもローカル変数。
SPCR−SPI制御レジスタ。0x00がイニシャル値です。
TCCR0B−タイマ/カウンタ0制御レジスタB。0x00がイニシャル値です。
TCCR0A−タイマ/カウンタ0制御レジスタA。0x00がイニシャル値です。
TIMSK0−タイマ/カウンタ0割込み許可レジスタ。0x00イニシャル値です。
TIFR0−タイマ/カウンタ0割込み要求レジスタ。0x00イニシャル値です。もし、bit2,1,0の
値が1になっていたら、同じビットに1を書いてもフラグがクリアされると
データシートにあります。気になるのは、いきなり0x07を書いていますが、
各ビットが0だったらどうなんでしょう。実際に確かめてみたところ、
いきなり0x07を書いても問題ありませんでした。
TCNT0−タイマ/カウンタ0。0x00がイニシャル値です。
OCR0A−タイマ/カウンタ0 比較Aレジスタ。0x00がイニシャル値です。249を代入しています。
OCR0Bがありませんが、使用していないっていうことでしょう。
TCCR0B−再度の登場です。0x03にするとクロック元を64分周します(16MHz/64=250kHz)。
1256行のwhile(true){}は、無限ループです。if-else文でD13をHigh,Lowにします。
1261行のfor文はD13の点滅周期を作っているのと、再度のTIFR0のフラグクリアです。
1262行のwhile((TIFR0 & 2) == 0)ですが、このwhile文は怖いです。何らかの理由で、
(TIFR0 & 2) == 0が真になると永久に何もしない無限ループとなります。
変数dlyの単位はmsecのようです。どうやら、このwhileの式の評価(但し偽を期待し
ている評価式)とTIFR0への値代入で1msecの時間を作っているということらしいです。
そうであれば、while文はやめてif文にする方が絶対に安全ですね。
2015/1/21 22:16 [1681-34]

**************************************
rxinit()の説明
**************************************
128 void
129 rxinit(void)
130 {
131 rxn = 0;
132 }
グローバル変数 byte型 rxnに0を代入します。rxnは受信文字列長でしょうか?
2015/1/21 22:18 [1681-35]

**************************************
rminit()の説明
**************************************
219 void
220 rminit(boolean on)
221 {
222 rmw = rmr = 0;
223 rmon = (on) ? 1 : 0;
224 }
グローバル変数 byte型 rmw、rmrに0を代入します。boolean変数 onが真なら byte変数 rmonを1、偽なら0にします。
2015/1/21 22:19 [1681-36]


この掲示板の新着スレッド

番号 | タイトル | 返信数 | 最終投稿日時 |
---|---|---|---|
[1681-32] | オシロスコープソフト kit_scope.ino の関数解説 | 4 | 2015年1月21日 22:19 |
[1681-29] | Arduino側のソフトウエア kit_scope.ino の解説 | 2 | 2015年1月16日 22:29 |
[1681-27] | ATmega328p データシート | 0 | 2015年1月9日 23:15 |
[1681-21] | Arduino IDE の動作をちょっと確認したいとき | 1 | 2015年1月8日 00:12 |
[1681-13] | Uncompatinoでオシロスコープ製作に挑戦 | 7 | 2015年1月14日 22:29 |
[1681-11] | AVR 開発環境に関するサイトの紹介 | 1 | 2015年1月1日 06:33 |

