マイコンプログラミング講座

Similar documents
内容 1. 仕様 動作確認条件 ハードウェア説明 使用端子一覧 ソフトウェア説明 動作概要 ファイル構成 オプション設定メモリ 定数一覧 変数一

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

1. A/D 入力について分解能 12bit の A/D コンバータ入力です A/D 入力電圧とディジタル値との対応は理論上 入力電圧 0V : 0 入力電圧 +3V : 4095 です 実際はオフセットと傾きがあり ぴったりこの数値にはなりません 2. A/D 入力に使用する信号 STM32L_A

1. 使用する信号 1.1. UART 信号 UART 通信に使用する信号と接続相手との接続は以下の通りです UART 信号表 番号 CPU 機能名 CPU 信号名 基板コネクタピン番号 方向 接続相手の信号名 1 USART1_TX PA9 CN > RxD 2 USART1_R

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

main01a.dvi

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

前回の内容 マイクロコンピュータにおけるプログラミング PC上で作成 コンパイル マイコンに転送 実行 プログラムを用いて外部の装置を動作させる LED turnonled turnoffled LCD printf プログラムを用いて外部の装置の状態を読み取る プッシュスイッチ getpushsw

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

1. UART について UART は Universal Asynchronous Receiver Transmitter の頭文字をとったもので 非同期シリアル通信と呼ばれます シリアル通信とは 一本の信号線でデータをやりとりするために 1bit ずつデータを送出することをいいます データを受

スライド 1

AKI-PIC16F877A開発キット (Ver1

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

スライド 1

CoIDE 用 STM32F4_UART2 の説明 V /03/30 STM32F4 Discovery の非同期シリアル通信ポート UART2 の送受信を行うプログラムです Free の開発ツール CoIDE で作成したプロジェクトサンプルです プログラムの開始番地は 0x08000

memo

SDC_SDIO_STM32F4 の説明 2013/09/17 SDIO インターフェースで SD カードをアクセスするプログラムのプロジェクトサンプルです FAT でファイルアクセスするために FatFs( 汎用 FAT ファイルシステム モジュール ) を使用しています VCP(USB 仮想 C

目次 1 I2Cとは 13 結線写真 2 センサの多くがI2Cに対応 14 WHO_AM_I 3 マイコンでのI2C通信例 15 I2C読込みプログラム 4 とは 16 I2C読込みスクリプト概要① 5 タイミングパラメータ 17 I2C読込みスクリプト概要② 6 書込み 18 センサ読込みプログラ

RL78開発環境移行ガイド R8C/M16C, H8S/H8SXからRL78への移行(統合開発環境編)(High-performance Embedded Workshop→CS+)

初心者のための RL78 入門コース ( 第 3 回 : ポート出力例 2 とポート入力 ) 第 3 回の今回は, 前回作成したプログラムを RL78/G13 のハードウェアを用いて見直しをお こないます 今回の内容 8. コード生成を利用した実際のプログラム作成 ( その 2) P40 9. コー

PowerPoint プレゼンテーション

スライド 1

内容 1. 仕様 動作確認条件 ハードウェア説明 使用端子一覧 ソフトウェア説明 動作概要 ファイル構成 オプション設定メモリ 定数一覧 変数一

PowerPoint プレゼンテーション

GR-SAKURA-SAのサンプルソフト説明

1. プログラム実行時の動作プログラムを実行すると以下のように動作します 1) NUCLEO-F401RE 上の LED LD2( 緑 ) が 200mSec 間隔で点滅します 2. プロジェクトの構成 2.1. プロジェクト F401N_BlinkLD2 の起動画面 TrueSTUDIO で作成し

PowerPoint Presentation

プログラミング実習I

tri_s_tg12864_vcp の説明 2014/02/05 飛石伝ひ CPU 基板 の LCD TG12864 の表示プログラムです 漢字表示 (JIS208) を行うことができます USB の VCP ( 仮想 COM ポート ) を使用して非同期シリアル通信により 表示試験を行うことができ

PowerPoint プレゼンテーション

講習会 Arduino

1. 新規プロジェクト作成の準備新規プロジェクトのためのフォルダを用意して そこにプロジェクトを作成します [ 新しいフォルダー ] をクリックして希望のフォルダに新しいフォルダを作成します この例では TrST_F401N_BlinkLD2 というフォルダを作成しました TrST_F401N_Bl

Microsoft Word - 実験4_FPGA実験2_2015

1 1 Arduino とは Arduino アルドゥイーノ は ワンボードマイコンの一種で オープンソースハードウェアであ り 組み立て済みの基板を購入することもできるほか 誰でも自分の手で Arduino を組み立てる ことができます USBコネクタでPCと接続して利用します デジタルポートとア

AN1526 RX開発環境の使用方法(CS+、Renesas Flash Programmer)

スライド 1

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

HDLトレーナーサンプルプログラム説明書

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft PowerPoint - kougi2.ppt

まず,13 行目の HardwareTimer Timer(1); は,HardwareTimer というクラスを利用するという宣言である. この宣言によって Timer というインスタンスが生成される.Timer(1) の 1 は,OpenCM に 4 個用意されているタイマのうち,1 番のタイマ

1. LCD LS027B4DH01 について LS027B4DH01 は 400dot x 240dot のグラフィック LCD です 秋月電子通商で購入できます 外形サイズ : 62.8 x x 1.53mm LCD のフレキシブルケーブルの根元の部分はちょっと力を加えただけで表示が

PowerPoint プレゼンテーション

Microsoft PowerPoint ppt

ブート領域、フラッシュ領域の分割方法 RL78ファミリ用Cコンパイラ CC-RL

正転時とは反対に回転する これが逆転である 図 2(d) の様に 4 つのスイッチ全てが OFF の場合 DC モータには電流が流れず 停止する ただし 元々 DC モータが回転していた場合は 惰性でしばらく回転を続ける 図 2(e) の様に SW2 と SW4 を ON SW1 と SW3 を O

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

1. 概念 STM32F4 Discovery 基板は Mini USB を接続して デバッグやプログラムの書き込みができるようになっています 通常は CPU の 0x 番地からプログラムを実行します では なぜわざわざこのプロジェクトの雛形を使用して CPU の 0x

RX210 グループ MTU2 を用いた相補 PWM モードの波形出力 要旨 本サンプルコードでは MTU2 を用いて相補 PWM モードの波形を出力する方法について説 明します 対象デバイス RX210 1 / 41

81 /******************************************************************************/ 82 /* スレーブアドレスの設定 */ 83 /*****************************************

ReTRY HUB

SpeC記述のC記述への変換 (SpecCによるソフトウェア記述の実装記述への変換)

C#の基本

PowerPoint プレゼンテーション

割り込み 今までのプログラムは 順番にそって命令を実行していくのみ それはそれで良いが 不便な場合もある 例えば 時間のかかる周辺機器を使う場合 その周辺機器が動作を終了するまで CPU は待たなければいけない 方法 1( ポーリング ) 一定時間毎に 周辺機器の動作が終了したか調べる 終了していれ

また RLF 命令は 図 2 示す様に RRF 命令とは逆に 各ビットを一つずつ 左方向に回転 ( ローテイト ) する命令である 8 ビット変数のアドレスを A とし C フラグに 0 を代入してから RLF A,1 を実行すると 変数の内容が 左に 1 ビットシフトし 最下位ビット (LSB)

スライド 1

CR-USB 仕様書 株式会社測商技研 JS カード用データ転送用カードリーダー CR-USB 仕様書 取扱説明書 2012 年 07 月 31 日版 株式会社測商技研 1. 概要 本器は当社製自動観測装置で記録した JS カードデータ

TCP_BP3591 の説明 V /03/28 ROHM 社製 WIFi モジュール BP3591 を使用して 無線 LAN により TCP/IP 通信を行うプログラムです 簡単な文字列によるコマンド ( 例 : LED0 ON ) を受信して LED の ON/OFF を行います 受

Microsoft PowerPoint - prog04.ppt

Microsoft Word - プログラムをRAM.doc

アプリケーションノート MT-R300 割り込みプログラムのデバッグ方法

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留

電子13-06 エネメータ専用ソフト SAVER CAST for EneMeter Ver3.00設定方法.ppt

TFTP serverの実装

リモートデバッグモードでのデバッグ 注意!! 外部 RAM を持たない CPU ボードの場合は 次項の RLL 機能を利用したリモートデバッグモードでのデバッグ をごらんください モニタの書き込みまず最初にモニタと呼ばれるプログラムをターゲットのフラッシュ ROM に書き込みます リモートデバッグ中

訂正 _ 第 1 回 1 Arduino Arduino を用意する 入力 アナログ Analog 入出力 任意の電圧を扱える 電源系 外部入力 7 12V デジタル digital 入出力 リセットボタン Low High いわゆる 01 が入出力される 通常は Low 0V GND High 5

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

QuartusII SOPC_Builderで利用できるGPIF-AVALONブリッジとは?

2015/04/01 改定 オムロン DeviceNet ユニット CJ1W-DRM21 に関するコンフィグレーション作業について 1. 概要 DeviceNet ユニット CJ1W-DRM21 を装着したオムロン製 CJ2 シリーズと WAGO-I/0-SYSTEM DeviceNet 対応バスカ

Jan/25/2019 errata_c17m11_10 S1C17 マニュアル正誤表 項目 リセット保持時間 対象マニュアル発行 No. 項目ページ S1C17M10 テクニカルマニュアル システムリセットコントローラ (SRC) 特性 19-3 S1C17M20/M

S1C17 Family Application Note S1C17 シリーズ PORT 多重割り込みアプリケーションノート Rev.1.0

02: 変数と標準入出力

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

スライド 1

RY_R8C38ボード RY-WRITER基板 自動書き込み・実行解説マニュアル

Microsoft Word - Cプログラミング演習(10)

Transcription:

マイコンプログラミング講座 明治大学エレクトロニクス研究部武山文信 2008/03/04 & 2008/03/11 マイコンプログラミング講座 1

はじめに 回路ができてもプログラムが書けなければ意味がないソフトゼミで触れた部分は ソフトゼミの資料を見直すなどしてちょっと難しめに書いた気がするけど そこは口頭で補足ハードウェアマニュアル嫁ググれ 2008/03/04 & 2008/03/11 マイコンプログラミング講座 2

使用するマイコン マイコンキット モデル : 秋月電子通商 AKI-H8/3664F(QFP) タイニーマイコンキット価格 : 1600 サイズ : 40mm 25mm クロック : 16MHz( ( メイン ) 32.768KHz( ( サブ ) 3 端子レギュレーター シリアル通信用の IC 等が実装済み 2008/03/04 & 2008/03/11 マイコンプログラミング講座 3

マイコン マイコンキットの中央の黒いチップ Renesas H8/3664F 16bit CPU タイマ A タイマ V タイマ W 10bit A/D 変換器シリアル通信インターフェースフラッシュ ROM( ( プログラム書き込み ) 32KB RAM( ( メモリ ) 2KB 2008/03/04 & 2008/03/11 マイコンプログラミング講座 4

必要なもの マイコンキットと説明書 秋月で買ってくる 3664 の説明書は秋月の Web サイトに置いてある H8/3664 グループハードウェアマニュアル HEW( ( コンパイラと開発環境 ) 無償評価版 FDT( ( 書き込みソフト ) 無償評価版 3つとも Renesas からダウンロード USB RS232C 変換ケーブル ( ポートが無ければ ) 秋月に安いのがある 2008/03/04 & 2008/03/11 マイコンプログラミング講座 5

とりあえずプログラムを書いてみよう 2008/03/04 & 2008/03/11 マイコンプログラミング講座 6

プロジェクトの作成 プロジェクトとソースコードを保存するディレクトリを設定 CPU の種類を H8/300 に設定する 2008/03/04 & 2008/03/11 マイコンプログラミング講座 7

プロジェクトの作成 ツールチェインバージョンはそのまま CPU シリーズは 300H タイプは 3664F 2008/03/04 & 2008/03/11 マイコンプログラミング講座 8

プロジェクトの作成 2ページ目は変更せずに次へハードウェアセットアップ関数生成を C/C++ source file にする 2008/03/04 & 2008/03/11 マイコンプログラミング講座 9

プロジェクトの作成 他のページもそのまま 次へ をクリック出来上がったワークスペース 2008/03/04 & 2008/03/11 マイコンプログラミング講座 10

プログラム 1 LED 点滅プログラム main 関数 ({$( プロジェクト名 }.c に作成されている ) に次のプログラムを入力 次のページ 出来上がったら ビルド エラーが無ければ プロジェクトディレクトリの Debug フォルダに mot ファイルが作成される 2008/03/04 & 2008/03/11 マイコンプログラミング講座 11

プログラム 1 #include "iodefine.h" #ifdef 中略 #endif void main(void) { unsigned long i; IO.PCR8 = 0xff; for (;;) { IO.PDR8.BYTE = 0xff; for (i = 0; i < 500000; i++); IO.PDR8.BYTE = 0x00; for (i = 0; i < 500000; i++); } } 2008/03/04 & 2008/03/11 マイコンプログラミング講座 12

プログラムを転送 出来上がったプログラムをマイコンに転送する転送には FDT (Flash Development Toolkit) を使う 2008/03/04 & 2008/03/11 マイコンプログラミング講座 13

FDT プロジェクトの作成 H8/300H を選択 2008/03/04 & 2008/03/11 マイコンプログラミング講座 14

FDT プロジェクトの作成 ポートはマイコンを接続するポートを選択するポート番号はデバイスマネージャで確認 2008/03/04 & 2008/03/11 マイコンプログラミング講座 15

FDT プロジェクトの作成 入力クロックを 16MHz にする 2008/03/04 & 2008/03/11 マイコンプログラミング講座 16

FDT プロジェクトの作成 ポーレート を 9600[bps] に設定 Use Default のチェックを外す 他のページは初期設定のままで OK 2008/03/04 & 2008/03/11 マイコンプログラミング講座 17

プロジェクトに追加 画面左のツリー上の作成されたプロジェクトを右クリックして ファイルの追加 コンパイルして出来上がった mot ファイルを選ぶ 2008/03/04 & 2008/03/11 マイコンプログラミング講座 18

マイコンとの接続 & 書き込み マイコンの電源を切るマイコンをブートモードに設定する 今回の場合は ジャンパーピンを 2 本挿す ケーブルを接続してマイコンの電源を入れる mot ファイルを右クリックして Download File をクリック 書き込みが始まる 書き込みが終了したら デバイス デバイスの切断 マイコンの電源を切るブートモードを解除する 2008/03/04 & 2008/03/11 マイコンプログラミング講座 19

書き込んだプログラムを実行する 通常モードの状態でマイコンの電源を入れると main 関数が実行される 2008/03/04 & 2008/03/11 マイコンプログラミング講座 20

プログラミングの基礎知識 2008/03/04 & 2008/03/11 マイコンプログラミング講座 21

ビット (bit) とバイト (byte) ビットとバイト 1[byte] = 8[bit] 1[bit] は0か1(2 進数 ) int 型のサイズはそのコンパイラで汎用的な大きさ ex) PC 用のコンパイラ 32bit 3664 のコンパイラ 16bit long 型 32bit char 型 8bit ここから先は H8/3664 の話 (int( 型は 16bit) 2008/03/04 & 2008/03/11 マイコンプログラミング講座 22

符号付き整数と符号なし整数 符号付き 負の数も扱える int 型 (signed int 型 ) -32,768~32,767 32,767 long 型 (signed( long 型 ) -2,147,483,648~2,147,483,648 符号なし 0 以上の数しか扱えない unsigned int 型 0~65,535 unsigned long 型 0~4,294,967,296 (32bit: 4G) 2008/03/04 & 2008/03/11 マイコンプログラミング講座 23

ビット演算 AND 0 & 0 = 0 0 & 1 = 0 1 & 0 = 0 1 & 1 = 1 (0101)2 & (0100)2 = (0100)2 OR 0 0 = 0 0 1 = 1 1 0 = 1 1 1 = 1 (0101)2 (0010)2 = (0111)2 2008/03/04 & 2008/03/11 マイコンプログラミング講座 24

ビット演算 NOT ~0 = 1 ~1 = 0 ~(0101)2 = (1010)2 XOR 0 ^ 0 = 0 0 ^ 1 = 1 1 ^ 0 = 1 1 ^ 1 = 0 (0101)2 (0010)2 = (0111)2 2008/03/04 & 2008/03/11 マイコンプログラミング講座 25

ビット演算 ビットシフト 符号なしの場合 (10000010)2 << 1 = (00000100)2 (00100011)2 >> 1 = (00010001)2 (10010000)2 >> 2 = (00100100)2 符号付きの場合 (00100010)2 >> 1 = (00010001)2 (10001000)2 >> 2 = (11100010)2 2008/03/04 & 2008/03/11 マイコンプログラミング講座 26

C 言語でビット演算 優先順位 ~ > & > ^ > C 言語で 16 進数の書き方 0xFF = (11111111)2 = (255)10 2008/03/04 & 2008/03/11 マイコンプログラミング講座 27

問題 変数 xの2bit 目が 1であるかの条件文は? 0 から数える (1( から数える場合もある ) 1の位 0bit 目 if ( ) { /* x の2bit 目は 1 */ } 2008/03/04 & 2008/03/11 マイコンプログラミング講座 28

問題 ( 回答 ) 変数 xの2bit 目が 1であるかの条件文は? 0 から数える (1( から数える場合もある ) 1の位 0bit 目 if (x & 4!= 0) { /* x の2bit 目は 1 */ } x = 6 0110 & 0100 = 0100 x = 10 1010 & 0100 = 0000 2008/03/04 & 2008/03/11 マイコンプログラミング講座 29

プリプロセッサ #define #define NAME TEXT ソースコード中に現れた NAME を単純に TEXT に置き換える 定数を宣言するときに使う事が多い 今は const を使いましょう const int MAX_SIZE = 10; #define HOGE printf("test\n") #define N 10 int main(void) { HOGE; printf("%d\n", N); return 0; } の実行結果は? 2008/03/04 & 2008/03/11 マイコンプログラミング講座 30

プリプロセッサ ヘッダーファイル C 言語ファイルと拡張子以外の違いは無い インクルードして使う場合は慣例的に.h 主に構造体の宣言や関数のプロトタイプ宣言を複数のソースファイルで共有するときに使う #include 指定したファイルの内容を #include が書かれた位置に単純に挿入する #include <headerfile.h> headerfile.h をインクルードパスに設定されたディレクトリから探す #include "headerfile.h" headerfile.h をインクルードする C 言語ファイルと同じディレクトリから探す 2008/03/04 & 2008/03/11 マイコンプログラミング講座 31

構造体と共用体 構造体 複数のメンバー変数を 1つにまとめる 共用体 1つの領域を複数のメンバーで共有する u.x = 0xFF00 と代入することは u.a = 0xFF, u.b = 0x00 と同じ ただし H8( ( ビッグエンディアン ) の場合 struct EXAMPLE1 { char a; char b; } union EXAMPLE2 { int x; struct EXAMPLE1 ex; } u; char a; char b; int x; char a; char b; 2008/03/04 & 2008/03/11 マイコンプログラミング講座 32

構造体と共用体 ex2 の領域を ex (struct EXAMPE1 型 ) としてアクセスするか x (int 型 ) としてアクセスするか選べる int w; char z; struct EXAMPLE1 ex1; struct EXAMPLE2 ex2; w z メモリー ex2.ex.a = 1; ex2.ex.b = 0; とすると ex2.x は256 になる ex1 ex2 e x ex1.a ex1.b ex2.ex.a ex2.ex.b ex2.x 2008/03/04 & 2008/03/11 マイコンプログラミング講座 33

ビットフィールド 構造体をビット単位で作ることができる struct TEST { unsigned char B76:2; unsigned char B54:2; unsigned char B32:2; unsigned char B1 :1; unsigned char B0 :1; } struct TEST t; t.b76 = 1; t.b54 = 2; t.b32 = 0; t.b1 = 0; t.b0 = 1; 全体は 8bit B76 B54 B32 B1 B0 0 1 1 0 0 0 0 1 2008/03/04 & 2008/03/11 マイコンプログラミング講座 34

汎用入出力ポート 2008/03/04 & 2008/03/11 マイコンプログラミング講座 35

汎用入出力ポート ポート マイコンの足それぞれのポートにはアドレス ( ポインタ ) が割り当てられている 1つのポートには複数の機能が割り当てられている ポートコントロールレジスタに値を設定し どの機能を使うか選択 ex) P50 とWKP0 PB4 とAN0 そもそもレジスタって何よ CPU に配置された変数ポインタが割り当てられているので C 言語からアクセスできる 2008/03/04 & 2008/03/11 マイコンプログラミング講座 36

汎用入出力ポート 汎用入出力ポート P8 P1( ( ポート 1) ) P2 P5 P7 P8 PB がある出力 データレジスタに設定した値に応じてポートの電圧が変わる 0 0V 1 5V (GND を0V とした場合 ) 入力 ポートの電圧に応じてデータレジスタの値が変わる (0,( 1) 1 大電流ポート ( 他より大きな電流が流れる ) 実験用基板で LED が接続されている ハードウェアマニュアルを見てみよう 2008/03/04 & 2008/03/11 マイコンプログラミング講座 37

LED を点滅させる ポート 8を汎用出力に設定する PCR8( ( ポートコントロールレジスタ 8) ) を 1にする 出力する PDR8( ( ポートデータレジスタ 8) ) に値を代入すると値に応じた電圧が出力される レジスタとポートの対応 (PCR8 PDR8) ) レジスタのビット 0 P80(CN2-9 CN2-9) (PCR8 PDR8) ) レジスタのビット 1 P81(CN2-10 CN2-10) (PCR8 PDR8) ) レジスタのビット 7 P87(CN2-16 CN2-16) 2008/03/04 & 2008/03/11 マイコンプログラミング講座 38

LED を点滅させる C 言語で書くと void main(void) { unsigned long i; IO.PCR8 = 0xff; //P80~P87 P87を出力に設定 for (;;) { IO.PDR8.BIT.B0 = 0x01; //P81 に1を出力 for (i = 0; i < 100000; i++) { ; // 何もしない ( 時間稼ぎ ) } IO.PDR8.BIT.B0 = 0x00; //P81 に0を出力 for (i = 0; i < 100000; i++) { ; // 何もしない ( 時間稼ぎ ) } } } 2008/03/04 & 2008/03/11 マイコンプログラミング講座 39

レジスタへのアクセス IO.PCR8 って一体どうなってるの? iodefine.h で定義されている IO struct st_io 型でレジスタが指定されている st_io のメンバーに PCR8 がある (unsigned( char 型 ) volatile 最適化禁止詳しい話は各自調べて 2008/03/04 & 2008/03/11 マイコンプログラミング講座 40

レジスタへのアクセス んじゃ IO.PDR.BIT.B0 は? PDR8 は共用体アクセス方法を選べる unsigned char BYTE; struct {} BIT は構造体でビットフィールド ビットに直接アクセス アクセス方法を選べる IO.PDR.BIT.B0 = 1 と IO.PDR.BYTE = IO.PDR.BYTE 0x01 は同じ前者の方が便利 2008/03/04 & 2008/03/11 マイコンプログラミング講座 41

プログラム 2 8 個の LED のうち 4 個ずつ交互に点灯するプログラム まずは BIT.B0 = 1 を使って書く次はビット演算を使ってみよう こっちの方が かなり楽だよね? 2008/03/04 & 2008/03/11 マイコンプログラミング講座 42

プログラム 3 8つの LED が1 個ずつ順に点灯 [ ] [ ] [ ] 最初に戻るビットシフトを使ってみよう BIT を使うと かなりメンドクサイ 2008/03/04 & 2008/03/11 マイコンプログラミング講座 43

入力を使ってみる P50(CN1-14 CN1-14) ) に接続されたボタンが押されると GND と接続されるので P50 は0V になる放された状態だと 5V ポートを入力に設定すると PDR のビットに値が格納される P50 の状態は PDR5 の0ビット目 P50 を汎用入力に設定するには P50 は標準状態で汎用入力に設定されているハードウェアマニュアルを見る if (IO.PDR5.BIT.B0 == 0) { // ボタンが押されている } 2008/03/04 & 2008/03/11 マイコンプログラミング講座 44

プログラム 4 次のプログラムを作ってみよう ボタンが押されている LED 全点灯ボタンが放されている LED 消灯 ヒント ひたすら スイッチの状態をチェックする 2008/03/04 & 2008/03/11 マイコンプログラミング講座 45

プログラム 5 電子ルーレットを作ってみよう 2008/03/04 & 2008/03/11 マイコンプログラミング講座 46

モータードライバー IC 2008/03/04 & 2008/03/11 マイコンプログラミング講座 47

モータードライバー IC の使い方 TA8428K 東芝セミコンダクターの小型モーター用 モータードライバ信号ピン (IN1( とIN2) ) の値で回転方向をコントロールする優れもの新月のモータードライバは 高出力で 速度も変えられるデータシートを見てみよう 入力と動作 (IN1, IN2) = (0, 0) ストップ (1, 0) 正転 (0, 1) 逆転 (1, 1) ブレーキ 2008/03/04 & 2008/03/11 マイコンプログラミング講座 48

プログラム 6 モーターを正転させるプログラムを書いてみよう モータードライバは P80 がIN1 にP81 がIN2 に接続されている 一定間隔で正転と逆転を切り替えるプログラムを書いてみよう 2008/03/04 & 2008/03/11 マイコンプログラミング講座 49

割り込み 2008/03/04 & 2008/03/11 マイコンプログラミング講座 50

割り込み 現在実行しているプログラムを中断して 指定された処理を実行するこの処理が終わったら 元の処理に戻る割り込みの要因に対応した 割り込み処理を定義する main() INT_WKP() ( 割り込み ) 中断 再開 2008/03/04 & 2008/03/11 マイコンプログラミング講座 51

割り込みのメリット 今までの方法では 入力待ちの間 無駄なループがあった 他の作業ができないこの動作が白線検知であれば 敵を見つけられない 2008/03/04 & 2008/03/11 マイコンプログラミング講座 52

割り込み 主な割り込みの種類 NMI NMI 端子が 0になると発生する 優先度が最も高い &NMI& を止めることはできない ( 緊急停止など ) IRQ 端子 WKP 端子が指定した条件を満たすと発生する 0から 1に変化したとき ( 立ち上がりエッジ ) 1から 0に変化したとき ( 立ち下がりエッジ ) タイマタイマーカウンタが設定値に達したとき A/D 変換やシリアル通信の処理が終了したとき 優先順位 高い優先順位の割り込みは 低い優先順位の割り込み処理中にも割り込める 2008/03/04 & 2008/03/11 マイコンプログラミング講座 53

割り込み IRQ ポートと WKP ポートの違い IRQ ポート IRQ0~IRQ3 IRQ3があり それぞれに対して割り込み処理を定義できる void INT_IRQ0(void) void INT_IRQ1(void) void INT_IRQ2(void) void INT_IRQ3(void) WKP ポート WKP0~WKP5 WKP5があり 共通の割り込み処理を定義する割り込み発生条件はポート別に設定できる void INT_WKP(void) 2008/03/04 & 2008/03/11 マイコンプログラミング講座 54

割り込み関数の書き方 割り込み処理を割り込み関数として書く HEW で自動生成された intprg.c を編集する interrupt(vect=18) void INT_WKP(void) { /* * 空の関数が用意されているので 編集する * ここに割り込み処理を書く */ } 2008/03/04 & 2008/03/11 マイコンプログラミング講座 55

割り込みを使ってみる スイッチが WKP0 端子 (CN1-14( CN1-14) ) に接続されている 実は IRQ0 に接続するつもりで間違えた ポートの初期化 ( ポートモードの設定など ) は hwsetup.c の HardwareSetup 関数に書く 前半で使用した PCR の設定も自動生成されたソースコードを追えば分かるはず割り込み禁止状態で呼び出される 2008/03/04 & 2008/03/11 マイコンプログラミング講座 56

割り込みを使ってみる ( 準備 ) ポートモードの変更 ポートモードレジスタ (PMR) でWKP0 を有効にする 条件の設定 割り込みエッジセレクトレジスタで条件を設定 割り込みの有効 割り込みイネーブルレジスタ (IENR( IENR) ) で WKP による割り込みを有効にする 参照 ハードウェアマニュアル 3. 例外処理 9.6 ポート 5 2008/03/04 & 2008/03/11 マイコンプログラミング講座 57

割り込みを使ってみる ( 準備 ) ポートを設定する void HardwareSetup(void) { 他のポートの設定 } IO.PMR5.BIT.WKP0 = 1; /* WKP0 として使う */ IEGR2.BIT.WPEG0 = 0; /* 立ち下がりエッジで割り込み */ IENR1.BIT.IENWP = 1; /* WKP ポートの割り込みを有効化 */ 2008/03/04 & 2008/03/11 マイコンプログラミング講座 58

割り込みを使ってみる ( 処理 ) 割り込み関数を編集する iodefine.h のインクルードを忘れずに!! まず割り込み要求フラグをクリアする IRQ ポートなど 他の割り込みの場合も 相当する要求フラグをクリアする 割り込み処理完了通知クリアしないと 何度も割り込み関数が実行されてしまう interrupt(vect=18) void INT_WKP(void) { /* WKP0 の割り込み要求フラグをクリア */ IWPR.BIT.IWPF0 = 0; } ここに 割り込みが発生した時に実行したいプログラムを書く 2008/03/04 & 2008/03/11 マイコンプログラミング講座 59

割り込み禁止 割り込みを禁止すると 割り込みが発生できなくできる 割り込みが発生するとマズイタイミングで使用する詳細は各自調べて ( 相撲ロボットのプログラムでは必要 ) 割り込み禁止 set_imask_ccr(1); 割り込み禁止解除 set_imask_ccr(0); 割り込み禁止区間に入る際に 状態が分からない場合 unsigned char ccr; ccr = get_imask_ccr(); /* 状態を待避 */ set_imask_ccr(1); 割り込み禁止で実行する処理 set_imask_ccr(ccr); 2008/03/04 & 2008/03/11 マイコンプログラミング講座 60

プログラム 7 プログラム 6を改造して ボタンが押されたらモーターを止めるプログラムを書いてみよう main 関数は終了してしまうと困るので 今回は無限ループを入れておく 2008/03/04 & 2008/03/11 マイコンプログラミング講座 61

タイマ 2008/03/04 & 2008/03/11 マイコンプログラミング講座 62

タイマ 今までは無駄な for 文で時間調整をしていた 正確な時間を計りたい他の作業ができない 割り込みを使いたい タイマ 一定間隔でタイマレジスタをカウントアップタイマーレジスタの値が条件を満たせば 割り込みを発生 2008/03/04 & 2008/03/11 マイコンプログラミング講座 63

タイマの種類 タイマの種類 ( 詳しくはハードウェアマニュアル ) タイマ A 今回はこれを使う 1~8kHz 時計広い間隔 AKI-H8/3664 では 32.768KHz のクリスタルが接続されている タイマ V 8bit タイマ タイマ W 16bit タイマ短い間隔 PWM( ( 最大 3 出力 ) など 2008/03/04 & 2008/03/11 マイコンプログラミング講座 64

タイマ Aの初期化 0.5 秒タイマに設定し 割り込みを有効にする ハードウェアマニュアルのタイマ Aを参照 void HardwareSetup(void) { TA.TMA.BIT.CKSI = 0x09; /* (1001)2 0.5 秒タイマ */ IENR1.BIT.IENTA = 1; /* タイマ Aの割り込みを有効 */ } /* LED 点滅用 */ IO.PCR8 = 0xff; 2008/03/04 & 2008/03/11 マイコンプログラミング講座 65

タイマ Aの割り込み関数 他の割り込みと同様に intprg.c を編集する interrupt(vect=19) void INT_TimerA(void) { /* タイマ A(TA) ) の割り込み要求フラグをクリア */ IRR1.BIT.IRRTA = 0; } /* ここに割り込み処理を書く */ /* LED 点滅 */ IO.PDR8.BYTE = ~IO.PDR8.BYTE; 2008/03/04 & 2008/03/11 マイコンプログラミング講座 66

プログラム 8 4 秒ごとにモーターの回転方向を変えるプログラムを書いてみよう 8 回 0.5 秒の割り込みが発生大域変数を使う ( または static 変数 ) 2008/03/04 & 2008/03/11 マイコンプログラミング講座 67

その他の機能 ( 相撲ロボットには必要 ) 2008/03/04 & 2008/03/11 マイコンプログラミング講座 68

シリアル通信 RS232C を通して PC に文字列を送信したりするのに使う デバッグなどに便利 新月用に軽量版 stdio ライブラリがある 流用するなり 参考にするなり 2008/03/04 & 2008/03/11 マイコンプログラミング講座 69

A/D 変換 アナログ デジタル変換ポートの電圧を測定し 10bit の整数として取得する 汎用入力では ポートの電圧が閾値より高いと 1 低いと 0 新月の PSD センサーは距離に応じた電圧を出力 電圧を測定して 距離を計算する 2008/03/04 & 2008/03/11 マイコンプログラミング講座 70

その他 PWM 出力 ( タイマ W) サーボモーターの制御やモーターの速度制御に必要 ポートプルアップ ポートをプルアップする 2008/03/04 & 2008/03/11 マイコンプログラミング講座 71