Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
組み込みソフトウェア工学
第7回 組み込みプログラム例題
MPLAB X と XC8 は DL 済みですか?
MPLAB とXC8 はインストール済ですか?
本日の講義
� 組み込みプログラム例題
� CONFIG 設定
� LEDの点灯
� SWの ON/OFFの判断� チャタリング
� 無限ループの使い方(OSなしの場合)
� プログラムの作成とコンパイル
� 複数ファイルのコンパイル
� MPLAB のコンパイル作業例
PIC における CONFIG の設定PICの
CONFIGレジ
スタは特殊で,
直接プログラ
ムができない
ため,プログラ
ム書き込み時
にメモリに直接
データを書くよ
うな指定をする
↓
CONFIG命令
#include
#include
#include
#include "lcd_disp.h"
#include "sensor.h"
/* CONFIGRATION */
__CONFIG(
FOSC_INTRC_NOCLKOUT
& WDTE_OFF
& PWRTE_OFF
& MCLRE_ON
& CP_OFF
& CPD_OFF
& BOREN_OFF
& IESO_OFF
& FCMEN_OFF
& LVP_OFF );
__CONFIG(WRT_OFF & BOR4V_BOR40V);
CONFIG1 の設定
CONFIG2 の設定
PIC の色々なピンや構造体などの情報がある
#include の直ぐ下に記述
仕様書 p.206 仕様書 p.206
LED の点灯
CPU
① CPU から電流を流す場合
② 流れ込む電流をトランジスタで受ける場合
CPU
IO を「1」にすると LED が点灯する
・IO が大量の電流を流すことか可能か?
IO を「1」にすると LED が点灯する
・IO はあまり電流を必要としない
SW と共用の LED
通常のLED
RB0 - 7
RD0 - 5RD0 - 5RD0 - 5
実習用ボードの場合
RC5
RBx
・RC5 を out で 「0」に設定
・RBx を in に設定
・SWx を押すと LED が点灯
RD0-5
実習用ボードには LED が下記の2種類存在する
SWx
・RD0~5 を out に設定
・RD0~5 を「1」にするとLEDが点灯
・RD0~5 を「0」にするとLEDが消灯
LED と PORT の関係
7 6 5 4 3 2 1 0
PORTB
7 6 5 4 3 2 1 0
PORTD
LED #1 #2 #3 #4 #5 #6 #7
LED #8 #9 #10 #11 #12 #13
bit 7 ~ 1までが LED
で使われている
なお,SW1~7と共用
bit5 ~ 0 が LED で
使われている
SWの ON/OFF 判定について
while(1)
{
:
if ( SWxが押されたとき )
SW処理
:
}
SW を押ししている間,if
文の中の「SW処理」が何
回も実行されてしまう
SW を押した時に1回しか
実行しないようにするには
どうすれば良いか?
SW の ON/OFF 判定について
� SW の ON の判定
if (SWxが押されている & SWx Flag = 0 )
SWx Flag = 1
� SW の OFF の判定
if (SWxが押されていない & SWx Flag = 1 )
SWx Flag = 0
SW 1 ~ 7
実習用ボードの場合
RC5
RBx
RCx
・RBxおよび RCx を in に設定
・SWx を押すと RxDATAに SW の状況が入る
実習用ボードには SW が9個存在する
SW 1~7
SW 8,9
Pull-UP抵抗
char sw_status; /* 現在の SW の状況 */
int sw[10]; /* SW の状態 */
:
while(1) {
sw_status = PORTB;
/* SW1 */
if ( (sw_status & 0x80)==1 && sw[1]==0 ) {
sw[1] = 1;
}
/* SW2 */
if ( (sw_status & 0x40)==1 && sw[2]==0 ) {
sw[2] = 1;
}
:
}
SW を押したことを検出
char sw_status; /* 現在の SW の状況 */
int sw[10]; /* SW の状態 */
:
while(1) {
sw_status = PORTB;
/* SW1 */
if ( (sw_status & 0x80)==0 && sw[1]==1 ) {
sw[1] = 0;
}
/* SW2 */
if ( (sw_status & 0x40)==0 && sw[2]==1 ) {
sw[2] = 0;
}
:
}
SW を離したことを検出
SW と PORT の関係
7 6 5 4 3 2 1 0
PORTB
7 6 5 4 3 2 1 0
PORTC
SW #1 #2 #3 #4 #5 #6 #7
SW #8 #9
bit 7 ~ 1までが SW
で使われている
bit 1 と 0 のみが SW
で使われている
Pull-up,チャタリング
H
L
High でも Low でも無い(不定)
Pull-up とは線上の信号レベルを
基本的にHigh レベルにはっきり
させておくために用意する抵抗
これが無いと線上の信号レベル
が不定な状態になる場合がある
ディレイ方式
int sw_status; /* SW の状況 */
while(1)
{
:
sw_status = read_sw_status( );
if ( sw_status == ON )
{
delay_time( 1ms );
sw_status = read_sw_status();
}
:
}
OFF の場合は ON を OFF にする
ここでは SW 用の Flag は無視している
サンプリング方式
int sw_status; /* 現在の SW の状況 */
int sw_number = 0; /* SW が ON になった回数 */
int sw_on = 0; /* SW の ON/OFF の確定用変数 */
while(1)
{
:
sw_status = read_sw_status( );
if ( sw_status == ON ) {
sw_number ++;
}
else {
sw_number = 0;
}
if( sw_number >=3 ) {
sw_number = 0;
sw_on = 1;
}
:
}
OFF の場合は ON を OFF にする
OFF の場合は 1 を 0 にする
ここでは SW 用の Flag は無視している
本日の講義
� 組み込みプログラム例題
� CONFIG 設定
� LEDの点灯
� SWの ON/OFFの判断� チャタリング
� 無限ループの使い方(OSなしの場合)
� プログラムの作成とコンパイル
� 複数ファイルのコンパイル
� MPLAB のコンパイル作業例
Idle
Power
ON
初期化
Reset
SW1=1SW1=1
FAN制御 風量変更 方向変更
設定温度
変更
LCD表示
設定温度と
測定温度と
の差の確認
電流測定温度測定
SW1=1
FAN_ON=1
FAN_CNT=1
FAN_ON=0
FAN_CNT=1
IMES=1
TMES=1
CHK_TEMP=1
FAN_SENSOR=1
TINT=0
Debug
SW 制御
温度下降
温度上昇
FAN
STOP
WIND
STOP
電流超過
ERROR
表示制御
ERROR
表示
表示
ONOFF
FAN_OFF FAN_ON
NOP
NOPTIMER
TINT=1
FAN回転
の確認
WINDの
確認
FAN_ON=0
FAN_CNT=1
FAN_CNT=1
FAN_CNT=0
SW7=1
SW7=0
SW6=1
SW6=0
Rotary Encoder
LCD_DISP_ON=1
LCD_DISP_ON=0CHK_TEMP=1
CHK_TEMP=0
CHK_IMES=1CHK_IMES=0
CUR_OVER=1
SW8=1
SW9=1
SW3=1
SW2=1
SW4=1
20deg
TMES=1TMES=0
TINT=1
割込
FAN_ROT=0
FAN_ON=0
FAN_CNT=1
ERR_CNT=1
ERR_DISP=004
ERR_DISP_ON=1
ERR_CNT=1
ERR_DISP=003
ERR_DISP_ON=1
室内外機
ON室内外機
OFF
近~遠の信
号の変更FAN_ON=1FAN_ON=0
強~微弱
の信号の
変更
LCD
表示
LCD
表示
LCD表示
LCD表示LCD表示
ERR_DISP_CNT=1
ERR_DISP=001~004
ERR_DISP_ON
FAN_ON=1
FAN_CNT=1
ERR_CNT=1
ERR_DISP=002
ERR_DISP_ON=1
ERR_CNT=1
ERR_DISP=001
ERR_DISP_ON=0
ERR_CNT=1
ERR_DISP=001
ERR_DISP_ON=1
各種設
定のリ
セット
TINT=0
SW2,3,4,8,9=1
状態遷移図(クーラー)
LCD表示(通常)
LCD_DISP_ON = 0 or 1
LCD_DISP_MODE = TEMP, FLOW, DIR, POWER, SET_TEMP
LCD_DISP_DATA = 3 charactor
LCD表示 (ERROR)
ERR_DISP_CNT = 0 or 1
ERR_DISP_ON = 0 or 1
ERR_DISP = 001 ~ 004
2012/10/1 TK
void main( void ){
while(1)
{
if( 状況状況状況状況がAのとき ) {
}
if( 状況状況状況状況が B のとき ) {
}
if( 状況状況状況状況が C のとき ) {
}
}
}
初期化および割り込み処理開始
Aに対する処理
Bに対する処理
Cに対する処理
無限に
繰り返す int proc_A ( void )
{
割り込みの禁止
:
詳細処理詳細処理詳細処理詳細処理
:
割り込みの許可
return rc;
}
OSが無い機器のプログラム例
割り込み処理よって状況が変化する割り込み処理よって状況が変化する割り込み処理よって状況が変化する割り込み処理よって状況が変化する
クーラーの場合の疑似コード
while(1)
{
if( 操作パネルの変化 ) {
操作パネル用関数
}
if( 風量変化 ) {
風量変化用関数
}
if( 方向の変化 ) {
方向変化用関数
}
if (温度測定 ) {
温度測定用関数
}
if ( 電流測定 ) {
電流測定用関数
}
if ( 温度が設定を越えた && ファン停止 ) {
ファン回転関数
}
if ( 温度が設定に達した && ファン回転 ) {
ファン停止関数
}
}
割り込み処理割り込み処理割り込み処理割り込み処理
タイマー1割込関数タイマー1割込関数タイマー1割込関数タイマー1割込関数
{
if( 温度測定 == 0 ) {
温度測定 = 1;
}
}
タイマー2割込関数タイマー2割込関数タイマー2割込関数タイマー2割込関数
{
if ( 電流測定 == 0 ) {
電流測定 = 1;
}
}
操作パネル割込関数操作パネル割込関数操作パネル割込関数操作パネル割込関数
{
if( 風量ボタン == 1 ) {
風量変化 = 1;
}
if( 方向ボタン == 1 ) {
方向変化 = 1;
}
}
本日の講義
� 組み込みプログラム例題
� CONFIG 設定
� LEDの点灯
� SWの ON/OFFの判断� チャタリング
� 無限ループの使い方(OSなしの場合)
� プログラムの作成とコンパイル
� 複数ファイルのコンパイル
� MPLAB のコンパイル作業例
C言語による複数ファイルのコンパイル
yyy.c
コンパイラ
yyy.obj
コンパイラ
オプション
リンカ
PIC.h
libC言語の各種関
数のライブラリ
コンパイルする時
の各種オプション
各種ファイル
を結合する変換
xxx.HEX
xxx.c
コンパイラ
xxx.obj
実行ファイル
Hex ファイル
を書き込む
HEX ファイル
:10 0000 00 92ED73CEE943A2EFB87E3B89FEB2D26D 8A
:10 0010 00 965AC3175EF077E199BBE27692E95088 71
:10 0020 00 83DD62C6B4CA5308E78180CDF48728E8 2F
:10 0030 00 B16B70761456AA139CE4D64EEC32695A 12
:10 0040 00 BA394E06E75A2BEEEF39E5F384CF66EA 6C
:10 0050 00 76BB9E91D6D9C7C75B16EEFC0483AFE6 8C
:10 0060 00 FFA84075CA1AB10A985071E4F6B215DA C1
:10 0070 00 AEF35550ECA157649FFA31682202A995 5E
:10 0080 00 1CD23EFDA5336DC2AA6B2D869257BC22 B1
:10 0090 00 21BA9D9B9DD5E2523038A77A8ED7DFCF 0B
:10 00A0 00 D7605385BFCCE77FEC351FC2A0E7E329 BB
:10 00B0 00 97B97F5A339EEEF8D677581B8F2BD9FD 10
:10 00C0 00 FAFA84F6610EA8AA2753518167891257 5C
:10 00D0 00 D8980275F42305C0595F4D316F262085 ED
:10 00E0 00 4B47DB36D32137A92370CBA93066D214 16
:10 00F0 00 ABFE2FD4298DAE1180998DA574EF3BD1 25
:00 0000 01 FF
16進数が ASCII Code化さ
れている
このファイルが PIC に書き込
まれる
PICにおける複数ファイルのコンパイル
本日の講義
� 組み込みプログラム例題
� CONFIG 設定
� LEDの点灯
� SWの ON/OFFの判断� チャタリング
� 無限ループの使い方(OSなしの場合)
� プログラムの作成とコンパイル
� 複数ファイルのコンパイル
� MPLAB のコンパイル作業例のコンパイル作業例のコンパイル作業例のコンパイル作業例
コンパイル作業例の流れ
� MPLAB X の起動
� PICkit3 の接続(USBポートへの接続)
� プロジェクトの新規作成
� テストコードの追加
� ビルド作業
� ボードへの書き込み
MPLAB X の起動
MPLAB X IDE のアイ
コンをクリックして
MPLAB X を起動する
最初の起動は各PCのモジュールの最適化のため
時間が掛かります
MPLAB X が起動すると下のような画面が表示されます.
MPLAB X の起動
PICkit3 の接続
ここで PICkit3 の付属の USB ケーブルを PC と PICkit3 の両方に
接続します.
PC によってはデバイス
ドライバがインストール
される場合があります
プロジェクトの新規作成
左上の「File」メニューを
開き,「New Project」を
選択します
プロジェクト作成の画面
が開きます.
ここで「Microchip Embedded」
と「Standard Project」を選択し
ます.
その後「Next」を押します
使用するデバイスを選択します.
ここでは 「PIC 16F887」を選択します. その後「Next 」を押します.
次に書き込みツールを選択します.
ここで 「PICkit3」の下に シリアル番号が出ていることを確認します.
そして,「SN:~」を選択し,「Next」を押します.
使用するコンパイラを選択します.
ここでは 「XC8」を選択します. その後「Next 」を押します.プロジェクト名と使用するフォルダを選択します.プロジェクト名は適当に決めプロジェクト名は適当に決めプロジェクト名は適当に決めプロジェクト名は適当に決め
ますますますますが,最初は「Test1」とします.その後「Finish」を押します
プロジェクトが作成されると下の様に左側の欄にプロジェクト名と各ファイル
に関する表示がでます.
コンパイル作業例の流れ
� MPLAB X の起動
� PICkit3 の接続(USBポートへの接続)
� プロジェクトの新規作成
� テストコードの追加
� ビルド作業
� ボードへの書き込み
TEST Code の追加
� ホームページよりテストコードをダウンロードして
適当なフォルダに保存する
� test1.c
� lcd_disp.c
� sensor.c
� lcd_disp.h
� sensor.h
ダウンロードしたテストコードを project に追加する
・「Source Files」で右クリックしてメニューを出す
・「Add Existing Item」を選択する
・ダウンロードしたフォルダを指定し,test1.c,lcd_disp.c,sensor.c をそれぞれ追加
TEST Code の追加
TEST Code の追加
・同様にヘッダファイルも追加する
・「Header Files」で右クリックしてメニューを出す
・「Add Existing Item」を選択する
・ダウンロードしたフォルダを指定し,lcd_disp.h,sensor.h をそれぞれ追加
TEST Code の追加
最終的に左図のように2つのヘッダ
ファイル,3つのソースファイルが追
加されていることを確認する
コンパイル作業例の流れ
� MPLAB X の起動
� PICkit3 の接続(USBポートへの接続)
� プロジェクトの新規作成
� テストコードの追加
� ビルド作業
� ボードへの書き込み
PICkit3 をボードに接続する
PICkit3 をボードに差し込みます.
PICkit3 の▽マークは「1番ピン」を表します.
ボード上の「1番ピン」は白いボタンの近くになりますので,間違えないように差します
1番ピンを表すマーク
ボード上の1番ピンの場所
PICkit3 をボードに接続する
ボードに差し込んだ状態
PICkit3 をボードに差し込んだ状態が下の状態です.
白い▽マークの位置を間違えないようにして下さい
TEST Code のコンパイル/書き込み
� テストコードをコンパイル(ビルド)して,PIC に書
き込む
Run → Run Project
でビルドと PIC への
書込を連続して行う
TEST Code のコンパイル/書き込み
� 途中で以下のメッセージが表示された場合,「
OK」を押して先に進める
TEST Code のコンパイル/書き込み
� ビルドおよび書き込み中は右下に以下のような
グラフィクスが現れる
� ビルドまたは書き込みが終了した時点でこのグ
ラフィックスは消える
TEST Code のコンパイル/書き込み
� 書き込みまで終了した場合,書き込みが終了し
た旨のようなメッセージが出力される
書き込み終了を示すメッセージ
TEST Code をRUN させる
� PICkit3 をボードから取り外し,電源の ON/OFF
または リセットボタンを押す
� 以下の様な表示がでればOK
まとめ
� 組み込みプログラム例題
� CONFIG 設定
� LEDの点灯
� SWの ON/OFFの判断� チャタリング
� 無限ループの使い方(OSなしの場合)
� プログラムの作成とコンパイル
� 複数ファイルのコンパイル
� MPLAB のインストールとコンパイル作業の実例