前々回、
前回で作成したSH7125のPWM機能を試します。
※2017/05/02 説明内のフォルダ名が間違っていたので修正しました。
ファイルはとりあえず
汎用IO設定ソース:
io_setup.c 汎用IO設定ヘッダ:
io_setup.h PWM設定ソース:
intMTU.c PWM設定ヘッダ:
intMTU.hの4つを使います。
プロジェクトの準備~ビルド
とりあえず付属CDのコンパイル編に従ってプロジェクトを作ります。
1)HEWを起動・新規プロジェクトワークスペースの作成
ワークスペース名:sh7125_PWM_test(任意で構いません。
ワークスペース名に半角カッコ()を使うと動かない事があります。)
プロジェクト名:sh7125_PWM_test(ワークスペース名と同じでOK)
ディレクトリ:標準設定では「C:\WorkSpace」内に作成されます。
CPU種別、ツールチェイン:SuperHって名前が入っている方。多分標準で選択されているはず。
この項はこれでOKです。
次のページ
CPU:使用するCPUとC言語を機械語に変換する機能(ツールチェイン)を選択します。
ツールチェインバージョン:標準選択で構いません。
インストールしたHEWのバージョンで多少違います。CPUシリーズ:SH-2
CPUタイプ:SH7125
以降は標準選択を使用するので
完了ボタンでもOKです。
オプション:よく分かりません。標準選択で構いません。
生成ファイル:よく分かりません。標準選択で構いません。
標準ライブラリ:多分使用したいライブラリの選択です。標準選択で構いません。
スタック領域:多分メモリ関係の設定です。標準選択で構いません。
ベクタテーブル:よく分かりません。標準選択で構いません。
デバッガ:シミュレータデバッガ関連の様ですがよく分かりません。標準選択で構いません。
生成ファイル名:自動生成されるファイル一覧が表示されます。とくに選択する要素はありません。
2)ファイルの追加
一旦HEWは置いておいてプロジェクトを作成したフォルダを開きます。
今回の設定では C:\WorkSpace\sh7125_PWM_test です。
sh7125_PWM_testフォルダの中にsh7125_PWM_testフォルダがあるので開きます。
ここにダウンロードしたファイル4つを入れます。
3)ファイルの登録
HEWに戻って操作します。
メニューよりプロジェクト→ファイルの追加
作成(ダウンロード)したファイル4つを登録します。
1つづつ登録しても、4つまとめて登録してもどちらでも構いません。
4)ファイルの編集1:割り込み機能の有効化
ファイルが追加できたところで、割り込み関数を登録します。
左側の一覧の「C source file」より
resetprg.cを開いて編集します。
36行目付近
#define SR_Init 0x000000
F0
を
#define SR_Init 0x000000
00
へ変更します。
5)ファイルの編集2:割り込み関数の登録
ファイルが追加できたところで、割り込み関数を登録します。
左側の一覧の「C source file」より
intprg.cを開いて編集します。
195行目付近
void INT_MTU2_0_TCIV0(void){
/* sleep(); */}
を
void INT_MTU2_0_TCIV0(void){
MTU20_INT_OVF();}
へ変更します。
6)ファイルの編集3:メインファイルの編集
続いてメインファイルを編集します。
sh7125_PWM_test.cを開いて中身をまるごと書き換えます。
#include "io_setup.h"
//汎用IO機能の読込#include "intMTU.h" //PWM機能の読込void main(void){
hardware_setup();
//汎用IOの初期化 Init_MTU(); //PWM機能の初期化 while(1){
if(get_sw1()){
//スイッチで出力を切り替える set_pwm( PWM_PE0 ,
50 ); //PWM出力:ポート、出力 0-1023 set_pwm( PWM_PE1 ,
100 ); //PWM出力:ポート、出力 0-1023 }else{
set_pwm( PWM_PE0 ,
200 ); //PWM出力:ポート、出力 0-1023 set_pwm( PWM_PE1 ,
400 ); //PWM出力:ポート、出力 0-1023 }
// end if }
// end while}
これでPWMを使用する準備ができました。
ビルドしてエラーが出なければ成功です。
Cannot find "C" specified in option "start"との警告が出ます。
Interface様の2006/05/17(水)の項に解説と対処法がありました。
http://www.cqpub.co.jp/interface/editors/yamaguchi/
書き込み~動作確認。
書き込んで実行します。
書き込んで実行してください。
LEDの赤と緑が微妙に光っていれば成功です。
SW1を切り替えるとLEDの明るさが変わるはずです。
また、電源を入れた状態でボードを振ると2色のLEDが点滅していることが確認できます。
SW1を切り替えるとデューティー比が変わるので点灯時間が変わる事が分かると思います。
AD変換とPWMを組み合わせる
AD変換の回で作成したプログラムと組み合わせてみます。
ファイルは
AD変換設定ソース:
ADConv.c AD変換設定ソース:
ADConv.hの2つを追加します。
追加方法はPWMのファイルと同じです。
組み合わせ1
メインファイルを下記に変更します。
#include "io_setup.h"
//汎用IO機能の読込#include "intMTU.h"
//PWM機能の読込#include "ADConv.h" //AD変換機能の読込void main(void){
hardware_setup();
//汎用IOの初期化 init_MTU();
//PWM機能の初期化 init_ADC(); //AD変換機能の初期化 while(1){
check_ai(); //AD変換を実行 set_pwm( PWM_PE0 ,
get_ai(0) );
//PWM出力:ポート、出力 0-1023 set_pwm( PWM_PE1 ,
get_ai(1) );
//PWM出力:ポート、出力 0-1023 }
// end while}
※2016/12/20に公開したAD変換の初期化関数名を
Init_ADCから
init_ADCへ変更しております。
これでPF0、PF1に接続した可変抵抗のAD変換値に反応してLEDの明るさが変わるようになります。
組み合わせ2
メインファイルを下記に変更します。
#include "io_setup.h"
//汎用IO機能の読込#include "intMTU.h"
//PWM機能の読込#include "ADConv.h"
//AD変換機能の読込void main(void){
short out=0; hardware_setup();
//汎用IOの初期化 init_MTU();
//PWM機能の初期化 init_ADC();
//AD変換機能の初期化 while(1){
check_ai();
//AD変換を実行 out=(get_ai(0)-512)*2;
//AD変換値を -1013 - 0 - 1013 に変換 set_pwm2( PWM_PE0 ,PWM_PE1 , out ); //PWM出力:ポートA,B、出力 -1023-0-1023 }
// end while}
これでPF0に接続した可変抵抗のAD変換値に反応して2つのLEDの明るさが排他的に変わります。
関連:
当ブログで扱うSH7125の特殊機能一覧