C言語によるPIC(16F88)プログラミング実習テキスト

Similar documents
PowerPoint プレゼンテーション

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

スライド 1

スライド 1

スライド 1

Microsoft Word - PIC-USBマイコンボード_v1-02@WEB公開用資料.docx

スライド 1

スライド 1

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

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

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

Microsoft PowerPoint - 工学ゼミⅢLED1回_2018

Microsoft Word - 4章.doc

スライド 1

PowerPoint プレゼンテーション

untitled

PIC

untitled

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

余白 : 上下 25.4mm, 左右 19mm (Word2012 での やや狭い 設定 ) マイコンプログラミング演習 I レポート 1 実験日 提出日 回路構築 /LED を用いた I/O 制御 [16pt] 班員と担当責任者第 0 班レポート作成

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

Microsoft Word - 実験4_FPGA実験2_2015

-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

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

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

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

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

Microsoft PowerPoint pptx

回路図 部品表 部品番号 型番 個数 U PIC6F823 I/ST (TSSOP 4pin) R 00Ω (/0W, 608) R2 - R9 360Ω (/0W, 608) 8 C μf (25V, 608) LED LN56RA CN ロープロファイルピンソケット CN2 ロープロファイルピン

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

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

PIC の書き込み解説 PICライターを使うときに間違った使い方を見受ける 書き込み失敗の原因は知識不足にある やってはいけないことをしている 単に失敗だけならまだしも部品を壊してしまう 正しい知識を身に着けよう 書き込みに必要なピンと意味 ICSPを意識した回路設計の必要性 ICSP:In Cir

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

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

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

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

スライド 1

Microsoft PowerPoint - Borland C++ Compilerの使用方法(v1.1).ppt [互換モード]

Microsoft Word - マイコンを用いた信号# doc

3 4 PIC

Microsoft PowerPoint - 第8α章.ppt [互換モード]

Microsoft Word - テキスト.docx

スライド 1

スライド 1

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

AKI-PIC16F877A開発キット (Ver1

AI1608AYUSB手順V3

プログラミング基礎

ETCB Manual

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

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

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

スライド 1

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

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

,, ( ) 5 ma ( ) 5V V 5 6 A B C D E F G H I J , LED LED, LED, 7 LED,, 7 LED ( ) V LED VCC 5V 7 LED VCC f g f a g b a b c e d e d c dp dp VCC (

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

Taro11-…e…L…X…g.jtd

本書は INpMac v2.20(intime 5.2 INplc 3 Windows7/8/8.1に対応 ) の内容を元に記載しています Microsoft Windows Visual Studio は 米国 Microsoft Corporation の米国及びその他の国における登録商標です

スライド 1

SLCONFIG の操作 JF1PYE Ⅰ. PC と slconfig の通信設定 Ⅱ. Slconfig の操作 Ⅲ. 端末ソフトによる Command 機能 Ⅳ. slconfig 実行形式プログラムの作成 Ⅴ. 端末ソフト Tera Term のダウンロード インストー

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

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

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

Microsoft PowerPoint LC_15.ppt

KR-501 USB Serial Converter Module USB シリアル変換モジュール取扱説明書 Version2.3 対応版 USB Serial Converter はマイコンモジュールと PC 間を接続する際に使用する通信変換モジュールです ATMEGA Mini Module

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

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

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

TWE-Lite R 取扱説明書

Taro-テキスト.jtd

AutomaticTelegraphKeyProject.c

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

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

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

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

<4D F736F F F696E74202D F4B87555F A838B B F5F91E63189F12E >

スライド 1

スクールCOBOL2002

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

PowerPoint プレゼンテーション

Microsoft Word - 本文.doc

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

PA-S500 取扱説明書

スライド 1

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

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

#define HOUR 0x04 #define DAY 0x05 #define WEEKDAY 0x06 #define MONTH 0x07 #define YEAR 0x08 #define CKOUT 0x0D #define CTRLT 0x0E // CLKOUT // TIMER

BCSH7211 開発セット 添付 CD の使い方 第 1 版 CD 構成 1-1 インストゥール 1-2 GNUSH7211 ホルダ 1-3 BRE ホルダ 1-4 コンパイル 1-5 GCC オプションの意味 2.BCSH7211 CPU ボード用 サンプルプログラム 入

Microsoft PowerPoint - 第3回目.ppt [互換モード]

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

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

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

Microsoft PowerPoint - RL78G1E_スタータキットデモ手順_2012_1119修正版.pptx

64 松尾邦昭 2. 無線送受信装置 SANWA 製のラジコン送受信装置は, その機能性の豊富さと価格の安さを理由に多くのラジコン ファンに愛用されており, 今回使用した VG6000は, チャンネル数が6チャンネルあり, ヘリコプター制御用に設計 開発され使用されているものだが, 我々はこれをロボ

C#の基本

スライド 1

BSF PORTA BCF PORTA MOVLWB MOVLWB MOVLWB MOVLWB , E=1, E=0 8 ビット 行表示 ディスプレイ制御 表示クリア エントリーモード CALLDSP MAIN BCF PORTA,3 R

(Microsoft Word - \214\264\215e B_\217\221\202\253\215\236\202\335\225\224.docx)

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

Transcription:

はじめに 本書は生理科学実験技術トレーニングコースにて我々が 2007 年度よりおこなってきた, C 言語によるPICプログラミング の実習で作成したテキストから抜粋して再編集したものです PIC については書籍やインターネット等で詳しく紹介がされており本書では詳しく説明をすることはしません また, デジタル回路の基本的なことやプログラムの作成には C 言語の知識が多少必要になります したがって, 本書の内容では PIC の魅力を分かっていただけないかも知れませんが, マイクロ コントローラに興味はあるがまだ使ったことが無い人に少しでもお役にたてればと考えています ( 本書をお読みいただく前に ) 図 1-1 はサンプルのプログラムで使用するテストボードの基本回路です さっそくですが, この回路図から何ができるのか想像できますか? PIC16F88 :PIC デバイス 330,5.1K,10K : 抵抗 ( 数値は抵抗の値 ) 10uF,0.1uF : コンデンサ ( 数値は容量の値 ) D1~D8 :LED 2SA1015 : トランジスタ PSW,SW : スイッチ, 押しボタン VDD : 電源 + : グランド (GND) 図 1-1, テストボート基本回路 PIC に何のプログラムがされているのか分からないので, どのような動作をするのかを答えるのは無理ですが, 電源やスイッチ,LED や抵抗, それにトランジスタなどの基本的な電子部品の記号の見方, 電圧や電流を加えたときの動作がある程度分かっていないと PIC のプログラムはできません もし, 回路の見方が分からないということでしたら, 電気部品とデジタル回路について少し勉強をしてから本書を読んでいただくと理解が深まると思います - 1 - Copyright 2013 NIPS Technical Division.

PIC について マイクロ コントローラと呼ばれるプログラム可能なデバイスは数多く存在しますが, マイクロチップ テクノロジー社で開発された PIC(Peripheral Interface Controller) は古くから電気工作好きの人々に利用されてきました PIC には多くの種類があり, デジタル入出力, 通信機能, アナログ入力, USB 機能など, 用途に合わせて選ぶことができます 本書では,PIC16F88 を使用しています PIC とは Peripheral Interface Controller の略でこの名前が表すように周辺機器の制御をおこなうための小さなコンピュータです PIC の内部には様々な仕事をする機能が組み込まれていますが, この内部に備わっている機能 (= 装置 ) も周辺機器と呼びます < 仕様 > プログラムメモリ (ROM) データメモリ (RAM) データ EEPROM 入出力ピンタイマ (8/16 ビット ) アナログ入力その他, 通信機能など :4k ワード :368 バイト :256 バイト :16 本 :2/1 個 :7 本 図 1-2,PIC16F88 周辺機器と信号やデータのやり取りするための接続口のことを Input/Output ポート ( 略して,I/O ポート ) といいます また PIC から出ている金属製の足のことを I/O ピンといいます PIC の種類によって I/O ピンの数は様々です PIC16F88 では 18 本のピンが出ていますが, 電源 :VDD, グランド :GND, リセット :MCLR, オシレータ :OSC1,OSC2 で 5 本を使用すると I/O で使用できるピンは 13 本となります ただし, ピンの幾つかは I/O やアナログ入力と兼用することができるので I/O は最大で 16 本使用することができます 例えば 押しボタンなどを接続する場合には I/O ピンを入力として設定します また LED などを接続する場合には I/O ピンを出力として設定します 例 ) スイッチの状態検査右図の場合 入力ピンの状態はスイッチを押すと Low 状態スイッチを離すと High 状態 例 )LED の点灯 消灯右図の場合は 出力ピンの状態を Low 状態にすると LED は点灯 High 状態にすると LED は消灯 図 1-3,PIC に何を接続するかで, ピンの入出力を決める - 2 - Copyright 2013 NIPS Technical Division.

I/O ピン毎の入出力回路の違いで入出力の動作が異なる場合があります 例えば,RA4 だけは出力として使用するとオープンドレインとなります また, ポート B のピンを出力として使用する場合には弱プルアップの設定をすることができます 詳しくは PIC16F88 の資料を参照してください PIC16F88 は信号の電圧が高いか低いかの 2 値 ( デジタル : 1 or 0 ) を扱えるだけでなく, 電圧値 ( アナログ ) を扱えます このような PIC では 1 つのピンが複数の機能を持つことになり, それらの機能を使用するには TRISx レジスタと他のレジスタも設定する必要があります アナログ入力兼用の I/O ピンはリセット後の設定がデフォルトでアナログ入力となるものがあるので, ピンの設定は目的に応じて必ずおこないます また, このようなピンはユーザーが I/O ピンとして使用することはできません また,MCLR ピンや OSC ピンを I/O ピンとして使用できる PIC もあります 周辺機器との接続口を I/O ポートといい I/O ピンの ON/OFF を制御するレジスタ (PORTA PORTB など ) を指すこともあります PIC の I/O ポートは特殊機能レジスタ内にメモリマップド I/O で配置されており, メモリをアクセスするのと同じ命令で周辺装置とデータをやり取りすることができます パソコンや PIC などの計算機の内部では全ての事柄が電圧の低いと高いで区別されます 電圧の低い状態を Low=0, 電圧の高い状態を High=1 として扱うことを正論理といい,Low=1,High=0 として扱うことを負論理といいます PIC のピンに入出力する信号は正論理で扱います PIC16F88 には PORTA と PORTB の 2 つのポートがあります I/O ポートを制御するには,TRISx (x はポート名 ) レジスタと PORTx レジスタを使用します PIC の I/O ピンは TRISx レジスタを設定することで,I/O ピンを入力または出力のどちらかで使用することができます TRISx レジスタのビットをセット (=1) すると, そのビットに対応する I/O ピンが入力となり,I/O ピンがハイインピーダンスモードになります TRISx レジスタのビットをクリア (=0) すると, そのビットに対応する I/O ピンが出力となり PORTx のビットが1なら H レベル (Vdd),0なら L レベル (GND) の信号が出力されます 例 ) ポート B に対してライト命令やリード命令を実行したときの入出力ピンの状態 図 1-4,I/O ポートのリードとライト 図 1-3 の場合 押しボタンを押したときに入力は [0] となります また LED を点灯するには出力を [0] にします - 3 - Copyright 2013 NIPS Technical Division.

テストボートについて 本テキストのプログラムを動作させるためのテストボートの回路を図 2-1 に示します 図 2-1, テストボードの回路図 - 4 - Copyright 2013 NIPS Technical Division.

図 2-2, テストボートの組み立て例です 図 2-3 はその部品配置と結線パターン図です 図 2-2, テストボートの組み立て例 部品面 ( 表面 ) ハンダ面 ( 裏面 ) 図 2-3, テストボードの部品配置と結線パターン例 - 5 - Copyright 2013 NIPS Technical Division.

回路部品 部品番号 部品名称 値 部品の印字 備考 U1 PIC16F88 - PIC16F88 18 ピン IC ソケット - U2 レギュレータ +5V 78L05 印字面手前, 左から 1,2,3 C1,C3,C4 セラミックコンデンサ 0.1uF 104 C5 電解コンデンサ 33-100uF 33-100uF 足の長い方が + 側 C10 電解コンデンサ 10uF 10uF 足の長い方が + 側 Q11,Q12,Q13 トランジスタ 2SA1015 A1015 印字面手前, 左から 1,2,3 D1~D8 LED - 足の長い方が + 側 D9 2 色 LED - 足の長さに注意 向きあり D10,D11 7セグ LED - 上下方向に注意 R1~R8 抵抗 330Ω 橙橙茶金 R11,R12,R13 抵抗 5.1KΩ 緑茶赤金 R20,R21,R22 抵抗 10KΩ 茶黒橙金 R23 抵抗 680Ω 青灰茶金 SW1,SW2 プッシュスイッチ - SW3 トグルスイッチ - J1~2,J11-18 シングル IC ソケット - J3 L 型ピンヘッダ 5Pin - J5 電池スナップ - 形状に注意 LS1,LS2 ミニリレー - G6A-274P オムロン社製 その他 プレップボード 演習で使用 ジャンパ線 演習で使用 CdS セル 演習で使用 ブザー 演習で使用 100Ω 抵抗 演習で使用 10KΩ 抵抗 演習で使用 押しボタンスイッチ 演習で使用 PIC がプログラムを処理するためにはクロックが必要になります クロックは心臓の鼓動に相当し規則正しいリズムを刻んで CPU に命令を処理するタイミングを知らせます この CPU クロックを発生する装置を発振器や発振回路といいます クロックはそのままの周波数で使われたり, 元の周波数に対して 1/n に分周したりn 倍に逓倍したりして利用します 他の書籍などで PIC には発振回路 ( 発振器やオシレータなど ) が必要と書いてあり, 図 2-1 と回路部品には発振に相当するものが無いのを見て変に思われた人がいるかもしれません,PIC16F88 には発振器が内蔵されており最高 8MHz のクロックを内部で発振させることができます 本書の演習では内蔵発振器を利用しています - 6 - Copyright 2013 NIPS Technical Division.

開発環境のインストール 1) コマンドプロンプトの用意適当な場所に作業用のフォルダ ( ディレクトリ ) を作成します 以下の説明は, ドライブ [C:] の下にファルダ [temp] を作成した場合です コマンドプロンプト ([ スタート ] メニュー [ プログラム ] [ アクセサリ ] の中にあります ) のショートカットのコピーを作る または, C:\Windows\System32\CMD.EXE のショートカットを作ります プロパティを表示して, ショートカット タブの 作業フォルダ を, 先に作成した [c:\temp] フォルダに変更します - 7 - Copyright 2013 NIPS Technical Division.

2)C 言語の開発環境の用意 PIC のプログラム開発には,C 言語のコンパイラやリンカなどのソフトウエアが必要になります それに, 作成したプログラムを PIC に書き込むための PIC ライタなどのハードウエアが必要になります ソフトウエアについてはフリーで入手することができます 本書ではプログラム開発には Small Device C Compiler( 以下,SDCC) を使用します コンパイラ http://sdcc.sourceforge.net/ アセンブラ, リンカ http://gputils.sourceforge.net/ テキストエディタ, メモ帳などテキスト編集できるものなら何でも良いです 参考 ) サクラエディタサクラエディタプロジェクト http://sakura-editor.sourceforge.net/ ダウンロードしたコンパイラとリンカプログラム テキストエディタをインストールします コマンドプロンプトを起動して, インストールができているか確認します スタート - プログラム - アクセサリ の コマンドプロンプト を選択する または, スタート - ファイル名を指定して実行 ] の名前に cmd と入力して OK します DOS 窓が表示されたら > の後に, sdcc とタイプしてヘルプが表示されることを確認してください 次に, gplink とタイプしてヘルプが表示されることを確認してください - 8 - Copyright 2013 NIPS Technical Division.

バッチファイルの作成バッチファイルは, コンパイル時の入力作業を軽減するために作成します テキストエディタを起動して, 下記の内容を入力します 入力が終わったら, 作業フォルダに [cc.bat] の名前で保存します @echo off sdcc -V -mpic14 -p16f88 %1 コンパイルのオプションについては, コンパイルの仕方 のページを参照してください プログラムライタの用意 PIC にプログラムを書き込むには専用の装置 ( プログラムライタ ) が必要です テストボードには マイクロチップ社 (Microchip Technology Inc.) の PICkit2 または PICkit3 を直接接続できるように端子を設けています - 9 - Copyright 2013 NIPS Technical Division.

プログラムの開発 SDCC コンパイラについて コンパイラにはコンパイラ毎の特有な命令や記述の仕方があります 以下の内容は SDCC で有効なものであり, 他のコンパイラでは異なる場合があります サポートするデータ型 レジスタへのアクセスレジスタへ値を読み書きしてペリファラルを制御します SDCC ではレジスタ名を変数のように扱えるように, ヘッダファイルで定義されています 例 ) 値の書き込み PORTA = 0xaa; // ポート A に 0xaa(10 進では 170) をセットします 値の読み込み unsigned char i; i = PORTA; // 変数 i を unsigned char 型 (8bit) で宣言 // ポート A から値を取り出します ヘッダファイル特殊機能レジスタ (SFR) にアクセスするには, ヘッダファイルで定義されているマクロ名を変数名 (unsigned char 型 ) として使用します 定義されている変数名は PIC の仕様書に記載されているレジスタ名やビット名と同一になっています 例えば, ポートやレジスタなどから信号を入出力する場合には以下のように記述する ポートおよびレジスタ指定入力 : i = PORTX; //Xは各ポートを示す, 例えば,PORTAなど出力 : PORTX = j; //Xは各ポートを示す, 例えば,PORTAなど ビット指定入力 : i = RX4; 出力 : RX4 = j; //Xは各ポートを示す, 例えば,RA0など //Xは各ポートを示す, 例えば,RA0など // 数字はポートのビット番号 - 10 - Copyright 2013 NIPS Technical Division.

コンパイルの仕方 1) 先に作成しておいたコマンドプロンプトのショートカットから DOS 画面を起動します コマンドプロンプトを使い慣れていない方は, ファイルのコピーやディレクトリ ( フォルダ ) の作成などは WINDOWS のファイルマネジャーなどを使用してください フォルダの移動書式 >cd ファルダ名一つ下のフォルダ名のフォルダへ移動 >cd.. 一つ上のフォルダへ移動 ディレクトリ内のファイル名の表示書式 >dir 2)DOS 画面で SDCC のコマンドを入力します 書式 >sdcc 制御オプション -m デバイスの種類 -p デバイス名ソースファイル名 制御オプションには以下のものがあります -V : コンパイルの進行状況を表示します -c : コンパイルとアセンブルの後にリンクをしない オブジェクトファイル (.o) を出力します オプションを省略すると, コンパイル, アセンブル, リンクがおこなわれ (.hex) ファイルができます 小規模なプログラムでソースファイルが1つのときにはオプションを省略します 規模の大きなプログラムを作成するときには, ソースファイルを分割して個別にコンパイルとアセンブルをおこない (.o) ファイルを生成し, 全てのコンパイルがすんだらリンカで (.hex) ファイルを生成します -S : アセンブラソース (.asm) を出力します -o : 出力ファイル名を指定します デバイスの種類に PIC16F88 の場合は, pic14 とします デバイス名に PIC16F88 の場合は, 16F88 とします PIC16F88 のソースファイルをコンパイルする場合 1 個のソースファイルをコンパイルからリンクまでする場合, >sdcc V mpic14 p16f88 ファイル名.c コンパイルが正常に終われば, ファイル名.HEX というファイルができます 複数のソースファイルのコンパイルをおこない後からリンクする場合ファイルを個別にコンパイルします >sdcc -c -mpic14 -p16f88 ファイル名 1.c >sdcc -c -mpic14 -p16f88 ファイル名 2.c オブジェクトファイル, ファイル名 1.o とファイル名 2.o をリンクします >gplink -I"c:\program files\sdcc\lib\pic" -w -r o 出力ファイル名ファイル名 1.o ファイル名 2.o libsdcc.lib pic16f88.lib 例 ) >sdcc -c -mpic14 -p16f88 main.c >sdcc -c -mpic14 -p16f88 sub.c >gplink -I"c:\program files\sdcc\lib\pic" -w -r -onips main.o sub.o libsdcc.lib pic16f88.lib リンクによって,nips.hex ファイルができます - 11 - Copyright 2013 NIPS Technical Division.

SDCC のプログラム書式 I/O ポートの制御例 < 回路説明 > 出力 LED-D1 の点灯 / 消灯 D1 を点灯するには RA0 を Low D1 を消灯するには RA0 を High 入力スイッチ-SW1 の状態 SW1 が OFF のとき RB0 は High SW1 が ON のとき RB0 は Low A) 上図の回路で LED-D1 を点灯する ポートAの入出力モードを設定する 特殊機能レジスタ (SFR) の TRISA レジスタの RA0 にあたる Bit0 の値を0( 出力モード ) にします 例 ) TRISA = 0x00; // この例では, ポートAの RA0 以外のビットも出力に設定される RA0 のピンを Low( 電圧が低い状態 ) にするため, ポート A の Bit0 に 0 を設定する 例 ) PORTA = 0x00; // ポートAの RA0 を Low:0 に設定, // この例では, ポートA 全体に対して 0 を設定しているまたは RA0 = 0; // ポートAの RA0 に対してだけ 0 を設定している B) 上図の回路でスイッチ-SW1 の状態を取得するポート B の入出力モードを設定する 特殊機能レジスタ (SFR) の TRISB レジスタの RB0 にあたる Bit0 の値を1( 入力モード ) にします 例 ) TRISB = 0x01; // ポートBの RB0 を入力に設定, この例では他は出力に設定される RB0 のピンの状態 スイッチ ON(Low のとき 0), スイッチ OFF(High のとき 1) を取得する 例 ) int swchk; swchk = PORTB; // ポートBレジスタのリード if ( ( swchk & 0x01 ) == 0x00 ) {... //Bit0 の値を 0 かどうかチェック または if ( ( PORTB & 0x01 ) == 0x00 ) {... // ポートBをリードして,Bit0 の値をチェック または if ( RB0 == 0 ) {... // ポート B の Bit0 をリードして, その値をチェック - 12 - Copyright 2013 NIPS Technical Division.

割り込み処理 割り込み処理は次のように記述します void Intr(void) interrupt 0 または void Intr(void) interrupt 0 { { // 割り込み内の処理 // 割り込み内の処理 Intr は関数名ですが, Intr でなくても構いません interrupt または interrupt の後にはスペースを空けて割り込みレベル値を記述します PIC16F88 などの 14bit の PIC では 0 レベルしかありません ( 重要 ) 割り込みレベルはレベル0の1つだけで, 全ての割り込みはここにジャンプします 割り込み処理内 ( void Intr(void) interrupt 0{ ) で何の割り込みが発生したか判定をおこない, 割り込みが発生した要因毎にプログラムを記述します ビット反転処理について左側の C ソースをコンパイルすると, 右側のようにアセンブラのコードが作られます ( アセンブラのコードは処理の関係で毎回このようなものができるとは限りません ) この例では,4 項目と7 項目のアセンブラのコードができていません SDCC においてはレジスタ (I/O ポート ) の1ビットを示す変数を反転することはコンパイルエラーとならずアセンブラコードができないので注意すること 5 項目のようにすることでビットの反転ができます C 言語のコード参考, コンパイル後のアセンブラコード 1: PORTB = 0x00; BCF STATUS,5 CLRF _PORTB 2: RB0 = 0x01; BSF (_RB0 >> 3), (_RB0 & 7) 3: PORTB = ~PORTB; COMF _PORTB,W MOVWF _PORTB 4: RB0 = ~RB0; ビットの反転はプログラムコードができない 5: RB0 = RB0 ^ 1; MOVLW (1 << (_RB0 & 7)) XORWF (_RB0 >> 3),F 6: RA0 = RB0; BCF (_RA0 >> 3), (_RA0 & 7) BTFSC (_RB0 >> 3), (_RB0 & 7) BSF (_RA0 >> 3), (_RA0 & 7) 7: RA0 = ~RB0; ビットの反転はプログラムコードができない - 13 - Copyright 2013 NIPS Technical Division.

PIC の特殊機能,SDCC でのコンフィグレーション指定コンフィグレーションをプログラムで指定するには, int at 0x2007 config = の後に指定したい項目を & で続けます SDCC の PIC16F88.H で定義されているコンフィグレーション Configuration 1 Options は int at 0x2007 config1 = に続けます _CP_ALL Code protected (all protected) _CP_OFF Code protection off _CCP1_RB0 CCP1 function on RB0 _CCP1_RB3 CCP1 function on RB3 _DEBUG_OFF In-Circuit Debugger disabled _DEBUG_ON In-Circuit Debugger enabled, _WRT_PROTECT_OFF No program memory write protection _WRT_PROTECT_256 First 256 program memory protected _WRT_PROTECT_2048 First 2048 program memory protected _WRT_PROTECT_ALL All of program memory protected _CPD_ON Data EE memory code-protected _CPD_OFF Code protection off _LVP_ON Low-Voltage Programming enabled _LVP_OFF Low-Voltage Programming disabled _BODEN_ON Brown-out Reset enabled _BODEN_OFF Brown-out Reset disabled _MCLR_ON MCLR-pin function is MCLR _MCLR_OFF MCLR-pin function is digital RA5 or VDD _PWRTE_OFF Power-up Timer disabled _PWRTE_ON Power-up Timer enabled _WDT_ON Watchdog Timer enabled _WDT_OFF Watchdog Timer disabled _EXTRC_CLKOUT External Resistor/Capacitor Fosc/4 RA6 _EXTRC_IO External Resistor/Capacitor I/O on RA6 _INTRC_CLKOUT Internal Oscillator CLKOUT-RA6 and I/O-RA7 _INTRC_IO Internal Oscillator I/O-RA6 and I/O-RA7 _EXTCLK External Clock with I/O-RA6 _HS_OSC HS oscillator _XT_OSC XT oscillator _LP_OSC LP oscillator Configuration 2 Options は int at 0x2008 config2 = に続けます _IESO_ON Internal External Switchover mode enabled _IESO_OFF Internal External Switchover mode disabled _FCMEN_ON Fail-Safe Clock Monitor enabled _FCMEN_OFF Fail-Safe Clock Monitor disabled 例 ) オシレータモード :HS, ウオッチドック :OFF, パワーアップタイマ :ON の場合 int at 0x2007 config1 = _HS_OSC & _WDT_OFF & _PWRTE_ON; - 14 - Copyright 2013 NIPS Technical Division.

データメモリについて PIC16F88 の汎用レジスタの個数は 368 個 (368 バイト ) のため必要以上の変数や配列を取らないようにします 数値を変更することの無い変数や配列のテーブルデータなどは参照専用宣言 (const) することでプログラム ROM 領域に置くようにします 例 ) テーブルデータの作成 char data[4] = {0,1,2,3; const char data[4] = {0,1,2,3; // 汎用レジスタ RAM 領域に確保される // プログラム ROM 領域に確保される I/O ポートのアクセス PIC の I/O ピンへのアクセスは PORT レジスタへのライト ( 書込み ) やリード ( 読込み ) でおこないます PORT レジスタはリード モディファイ ライトで処理されるので ライト命令であってもリード処理の後にライト処理が実行されます つまり 出力ピンとして設定している I/O ピンでも 一旦 リードにより I/O ピンの状態が読み込まれてから 目的とする値 (0or1) がライトされます リード モディファイ ライトによる問題点 仮に I/O ピンに接続された負荷の影響で信号が遅れて変化するような場合には 変化前の状態が I リードされることがあります 一部のコンパイラでは 同じ I/O ポートに対して連続して処理をおこなうソースコードを書いたときに このような問題が起きないようにオブジェクトコードを生成するものがあります 演習プログラム PIC マイコンの応用システムを開発するためには, ハードウエアとソフトウエアを開発する必要があります 今回, ハードウエアにはテストボードを使用します 幾つかの演習プログラムを用意していますが, 開発に慣れてきたら自身のアイデアで修正を加えて動作を確認してください 開発手順 1 テキストエディタで以下の演習のプログラムを入力してください 2 英数字でファイル名を付けて作業フォルダ ( 本書では,C:\temp) に保存してください 3コマンド画面でコンパイルをしてください 書式 >sdcc V mpic14 p16f88 ファイル名.c コンパイルが終わるとファイル名.HEX というファイルができます 4 ファイル名.HEX のファイルを PIC ライタで PIC に書き込みます PIC ライタとライタソフトの使い方については製品のマニュアルや開発者のホームページを見てください 5 書き込みが終わった PIC をテストボードに取り付けて動作を確認します 6 動作しないときには,1 に戻ってプログラムを見直します - 15 - Copyright 2013 NIPS Technical Division.

< 演習 1> Ⅰ.SW0 や SW1 のスイッチを押したとき, 同じ番号の LED を点灯させる #include <pic/pic16f88.h> // コンフィグレーションビットの設定 int at 0x2007 config1 = _INTRC_IO & _WDT_OFF & _PWRTE_OFF & _MCLR_ON & _BODEN_ON& _LVP_OFF & _CPD_OFF & _WRT_PROTECT_OFF & _DEBUG_OFF & _CCP1_RB0 & _CP_OFF; int at 0x2008 config2 = _FCMEN_OFF & _IESO_OFF; // プログラムはここから始まります void main () { // ここに,PIC の初期化処理を記述します OSCCON = 0x00; // 内部クロック 31.25kHz で動作 ANSEL = 0x04; // RA0-1,3 はデジタル入力,RA2 はアナログ入力 TRISA = 0x27; // RA0-2,5 は入力,RA3-4,6-7 は出力 TRISB = 0x00; // RB0-7 は出力 PORTA = 0xff; // ポート A の初期化 PORTB = 0xff; // ポート B の初期化 RA4 = 0; // RA4 のトランジスタ ON while(1) { // 無限ループ // ポート A のスイッチ状態を読み込み, 対応する LED を点灯させる PORTB = PORTA 0xfc; - 16 - Copyright 2013 NIPS Technical Division.

< 演習 2 ダイナミック点灯制御 > Ⅰ. 押しボタン (2 進入力 ) に対応した数字を右の 7 セグメント LED に表示する Ⅱ.7 セグメントと 2 進数表示の両方を点灯するように変更する #include <pic/pic16f88.h> // コンフィグレーションビットの設定 int at 0x2007 config1 = _INTRC_IO & _WDT_OFF & _PWRTE_OFF & _MCLR_ON & _BODEN_ON & _LVP_OFF & _CPD_OFF & _WRT_PROTECT_OFF & _DEBUG_OFF & _CCP1_RB0 & _CP_OFF; int at 0x2008 config2 = _FCMEN_OFF & _IESO_OFF; // 7 セグメントの字形データ // 0 1 2 3 4 5 6 7 8 9 A B C D E F const char seg[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xd8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e; // プログラムはここから始まります void main () { // ここに,PIC の初期化処理を記述します OSCCON = 0x00; // 内部クロック 31.25kHz で動作 ANSEL = 0x04; // RA0-1,3 はデジタル入力,RA2 はアナログ入力 TRISA = 0x27; // RA0-2,5 は入力,RA3-4,6-7 は出力 TRISB = 0x00; // RB0-7 は出力 PORTA = 0xff; // ポート A の初期化 PORTB = 0xff; // ポート B の初期化 RA6 = 0; // RA6 のトランジスタ ON while(1) { // 無限ループ // ポート A のスイッチ状態を読み込み, 対応する LED を点灯させる PORTB = seg[~porta & 0x03]; - 17 - Copyright 2013 NIPS Technical Division.

< 演習 3 演算 > Ⅰ. コンパイラの演算 ( 加算, 減算, 乗算, 除算, 除余算 ) の対応について確認する Ⅱ.num = num + 3; の + の部分を +, -, *, /, % に変えたときに, コンパイラのメッセージや計算結果を確認する #include <pic/pic16f88.h> // コンフィグレーションビットの設定 int at 0x2007 config1 = _INTRC_IO & _WDT_OFF & _PWRTE_OFF & _MCLR_ON & _BODEN_ON & _LVP_OFF & _CPD_OFF & _WRT_PROTECT_OFF & _DEBUG_OFF & _CCP1_RB0 & _CP_OFF; int at 0x2008 config2 = _FCMEN_OFF & _IESO_OFF; char num; // グローバル変数の宣言 // 7 セグメントの字形データ // 0 1 2 3 4 5 6 7 8 9 A B C D E F const char seg[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xd8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e; // プログラムはここから始まります void main () { // ここに,PIC の初期化処理を記述します OSCCON = 0x00; // 内部クロック 31.25kHz で動作 ANSEL = 0x04; // RA0-1,3 はデジタル入力,RA2 はアナログ入力 TRISA = 0x27; // RA0-2,5 は入力,RA3-4,6-7 は出力 TRISB = 0x00; // RB0-7 は出力 PORTA = 0xff; // ポート A の初期化 PORTB = 0xff; // ポート B の初期化 RA6 = 0; // RA6 のトランジスタ ON while(1) { // 無限ループ // ポート A のスイッチ状態を読み込み, 対応する LED を点灯させる num = ~PORTA & 0x03; num = num + 3; PORTB = seg[num]; - 18 - Copyright 2013 NIPS Technical Division.

< 演習 4 タイマ 0 割り込み > Ⅰ. タイマ 0 割り込みを使用し, その回数を 2 進数で LED に表示する Ⅱ.INTERVAL, OPTION_REG, OSCCON を変更した場合の動作を推定し, 確認する #include <pic/pic16f88.h> // コンフィグレーションビットの設定 int at 0x2007 config1 = _INTRC_IO & _WDT_OFF & _PWRTE_OFF & _MCLR_ON & _BODEN_ON & _LVP_OFF & _CPD_OFF & _WRT_PROTECT_OFF & _DEBUG_OFF & _CCP1_RB0 & _CP_OFF; int at 0x2008 config2 = _FCMEN_OFF & _IESO_OFF; #define INTERVAL 128 static unsigned char led; // 割り込み周期を決定する // グローバル変数の宣言 // 割り込み関数の定義 static void timer() interrupt 0{ TMR0 = INTERVAL; // TMR0 カウント値設定 led++; PORTB = ~led; TMR0IF = 0; // 点灯パターンをインクリメント // LED を2 進パターンで点灯 // フラグを倒す // プログラムはここから始まります void main(){ // ここに,PIC の初期化処理を記述します OSCCON = 0x00; // 内部クロック 31.25kHz で動作 ANSEL = 0x04; // RA0-1,3 はデジタル入力,RA2 はアナログ入力 TRISA = 0x27; // RA0-2,5 は入力,RA3-4,6-7 は出力 TRISB = 0x00; // RB0-7 は出力 OPTION_REG = 0x01; // 内部クロック, プリスケーラ値設定 1:4 TMR0 = INTERVAL; // TMR0 カウント値設定 PORTA = 0xff; PORTB = 0xff; RA4 = 0; led = 0xff; // ポート A の初期化 // ポート B の初期化 // RA4 のトランジスタ ON // 2 進パターンの初期化 TMR0IE = 1; // タイマ割り込み許可 GIE = 1; // 全体割り込み許可 while(1); // 無限ループ - 19 - Copyright 2013 NIPS Technical Division.

参考 ) タイマ 0 の計算クロックが 8MHz で, タイマ 0 に 10ms を設定するには以下のような計算をします 設定したい時間 ( 秒 ) ( クロック ( 秒 ) 4)= 必要なカウント数 10ms (0.125us 4)= 20000 TMR0 レジスタは 8 ビットカウンタなので 256 までしかカウントできません したがって, 最適なプリスケーラを選択して TMR0 のカウント数を求めます 必要なカウント数 プリスケーラの設定 = TMR0 のカウント数 20000 128 = 156.25 156 ( プリスケーラに 1:128 を選択した場合 ) TMR0 はアップカウンタなので,255-156=99 を設定すれば, 約 10ms の時間を計ることができます - 20 - Copyright 2013 NIPS Technical Division.

< 演習 5 ブザー制御 > Ⅰ.RB0 に圧電ブザーのプラス端子,GND にマイナス端子を接続する Ⅱ. タイマ 0 割り込みを使用して圧電ブザーを鳴らす Ⅲ. ボタン操作で音程が変更できるように改良する - 21 - Copyright 2013 NIPS Technical Division.

#include <pic/pic16f88.h> // コンフィグレーションビットの設定 int at 0x2007 config1 = _INTRC_IO & _WDT_OFF & _PWRTE_OFF & _MCLR_ON & _BODEN_ON & _LVP_OFF & _CPD_OFF & _WRT_PROTECT_OFF & _DEBUG_OFF & _CCP1_RB0 & _CP_OFF; int at 0x2008 config2 = _FCMEN_OFF & _IESO_OFF; #define INTERVAL 240 // 割り込み周期を決定する // 割り込み関数の定義 static void timer() interrupt 0{ TMR0 = INTERVAL; // TMR0 カウント値設定 RB0 = RB0 ^ 1; TMR0IF = 0; // High, Lo の反転 // フラグを倒す // プログラムはここから始まります void main(){ // ここに,PIC の初期化処理を記述します OSCCON = 0x70; // 内部クロック 8MHz で動作 ANSEL = 0x04; // RA0-1,3 はデジタル入力,RA2 はアナログ入力 TRISA = 0x27; // RA0-2,5 は入力,RA3-4,6-7 は出力 TRISB = 0x00; // RB0-7 は出力 OPTION_REG = 0x05; // 内部クロック, プリスケーラ値設定 1:64 TMR0 = INTERVAL; // TMR0 カウント値設定 PORTA = 0xff; PORTB = 0xff; RA4 = 0; RB1 = 0; // ポート A の初期化 // ポート B の初期化 // RA4 のトランジスタ ON // LED1 を点灯 TMR0IE = 1; // タイマ割り込み許可 GIE = 1; // 全体割り込み許可 while(1); // 無限ループ - 22 - Copyright 2013 NIPS Technical Division.

< 演習 6 PWM> Ⅰ.PWM を使用して LED の明るさやブザー音を調整する Ⅱ.PERIOD, DUTY の値を変化させ,LED の明るさやブザー音の違いを確認する #include <pic/pic16f88.h> // コンフィグレーションビットの設定 int at 0x2007 config1 = _INTRC_IO & _WDT_OFF & _PWRTE_OFF & _MCLR_ON & _BODEN_ON & _LVP_OFF & _CPD_OFF & _WRT_PROTECT_OFF & _DEBUG_OFF & _CCP1_RB0 & _CP_OFF; int at 0x2008 config2 = _FCMEN_OFF & _IESO_OFF; # define PERIOD 96 # define DUTY 48 // プログラムはここから始まります void main(){ // ここに,PIC の初期化処理を記述します OSCCON = 0x70; // 内部クロック 8MHz で動作 ANSEL = 0x04; // RA0-1,3 はデジタル入力,RA2 はアナログ入力 TRISA = 0x27; // RA0-2,5 は入力,RA3-4,6-7 は出力 TRISB = 0x00; // RB0-7 は出力 CCP1CON = 0x0c; // CCP モジュールを PWM にする T2CON = 0x02; // TMR2 プリスケーラ 1:16 PR2 = PERIOD; // ピリオドを設定 CCPR1L = DUTY; // デューティー比を設定 CCP1X = CCP1Y = 0; // デューティー比の 9,10bit を設定 TMR2 = 0; // TMR2 の初期化 PORTA = 0xff; PORTB = 0xff; RA4 = 0; RB1 = 0; TMR2ON = 1; while(1); // ポート A の初期化 // ポート B の初期化 // RA4 のトランジスタ ON // LED1 を点灯 // TMR2 スタート // 無限ループ - 23 - Copyright 2013 NIPS Technical Division.

< 演習 7 RB0/INT 割り込み > Ⅰ. 抵抗 100Ω とスイッチを直列に,RB0 と GND 間に接続する ( 抵抗は RB0 側 ) Ⅱ.RB0/INT 割り込みを使用し, その回数を 2 進数で LED に表示する Ⅲ. タイマ 0 割り込みを使用し, その回数を 2 進数で LED 左 4 つに併せて表示する - 24 - Copyright 2013 NIPS Technical Division.

#include <pic/pic16f88.h> // コンフィグレーションビットの設定 int at 0x2007 config1 = _INTRC_IO & _WDT_OFF & _PWRTE_OFF & _MCLR_ON & _BODEN_ON & _LVP_OFF & _CPD_OFF & _WRT_PROTECT_OFF & _DEBUG_OFF & _CCP1_RB0 & _CP_OFF; int at 0x2008 config2 = _FCMEN_OFF & _IESO_OFF; static unsigned char count = 0; // グローバル変数の宣言 // 割り込み関数の定義 static void inte() interrupt 0{ if(count < 127){ // 表示は左へ 1bit シフトするので 7bit まで count++; else{ count = 0; PORTB = ~(count << 1); INTF = 0; // フラグを倒す // プログラムはここから始まります void main(){ // ここに,PIC の初期化処理を記述します OSCCON = 0x00; // 内部クロック 31.25kHz で動作 ANSEL = 0x04; // RA0-1,3 はデジタル入力,RA2 はアナログ入力 TRISA = 0x27; // RA0-2,5 は入力,RA3-4,6-7 は出力 TRISB = 0x01; // RB0 は入力,RB1-7 は出力 INTEDG = 1; PORTA = 0xff; PORTB = 0xff; RA4 = 0; // RB0/INT の立ち上がりエッジによる割り込み // ポート A の初期化 // ポート B の初期化 // RA4 のトランジスタ ON INTE = 1; // RB0/INT 割り込み許可 GIE = 1; // 全体割り込み許可 PORTB = ~(count << 1); // RB0 は入力のため表示は左へ 1bit シフト while(1); // 無限ループ - 25 - Copyright 2013 NIPS Technical Division.

< 演習 8 RB7:RB4 の状態変化割り込み > Ⅰ. 抵抗 100Ω とスイッチを直列に,RB7 と GND 間に接続する ( 抵抗は RB7 側 ) Ⅱ.RB7:RB4 の状態変化割り込みを使用し, その回数を 2 進数で LED に表示する - 26 - Copyright 2013 NIPS Technical Division.

#include <pic/pic16f88.h> // コンフィグレーションビットの設定 int at 0x2007 config1 = _INTRC_IO & _WDT_OFF & _PWRTE_OFF & _MCLR_ON & _BODEN_ON & _LVP_OFF & _CPD_OFF & _WRT_PROTECT_OFF & _DEBUG_OFF & _CCP1_RB0 & _CP_OFF; int at 0x2008 config2 = _FCMEN_OFF & _IESO_OFF; static unsigned char count = 0; // グローバル変数の宣言 // 割り込み関数の定義 static void rbie() interrupt 0{ if(count < 127){ // RB7 は入力のため表示は 7bit まで count++; else{ count = 0; PORTB = ~count; // 状態を記憶する RBIF = 0; // フラグを倒す // プログラムはここから始まります void main(){ // ここに,PIC の初期化処理を記述します OSCCON = 0x00; // 内部クロック 31.25kHz で動作 ANSEL = 0x04; // RA0-1,3 はデジタル入力,RA2 はアナログ入力 TRISA = 0x27; // RA0-2,5 は入力,RA3-4,6-7 は出力 TRISB = 0x80; // RB0-6 は出力,RB7 は入力 PORTA = 0xff; // ポート A の初期化 PORTB = 0xff; // ポート B の初期化 RBIE = 1; RA4 = 0; PORTB = ~count; RBIF = 0; GIE = 1; while(1); // RB7:RB4 の状態変化割り込み許可 // RA4 のトランジスタ ON // 状態を記憶する // フラグを倒す // 全体割り込み許可 // 無限ループ - 27 - Copyright 2013 NIPS Technical Division.

< 演習 9 A/D 変換 > Ⅰ.RA3 に圧電ブザーのプラス端子,GND にマイナス端子を接続する Ⅱ.RA2 に CdS と抵抗 10kΩを接続する 残りの足を CdS は VCC に, 抵抗は GND に接続する Ⅲ.A/D 変換を使用し, その電圧を7セグに表示する Ⅳ. 電圧に対応した音も出すように変更する - 28 - Copyright 2013 NIPS Technical Division.

#include <pic/pic16f88.h> // コンフィグレーションビットの設定 int at 0x2007 config1 = _INTRC_IO & _WDT_OFF & _PWRTE_OFF & _MCLR_ON & _BODEN_ON & _LVP_OFF & _CPD_OFF & _WRT_PROTECT_OFF & _DEBUG_OFF & _CCP1_RB0 & _CP_OFF; int at 0x2008 config2 = _FCMEN_OFF & _IESO_OFF; unsigned short d, v, i; // グローバル変数の宣言 // 7 セグメントの字形データ // 0 1 2 3 4 5 6 7 8 9 A B C D E F const char seg[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xd8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e; // 表示ルーチン ( アクィジション時間の確保 ) void disp(){ // アナログ値の読み込み ( 右詰 10bit) d = (unsigned int) ADRESH << 8 (unsigned int) ADRESL; v = (d * 50) / 1024; // 電圧値の 10 倍に変換 // 1V の桁表示 PORTB = seg[v / 10]; RB7 = 0; RA7 = 0; for (i=0; i<100; i++); RA7 = 1; // 0.1V の桁表示 PORTB = seg[v - (v / 10) * 10]; RA6 = 0; for (i=0; i<100; i++); RA6 = 1; // バーグラフ表示 PORTB = 0xff >> ((v * 9) / 50); RA4 = 0; for (i=0; i<100; i++); RA4 = 1; - 29 - Copyright 2013 NIPS Technical Division.

void main(){ // ここに,PIC の初期化処理を記述します OSCCON = 0x70; // 内部クロック 8MHz で動作 ANSEL = 0x04; // RA0-1,3 はデジタル入力,RA2 はアナログ入力 TRISA = 0x27; // RA0-2,5 は入力,RA3-4,6-7 は出力 TRISB = 0x00; // RB0-7 は出力 ADCON0 = 0x50; // RA2(AN2) で AD 変換 ADFM = 1; // 右詰で 10bit 出力 ADCS2 = 1; // ADCON0 で ADCS1=0,ADCS0=1 にしたので 16TOSC(2μS) VCFG1 = VCFG0 = 0; // リファレンス AVDD-AVSS PORTA = 0xff; PORTB = 0xff; // ポート A の初期化 // ポート B の初期化 while(1){ // 無限ループ ADON = 1; // AD 変換 ON disp(); // アクィジション時間待ち (20μS 以上 ) GO = 1; // AD 変換開始, フラグを立てる while(go); // フラグが倒れるまで待つ ADON = 0; // AD 変換 OFF - 30 - Copyright 2013 NIPS Technical Division.

EEPROM の利用 EEPROM からのデータの読み書きを確認する 予め, 下記のデータファイルを用意して, プログラムライタで書き込む データの確認は, プログラムライタで確認する //EEPROM の 0x00 番地から読み込んだデータに 3 を加えて 0x05 番地に書き込む - 31 - Copyright 2013 NIPS Technical Division.

参考文献 PIC16F88 仕様書, マイクロチップ テクノロジー ジャパン http://www.microchip.co.jp/ SDCC についての詳細, http://sdcc.sourceforge.net/ 電子工作のための PIC 活用ガイドブック後閑哲也技術評論社 おもしろい PIC マイコン PIC12F675 を使いこなす中尾真治オーム社 たのしくできる C&PIC 実用回路鈴木美郎志東京電機大学出版局 平成 22 年 4 月第 1 版平成 25 年 10 月第 2 版 自然科学研究機構生理学研究所技術課 PIC プロジェクト班 - 32 - Copyright 2013 NIPS Technical Division.