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

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

スライド 1

スライド 1

スライド 1

// USB_CNC_Machine リモート PIO 端末プログラムのメイン関数およびユーザアプリ部 // 編集作成 by Takehiko Inoue /*********** メイン関数 ***************************/ #pragma code

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 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

PowerPoint プレゼンテーション

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 ポート )

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

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

スライド 1

1 1 TA, ,9 1. ( 2. TM TM GUI TM 1. P7-13 TM Notepad, Meadow, ( P109 ). 2. (shisaku01/sys test)

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

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

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

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

057 { 058 int i; 059 timecounter=0; 060 pwmvalue=0;x=0;v=0; 061 requestdisplaydata=1; 062 tick=1; 063 for (i=0; i<rbuffsize; i++) { 064 ringbuffer[i]=

Microsoft PowerPoint - timer_pwm2.pptx

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

スライド 1

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

マイコンボードの LED 制御 準備編その 1 マイコンとノート PC の役割 どうすれば LED は光るの? 光らせる LED の選択は? マイコン端子に接続された LED マイコン端子の電圧設定 制御用ソフトウェアの注意点 1

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

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

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

スライド 1

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

スライド 1

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

PowerPoint プレゼンテーション

Microsoft Word - 4章.doc

PIC24F Family Reference Manual Section 9 WDT

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

講習会 Arduino

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

スライド 1

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

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

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

スライド 1

ETCB Manual

Timers_JP.fm

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

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

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

VLSI工学

Microsoft PowerPoint - 工学ゼミⅢLED1回_2018

Microsoft Word - 実験4_FPGA実験2_2015

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

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

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

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

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

Microsoft Word - 工学ゼミ3_テキスト

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

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

PowerPoint Presentation

-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

< 動作マトリクス > 停止 REQ 固定位置 REQ 往復 REQ 停止 () 現在位置と同じなら無視異なれば停止パルス中へ 停止パルス中へ 停止 ( 固定位置 ) 現在位置と同じなら無視異なれば停止パルス中へ 停止パルス中へ 停止パルス中 ( 停止パルス終了後 ) ( 停止パルス終了後動作 )

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

ex04_2012.ppt

RH850の割り込み/例外実現方法 CC-RHアプリケーションガイド

プログラミングA

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

製åfi†æ¡‹åƒ–.xlsx

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

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

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

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

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

プログラミングA

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

3 1EEPROMElectrically Erasable PROM PROMProgrammable ROM 2 EEPROM 3

PowerPoint プレゼンテーション


untitled

AutomaticTelegraphKeyProject.c

目次 目次... 1 はじめに... 3 マイコンシミュレータのデバッグ機能... 3 スタートアップコマンドファイル... 5 シミュレータコマンド ( マクロ ) 例... 6 I/O 制御等で外的要因待ちをしている場合 ( その1)... 6 I/O 制御等で外的要因待ちをしている場合 ( そ

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

Microsoft PowerPoint - OS04.pptx

RX開発環境移行ガイド V850からRXへの移行(コンパイラ編)(CA850/CX→CC-RX)

Microsoft PowerPoint - kougi7.ppt

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

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

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

Microsoft Word - テキスト.docx

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

Microsoft PowerPoint pptx

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

Microsoft Word - 本文.doc

DCモータの制御

プログラミング入門1

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;

実際の割り込みルーチンの例 (PIC24F シリーズ ) PIC24 シリーズの場合は それぞれの割り込み要因ごとに ISR を設定できる ( ベクタ方式 ) ADC 割り込みの場合 void attribute ((interrupt, no_auto_psv)) _ADC1Interrupt(void){ : IFS0bits.AD1IF= 0; 終了前にはフラグをクリアする タイマー (TMR1) 割り込みの場合 void attribute ((interrupt, no_auto_psv)) _T1Interrupt(void) { : IFS0bits.T1IF = 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 _endasm //end main

初期化関数 static void InitializeSystem(void){ //GPIO Initialize ADCON1=0x0F; LATA = 0; TRISA = 0xff; LATB = 0; TRISB = 0xff; LATC = 0; TRISC = 0xff; //All digital IO // Port A : Intput // Port B : Input // Port C : Input //TMR0 setting [every 100us タイマーの設定 ( 詳しくはデータシート参照 ) T0CON = 0xd2; //1101_0010 Enable TMR0, 8bit, Internal clk, PSA=1/8 TMR0L = TMR0_PERIOD; タイマー周期を設定する ( 今回は0.1msにしてある ) INTCONbits.TMR0IF=0; //Clear Interrupt flag INTCONbits.TMR0IE = 1; //Interrupt enable タイマーがオーバーフロー (0.1 秒後 ) したら INTCON2bits.TMR0IP = 1; //high priority 割り込みを発生させるようにする InitLEDs(); //end UserInit すべての IO ポートを入力で初期化する 割り込みの優先度を 高 にする. これによって, 割り込みが起こったら 0x08 番地に飛ぶ

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

main.h : //Interrupt vector #pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = 0x08 void Remapped_High_ISR (void) { _asm goto High_ISR _endasm 特殊な命令, 置かれるメモリを指定 (0x08... 優先度 高 の割り込みが起きるとここに飛んでくる ) 中では,goto 命令で High_ISR() に飛ぶように指定 特殊な命令, 置かれるメモリを指定 (0x18... 優先度 低 の割り込みが起きるとここに飛んでくる ) #pragma code REMAPPED_LOW_INTERRUPT_VECTOR = 0x18 void Remapped_Low_ISR (void) { 中では,goto 命令でLow_ISR() に飛ぶように指定 _asm goto Low_ISR _endasm : 割り込みルーチンの入り口の定義

タイマーの応用 :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 時間を保存しておくための変数 BYTE LED1_duty; BYTE LED2_duty; BYTE LED3_duty; #define LED0_PWM(val) LED0_duty = (val) ON 時間を設定するためのマクロ #define LED1_PWM(val) LED1_duty = (val) #define LED2_PWM(val) LED2_duty = (val) #define LED3_PWM(val) LED3_duty = (val) : void High_ISR(){ : //TMR0... system time counter if(intconbits.tmr0if){ TMR0L = TMR0_PERIOD; //period: 100 us time_counter++; システム時間 ( グローバル変数 ) を更新 if(led_timer <= LED0_duty) LED0_on(); if(led_timer <= LED1_duty) LED1_on(); if(led_timer <= LED2_duty) LED2_on(); if(led_timer <= LED3_duty) LED3_on(); if(--led_timer == 0){ LED_timer = LED_PERIOD; LED0_off(); LED1_off(); LED2_off(); LED3_off(); カウンタ (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; システム時間をみて, 一定時間ごとに処理を行う ( ここでは 50ms ごと ) LEDの明るさ (PWMのディーティー) をサイン波状に変える LED0_PWM( (BYTE)(50.0 + 50.0*sin( ((double)time_counter/(double)period + 0.00) * 2.0*3.14) ) ); LED1_PWM( (BYTE)(50.0 それぞれのLEDで位相をPI/2だけ変える + 50.0*sin( ((double)time_counter/(double)period + 0.25) * 2.0*3.14) ) ); LED2_PWM( (BYTE)(50.0 + 50.0*sin( ((double)time_counter/(double)period + 0.50) * 2.0*3.14) ) ); LED3_PWM( (BYTE)(50.0 + 50.0*sin( ((double)time_counter/(double)period + 0.75) * 2.0*3.14) ) ); : LED0_Dutyの値... LED0 出力......... 50 ms

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

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