組み込みソフトウェア工学rd0 -5 実習用ボードの場合 rc5 rbx ・rc5 をout...

14
組み込みソフトウェア工学 第7回 組み込みプログラム例題 MPLAB X XC8 DL 済みですか? MPLAB XC8 はインストール済ですか? 本日の講義 組み込みプログラム例題 CONFIG 設定 LEDの点灯 SWON/OFF の判断 チャタリング 無限ループの使い方(OSなしの場合) プログラムの作成とコンパイル 複数ファイルのコンパイル MPLAB のコンパイル作業例 PIC における CONFIG の設定 PICCONFIGレジ スタは特殊で, 直接プログラ ムができない ため,プログラ ム書き込み時 にメモリに直接 データを書くよ うな指定をする CONFIG命令 #include <stdio.h> #include <stdlib.h> #include <pic.h> #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 の直ぐ下に記述

Upload: others

Post on 26-Jan-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

  • 組み込みソフトウェア工学

    第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 のインストールとコンパイル作業の実例