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

Similar documents
マルチタスクプログラミング.pptx

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

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

スライド 1

講習会 Arduino

IntroductionForGR-PEACH.pptx


Microsoft Word - SU1202教本(Disp)原稿.docx

スライド 1

ESP32-KEY-KIT-R1 (ESP-WROOM-32 ) Copyright c 2

Microsoft Word - SU1204教本(Driver)原稿.docx

Arduino UNO IS Report No. Report Medical Information System Laboratory

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

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

Microsoft Word - SU1203教本(Sens)原稿.docx

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

ETCB Manual

Studuino ライブラリ環境設定Windows編

PowerPoint Presentation

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

Studuinoライブラリ環境設定Mac編

TOPPERS活用アイデア・アプリケーション開発

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

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

Arduinoで組込み制御

Microsoft Word - SU1201MotorDriverSheildManual.doc

<4D F736F F F696E74202D F4B87555F A838B B F5F91E63189F12E >

図 1 で示すように割り込み作業に対応していない間は CPU が他の作業を行えま す 割り込みが発生した時に作業中の仕事を一時停止し 割り込みハンドラに 入ってタスクを実行します 割り込み作業が終わった後停止した作業を再開し ます 割り込み対応コードが停止したプロセスに影響ありますので なるべく 最

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

論文番号 分 2-2 平成 24 年度全国情報技術教育研究会第 41 回全国大会 ( 新潟大会 ) Xbee を活用した無線通信の研究 期日平成 24 年 8 月 9 日 ( 木 )~10 日 ( 金 ) 場所長岡市シティホールプラザ アオーレ長岡 香川県立三豊工業高等学校 電子科 本行

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

改訂履歴 改訂日付 改訂内容 2014/11/01 初版発行 2017/01/16 Studuino web サイトリニューアルに伴う改訂 2017/04/14 Studuino web サイトリニューアルに伴うアクセス方法の説明変更 2018/01/22 Mac 版インストール手順変更に伴う改訂

INDEX 1 必要なものを準備しよう 各部の名称を確認しよう 電源を入れよう スイッチで LED を光らせよう BiZduino で Wi-Fi 通信しよう RTC を使ってみよう 参考資料 7 困ったら... 21

DCモータの制御

Microsoft Word - toppers-contest-2014_NTB.doc

1 Atollic TrueSTUDIO( GR-PEACH TOPPERS/ASP ASP GR-PEACH mbed ( git

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

講習会 Arduino

Mathematica で Arduino を利用する (2012 年度 ) はじめに情報工学部では全学科で Arduino を導入して フィジカルコンピューティングに関連した教育を行ってきている 電子情報工学科ではいくつかの実験演習を通じて Arduino を取り入れてきている ここでは 電子情報

ESP8266-CORE-R Copyrig

Taro-テキスト.jtd

Arduino をはじめよう オープンソースハードウェア入門 ~ Arduino( アルドゥイーノ ) 始めてみませんか?

RTOSSkillupSeminar pptx

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

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

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

Arduino の勉強会 平成 23 年 1 月 5 日於 : 鳥取大学

Arduino をドリトルから 制御する教材の試行 鈴木裕貴 1

今回の内容 マイクロコンピュータにおけるプログラミング 機器の中に組み込まれる ロボット 自動車 家電 などいろいろな分野で利用 プログラムを用いて外部の装置を動作させる マイコンから の出力 発光ダイオード Light Emitting Diode 液晶ディスプレイ Liquid Crystal

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

POSIXスレッド

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

Arduino Processing and ) Fig1. Arduino Homepage : h;p://

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

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

Taro-テキスト.jtd

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

TOPPERS活用アイデア・アプリケーション開発

プログラミング実習I

目次 Arduino で始めるソフトウェア開発 1 はじめてみよう Arduino 準備編 Arduino の購入 開発環境の準備 体験編 Arduino IDE の起動 Ar

Microsoft Word - no11.docx

PowerPoint プレゼンテーション

ブンブン振り子

8051 개발보드 메뉴얼

Microsoft PowerPoint - A3② JaSST_MISRA2004ソースコード品質診断.ppt

SOPC Builder ペリフェラル 簡易ユーザ・ガイド - PIO (Parallel I/O)

24th Embarcadero Developer Camp

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

プログラミング基礎

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

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

Microsoft PowerPoint _iwasaki

Prog1_10th

<4D F736F F F696E74202D20834A815B836C838B835C815B835882CC95E082AB95FB F4B2E B8CDD8AB B83685D>

PowerPoint プレゼンテーション

PSoC5LP で USBMIDI 2015/5/23 第 2 回 PSoC まつり (Sat) 於 本サイプレス本社 ( 中野 ) PSoC5LP で USBMIDI ectoyfan ectoyfan アラフィフ ( 電 回路玩具ファン ) Electronic Circui

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

EV3_APIの解説.pptx

Microsoft PowerPoint - 計算機言語 第7回.ppt

04-process_thread_2.ppt

LANカード(PG-2871) 取扱説明書

プログラミング入門1

プログラマブル LED 制御モジュール アプリ操作説明書 プログラマブル LED 制御モジュール設定アプリ操作説明書 適用モジュール 改訂番号 エレラボドットコム 1

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

Microsoft Word - Ladder Tool 使çfl¨ã…žã…‰ã…¥ã‡¢ã…«ã…©ã…•ã…¼ã†ªã†Š_ docx

PowerPoint プレゼンテーション

HW-Slides-03.ppt

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

<4D F736F F F696E74202D F4B87555F A838B B F5F91E63389F12E >

7th CodeGear Developer Camp

AN424 Modbus/TCP クイックスタートガイド CIE-H14

スライド 1

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

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

C#の基本

IEEE1888 開発キットの活用 電力管理システムを作る 慶應義塾大学 メディアデザイン研究科 秋山寛子

4 分岐処理と繰返し処理 ( 教科書 P.32) プログラムの基本的処理は三つある. (1) 順次処理 : 上から下に順番に処理する ぶんきそろ (2) 分岐処理 : 条件が揃えば, 処理する はんぷく (3) 反復処理 : 条件が揃うまで処理を繰り返す 全てのプログラムは (1) から (3) の

Taro-82ADAカ.jtd

Microsoft Word - Training10_プリプロセッサ.docx

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

Transcription:

シングルタスク プログラミング 本田晋也名古屋大学大学院情報科学研究科准教授 TOPPERSプロジェクトシニアテクニカルエキスパート honda@ertl.jp 最終更新 2016/6/27 1

自己紹介 所属 名古屋大学情報科学研究科組込みリアルタイムシステム研究室 TOPPERSプロジェクト TOPPERS/R2CA 設計 開発 メンテ 最近注力している内容 TOPPERS/ASP GR-PEACH 依存部 OS 基本箇所の開発 TOPPERS/FMPカーネル設計 開発 メンテ マルチプロセッサ対応 RTOS TOPPERS/SafeG 設計 開発 メンテ 組込み向け仮想化環境 趣味 プログラミング ポケモンカード 料理 ガンプラ 2

概要 シングルタスクプログラミングについて学習する Arduino ボードと Arduino IDE を使用する アジェンダ Arduinoとは 開発環境のセットアップ 単一機能のプログラム 複合機能のプログラム 3

Arduino とは 4

Arduino Maker の作品で広く使われているマイコンボードと IDE をセットにした環境 安価で容易に使える 書籍等の情報が豊富 Arduinoボード 各種マイコンを用いたボード ( 数十種類存在 ) Arduino Uno : 最も一般的なArduinoボード Atmel ATmega328P, Flash 32KB, RAM 2KB オープンハードウェアなためクローンのボードも存在 ArduinoIDE マルチプラットホームの開発環境 インストーラによりコンパイラ (GCC) や Arduino ライブラリがインストールされる ボタンを押すだけでコンパイルとボードへの書き込みが可能 デバッグ機能はない (printf デバッグ ) Arduino ライブラリを含む ( ライセンスは GPL) 5

Arduino Arduino プログラミングモデル setup()/loop() による容易なモデル C++ ベースの独自言語 プロトタイプ等は必要なし Arduino IDE が C++ に変換してコンパイル Arduino ライブラリ コアライブラリ IO 操作 (GPIO, AD, SPI, I2C), 時間, 文字列操作 Arduino 準拠ライブラリ コアライブラリの上で実現されたライブラリ Arduino IDE に含まれるライブラリ SD,LCD,USB,Audio 等のライブラリ その他, センサーやシールドに含まれるライブラリ センサー値の変換,Wifi モジュール制御,IoT サービスへの接続 void setup() { pinmode(13, OUTPUT); void loop() { digitalwrite(13, HIGH); delay(1000); digitalwrite(13, LOW); delay(1000); 6

単一機能のプログラム 7

単一機能のプログラム 単一の機能のプログラムについて解説する プログラム 1(LEDBlink) 1000m 周期で LED を点滅 プログラム 2(CLEDBlink) 250m 周期で Change LED の色を変更 プログラム 3(TouchSense) Touch センサの検知による LED の ON/ 切り替え プログラム 4(LuxSense) 光センサの値の OLED への出力 8

プログラム 1(LEDBlink) 1000ms 周期で LED を点滅させる 1000ms 1000ms LED プログラム setup() Grove LEDが接続されているポートを出力に初期化 loop() Grove LEDが接続されているポートに 1000ms 毎にHIGHとLOWを出力 #define LED_PIN 4 void setup() { pinmode(led_pin, OUTPUT); void loop() { digitalwrite(led_pin, HIGH); delay(1000); digitalwrite(led_pin, LOW); delay(1000); 9

プログラム 2(CLEDBlink) 250m 周期で Change LED の色を変更 Red, Green, Blue の順で点灯 10ms 毎に輝度を上げる プログラム setup() : leds.init() により初期化 loop() : leds.setcolorrgb() により出力 輝度を上げるため 10m 周期のループを実行 #include <ChainableLED.h> #include <Wire.h> #define NUM_LEDS 1 ChainableLED leds(8, 9, NUM_LEDS); void setup() { leds.init(); CLED 250ms 250ms 250ms void loop() { int i; for(i = 0; i < 25; i++){ leds.setcolorrgb(0, i*10, 0, 0); delay(10); for(i = 0; i < 25; i++){ leds.setcolorrgb(0, 0, i*10, 0); delay(10); for(i = 0; i < 25; i++){ leds.setcolorrgb(0, 0, 0, i*10); delay(10); 10

プログラム 3(TouchSense) Touch センサが押されたら LED の ON/ を切り替える Touch センサは押されていない状態で 0, 押された状態で 1 を読み込み込める Touch センサが押されたことを -ON- の検知で判定する Touch センサ ON ON LED 11

プログラム 3(TouchSense) setup() ピンの初期化と LED の初期化 loop() TouchState : -ON- の検知のための変数 PreTouchValue : 前の Touch センサの状態 #define TOUCH_PIN 3 #define LED_PIN 4 int PreTouchValue = 0; int TouchState = 0; int LEDState = 0; void setup() { pinmode(touch_pin, INPUT_PULLUP); pinmode(led_pin, OUTPUT); digitalwrite(led_pin, LOW); void loop() { int TouchValue = digitalread(touch_pin); if ((PreTouchValue == 0) && (TouchValue == 1) && (TouchState = 0)) { TouchState = 1; if ((PreTouchValue == 1) && (TouchValue == 0) && (TouchState = 1)) { TouchState = 0; if (LEDState == 0) { LEDState = 1; digitalwrite(led_pin, HIGH); else { LEDState = 0; digitalwrite(led_pin, LOW); PreTouchValue = TouchValue; 12

プログラム 4(LuxSense) 光センサの値の OLED への出力 光センサと OLED 共に I2C によりアクセス アクセスに時間が必要であり割込みを使用する 表示毎にカウンタをインクリメントして表示 プログラム OLEDCount : 変数カウンタ #include <Wire.h> #include <Digital_Light_TSL2561.h> #include <SeeedOLED.h> void setup() { Wire.begin(); TSL2561.init(); SeeedOled.init(); SeeedOled.deactivateScroll(); SeeedOled.setNormalDisplay(); SeeedOled.clearDisplay(); int OLEDCount = 0; void loop() { int lux; lux = TSL2561.readVisibleLux(); SeeedOled.setTextXY(0, 0); SeeedOled.putString("Digital Light"); SeeedOled.setTextXY(1, 0); SeeedOled.putString("Sensor Value is"); SeeedOled.setTextXY(2, 0); SeeedOled.putNumber(lux); SeeedOled.putString(" lux "); SeeedOled.setTextXY(4, 0); SeeedOled.putString("Count is"); SeeedOled.setTextXY(5, 0); SeeedOled.putNumber(OLEDCount++); 13

複合機能のプログラム 14

複合機能のプログラム 単一機能のプログラムを組み合わせることで複数の機能を持つプログラムを実現する プログラム5(LEDBlink_CLEDBlink) プログラム1とプログラム2の組み合わせ プログラム6(TouchSense_LuxSense) プログラム3とプログラム4の組み合わせ プログラム7(Interrupt) プログラム6の割込み版 処理をloop() と割込みハンドラに分ける プログラム8(Interrupt_Blink) プログラム7 をベースにTouchセンサで検知するとLEDを2 秒間点灯する 15

プログラム 5(LEDBlink_CLEDBlink) プログラム1とプログラム2の組み合わせ プログラム1 1000m 周期でLEDを点滅させる プログラム2 250m 周期でChange LEDの色を変更 Red, Green, Blueの順で点灯 10ms 毎に輝度を上げる 1000ms 1000ms LED 250ms 250ms 250ms 250ms 250ms 250ms 250ms 250ms 250ms CLED 16

プログラム 5 : プログラム 別々の loop() 処理を 1 つにまとめる 周期の短い (CLED) 方をベースにする ( 逆は機能を実現できない ) LED 処理は 250m 周期毎に呼び出されること前提に変更 周期 (led_count) と LED 状態 (led_stae) 変数の追加 loop() 内で LED 処理を呼び出す int led_count; int led_state; void setup() { pinmode(led_pin, OUTPUT); leds.init(); led_count = 0; led_state = 0; void led_check(){ led_count++; if (led_count == 4) { led_count = 0; if (led_state == 0) { digitalwrite(led_pin, HIGH); led_state = 1; else { digitalwrite(led_pin, LOW); led_state = 0; void loop() { int i; for(i = 0; i < 25; i++){ leds.setcolorrgb(0, i*10, 0, 0); delay(10); led_check(); for(i = 0; i < 25; i++){ leds.setcolorrgb(0, 0, i*10, 0); delay(10); led_check(); for(i = 0; i < 25; i++){ leds.setcolorrgb(0, 0, 0, i*10); delay(10); led_check(); 17

プログラム 5 : 問題点 独立した処理のプログラムを関連付けて開発する必要がある 時間的には独立していないためプログラム的に関連してしまう CLED のコードに LED の実行呼び出しコードが入る 片方の周期に変更があった場合, もう片方も変更が必要な場合が出てくる 例 )LEDの点滅周期を400msに変更 void led_check(){ led_count++; if (led_count == 4) { led_count = 0; if (led_state == 0) { digitalwrite(led_pin, HIGH); led_state = 1; else { digitalwrite(led_pin, LOW); led_state = 0; void loop() { int i; for(i = 0; i < 25; i++){ leds.setcolorrgb(0, i*10, 0, 0); delay(10); led_check(); for(i = 0; i < 25; i++){ leds.setcolorrgb(0, 0, i*10, 0); delay(10); led_check(); for(i = 0; i < 25; i++){ leds.setcolorrgb(0, 0, 0, i*10); delay(10); led_check(); 18

プログラム 6(TouchSense_LuxSense) プログラム3とプログラム4の組み合わせ プログラム3 Touchセンサが押されたらLEDのON/を切り替える Touchセンサは押されていない状態で 0, 押された状態で 1 を読み込み込める Touchセンサが押されたことを-ON-の検知で判定する ON ON Touch センサ LED プログラム4 光センサの値のOLEDへの出力 光センサはOLED 共にI2Cによりアクセス アクセス時間が必要であり割込みを使用する 表示毎にカウンタをインクリメントして表示 19

プログラム 6 : プログラム プログラム 5 と同様に Touch センサのセンシング処理を別関数として,loop() 内で Touch センサのセンシング処理を呼び出す void CheckTouch() { int TouchValue = digitalread(touch_pin); if ((PreTouchValue == 0) && (TouchValue == 1) && (TouchState = 0)) { TouchState = 1; if ((PreTouchValue == 1) && (TouchValue == 0) && (TouchState = 1)) { TouchState = 0; if (LEDState == 0) { LEDState = 1; digitalwrite(led_pin, HIGH); else { LEDState = 0; digitalwrite(led_pin, LOW); PreTouchValue = TouchValue; void loop() { int lux; CheckTouch(); lux = TSL2561.readVisibleLux(); SeeedOled.setTextXY(0, 0); SeeedOled.putString("Digital Light"); SeeedOled.setTextXY(1, 0); SeeedOled.putString("Sensor Value is"); SeeedOled.setTextXY(2, 0); SeeedOled.putNumber(lux); SeeedOled.putString(" lux "); SeeedOled.setTextXY(4, 0); SeeedOled.putString("Count is"); SeeedOled.setTextXY(5, 0); SeeedOled.putNumber(OLEDCount++); 20

プログラム 6 : 問題点 Touch センサの PUSH を検知しない場合がある 光センサ表示処理に処理時間が必要なため,CheckTouch() の呼び出し間隔が長く, その間に -ON- がなされると検知出来ない 解決方法 CheckTouch() を呼び出す箇所を増やす 単一の関数が長い場合はどうするか? 性能 ( 応答時間 ) の保証は可能か? ライブラリ関数内の詳細は分からないため困難 CheckTouch() Touch センサ ON ON 光センサ表示処理 検出状況 ON loop() 21

プログラム 7(Interrupt) プログラム 6 の割込み版 割込みハンドラで Touch センサの検出を行う Touch センサの値が変化すると,loop() 処理 ( 光センサ表示処理 ) が中断されて, 割込みハンドラ ( 別の関数 ) が実行される 割込みハンドラが終了すると loop() 処理の中断した箇所から再開する CheckTouch() Touch センサ ON ON 光センサ表示処理 検出状況 ON ON 割込みハンドラ loop() 22

プログラム 7(Interrupt) : プログラム CheckTouch() の内容は変更なし setup() 割込みハンドラとして実行する関数を登録する loop() CheckTouch() の呼び出しは行わない void setup() { Wire.begin(); TSL2561.init(); SeeedOled.init(); SeeedOled.deactivateScroll(); SeeedOled.setNormalDisplay(); SeeedOled.clearDisplay(); pinmode(touch_pin, INPUT_PULLUP); pinmode(led_pin, OUTPUT); digitalwrite(led_pin, LOW); attachinterrupt(touch_pin, CheckTouch, CHANGE); void loop() { int lux; lux = TSL2561.readVisibleLux(); SeeedOled.setTextXY(0, 0); SeeedOled.putString("Digital Light"); SeeedOled.setTextXY(1, 0); SeeedOled.putString("Sensor Value is"); SeeedOled.setTextXY(2, 0); SeeedOled.putNumber(lux); SeeedOled.putString(" lux "); SeeedOled.setTextXY(4, 0); SeeedOled.putString("Count is"); SeeedOled.setTextXY(5, 0); SeeedOled.putNumber(OLEDCount++); 23

プログラム 8 プログラム 7 をベースに Touch センサで Off-On-Off を検知すると LED を 2 秒間点灯する 光センサ表示処理も行う ON Touch センサ 2000ms LED 光センサ表示 24

プログラム 8 : プログラム 割込みハンドラでは delay() 関数は使用出来ない delay() 関数内で割込みを使うため ( 割込みハンドラ実行中は割込み禁止 ) for() で 2 秒程度の計時は可能だが,loop() 処理が停止してしまう ON Touch センサ 検出状況 ON 割込みハンドラ 2000ms LED loop() 25

プログラム 8 : プログラム 割込みハンドラで点灯しループ処理で消灯する方法 loop() 関数は時間同期の処理でなく, ライブラリ関数の実行時間も不明なため実現は困難 void CheckTouch() { int TouchValue = digitalread(touch_pin); if ((PreTouchValue == 0) && (TouchValue == 1) && (TouchState = 0)) { TouchState = 1; if ((PreTouchValue == 1) && (TouchValue == 0) && (TouchState = 1)) { TouchState = 0; digitalwrite(led_pin, HIGH); for(volatile int i = 0; i < 0x400000; i++); digitalwrite(led_pin, LOW); PreTouchValue = TouchValue; void loop() { int lux; lux = TSL2561.readVisibleLux(); SeeedOled.setTextXY(0, 0); SeeedOled.putString("Digital Light"); SeeedOled.setTextXY(1, 0); SeeedOled.putString("Sensor Value is"); SeeedOled.setTextXY(2, 0); SeeedOled.putNumber(lux); SeeedOled.putString(" lux "); SeeedOled.setTextXY(4, 0); SeeedOled.putString("Count is"); SeeedOled.setTextXY(5, 0); SeeedOled.putNumber(OLEDCount++); 26

まとめ 27

まとめ シングルタスクプログラムについて紹介 単一機能の実現 基本的には記述可能 複合機能の実現 記述可能な場合と不可能な場合がある 可能な場合もプログラムの保守性が悪化 それぞれ時間に依存する処理の場合, お互いの実行タイミングを考慮したプログラミングが必要 周期が短い処理と長い一連の処理を実行するのは不可能 割込みハンドラによる解決 割込み発生後に待ちを伴う処理の実現方法が課題 28