便所の落書き

電気の知識を赴くままに...

PSoCの割り込み処理記述

他にも良いやり方があるのかもしれない。
 
 
 

リファレンスに割り込み処理について書かれたものが見当たらなかったので,明治大学さんの解説資料を参考にしてまとめる。

今回はUARTのRXRegisterFull割り込みを例に設定する。
 
前もってやっておくこと:
・UARTの設定をChip Editerで一通りやっておく
・mainファイルには何も書かず,Buildする
 
Chip Editerタブに切り替え,Workspace Explorerウィンドウの中からSource Files\boot.asmファイルを開く。
そこで,検索ツールを使うなりして,「Interrupt Vector Table」のところまで飛ぶ。
(95行目あたりにあったりなかったり)
 

f:id:ENOTYAMA:20140303233308p:plain

 
そこから下に「Insert your custom code below this banner」ってある。上の画像にもちらっと写ってたり。
で,その下から割込みベクタが色々書いてあるが,一番上に
     org     04h
     halt
とある。これは,電源電圧が低すぎる状態になるとプログラムを非常停止するものなのかな?よく分からん。
少し下に行くと,
     org     08h                         ;analog Column 0 Interrupt Vector
     // call     void_handler
     reti
がデフォルトなら書き込まれてある。これは見た感じ,analog0の割込みベクタのようだが,コールの記述が打ち消されている。まだ,使うように設定されていない。
 
そこからまた下の方に行くと,
    org   2Ch                      ;PSoC Block DCB03 Interrupt Vector
    ljmp _UART_1_RX_ISR
    reti
とある。これは,UARTモジュールを設定したので書き換えられたものと推測される。
この「_UART_1_RX_ISR」をどこかにメモっておこう。
 
今度は,lib\Library Source Files\UART_1INT.asmを開いて,さっきメモった文字列を検索する。
 

f:id:ENOTYAMA:20140303233317p:plain

 
赤で示したところで,
     Insert your custom assembly code below this banner
というところがあるので,その下の青いところに
     ljmp    _ (interrupt vector name)
を入力する(括弧のところは,わかりやすい割込み名を入れておいた方が良い。先頭のアンダーバーは必ず入れてておかないとダメ)。
 
次に,main.cファイルを開いて,プリプロセッサ
     #pragma interrupt_handler     (interrupt vector name)
を追加する(こっちでは,先頭のアンダーバーは入力しない)。
あとは,割込み関数を書いていくだけ。書式は,
     void (interrupt vector name) (void)
     {
          // interrupt process
          return ;
     }   
簡単やね。
 
あとは,割込み関数に割込み禁止・許可の命令も忘れずに書いておいて,完成!!