The Yak Shaver
さあ、今日も毛を刈ろう。
skip to main
|
skip to sidebar
ラベル
AVR
の投稿を表示しています。
すべての投稿を表示
ラベル
AVR
の投稿を表示しています。
すべての投稿を表示
2013/06/11
あるXtalをボーレート設定に使ったときの誤差を求める
部品屋でボーレート設定用の Xtal を探すときは[この式](http://yak-shaver.blogspot.jp/2013/06/blog-post_11.html)で事足ります。 しかし、手持ちのジャンク箱から適当なクリスタルやセラロックを引っ張りだしてボーレート設定に使いたいときなどは、できるだけ誤差の小さいものを選びたいものです。 手前味噌ですが、クリスタルの周波数と目的のボーレートをキーボードで入力して、誤差を求めるPythonプログラムを書きました。 $baud.py Xtal frequency [MHz]:1 baud rate [bps]:9600 --> err:0.16[%] 上の例では 1MHz のクリスタルを 9600pbs で使った場合の誤差を求めています。
ボーレート設定用クリスタルの周波数の見分け方
UARTのボーレート設定に使う Xtal の周波数は 周波数[Hz] / ボーレート[bps] = 整数 となるものを選ぶと、理論上の誤差が0となり精度が最も高くなります。 つまり Xtal の周波数を Hz に直してボーレートで割り切れたら、それは UART用のXtalと思っていいでしょう。 ただしマイコンの多くは分周比が固定されているので、その場合は更にその分周比(8, 16 など)でさらに割ってやります。 例えば、AVRで 7.3728MHz を 115200bps で使うとすると、AVRの分周比が16の場合では、 7372800 / 115200 / 16 = 4 と割り切れて整数となります。ですので、この周波数 7.3728MHz はUARTのボーレート設定用に使えるとわかります。 ボーレート設定用としてよく使われるものは、 1.8432MHz 3.6864MHz * 7.3728MHz * 11.0593MHz * 14.7456MHz などがあり、いずれも端数つきの周波数となります。 ノイズマージンやマイコンの動作スピードを考えると、5〜10MHz のものが使いやすいので、このリストの`*`印のあたりがいいかもしれません。 ちなみに、よく見かける端数つきの周波数 3.58MHz(3.579594MHz) はボーレート設定用ではなく、NTSC等のビデオ信号用として使われます。
2013/06/05
C言語のビット演算子 まとめ
#### ビット演算子のおさらい 例 16進数 2進数 NOT '~' ~0x04 => 0xFB (~0000_0100 => 1111_1011) OR '|' 0x26 | 0x14 => 0x36 ( 0010_0110 | 0001_0100 => 0011_0110) AND '&' 0x26 & 0x14 => 0x04 ( 0010_0110 & 0001_0100 => 0000_0100) XOR '^' 0x26 ^ 0x14 => 0x32 ( 0010_0110 ^ 0001_0100 => 0011_0010) #### 実践編 実際にはビットマスクを使って下記のようにすることが多いです。 ##### あるビットを立てたい(1にしたい)→ OR mask = 0x04; // 0000_0100 PORTB |= mask; // bit2 を立てる ##### あるビットを寝かせたい(0にしたい)→ AND mask = 0x04; // 0000_0100 PORTB &= ~mask; // bit2 を寝かす マスクを一旦 NOT して、それを AND するという2段階が必要 ##### あるビットを反転させたい → XOR mask = 0x04; // 0000_0100 PORTB ^= mask; // bit2 を反転させる #### XOR についての注意 元のビットが 1 のときに XOR を使うとビットを寝かせることができるので、AND の代わりに使えそうです。AND が2段階必要なのに比べるとシンプルにも思えます。 しかしこの方法は、元のビットが想定外に0に変化してしまうと、XOR の結果は 1 になる(立ってしまう)ため、下手をすればバグの元となります。 特に割り込み許可フラグや状態遷移のフラグなどにこの手の操作をしてしまうと、盛大にバグる上に発見が難しいです。 なので、XOR のそういう使い方は避け、純粋にビット反転の用途のみに使うべきです。
AVR Dragon 接続できない件
なぜか、ときどき AVR Dragon が使えなくなります。 PCの電源は落とさずにスリープしながら使っているのが原因かもしれないのですが、再現性100%というわけでもなく、今ひとつはっきりしません。その度にUSBケーブルをつなぎ直したりするのですが、いつも手間取ってしまうので、うまくいく手順の一例を下記に書いておきます。 AVR Dragon の ISPコネクタをターゲット基板に接続している状態で、次のとおりに行います。 1. Atmel Studio (AVR Studio) を一旦閉じる 1. Atmel Studio 起動 1. ターゲットの電源 ON 1. AVR Dragon と USBケーブルを接続 これでいつものように、F5 を押せばステップ実行できるようになるはず。
2013/05/29
AVRのタイマー割込みサンプル
1秒ごとにLEDが点滅するサンプルです。
2013/05/27
AVRのSW入力とLED点灯のサンプル
タクトSWを押すとLEDが光るサンプルを置いておきます。
- LEDはPB0: LO で 点灯 - SWはPB1: LO で ON です。 ごく単純なものですが、組込みにおける`Hello world!`的なものなので、一生のうち何度も書くです。
2013/05/25
C言語の二次元配列の要素数
比較的最近のGCCで二次元配列の初期化をする話しです。 char arr[][] = {{1, 2, 3, 4}, {6, 7, 8, 9}}; などと書くと、コンパイラから次のように文句を言われます。 Error 2 array type has incomplete element type Warning ではなく Error です。エラーメッセージには`element type`とあるので、型がおかしいように思えますがそうではなく、単純に要素数を明示してないのが原因です。ですんで、 char arr[2][4] = {{1, 2, 3, 4}, {6, 7, 8, 9}}; といういうふうに、要素数を明記してやれば回避できます。一次元配列では要素数は省略できますが、多次元では省略不可のようです。 GCCの仕様変更によるものらしいです。
2013/05/16
AVRのUARTのサンプルその2
以前の[これ](http://yak-shaver.blogspot.jp/2013/05/avr-1.html)のつづきです。 割り込みによる送受信とリングバッファを追加したものです。 若干納得が行かないところもありますが、とりあえず使えます。
リングバッファモジュール
前回の[コレ](http://yak-shaver.blogspot.jp/2013/05/blog-post.html)をモジュール化しました。 動きは同じです。
リングバッファのサンプル
通信などに用いるリングバッファのサンプルです。 このサンプルでは、バッファの状態をグラフィカル(笑)に表示するので動きがわかりやすいかもしれません。 バッファに書き込むライトポインタとバッファから読み出すリードポインタがあり、ライトポインタはリードポインタを追い越しません。 これにより、まだ読み出されていないデータは上書きされることはありませんが、書こうとしていたデータは捨てられます。 それを防ぐためには、書込み/読出しの頻度差(通信速度差ともいえます)に見合ったバッファサイズに調整する必要があるでしょう。
AVR シリアル通信サンプル その1
UARTのもっとも単純なサンプルを置いておきます。 デバイスはATMEGA88P、クロックは工場出荷状態の内蔵RCオシレータで9600bpsです。 このままでは実用的でないです。 とくに受信部分は割り込み処理とバッファが別途必要ですがそれはまた後日。
2013/05/08
AVR Dragon の debugWIRE 使用上の注意
AVR Studio と AVR Dragon の組み合わせで debugWIRE を使ってデバッグをする方法について書きます。 debugWIRE は 6ピンのISPコネクタで接続するので、結線自体はふつうにISP書き込みするのと同じです。 ただ、debugWIRE を使うには、事前に AVR のフューズビット DWEN を 1 にしておく必要があります。フューズ操作は、デバイスによっては ISP接続ではできないものもあり、 AVR Dragon でそのようなデバイスのフューズを操作するには、ISPコネクタでの接続ではなく HVPP ソケットを使わなければなりません。 ですが、買ったままの AVR Dragon は HVPPソケットはスルーホールパターンのみでソケットは実装されていないので、HVPP を使いたいときは、事前に別途 ZIFソケット等をハンダ付けしておく必要があります。 これらのことは特に、新しい環境だったり初物のマイコンだったりすると割とハマリやすいので、以下に手順を残します。 ---- まずは AVRマイコンの DWEN ビットを ON します。 1. AVR Studio を起動し AVR Dragon と PC をUSBケーブルでつなぐ。 1. AVR Dragon の HVPP ソケットに AVRマイコンを差し込む。 1. AVR Studio > Tools > Device Programming 1. Interface = HVPP > Apply 1. 左ペインの Fuses を選択し、 DWEN をチェック。 Program を押す。 ---- 次に HVPPソケットから AVRマイコンを外してターゲット基板に実装し、ISPコネクタと接続します。 debugWIRE でデバッグするのに最低限必要な結線を下図に示します。
ここで、ターゲット基板に専用の電源回路がある場合(ふつうはこれ)は、ISPコネクタの 2番ピン(VTG)は接続しません。 ターゲット基板に電源回路がない場合は、しかたないので接続します。ただし、その場合は AVR Dragon から+5Vを供給することになるので、ターゲット回路の電源系は+5Vとなります。もし 3.3V系のICなどが接続されている場合は壊れる可能性があるので注意が必要です。 ---- 結線ができたら、あとはふつうにデバッグを始められます。 1. ターゲット基板の電源を入れます。 1. `Alt` + `F7` を押して プロジェクトのプロパティを開き、左ペイン > Tool > Selected debugger/programmer = AVR Dragon, Interface = debugWIRE
1. ソースにブレークポイントを仕掛けて、`F5`(Continue)します。
実行中は AVR Dragon の赤LEDは点灯せず、緑が点灯/点滅しています。もし、赤が点灯している場合は何かがおかしいです。 デバッグまでの手順は以上です。 ---- ####余談その1 上の結線図にもありますが、ISPコネクタの2番(VTG)はターゲット基板に接続する必要はありません。このピンは AVR Dragon から 5V が出力されており、これをターゲット基板の電源として使うこともできますが、単純なブレッドボード上での評価用と割り切ったほうがいいと思います。特にターゲット回路の電源が5Vより低い場合(3.3V系など)はターゲット回路を壊す可能性があるため、このピンはオープンのままのほうが無難です。 ####余談その2 ブレークポイントを仕掛けても止まらないとか、ローカル変数がウォッチできない場合は、コンパイル時の最適化が効いていることが原因かもしれません。その場合、次のようにして最適化を無効にします。 `Alt` + `F7` を押して プロジェクトのプロパティを開き、左ペイン > Toolchain > AVR/GNU C Compiler > Optimization > Optimization Level = None(-O0)  ####余談その3 AVR Dragon のマニュアルによると、大きい方のLED が黄色に光っているときは、AVR Dragon のファームウェアがコンフリクト(?)しているらしいので、ファームウェアをアップデートする必要があります。 ####余談その4 ISPコネクタでの接続した状態で `AVR Studio > Tools > Device Programming > Interface = ISP` とした時は `Device Signature`, `Fuses`, `Lock Bits` はどれも読めず、下記のようなダイアログが出ます。 Unable to enter programming mode. Please verify device selection, interface settings, target power and connections to the target device. しかし、この動作は正常です。最初に書いたとおり、AVR Dragon でフューズビット等をR/Wするには、ISPコネクタではなく HVPPでの接続でしかできません。つまり AVR Dragon でこの手の操作を行うには、`AVR Studio > Tools > Device Programming > Interface = HVPP` として、HVPPソケットにAVRマイコンを挿しこんで行います。ダイアログのメッセージを読むと、一見、結線や電源を見なおせばISP接続でも `Device Signature` 等が読み取れそうに思えますが、この場合はそうではないです。 以下環境です。 - Mac mini 2011 (OS X 10.8.3 / Mountain Lion) - Parallels Desktop 8 - Windows XP Home SP 3 / Windows 7 Home x64 - AVR Studio (Atmel Studio) 6.1 / 5.1 - AVR Dragon
前の投稿
ホーム
About
Unknown
詳細プロフィールを表示
Labels
AVR
( 12 )
Blogger
( 10 )
Chrome
( 2 )
cocoa
( 5 )
Eagle
( 5 )
emacs
( 31 )
game
( 1 )
Google
( 4 )
iPhone
( 2 )
Javascript
( 1 )
lisp
( 4 )
LPCXpresso
( 1 )
mac
( 53 )
Markdown
( 4 )
msp430
( 1 )
NXP
( 1 )
Parallels Desktop
( 1 )
PIC
( 3 )
python
( 19 )
Raspberry Pi
( 9 )
ruby
( 1 )
Safari
( 2 )
shell script
( 4 )
Sublime Text
( 1 )
windows
( 7 )
xcode
( 8 )
xyzzy
( 60 )
おぼえがき
( 69 )
まとめ
( 6 )
メール
( 2 )
よもやま
( 19 )
工作
( 23 )
電験
( 4 )
本日の探索結果
( 2 )
Blog Archive
▼
2015
( 3 )
▼
02
( 1 )
C99 サンプルコード
►
01
( 2 )
►
2014
( 17 )
►
12
( 1 )
►
07
( 3 )
►
06
( 3 )
►
04
( 2 )
►
03
( 4 )
►
01
( 4 )
►
2013
( 135 )
►
12
( 5 )
►
10
( 6 )
►
09
( 7 )
►
08
( 10 )
►
07
( 24 )
►
06
( 15 )
►
05
( 15 )
►
04
( 17 )
►
03
( 13 )
►
02
( 17 )
►
01
( 6 )
►
2012
( 11 )
►
10
( 5 )
►
07
( 1 )
►
02
( 2 )
►
01
( 3 )
►
2011
( 86 )
►
12
( 2 )
►
11
( 2 )
►
10
( 1 )
►
07
( 2 )
►
06
( 3 )
►
05
( 20 )
►
04
( 49 )
►
03
( 7 )
►
2009
( 4 )
►
03
( 1 )
►
01
( 3 )
►
2008
( 8 )
►
12
( 8 )
STAT
Ads
Amazon.co.jp ウィジェット
Powered by
Blogger
.