人気ブログランキング |

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

Japanino ArduinoISPで ATtiny13 で 内部割込みと外部割込み (14) (9/16)

さてマイコンのタイマーが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ループが正しく動かなくてロケットが落ちたという歴史的事象があったが、本当に困る。コンマ重要。
Japanino ArduinoISPで ATtiny13 で 内部割込みと外部割込み (14) (9/16)_a0034780_07554354.jpg
で、1024分周で9.6MHzだと256回に一回PB0につないだLEDがON/OFFする。
(1024*2)*256/9600000=0.0546秒でだいたい55ミリ秒毎か。オシロスコープの様子も示す。プローブはいつものように抵抗をはさんでつなぐ。赤をPB0とLEDの間に、黒をGNDと抵抗の間にそれぞれつなぐ。
Japanino ArduinoISPで ATtiny13 で 内部割込みと外部割込み (14) (9/16)_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)