人気ブログランキング |

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

Japanino ArduinoISPで ATtiny13 で タイマーで矩形波発生 (12) (9/15)

タイマーと割込みはマイコンによって色々違うが、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)