PIC16シリーズ(PIC10/12/16を含む)も次世代に入り、アセンブラからC言語での開発に移行が進もうとしています。
Microchip社がHI-TECH社を得たことで、PIC16シリーズ用のXC(旧HI-TECH C)を提供しはじめました。
これによりアセンブラになじみのなかった方もPIC16の開発を行うことができ、ユーザの裾野を広げていくことでしょう。
もちろんアセンブラがなくなるというわけではなく、最適化したコードを確実に記述する場合にはアセンブラが適しています。
C言語にはインラインアセンブル機能もあるため、適材適所でアセンブリ言語を記述することができます。
一方でC言語にもデメリットが存在します。これらのデメリットも搭載メモリの増量、C言語に適した命令の追加などが行われ、改善に向かっています。
- コードサイズや処理性能はCコンパイラの性能に依存します。最適化のできないFreeモードは不利です。
- コードサイズの制限を受けるため、大規模や複雑なプログラムをC言語で記述できません。
- 例えば、printf関数で浮動小数点を扱うとコードサイズがオーバーフローします。
- 本来あってはならないのですが、Cコンパイラのバグに悩まされることがあります。
- 実際、HI-TECH C Compiler for PIC10/12/16 V9.71aにバグがあり、悩まされました。
- 記述したプログラムが正しくても、Cコンパイラのバグで正しく動作しないことがあります。
ここで紹介する、ライブラリはきっとみなさんのお役に立つものと思います。
さてPIC16用にプリミティブな(原始的な)ライブラリは Microchip 社から提供されていますが、 実用レベルで使い回しの効く、真の意味でのライブラリが整っていません。
ライブラリは使い回してこそ価値があります。つまり再利用できるかが重要です。
例えば、PICではコンフィグレーションの設定など、さまざまな細かい手続きが必要で (これをプログラマーの世界では通称「おまじない」と呼びます)、 なかなか本来やりたいことにたどり着きません。たくさんの「おまじない」を記述しなければなりません。
つまりプログラムの本質的ではないところに時間と労力を費やすことになります。
ここで提唱する汎用化方式と従来方式を比較してみましょう。どちらの方式がプログラムとして読みやすく、再利用しやすいかは一目瞭然です。
従来方式 汎用化方式
些細な違いではありますが、後々大きな差になります。
従来のままではプログラムの生産性が上がらず、非常に不便であり、初心者の方にも障壁が高く PICの普及につながりません。
C言語の基本構造は関数の集まりです。 ちょうど積み木のように機能をブロック化して積み重ねていくことで、複雑な処理も簡単に プログラムしていくことができます。main関数を中心にした関数の組み合わせで構成されています。
関数という単位で分割統治することにより、管理しやすくします。 問題の修正や改良は関数単位で行えばよく、インターフェース(引数、戻り値)のみ気をつけておけば他に気をとられることはありません。 その関数の閉じた世界で考えればよく、集中することができます。
そしてある目的を持った関数の集合をライブラリと呼びます。
C言語は先人の知恵をライブラリという形で使い回すことで開発効率を飛躍的に向上させることができます。 つまりC言語はより使いやすいように関数を汎用化することで、下層の複雑な手続きを隠蔽することができます。 おまじないを隠蔽することで、本質的ではないことから大幅に解放されます。
PIC16F1827に特化します。使い方を限定し、割り切りました。
※他のPIC16シリーズにも、ソースコードを改変すれば対応できます。
動作確認は以下のバージョンで行います(バージョンによってバグが異なるためです)。※MPLAB IDE(X IDEではない)でXC8を使えないという方へ
- MPLAB IDE 8.92
- XC8 C Compiler (Free Mode) V1.35
※Select Language Toolsuite でXC8を認識しない問題があります。
※コマンドプロンプト(管理者)で以下のコマンドを実行すると認識します。
※cd "C:\Program Files (x86)\Microchip\xc8\v1.35\bin"
※regsvr32 MPLABXC8.dll
ライブラリを利用するための回路図です。PIC16F1827の機能をほぼフルに引き出しました。
※システムクロックは32MHzです。これを前提にタイミングを調整しています。
電源端子ICSP端子
5V 電源です。LCDに5Vを必要とするため、3.3Vは使えません。 GND GNDです。 I2C端子
VPP 書き込み用電圧です。 VDD 書き込み用電源です。 VSS GNDです。 PGD 書き込み用データ信号です。 PGC 書き込み用クロック信号です。 UART端子
SCL I2Cクロック信号です。 SDA I2Cデータ信号です。 部品リスト
TX UART送信端子です。 RX UART受信端子です。
PIC18F1827 マイコンです。 SC1602BS 16x2行のLCDです。 SW タクトスイッチです。 LED 赤LEDです。Aが長く、Kが短い端子です。 10K カーボン被膜抵抗(1/4W)です。プルアップ抵抗です。 10K カーボン被膜抵抗(1/4W)です。プルアップ抵抗です。 4.7K カーボン被膜抵抗(1/4W)です。コントラストの簡易設定用抵抗です。 1K カーボン被膜抵抗(1/4W)です。LED電流制限抵抗です。 10KB アナログ入力用可変抵抗です。Bカーブです。
- 上記をモジュール化し、シンプルなコンピュータに仕上げました。略してシンコンと名付けました。
- Arduinoやmbedなどボードコンピュータがありますが、高機能高性能になり過ぎて、扱いづらくなりました。
- 大した目的でもないにも関わらず、大げさです。
- そこで発想を転換し、機能を割り切って、簡単に利用できるようにしました。
- 使い方を割り切り、細かいことにこだわらないことにします。
- ライブラリによる操作で簡単制御を実現しました。
- ※機能をライブラリというブラックボックス化しました。中身がどうなっているか気にしてはいけません。
- ※細かいことにこだわりたいなら、シンコンは向いていません。
- 入門やIoTに最適です。IoTではシステム全体が大がかりになり、いかに簡単に実現するかがキーになります。
- 少数のマイコン上級者なら自分でできるので、シンコンは不要でしょう。
- しかし大多数である入門者にシンコンは最適です。
- 機能を割り切ったとはいえ、一般的に利用する機能を用意しています。
- 特殊用途以外、ほとんどをまかなえるでしょう。
PIC16シリーズではコードサイズに限りがあるため、テクニックが必要になります。
例えば、sprintfで%fを使うとコードサイズ・オーバーフローを起こします。
回避策としてmodfを使います。一旦、整数部と小数部を分離して整数として扱います。
%5.2fとは全体として5桁(小数点を含む)、小数部を2桁として表示するという意味です。
回避策では、整数部を2桁、小数部を2桁(ゼロパディング)、それぞれ整数%dとして扱います。
- プログラム、ライブラリの著作権は、法律で保護されています。
- 個人利用に限定され、著作権者の許可なく商用利用できません。
- 無保証、無担保です。バグがあってもその修正義務を負いません。問い合わせによる回答義務も負いません。
- 直接間接に関わらず、使用によって生じたいかなる損害も著作権者は責任を負いません。
- 仕様は予告なく変更されることがあります。
©2010-2015 All rights reserved by Einstein.