人気ブログランキング |

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

<   2016年 09月 ( 30 )   > この月の画像一覧

内部割込み・外部割込みと見てきた。デジタル入力としてスイッチを使う場合BASCOM-AVRで用意されているDebounceを使うと内部的にピンのON/OFFが検出されるとデフォルトで25ms待つ処理になっている。
これは前回の外部割込みで、飛び先で25ms待っているのと同じ。
Isr_pcint:
' GIFR.5 = 1
Waitms 25
:
:
Return
ピンのON/OFFが検出されなければ待ち時間は発生しないので、それほど悪くはない。
しかし、次のURLからピンによる外部割込みの場合、チャタリングで発生した割込みが現在の割り込み終了を待ってから処理されるとの内容があり、GIFR I/Oレジスタの、ビット5のPCIFビットを0(他の割り込み要求を解除)するために1を書き込む必要があるらしい(コメントのGIFR.5=1)。それはポート単位で割り込みを解除するため、ポートBしかないATtiny13では外部割込み要求はチャタリングを防止するため1ピンしか使えないようだ。もちろんスイッチじゃなく外部回路とのやり取りならチャタリングはないのでこのビットは0にしなくてもいい。つまり2つスイッチを外部割込みで同じポートBにつなぐのは勧められない。
[AVR] 割り込み処理でのチャタリング対策 - Let's Try It!

別のチャタリング防止策として、外部割込みではなく、ポーリングで行う方法もある。

ソース:
'****************************************
' Copyright (c) 2016 k1segawa
' License : free
' Program : Internal Interrupt Control
' (Compare OC0A SW Bounce)
'****************************************

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16

Dim S As Byte , W As Byte 'sampling
S = 0
Config Portb.3 = Input
Set Portb.3 'Pullup

'--- Compare OC0A ---
Config Portb.4 = Output
Config Timer0 = Timer , Prescale = 1024 , Clear Timer = 1 ' REMEMBER comma !

Ocr0a = 94 '10ms
On Oc0a Isr
Enable Oc0a
Enable Interrupts

Do
Loop

End

Isr:
'--- Store Pin Status with 3 times ---
W = Pinb.3 'polling Pin
S = S And &B11 'bit1,0 mask
Shift S , Left , 1 '1:bit2, 2:bit1, 3:bit0
S = S + W 'bit0 append

If S = 0 Then '3 times = 000
Portb.4 = 0
Elseif S = 7 Then '3 times = 111
Portb.4 = 1
End If
Return
' History
' [2016/09/21]
' URL=http://www.palettesoft.co.jp/technology/pic/pic_sample_sw0.htm
こちらはタイマーとOC0Aレジスタの比較一致割込みで、9.6MHz, Prescale=1024, OCR0A=94で、1024*94/9600=10.02ms間隔で入力ピンをチェックし、3回連続して同じ値なら有効とみなす。これなら複数ピンをつないでもそれぞれ別の変数(S)に保持すればいい。タイマー比較一致割込みが10ms毎に入るがそれほどの負荷でもないだろう。
どちらの方法も長所短所があり、スイッチ入力が一筋縄ではいかないことがわかる。
by k1segawa | 2016-09-21 16:56 | arduino, AVR | Comments(0)
外部割込みの拡張外部割込みPCINTxを行う。
INT0はピンが決まっているが、PCINTxは複数のPinに割り当てられ、別のPinに割込みを切り替えることができる。
そのため直接I/Oレジスタを設定しなければならない。
下記のURLで
Const Used_pcint = &B00000011
Pcmsk = Used_pcint 'Einschalten pcint0 pcint1 (portb.0 portb.1)
となっており、PCMSKが下位0~7ビットでPCINT0~7を表している(ATtiny13は最大5までだが)。
http://www.makerconnect.de/index.php?threads/pcint-pin-abfragen.2963/

ソース:
'****************************************
' Copyright (c) 2016 k1segawa
' License : free
' Program : External Interrupt Control (PCINTx)
'****************************************

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16

Config Portb.4 = Output
Config Portb.3 = Input
Set Portb.3

Enable Interrupts
Enable Pcint0
On Pcint0 Isr_pcint
Pcmsk = &B00001000 'PCINT3 mask

Do
Loop

End

Isr_pcint:
Portb.4 = 1
Waitms 10
Portb.4 = 0
Return
' History
' [2016/09/19]
' CONFIG INTx(external Interrupt), 0-4:OK

割込み名はPCINT0で記述しPCMSKでピンを切り替える。立ち上がり立ち下がりを指定することは出来ない。注意点として、動作確認時は書込みの線を外す事(VCCとGNDのみにする)。
by k1segawa | 2016-09-19 20:53 | arduino, AVR | Comments(0)
外部割込みは、AVRで代表的なのはINT0になる。Pin 6でPB1(INT0)がそれに当たる。
BASCOM-AVRは前の記事のBASCOM-AVR 使用方法のサイト様の説明の通り、AT90Sシリーズがベースらしいので、そのマイコンの仕様を把握すれば何が出来るかわかる。従ってBASCOM-AVRの[メニュー][View][Pin Layout][Chip Search]ボタンで何も入れないで[Search]ボタンを押し、AT90Sで右欄の21番目[Ints]項が3のAT90S1200が最も割込みが少ない基本のそして最小番号型番のAT90Sと考える。このユーザマニュアルをAVR日本語情報サイト様で閲覧する。
割込みは[先頭ページ][■特殊マイクロ コントローラ機能][・外部及び内部の割り込み]の青い字をクリックすると、9ページ目[リセットと割り込みの扱い]に飛ぶ。その[表2.リセットと割り込みのベクタ]には4つの割込みが描かれている。
これにリセット(PowerON/WDT)、INT0、Timer0(オーバーフロー)、ANA_COMPが定義されているのでこれが基本とわかる。
外部割込みはINT0で、GIMSK I/Oレジスタが関係しているらしい。今後直接設定の際の参考になる。

ソース:
'****************************************
' Copyright (c) 2016 k1segawa
' License : free
' Program : External Interrupt Control
'****************************************

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16

Config Portb.0 = Output
Config Portb.1 = Input
Set Portb.1 'Pullup
Config Int0 = Rising

On Int0 Isr
Enable Int0
Enable Interrupts

Do
Loop

End

Isr:
Portb.0 = 1
Waitms 10
Portb.0 = 0
Return
' History
' [2016/09/19]
' figure:External Interrupt Input:SW=PB1(INT0),Pullup, Output:LED=PB0
' BASCOM-AVR Japan Site - Internal Hardware Control Command -
' CONFIG INTx(external Interrupt)

配線:
a0034780_13455645.jpg
タクトスイッチのプルアップ抵抗はプログラムで指定済みなので不要。PB1にスイッチ(図ではタクトスイッチだが、実際は押し込んでも入ったままにならないタイプ)、PB0にLEDを抵抗1kΩでGNDと接続。

オシロスコープ:
a0034780_14213656.jpg
PB0 のLEDの間に赤のプローブ(+)、抵抗とGNDの間に黒のプローブ(-)を取り付けてタクトスイッチを押した瞬間に波形が流れるので、P-Trigボタンを押し、波形の高さの目安を付ける。だいたい0.1mVくらいになる。

LED:
押した瞬間と離した瞬間に一瞬LEDが点灯し消える。オシロスコープで押した後10ms程度でPinがOFFになっている。図は[メニュー][設定変更][デバイス、周波数・・・] [トリガー・レベル]を0.1mVに設定してP-Trigボタンを押し、その後手でスイッチを押しそのままの状態の様子。原点から2.22msで0.1162mVになり、12.7ms後に最低電圧が-0.1139mVになっている。この操作がキャプチャーといい、キャプチャーを行うと、トリガー・レベルに0.1162と勝手に入る。
a0034780_14221099.jpg

by k1segawa | 2016-09-19 13:25 | arduino, AVR | Comments(0)
内部割込みの一つとして、前回タイマーオーバーフロー割込みを行った。「Timer0 のブロック図」を見るとその他に比較一致割込みがある。
タイマーの値がOC0A/Bの値に等しくなったら割込みを発生させるもの。その書式は以下のようになる。

オーバフロー割込み:
Config Timer0 = Timer , Prescale = 1024
On Timer0 Isr
Enable Timer0
Enable Interrupts
比較一致割込み:
Config Timer0 = Timer , Prescale = 1024 , Clear Timer = 1
On Oc0a Isr
Enable Oc0a
Ocr0a = 150
Enable Interrupts

BASCOM-AVRの使用法を解説されているサイト様の「内蔵ハードウェア制御命令」のTimer0の比較器[OCR0]を搭載しているチップの所によると、Clear Timer = 1でOC0A/Bの比較一致 CTC動作という期待した動きをするとの事。この時0を指定するとタイマーオーバーフロー割込み動作になってしまう(オシロの波形から50%PWMなので)。またCompare A = Disconnectは省略している(省略するとOC0Aがなるらしい)。そしてOC0Aのピンを使わない(ON/OFFしない)。ここは前の割込み処理がToggle PORTB.0になっていたので、PORTB.4に変更して確認する。
a0034780_11015177.jpg
ソース:
'****************************************
' Copyright (c) 2016 k1segawa
' License : free
' Program : Internal Interrupt Control
' (Compare OC0A)
'****************************************

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16
'--- Compare OC0A ---
Config Portb.4 = Output '0->4
Config Timer0 = Timer , Prescale = 1024 , Clear Timer = 1 ' REMEMBER comma !

Ocr0a = 150
On Oc0a Isr
Enable Oc0a
Enable Interrupts

Do
Loop

End

Isr:
Toggle Portb.4 '0->4
Return
' History
' [2016/09/19]
' add Enable OC0A
' [2016/09/16]
' URL:http://bbradio.sakura.ne.jp/avr_timer2/avr_timer2.html
a0034780_11193210.jpg
オシロの様子は縦線の間の時間が左に33.3msと表示され、計算では1024分周で9.6MHzの150サイクルに一回PB4につないだLEDがON/OFFすると、(1024*2)*150/9600000=0.032秒でだいたい32ミリ秒間隔となる。

さて、困ったのがOC0Bだ。上記の修正箇所をBにし、Compare B = Disconnectを追加してもオシロには一切波形は出てこない。
しかしLEDは光っている。Toggleを消すと消灯するので割り込み関数Isrには飛び込んでいるようだ。OCR0A=150とAにするとAの時と同じ波形になる。Aの割込みしか登録されないのか?どうもBASCOM-AVRはATtiny13のサポートも中途半端なようだ。とすると直接I/Oレジスタに値を設定しなければならないらしい。サイト様の「ハードウェアタイマーの使用方法の新しい動作モードの設定方法 (タイマー 1)」で WGM13 に設定しなければならない話があったがマイコンのユーザマニュアルを理解しないとOCR0Bは使えないようだ。このように基本的に最初の1つしかBASICの文法で設定は出来ないので、追加されたらしい機能の使い方は課題として残しておく。
内部割込みはこの辺にして次は外部からの入力の外部割込みにかかる。やっと割込みでスイッチの入力をやれるかな。
by k1segawa | 2016-09-19 11:05 | arduino, AVR | Comments(0)
何年か前のGigazineさんでサイバー攻撃の様子を見るサイトを閲覧した。
最近はどうなってるのかビットコインとかiPhone 7のFericaとか電子マネーが身近になってきたので、もうそんなサイトは無くなっているかなと思ったら、全然現役だった。
http://hp.ipviking.com/
a0034780_23324916.gif

前はNorse社のサービスだったのに、いつの間にかURLがHPのものになっていた。画像はScreen To Gifで作成。6フレーム程度のループ。以前もオシロスコープのGif動画でお世話になった。ビットコインもお金になるとこぞって資金をつぎ込む中国は半端ないな。
Bitcoin採掘の7割を中国が占め、元開発者が「実験は失敗だった」と表明 - Gigazine
by k1segawa | 2016-09-17 23:35 | Comments(0)
さてマイコンのタイマーがPCのタイマーとは感覚が違う事がわかった。

PC:目覚まし時計のイメージ。自然の時刻を参照するので時分秒で設定したり、現在の時刻が参照できる。
マイコン:ストップウォッチのイメージ。マイクロ秒のレベルで動き、自分でスタートさせる。直接参照しても細かすぎて意味無いのでハードウェアのマイコン内部の別の値を設定して、それと比較して一致や越えたらPinをON/OFFさせて外部へ知らせたり、割込みベクタに飛んだりする機能を使う。

では割込みはというと、その種類で決まった割込みテーブルへ飛ぶだけなので、その種類が内部のイベントなのか外部のイベントなのかが重要。内部ならタイマーのオーバーフローや内部の値OCR0A/BなどのI/Oレジスタとの比較、外部ならPinのON/OFF。

内部割込みはオーバーフローであってもミリ秒レベルで発生するので信号を作るのには使えるが、それ自身が処理のきっかけとしてはちょっと。なので、その短さを利用して定期的にPinをチェックしたりするのに使うとよい。外部周辺回路としてリアルタイムクロックを追加すれば目覚まし時計が出来るが、内部クロックだけでは工夫して使わないと難しい(BASCOMはある)。
なのでマイコンの機能として直接使える割込みは外部のPinがON/OFFを検知して何かする割込み。
その割込みにもATtiny13ではINT0とPCINTという2つがある。
INT0は標準的な外部割込みで、PCINTは設定すれば使えるといった感じ。
詳しくは次回以降。ここではまず、内部割込みについてテストする。

タイマー割込み:
内部割込みの代表的なものとしてタイマー割込みがある。またATtiny13には無いがその他にマイコンによってシリアル通信の完了やEEPROMの書込み完了など時間のかかる内部処理をレジスタで知らせる割込みがある。
1.オーバーフロー
標準的な割込みでタイマーが8ビットなら255を越すと発生する。

ソース:
'****************************************
' Copyright (c) 2016 k1segawa
' License : free
' Program : Internal Interrupt Control(Timer Over)
'****************************************

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16

Config Portb.0 = Output
Config Timer0 = Timer , Prescale = 1024 ' REMEMBER comma !

On Timer0 Isr
Enable Timer0
Enable Interrupts

Do
Loop

End

Isr:
Toggle Portb.0
Return
' History
' [2016/09/16]
' URL:http://bbradio.sakura.ne.jp/avr_timer2/avr_timer2.html
最初Prescale の前の,(コンマ)を忘れて動かなかったため悩んだ。コンマが無いと= 以降の書式として捉えられて別パラメータにならないらしい。フォートラン言語でコンマ(カンマ)区切りを忘れてFORループが正しく動かなくてロケットが落ちたという歴史的事象があったが、本当に困る。コンマ重要。
a0034780_07554354.jpg
で、1024分周で9.6MHzだと256回に一回PB0につないだLEDがON/OFFする。
(1024*2)*256/9600000=0.0546秒でだいたい55ミリ秒毎か。オシロスコープの様子も示す。プローブはいつものように抵抗をはさんでつなぐ。赤をPB0とLEDの間に、黒をGNDと抵抗の間にそれぞれつなぐ。
a0034780_16140387.jpg
矩形波の幅が左に57.0 , 17.55 Hzと出ており、一目盛り20.0mSEC/Dとグラフ外の右下に出ているので57ms。矩形波は50%のPWMの感じ。LEDは高速で点滅している。内部割込みの一つ、タイマーオーバーフロー割込みがこんな所。「Timer0のブロック図」では、Enable Timer0と書くとオーバーフロー割り込みが有効になるらしい。さて次はEnable OC0A/B(比較一致割込み)かな。
by k1segawa | 2016-09-15 20:56 | arduino, AVR | Comments(0)
タイマーの波形発生機能だが、前記事では、

1. TIMERモード (タイマー 0)
★Config Timre0 = Timer , Prescale = …
⇒システムクロックによる矩形波発生

を行ったが、同BASCOM-AVRの説明をされているサイト様の「ハードウェア タイマーの使用方法」の、

2. COUNTERモード (タイマー 0)
★Config Timer0 = Counter , Edge =…
⇒カウンター0 外部クロック入力による矩形波発生

は例「(プログラム例)・ATtiny2313を使用し、PD4 [T0] ピンから入力したパルスを、1/100してPB2 [OC0A] ピンから出力します。」を、ATtiny2313→ATtiny13に置き換えるなら次のようになると思われる。

ソース:
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16
Config PORTB.2 = Input ' [T0] ピンを入力に設定。
Config PORTB.0 = Output ' パルスの出力ポート[OC0A] を出力に設定。
Config Timer0 = Counter , Edge = Rising , Clear Timer = 1 _
, Compare A = Toggle
Ocr0a = 49 ' 100 ÷ 2 = 50カウント - 1
End
実際にはT0であるPB2へ、外部のマイコン等から5Vの矩形波信号発生するPinをつなぎ、GNDとGNDをつながなければ確認できないので、例えばATtiny13を2つ買って一方をそういうプログラムを書き込んでつなぐしかない。
そうすれば、入力波形をCounterモードでn倍化した波形を出力する事が割込みじゃなく出来るという事になる。
タイマーって割込み使わなくてもいろいろ出来るな~
※ちなみにAとBは両方とも動くのを確認している。ConfigはBもサポートしているらしく、あとは直接I/Oレジスタに代入だから動いているのか。この後の割込みではBはBASICの文法だけでは動かなくなっていく(2016/9/19追加)。
あと割込みでは$hwstackは32バイト使うのでこれ以上は小さくできないようだ(サイト様のどこかに記述あり)。

by k1segawa | 2016-09-15 18:37 | arduino, AVR | Comments(0)
タイマーと割込みはマイコンによって色々違うが、AVR系はだいたい同じらしい。大体同じといっても数や有り無しが違い、ATtiny13では、割込みには内部と外部の2種類ある。
BASCOM-AVRの説明をされているサイト様の「ハードウェア タイマーの使用方法」がとても丁寧で全体を網羅しており、まずはここを読むべき。
ATtiny13はタイマーが1つしかなくそれも8ビット。Timer0と言う。サイト様の「Timer0のブロック図」を見るとTimer0にはオーバーフロー割込み(>255)とOC0A/Bへの比較一致割込みの2つの内部割込みがある。「タイマー」という機能の中に「タイマー割込み」と「波形発生」という機能があり、「割込み」機能の中の内部の割込みの一つとして、タイマー割り込みがある。内部割込みには他にウォッチドック、外部割込みにはリセットなどがある。
[機能]
+タイマー
---+Timer0
-------+タイマー割込み
-------+波形発生
+割込み
---+内部割込み
-------+ウォッチドック
---+外部割込み
---+リセット(外部割込みの一部だが)
こんな感じか。分類はいい加減だが。

割込みは〇〇割込みという何かのきっかけで発生し、タイマー波形発生はタイマーとOC0A/Bという内部I/Oレジスタ(かな?)でPinを任意の周波数でON/OFFする。割込みとタイマーは別の機能だ。
具体的には割込みは発生したら、あらかじめ決めておいたベクタに飛ぶ機能。
で、タイマーについて。
「Timer0のブロック図」を見ると、波形を発生させる機能は、
PWMは以前試した通り、タイマーとPWMで決めた値で比較しPinをONする。タイマーオーバーフロー時にOFF。決してタイマーオーバーフロー時に割り込みを発生させてOFFにしている訳では無い事に注意。そうやってデューティ比を色々変えた矩形波を発生させている。
それと同じで、波形発生も決して割込みで波形を発生させているのではなく(すぐ上に割込みも書いてあるが)、ハードが自動的ににOC0A/B I/Oレジスタに対応したPinをON/OFFしている。こちらは通常の矩形波でデューティ比で言えば50%のPWM。
PWMもOC0A/Bも発生できるのは矩形波であって三角波やサイン波ではない。

ソース:
'****************************************
' Copyright (c) 2016 k1segawa
' License : free
' Program : Wave Control
'****************************************

$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16

Config Portb.1 = Output ' DDRB |= (1<<pb0)
Config Timer0 = Counter , Prescale = 1024 , Clear Timer = 0 _
, Compare B = Toggle
OCR0B = 124 '255 124

Config Portb.0 = Output ' DDRB |= (1<<pb0)
Config Timer0 = Timer , Prescale = 1024 , Clear Timer = 0 _
, Compare A = Toggle
PWM0A = 124 '255 124

End
上記の通り、Timer0(TCNT0と同じ)が124と一致したらOCR0Bに対応するOC0BピンをON/OFF(トグル)する。ただしOCR0A/Bはどちらか一方しか使えない。なぜなら比較するタイマーがTimer0ひとつしかないから。
そしてサイト様の通りTimer0=Timer/Counterは区別されない。Counterの機能はEdge=と記述して初めて機能する。ここではPrescale=と記述しているのでタイマーのカウントの基準となるクロックとしてシステム内部クロックを使う。脱線するならEdge=と書いた時はT0からの外部クロックを使う(ひょっとしたらXTAL1/2かも)。
さらにTimer0をTCNT0、OCR0AをPWM0Aと置き換えられるのは純粋な代入文の時だけ。Config文や他の構文では置き換えられない。
このようにタイマーには波形発生という割込みを使わないで矩形波を出す機能があり、もちろん割込みで飛び先の処理でPinをON/OFFしても作れるが、マイコンにはこういう機能が元々あるのだ。
まだタイマー割込みについては説明していない。PWMはタイマーのオーバーフローも利用するが割込みではない。

by k1segawa | 2016-09-13 19:48 | arduino, AVR | Comments(0)
以前PWMを8/21にarduinoIDE8/25にBASCOM-AVRの記事として2箇所で書いた。
その意味をよく理解していなかった。
デューティ比(ローマ字でdhuと入力するのも知らなかった:MS IME)というのは、矩形波に対して、1周期のうち、HIになっている部分の比率。
デューティ比=100%はHI=100%の矩形波。
デューティ比=50%はHI=50%,LOW=50%。
デューティ比=25%はHI=25%。
a0034780_23434342.jpg
PWMを実現する方法を考えると、タイマーが0からカウントアップしていき、ある値を超すとピンをHIにする。その後タイマーがオーバーフローすると、ピンをLOWに戻す。このピンをHIにするタイミングを指定するわけで、その間はLOW期間だ。PWMで指定する時間というのは”LOW”の期間なのだ。
a0034780_00331235.jpg
つまり、デューティ比25%のPWMを指定する時、LOW期間75%を指定する。
PWM0Aを0~255に変化させると、LOWの期間が0~255に変わるのだからHIは逆に255~0になる。デューティ比は100~0%に変わる。
以前のソースを示す。

ソース:
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16

Config Portb.0 = Output
Config Timer0 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down

Dim I As Byte
Do
For I = 0 To 255
Incr Pwm0a ' = Pwm0a + 1
Waitms 10
Next I
Loop
End
このままだと、オシロスコープでもHIの期間が段々減っているのか逆なのかよくわからない(後述するが、Waitms 10を変えたり、Prescale=1↔64もやったりした)。
なので、Incr Pwm0a→Pwm0a = 191(192-1)に変える。
(191+1)/(255+1)=3/4で、LOWの期間が3/4だから1/4だけHIの矩形波になる。
a0034780_22155094.jpg
オシロスコープの図で左隅が原点0msであり、最初の矩形がHIになる所は図には無いが2.09ms、HIが終わる所が2.96ms、次のHIになる所は5.58ms。
つまりHIの期間は2.96-2.09≒1ms、矩形波全体は5.58-2.09≒4ms。HIが1/4の期間になっている。PWM0Aを255にした時LEDが真っ暗になったからん?と思ったことから気が付いた。254にすると、オシロスコープに一瞬パルスが出てあれ逆かと思いそれでタイマーのカウントアップとPWM0Aとの比較を考えて思い至った。
254をLEDの明るさで判断するのは微妙で難しい。オシロスコープならちょっとの違いも明らかにしてくれる。
ほんと、普段から意識してないと忘れそうだ。違う分野を覚えておくのはすぐ見れる自分メモでも持っておく必要がありそうだ。

本来Waitms 10やPrescale=1↔64は関係ない。なぜならPWMというのはプログラムでWait(=LOWか?←わかってないからこんな考えになる)したからどうなるものでもなく、ハードがソフトとは別に裏で自動的にやってることなのだ。Prescaleもものすごくハード(周期)が遅くなれば目に見えてくるかもしれないが、64ぐらいではLEDの明るさに影響したり、ソフトオシロごときで測れる範囲には入ってこないのだ。
by k1segawa | 2016-09-12 22:21 | arduino, AVR | Comments(0)
前々記事で「ハンディ・オシロスコープ」をWindows10 64ビットで動かしたが、基本的な使い方がよくわかっていない。
a0034780_23425325.jpg

PWMの矩形波が段々0~255(ATtiny13が8ビットタイマーなので)の幅で徐々にデューティ比が100~0%に短くなっていく(PWM0AがHIになる時刻を決めてる)ことしかわからず、Prescale = 1→64もなんでこうすれば表示できたかもよくわかっていない。たぶん9.6MHzの分周比64だとタイマーが64倍になって計測できるようになったんだと思う。

そこでハンディ・オシロスコープの[メニュー][較正]を行ってみる。
少ない経験からオシロスコープというのは較正というのを行い、プローブの0V 時の電圧を初期化してやらないといけないらしい。とりあえず基本的な事としてそこから始めてみよう。

較正に使うのは、前々回用意したステレオのオス-オスの3.5mmプラグのみ(前々回参照の自作したau-プラグがステレオなのに、簡易プローブのはんだ付けは一方しかつないでないので、モノラルだとつながらないかもしれない)。
a0034780_23332323.jpg
そしてICクリップによるプローブの自作がこれ。100均の携帯用プラグを再利用したもの。
a0034780_22272281.png

1.ハンディ・オシロスコープの画面を出来るだけ全画面にする。そして[メニュー][較正]を選ぶ。
a0034780_23175875.jpg
2.PCのスピーカーから、低音が出るが、とりあえず無視する。
3.PCのスピーカー以外のMIC入力とヘッドフォン出力(だいたいPCの前面に🎤と🎧(環境依存文字なので出ないかも)がある)を、そのケーブルでつなぐ。この時点かどうかわからないが、音がスピーカーからマイクへ流れて聞こえなくなるはず。
4.[電圧値の較正][開始]ボタンを押す。「出力関係のボリュームがすべて最大であることを確認して下さい。波形が歪まないように入力のボリュームを調整して下さい。」とメッセージ画面が出るので、PCのボリュームをサウンドのプロパティから最大にする(色んなドライバによって画面は違うがだいたいタスクバーのスピーカーアイコンを左クリックして最大音量にするか、右クリックして再生タブ内のスピーカーのプロパティからレベルタブで音量を最大にする)。
a0034780_23185492.jpg
a0034780_23442731.jpg
5.上(CH0)の画面の真ん中に、緑色の水平な直線とその上を波打っている色の濃い線があるので、そのメッセージ画面はそのままにして、その波形が見えるように縦のスライドバーを少し移動する。歪んでいなければ特に戻さなくてもそのままでよい(歪んでいたらPCのサウンドのプロパティの録音タグでレベルを調整する必要がある)。2つ目の[oscillator](発信器)というタイトルの画面の色々なパラメータは次で調整するので特に変更しない(sine wave volume=5 Pan=0, Freq-周波数=100,L-Right音の左右のバランス=中央,L-High音量=High Max,1-11周波数の下の桁=10,10に丸 周波数上の桁=10Hz)。今の音は10Hzで最大音量でサイン波が出ている。
a0034780_2348854.jpg
a0034780_23494192.jpg
6.「出力関係~」のメッセージの方の画面の[OK]ボタンを押す。「I 上画面で緑の水平カーソル(shift+マウスの左ボタン)を波形のピークに合わせて下さい」と出るので、縦のスライドバーを波形の高さがが見やすくなるまで移動して、十分な高さにする。
a0034780_23562460.jpg
a0034780_23544692.png
7.shift+マウスの左ボタンを押すと点線の水平線が表示されるのでそれを波形の上の山の頂上に接するように移動させる。
a0034780_23595892.jpg
8.数字が0.0407などと表示されるのでその数字を「右の欄にピークの正しい値をmV単位で指定して下さい」の入力欄に40.7などと入力する。表示されているのはV単位なので。
a0034780_041464.jpg
9.チェックボックスを2つともONにして[OK]ボタンを押すと、「この較正値に変更しますか?」と出るので[OK]ボタンを押す。
a0034780_051199.jpg
再び[電圧値の較正][開始]ボタンを押し、同じ事を下(CH1)でも行う(が、ウィンドウの下に隠れているので、タスクバーから「構成する」というタイトルのウィンドウを呼び出す)。

10.次に[周波数目盛りの調整]を行う。
a0034780_0112796.jpg
11.[周波数目盛りの調整][開始]ボタンを押すと、メッセージ画面「出力端子と入力端子が接続されていることを確認してください・きれいなサイン波形になるように発信器のボリュームを調整して下さい」と出るので、[OK]ボタンを押す。
a0034780_0122472.jpg
12.波形が太いのから細いのまで少しずつ自動的に変化(10→100→1000など)するので少し放置しておく。この時波形が画面外まで高くなるようなら、2つ目の[osillator]画面のvolumeを右半分の方の横スライドバーで小さくする。
a0034780_0164520.jpg
13.しばらくすると「終了しました 現在の値 A=0.17301 , B=0.11599 今回の値 A=-0.26757 , B=0.11626 この較正値に変更しますか?」などと出る(値は適当)ので、[OK]ボタンを押す。
a0034780_017812.jpg
CH1の[電圧値の較正]の後に必ず[周波数メモリの調整]を行わないと、あとで[メニュー][発信器]でテストする時にFFTが選べなくなるので注意。

14.もう一つ[チャンネル-1時間軸調整]というのがあるが、今回は1つそれもCH1の方にしか端子をはんだ付けしてないので0のまま実行ボタンを押す。ステレオ端子の2つともプローブをはんだ付けしたらこれを-1,0,1のいずれか(たぶん0)にして実行を押す。波形がバタついているが、freq=周波数が1000に丸が付いているためで、10に変えれば落ち着く。[閉じる]ボタンを押して[較正]画面を終了する。

15.これで較正は終わり。使い方に慣れるためにも[較正]を何回かやるとよい。そしてケーブルを抜く時は忘れずにPCの音量を100%から下げる事。MICの方はこのあとPWMや新しくSOUND命令でテストするのでそのまま。

テスト:
スピーカー端子から抜いたケーブルを再び差して、PCの音量は100%に戻し、[メニュー][発信器]から[oscillator]画面を呼び出す。
sine wave , volume=2 , Pan=0 , Frequency(周波数)=100(Hz)になっているので、[Play]ボタンを押す。
a0034780_0343944.jpg
オシロスコープの画面に波打つ波形が表示される。適当に縦スライドバーを調整する。すぐ下のFFTというチェックボックスをONにすると、反対側に周波数100Hzの所にピークがあるとんがった解析結果が表示される。その画面でマウスの左ボタンをクリックすると縦の点線が出るので、ボタンを押したままピークの頂点に線を移動させると、102.3 (約100Hz)などと数字が表示される。右ボタンで2本目が表示され、その場で右ボタン再クリックで消去(左ボタンクリック後なら左ボタン)する。線の間が時間でms(ミリ秒)で、高さが電圧でV。今の状態で格子枠が横20ms x 縦40mV(-40.1e+00)になっている。 右下グラフ外の20mSEC/Dなどという表示がそれ。その左隣のHan 218.2Hz/Dは下のグラフの格子枠の横幅を示す。波を停止させるのに、下の[Pause/Logging]のトグルボタンを押す。サイン波の1周期分(谷から谷)を縦の線2本で挟むと左の方に10.0 , 100.00 Hzなどと出て100Hzのサイン波という事がわかる。終了は[ocsillator]画面で[Stop]ボタン、[Close]ボタンを押す。
a0034780_1173287.jpg


BASCOM-AVRのコマンドのSOUNDを使うテストは、(PCの音量が100%になっていないことを確認してから)スピーカー端子につないだケーブルを外し、自作した簡易プローブにつなぐ。

ソース:
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16
Config Portb.4 = Output
Do
Sound Portb.4 , 10 , 8000 '10=100ms, 8000=100Hz
Wait 1
Loop
End
回路:
PB4とGNDを抵抗1kΩ程度に変えて、圧電ブザーをPB4と抵抗につなぐ。
PB4 -①- 圧電ブザー -②- 1kΩ - GND
圧電ブザーは無くてもかまわない。音が聞こえないだけなので。代わりに②を1kΩの右に変える。①と②にそれぞれ赤のプローブ、黒のプローブをつなぐ。
a0034780_147299.jpg
オシロスコープには一瞬矩形波が流れて表示される。
[P-Trig(T)]ボタンを押すと波形が止まる。
マウス左クリックで縦線を表示させて、線を移動させる。shift+で横線だ。左端が0msの原点で、最初の矩形が始まるところ(立ち上がり)が図には無いがもうすでに2.3ms経過している。矩形の波形が終わる所が90.35+10(斜めの前の水平部分)=100.35ms。だいたい100ms経過している。ソースで10=100msとコメントした所だ。1個分の矩形の幅を2本の線で挟むと、97.08 Hzと出る。だいたい100Hzという所。ソースで8000と書いてある値だ。横線で矩形のトップとボトムを挟むと電位差で0.2333V。ブザーにもよる。
BASCOM-AVRの解説をされているサイト様のSOUND命令の説明によると、8000=9.6MHz/(100Hz*12)だそうだ。
スピーカーや圧電ブザーからは低いぶつぶつした音が1秒おきに鳴る。10→100、8000→800にすれば例の通り。
a0034780_1544134.jpg

by k1segawa | 2016-09-09 20:50 | arduino, AVR | Comments(0)