人気ブログランキング |

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

2016年 09月 19日 ( 3 )

外部割込みの拡張外部割込み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)