縁側 > ホビー > おもちゃ > 電子玩具 > 電子小物道場
「縁側」-みんなが作る掲示板-からのお知らせ
縁側からのお知らせ

縁側をご利用いただく際のルール&マナー集を用意いたしました
ユーザーの皆様に楽しくご参加いただけるよう、主に投稿時の注意点などをまとめています。
ご投稿の前には必ずご一読をお願いいたします。詳しくはこちら⇒「縁側 ルール&マナー

紹介文

手始めに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]   



ソフトウエアについてのスレです。私なりの解釈となります。不定期で進度はゆっくりですがご容赦ください。

Arduino IDE で、kit_scope.ino を開いてください。環境設定でDisplay line numbers にチェックを入れておいてください。そうすると、ソースコードに行番号が表示されます。

1行目から34行目まではコメント文で、基板上のコネクタのピンの信号名称について説明をしています。

37行目から125行目までは変数の定義と値の代入をしています。

128行目から1207行目までは関数の定義をしています。

これらの変数と関数は、setup()とloop()の外側でされていますから、setup()とloop()の中でも有効となります。

Arduinoのソフトウエア流儀は、1回だけ実行するsetup()と、繰り返し実行するloop()の2つの関数で構成されているのでしたね。

それでは1210行目から始まるsetup()の中身を見て行きます。

2015/1/14 22:49  [1681-29]   

setup() の大まかな流れです。

 下記変数に値をセットする。

  DDRB
PORTB
DDRD
PORTD
UBRR0H
UBRR0L
UCSR0C
UCSR0B
 次に、
  txinit()を呼ぶ。
rxinit()を呼ぶ。
rminit(false)を呼ぶ。
oscinit()を呼ぶ。

 次に、
  if文
 最後に、
  oscinfo()を呼ぶ。

 という具合になっています。 

 ここで、DDRBとはなんでしょうか。調べてみましょう。

 Arduino IDE のツールバーから編集をクリックして、検索を選びます。
検索テキストにDDRBと入力します。[検索]ボタンをクリックします。758行のDDRBがフォーカスされました。何やらビット演算をして値を代入していますが、変数の宣言ではありません。[検索]をどんどんクリックしてみましょう。一巡しても宣言しているところはありませんでした(見つけた人いますか?)。つまり、DDRBは 宣言しないで使える変数ということです。

 Arduino IDE にはデフォルトで使える変数や関数がいくつかあるようです。こういう場合はリファレンスを調べてみましょう。IDEからリファレンスに飛べますが、英文のリファレンスとなります。日本語のものは下記にあります。

 Arduino IDE の日本語リファレンス
 http://www.musashinodenpa.com/arduino/re
f/


 上記URLのビット演算子の章の「ポート操作」をクリックしてください。このページ内の検索でDDRBを探します。

 IE11をお使いの方は、[Ctrl]+[F]すると検索バーがIEの画面上部に表示されます。IE11がアクティブの状態(選択されている状態という意味です)じゃないと別のアプリの操作になるので注意してください。

 上記のやり方でDDRBが見つかったと思います。そのあたりの説明文を読んでおきましょう。読んでみると、DDRBはただの変数ではなくてレジスタ名だったということがわかります。さらにDDRBはポートBの各ビットを入力か出力かを指定する方向レジスタということがわかりました。

 ところで、レジスタってわかりますか? CPUが自分の動作のために一時的に使う専用メモリーといったものです。ATmegaのような1チップのマイコンだと、CPUだけではなくて、同じチップ内のCPU以外の周辺デバイスの設定を保存するためにもレジスタが必要になりました。1チップマイコンはそれぞれ固有のレジスタ群を持っていることが普通です。

 レジスタの各ビットは各GPIOピンに1対1に対応しているということですね。
 ポートを操作するには、DDRxで方向を定め、PORTxで出力データをセットし、PINxで入力データを読むということがわかりました。またDDRxとPORTxはRead/Writeでき、PINxは読み取り専用ということですね。

2015/1/15 22:37  [1681-30]   

写真1

setup()の解説の続きです。

 cli()を飛ばしていました。これもリファレンスを探してもありません。

 ネットで、”Arduino cli()”で検索すると、下記のページが見つかりました。

 Arduinoで遊ぶページ
 http://garretlab.web.fc2.com/arduino/ins
ide/avr/interrupt.h/cli.html


 そこには、「cli()は,割り込みを禁止するアセンブラ命令を実行するマクロです。」と説明がありました。また、「cli()は,hardware/tools/avr/avr/include/avr/inter
rupt.h に定義されています。」ともありました。余談ですがこのHPはかなり面白いです。時間があったらじっくり見てください。

 早速、hardware/tools/avr/avr/include/avr/inter
rupt.h を見てみましょう。確かに記述がありました。全ての割り込みを禁止するとありました。一発で全割り込みを禁止できるのは便利です。

 これからは、未定義で出現してくる関数は、フォルダ arduino-1.0.6 以下を探した方がよさそうです。

------- ここから

 余談が多いのですが、検索ソフトは、Vectorから「HNXgrep_1.4.3」というソフトウエアをダウンロードして使うことにしました。他に使ったことがないので自信がないのですが、正規表現で指定できるので使いやすいと思いました。

○使い方

1.対象で、探す場所を指定する(この場合は、フォルダ arduino-1.0.6 を指定)。

2.正規表現にて、ファイルの指定ができる。
 関数の定義ですから、探すファイルの拡張子は、.hか.cか.cppの筈だと当たりをつけます。
 ファイルマスクに、\.[hc(cpp)]$ と指定しその右にある[Regex]をクリックしました。

3.正規表現にて、キーワードを指定ができる。
 定義なので、「cli();」ではなく「cli()」を検索する必要があります。
 キーワードのところに、cli\(\)[^;] と指定し、同じ並びの[Regex]をクリックしました。

4.[検索実行]をクリックする。
 
5.検索結果のファイル名をクリックするとその該当箇所が表示される。

写真1をご参照ください。

------- 以上

setup()の説明は仕切り直しですね。

2015/1/16 22:29  [1681-31]   



写真1 Uncompatinoに書き込んだところ 写真2 TeraTermを立ち上げるとUncompatinoが動き出す

Uncompatino上で小さなプログラムを実行してその結果をPCに送るスケッチ(プログラム)を書けばよいです。

UncompatinoにはFUSEビットもブートローダーも書き込まれているという前提です。
(もし書き込まれていないのであれば、[1681-6]avrdudeの環境構築を参考にしてください)


Arduino IDE上で下記のスケッチを書きます。

void setup() {
Serial.begin(115200); // 115200bp
sでシリアルポートを開く
}

int x;

void loop() {
Serial.println(x); // 定義しただけで値の代入をしないと、何が入るのかを確認

x = 10; // 10を代入
Serial.println(x);

Serial.println("");
// 改行
Serial.println("");
// 改行

for(;;){}
}

上記をUncompatinoに書きます。


TeraTermを用意します。私が使っているのは、teraterm-4.84.zipを解凍したものです。

TeraTermのCOMポートとUncompatinoのCOMポートの番号を一致させることと、TeraTermとUncompatinoのシリアル通信速度を一致させてください。

Uncompatinoにスケッチを書きこんだ後に、TeraTermを起動します。つまりスケッチを書き込むときにはエラーになりますので、TeraTermが動作していてはいけません。

2015/1/7 00:20  [1681-21]   

写真3 コンパイル結果 写真4 実行結果

繰り返しさせてみたらこうなりました。

写真3:ソースコード

写真4:実行結果

loop()で定義されているものは、loop()内だけで有効であるということ。

2015/1/8 00:12  [1681-22]   



九州工業大学情報工学部にある下記内容の簡易オシロスコープに挑戦します。
http://www.iizuka.kyutech.ac.jp/faculty/
physicalcomputing/pc_kitscope/


また、下記のくつしたねこさんのブログも参考にさせていただきます。
くつしたねこのTinkering,Tinkering and Obliquity
http://kutsushita-neko.cocolog-nifty.com
/blog/2013/08/arduinoarduino-.html

2015/1/1 21:01  [1681-13]   

写真1 接続図

配線図です。FUSEビットの見直しもしてみます。

2015/1/3 21:35  [1681-15]   

FUSEビット計算機というのもあります。

http://www.engbedded.com/fusecalc

2015/1/3 22:12  [1681-16]   

写真2 ダウンロードボタン

ソースコードをダウンロードします。

写真2 のダウンロードボタンをクリックします。ファイルを解凍します。

Arduinoフォルダの中のkit_scope.ino が Arduino側のソースコードになります。

2015/1/4 23:42  [1681-17]   

kit_scope.ino ですが、TeraPadで見ることができます。全部で1268行でした。

2015/1/4 23:44  [1681-18]   

写真3 環境設定の変更

ソースコードの行番号なのですが、Arduino IDE の環境設定を変更することにより、Arduino IDE でも表示できることに気がつきました。

写真3のように変更してください。

2015/1/5 22:45  [1681-19]   

写真4 ファイルを開く 写真5 ファイルを指定し、検証をクリック

○Arduino のソフトウエア流儀について

下記のsetup()とloop()をユーザーが定義する(要するに中身を書くということ)だけ。setup()とloop()は引数を渡せないし、返り値もありません。

void setup() {
// put your setup code here, to run on
ce:

}

void loop() {
// put your main code here, to run rep
eatedly:

}

注意点
arduino-1.0.xのpathには、半角英数字のみとしないとコンパイルエラーになります。忘れないでください!

検証が通るかどうか一度確認されることをお勧めします。

写真4のようにして、任意のファイルを指定し、写真5のように kit_scope.ino を選択してスケッチ(ソースコード)を表示させます。それから検証をクリックします。

エラーが出ないで、コンパイルが終了すれば大丈夫です。

2015/1/5 23:06  [1681-20]   

オシロスコープのソフトウエアについて解説したいと考えています。私自身が勉強しながらで、かつ私の解釈ということになりますが。手始めにArduino側の kit_scope.ino から行いたいと思います。

kit_scope.ino の解説について別スレ立てます。私のペースなので超ゆっくりの解説となります。

2015/1/14 22:29  [1681-28]   



電子小物道場

タグ:

マイクロファンラボ AVR開発環境

http://www.microfan.jp/avr-dev

WinAVR/GNU GCCの利用法や、AVR Dragon の使い方の説明がどこにあるのか書かれていました。


この中の、AVR Studio の説明文の中に下記の文章がありました。

WinAVR/GNU GCCの利用法が、AVR Studio User Guideにしっかりと記載されています。
AVR Dragonにいたっては製品に何のドキュメントも付属しておらず、パッケージを開けた途端パニックに陥りそうになるのですが、そのドキュメントもAVR Tools User Guideにしっかり収録されています。

もちろん英文で書かれているものだと思います。

2015/1/1 06:18  [1681-11]   

BASCOM-AVR という、BASICコンパイラのIDEもあるんですね。

試用版(プログラム容量は4kByteに制限されている)の使い方や注意点についても説明があります。

O-Family 電子工作の部屋

http://www.ne.jp/asahi/shared/o-family/E
lecRoom/ElecMAIN.htm

2015/1/1 06:33  [1681-12]   


電子小物道場の掲示板に
電子小物道場の掲示板に新規書き込み
全員投稿可
電子小物道場
電子小物道場をお気に入り登録
運営者:
オーションさん
設立日:
2014年12月27日
  • 注目度:

    284(お気に入り登録数:2件)

  1. 1ドラマスキー

該当掲示板はありません

ページの先頭へ