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

Similar documents
スライド 1

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

スライド 1

スライド 1

スライド 1

スライド 1

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

スライド 1

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

Microsoft PowerPoint - RL78G14_動画マニュアル_タイマRD.ppt [互換モード]

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

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

PowerPoint プレゼンテーション

スライド 1

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

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

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

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

講習会 Arduino

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

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

本日の内容 導入 回路の作製 回路図から配線図へ ブレッドボードを使った試作回路の作製 マイコンへのプログラム書き込み GPIOの実験

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

データ収集用 NIM/CAMAC モジュールマニュアル 2006/5/23 目次 クレート コントローラ CC/ NIM ADC 1821 (Seiko EG&G)...3 ADC インターフェイス U デッドタイム

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

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

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

スライド 1

スライド 1

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

ディジタル電子回路 設計演習課題

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

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

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

PIC24FJ32GA002 で使える通信方式 デジタル通信 *UART (Universal Asynchronous Receiver Transmitter) 3 線方式 (Tx, Rx, Gnd) 下の 2 つに比べて, 比較的遠方までデータを送受信するのに使う. 調歩同期方式 ( 事前に通

2.RL78 での割り込み処理 ( 割り込み受け付け ) マスクが解除された (xxmk ビットが 0 の ) 割り込み要求信号は 2 つの用途で使用されます 一つ目は,CPU のスタンバイ状態の解除です この動作は, 割り込み優先順位とは全く無関係で, マスクされていない (xxmk=0 の )

回路 : Vdd GND 回路図と呼べるようなものではありません オシレータは外部 ( セラミック発振子 ) なので GP4 と GP5 は使えません 四角の枠内はモジュールなので ここから VDD GND TX RX の4 本をつなぐだけです 測定端子 (GP0) は 1MΩの抵抗と 2MΩの半固

本日の内容 導入 回路の作製 回路図から配線図へ ブレッドボードを使った試作回路の作製 マイコンへのプログラム書き込み GPIOの実験

スライド 1

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

UIOUSBCOM.DLLコマンドリファレンス

AutomaticTelegraphKeyProject.c

Microsoft Word - 実験4_FPGA実験2_2015

VelilogHDL 回路を「言語」で記述する

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

回路 7 レジスタ ( 同期イネーブル及び非同期リセット付 ) 入力データを保持するのに用いる記憶素子 使用用途として, マイクロプロセッサ内部で演算や実行状態の保持に用いられる Fig4-2 のレジスタは, クロック信号の立ち上がり時かつ 信号が 1 のときに外部からの 1 ビットデータ R をレ

/* モジュールストップ解除 */ SYSTEM.MSTPCRA.BIT.MSTPA24 = 0; /* MSTPA24(S12ADA 制御部 ) クロック供給開始 */ SYSTEM.MSTPCRA.BIT.MSTPA17 = 0; /* MSTPA17(S12ADA0) クロック供給開始 */

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

三菱電機マイコン機器ソフトウエア株式会社

スライド 1

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

VLSI工学

TOPPERS 活用アイデア アプリケーション開発 コンテスト 部門 : 活用アイデア部門アプリケーション開発部門 作品のタイトル : Toppers_JSP と Scicos_lab / (Scilab でも可 ) による 組込みメカトロニクス制御シミュレーション 作成者 : 塩出武 ( シオデタ

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

-2 外からみたプロセッサ GND VCC CLK A0 A1 A2 A3 A4 A A6 A7 A8 A9 A10 A11 A12 A13 A14 A1 A16 A17 A18 A19 D0 D1 D2 D3 D4 D D6 D7 D8 D9 D10 D11 D12 D13 D14 D1 MEMR

Microsoft PowerPoint - 工学ゼミⅢLED1回_2018

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

実習内容 PIC18C242 のポート B に接続した LED を点滅させます ( 他の実習と同じ内容です ) 8 個の LED に表示される値が +3 ずつインクリメントします MPLAB を使って MPASM アセンブラのソース ファイルをアセンブルします MPLAB とソース ファイルは配布し

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

TMSx70 MCU の RTI(リアルタイム割り込み)を使用してオペレーティングシステムの Tick を発生させる方法

PowerPoint プレゼンテーション

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

Taro-テキスト.jtd

スライド 1

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

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

アプリケーションノート AS-E402サンプルプログラム

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

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

DCモータの制御

スライド 1

<91E63589F161>

マクロ(シミュレータコマンド)の使い方

Lab GPIO_35 GPIO

Arduinoで組込み制御

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

NI P1200 Release Notes Cover

Microsoft PowerPoint pptx

Timers_JP.fm

AN

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

Transcription:

第 2 回 本日の内容割り込みとは タイマー

割り込み 今までのプログラムは 順番にそって命令を実行していくのみ それはそれで良いが 不便な場合もある 例えば 時間のかかる周辺機器を使う場合 その周辺機器が動作を終了するまで CPU は待たなければいけない 方法 1( ポーリング ) 一定時間毎に 周辺機器の動作が終了したか調べる 終了していれば 次の動作に移るし そうでなければ また少し待ってから同じことを繰り返す めんどくさいし 無駄が多い 方法 2( 割り込み ) 周辺機器に 動作が終了したら通知 (= 割り込み ) してもらうように予め依頼しておく CPU は この周辺機器のことなど気にせず 他の作業をすることができる 周辺機器からお知らせが来たら 予め決めてある動作 (ISR, 割り込み処理ルーチン ) を行う

割り込み 割り込み処理ルーチン 2 割り込み処理ルーチン 1 を実行する メインの処理 時間 割り込み 1 割り込み 2 割り込み元の種類により処理する内容が違う 割り込みが入ると 現在の処理を中断する 割り込み処理が終わったら先ほど実行していた処理を再開する

実際の割り込みルーチンの例 (PIC18F シリーズ ) PIC18 シリーズは 2 つの割り込みルーチン ( 優先度高 低 ) がある void interrupt High_ISR(){ int i; ISR の場合は interrupt (or interrupt low_priority) を 関数の前につける if(intconbits.tmr0if){ : INTCONbits.TMR0IF=0; ISR の中では どの要因で割り込みが生じたのか フラグを見て判断する ( 場合分け ) 処理を終了する前に フラグを必ずクリアする void interrupt low_priority Low_ISR(){ if(pir2bits.usbif){ : PIR2bits.USBIF = 0;

割り込みの設定レジスタ 主な関連レジスタ INTCON 割り込みの許可 禁止の設定 INTCON2 INTCON3 PIR1, 2 PIE1, 2 IPR1, 2 INTCON GIEH 全ての優先度 高 の割込みの許可 禁止 GIEL... 全ての優先度 低 の割込みの許可 禁止 TMR0IE TMR0 の割り込みの許可 禁止他も同様 INTCON2 INTEDGE0 外部割り込みの極性 (1 なら信号立ち上がり 0 なら信号立ち下がりで割り込み発生 ) TMR0IP TMR0 の割り込みの優先度を設定 (1 なら優先度 高 0 なら優先度 低 ) 他も同様

割り込みの設定レジスタ INTCON3 INT2IP 外部割り込み 2(INT2 ピン ) の優先度を設定 INT2IE 外部割り込み 2 の許可 禁止を設定 INT2IF 外部割り込みが発生したかどうかを示す 割り込みが発生したら自動的に 1 に設定される 他も同様 以下のレジスタは 以上と同様 PIR1,2 PIE1,2 IPR1,2... それぞれの割り込み要因毎の割り込みフラグ... それぞれの割り込みの許可 禁止を設定... それぞれの割り込みの優先度を設定

タイマー 文字通り時間を計測するためのモジュール 一定間隔で処理をしたいときや 時間を計測したいときなどに使用する PIC18F2550 には 4 つのタイマー (TMR0~3) が内蔵されている それぞれ ビット数や他の周辺モジュールへの接続が異なるので 詳しくはデータシート参照 ここでは TMR0(8bit モード ) について説明する 関連する主なレジスタ T0CON TMR0L データシートより転載

データシートより転載 カウントアップのための信号選択 カウンタ (8bit) クロック信号 ( の 1/4) プリスケーラ ( 分周器 ) カウンタ値が 255(0xff) になったら 割り込みが発生

カウンタ値 255 割り込みが発生 ISR でカウンタ値を所定の値に再設定 時間 割り込みの周期は (255 - ( 設定カウンタ値 ))/ タイマークロックになる

割り込みの実験 ( タイマー割り込み ) タイマー (TMR0) を使って一定周期 (0.1ms) で割り込みをかける. 割り込みルーチンが呼ばれた回数をカウントすると, 何秒経過したかわかる. これをつかって,0.5 秒ごとに順番に LED を光らせる メイン関数 ( 初期化したあとは, 何もしない. これだけ見ると, 何もしないように見えるが...) void main(void){ InitializeSystem(); EnableHighInterrupt(); while(1){ asm("nop");

初期化関数 unsigned long time_counter; #define TMR0_PERIOD 105 //(=255-150) TMR0 period: 100us void INIT_TMR0(){ タイマーの設定 ( 詳しくはデータシート参照 ) //TMR0 setting [every 100us T0CON = 0xd2; //1101_0010 Enable TMR0, 8bit, Internal clk, PSA=1/8 TMR0L = TMR0_PERIOD; タイマー周期を設定する ( 今回は0.1msにしてある ) INTCONbits.TMR0IE = 1; //Interrupt enable INTCON2bits.TMR0IP = 1; //high priority タイマーがオーバーフロー (0.1 秒後 ) したら 割り込みを発生させるようにする 割り込みの優先度を 高 にする. これによって, 割り込みが起こったら 0x08 番地に飛ぶ void INIT_LEDs(){ TRISBbits.TRISB5 = 0; //RB5 -- Output PIN LATBbits.LATB5 = 1; //RB5 = 'H'

初期化関数 static void InitializeSystem(void){ //GPIO Initialize ADCON1=0x0F; //All digital IO LATA = 0; TRISA = 0xff; // Port A : Intput LATB = 0; TRISB = 0xff; // Port B : Input LATC = 0; TRISC = 0xff; // Port C : Input すべての IO ポートを入力で初期化する INIT_TMR0(); INIT_LEDs(); time_counter = 0;

割り込みルーチン void interrupt High_ISR(){ static long counter =0; 優先度 高 の ISR カウンターを定義 (static をつけると, 関数を一旦出ても値が保持される. それ以外は関数を出ると値は破棄される ) if(intconbits.tmr0if){ この割り込みがTMR0によって引き起こされたかどうかを調べるもしTMR0 割り込みなら,TMR0IFに1が入っているはず TMR0L = TMR0_PERIOD; //period: 100 us 新たなタイマー周期を設定 ( 一定周期なので, 同じ値を入れる ) カウントアップしつつ, 値を比較 25000カウント (=2.5 秒経過 ) したら,LEDとカウンターをリセット //TMR0... system time counter if( ++counter > 25000 ){ //2.5 sec counter = 0; LED0_off(); else if( counter > 20000 ){//2.0 sec LED0_on(); 20000カウント (=2 秒経過 ) したら,LEDをONにする INTCONbits.TMR0IF=0; //Clear Interrupt flag フラグをクリア << 絶対必要 >> これをしないと, 割り込みがこのルーチンを抜けた瞬間に, また割り込みが発生してしまう. 無限ループ

タイマーの応用 :LED の明るさ調整 アナログ的にやるのは困難 ( マイコンの IO は通常デジタル出力 ) そこで, すごい早さで ON OFF させる. ON と OFF の時間を変えることで, 明るさを変える. そのような目的のために,PIC には PWM モジュールが組み込まれている. しかし,PWM モジュールは数が限られている上, 接続するピンが限られてしまう. ( たくさんの LED の駆動はむずかしい ) そこで, タイマー割り込みをつかって,PWM の機能を実現する. ー > ソフトウェア処理なので, 汎用性があるー > ただし, ソフトウェア処理に多少の時間がかかる ( あまり早い ON.OFF は難しい ) ( 人間の目をごまかすくらの十分な早さは出せる ) ON 1 周期 連続的に変化 1 周期 ON OFF 時間デューティー比 =(ONの時間 )/( 周期 ) デューティー比, 小 = 暗い OFF デューティー比, 大 = 明るい

main.c : #define LED_PERIOD (100) LED 点灯の周期を設定 ( これで10msに設定される ) BYTE LED0_duty; LEDのON 時間を保存しておくための変数 #define LED0_PWM(val) LED0_duty = (val) ON 時間を設定するためのマクロ : unsigned long time_counter; #define TMR0_PERIOD 105 period: 100us //(=255-150) TMR0 void interrupt High_ISR(){ static unsigned int LED_timer; if(intconbits.tmr0if){ TMR0L = TMR0_PERIOD; time_counter++; //period: 100 us if(led_timer <= LED0_duty) LED0_on(); if(--led_timer == 0){ LED_timer = LED_PERIOD; LED0_off(); INTCONbits.TMR0IF=0; //Clear Interrupt flag システム時間 ( グローバル変数 ) を更新 カウンタ (LED_timer) と設定値を比較 LEDx_duty の値に応じて LED を点灯 カウンタ (LED_timer) が 0 になったら, 新たな周期を書き込むすべての LED を OFF

変数 LED_Timer の値 =LED_PERIOD =LED0_DUTY LED0 の出力 LED0_ON() が呼ばれる LED0_OFF() が呼ばれる 時間 ON OFF 時間

時間 main.c : period = 10000; while(1){ if(time_counter > time_next_change ){ time_next_change = time_counter + 500; LED0_PWM( (BYTE)(50.0 + 50.0*sin( ((double)time_counter/(double)period + 0.00) * 2.0*3.14) ) ); : システム時間をみて, 一定時間ごとに処理を行う ( ここでは 50ms ごと ) LED の明るさ (PWM のディーティー ) をサイン波状に変える LED0_Duty の値... LED0 出力......... 50 ms

応用 LED_PERIOD の値を大きくすれば, 遅い点滅も表現できる (PWM の明るさ制御とまったく同じ. 周期が早いと人間の目がごまかされて明るさが変化しているように見えるだけ ) ( ラジコン用 ) サーボモータの制御も PWM 変調ー > 同じ方法で, サーボモータの制御もできる. フィルタ ( 広域カットフィルタ,LPF) を通せば, アナログ出力を得られる. ー >DA コンバータ ( 注, 低速 )

割り込みを使ったプログラム 問題 ポート B0 にスイッチをつなぎ スイッチを押したら割り込みが発生するようにせよ ポート A0 には LED をつなぎ 割り込みルーチンに入ったら LED の ON/OFF を切り替えよ void interrupt isr(){ If( ) //clear flag