●LED電飾プログラムをMPASMで作ってみよう
A(PIC16F819)用LED電飾プログラム
基本となる'PIC16F84A'用の基本版プログラムを単純コピーしてから、個々のP IC毎に設定が必要な標準ヘッダ、定義ファイルを該当するものに変更し、段階的に試行 を繰り返しながら動作確認しました。
・ ・ ・ ・ ・
■取り合えず動かす為の変更箇所は・・・ @標準ヘッダ、定義ファイルの変更 LIST P=PIC16F84A → P=PIC16F819 INCLUDE "P16F84A.INC" → "P16F819.INC" A汎用レジスタの開始アドレスの変更 'OC' → '20'
■不具合事象に対応した変更箇所は・・・ @RB3が点灯しなかったので・・・ コンフィグレーションビットの設定項目を追加(_LVP_OFF)して、RB3を汎用入出力ピンとした。
■ちょっと、試したい事が・・・ @MCLRへの抵抗接続を取り外したいので・・・ MCLRピン(RA5)の抵抗接続を取り除きたいので、コンフィグレーションビット の設定項目を追加(_MCLR_OFF)して、RA5ピンをデジタル入力ピンとした。 Aクロック周波数を、4Mhzにしたら、どうなるのか? 'PIC16F84A'で試したのと同様に、セラロックを20Mhz→4Mhz に交換して動かしたら、同様に1/5の処理速度で遅くなって動く感じです。 B内部クロック周波数(4MHz)を使ったら、どうなるのか? コンフィグレーションビットで、内部クロックモード(_INTRC_IO)を指定設定して OSCCONレジスタは、周波数4MHz(IRCF2:1,IRCF1:1,IRCF0:0)を選択設定しました。 _HS_OSC → _INTRC_IO MOVLW B'01100000' ;Wレジスタ ← 4MHz(IRCF2:1,IRCF1:1,IRCF0:0)を選択する MOVWF OSCCON ;OSCCONレジスタ ← Wレジスタ → セラロックを4Mhzで動かしたのと同様な処理速度で動く感じです。
■コンフィグレーションビットは、最終的に、このような設定になりました。 ; ●クロック発振モード(OSC)の指定 :_INTRC_IO ; ●ウォッチドックタイマの動作指定:_WDT_OFF ; ●パワーアップタイマの許可指定 :_PWRTE_ON ; ●MCLRピンの機能選択指定 :_MCLR_OFF ; ●低電圧書き込み許可の指定 :_LVP_OFF ; ●コードプロテクトの指定 :_CP_OFF __CONFIG _INTRC_IO & _WDT_OFF & _PWRTE_ON & _MCLR_OFF & _LVP_OFF & _CP_OFF
■内部クロック(4MHz使用版)プログラムです。 → 16F819LED01.ASM
・ ・ ・ ・ ・
●配線図です。( Ver 2.0 )
・ ・ ・ ・ ・
●感想・・・ このPIC(16F819)は、PIC16F84Aの機能強化版みたいで、詳細は分か りませんが、お気に入りは、内蔵オシレータとして、内部クロックを選択して使用すれば 発振器を外付けしなくても良いので、とても便利な感じです。 また、8MHzを源信とする内部クロック(8MHz、4MHz、2MHz、1MHz、500kHz、250kHz、125 kHz、31kHzの8種類から)をプログラム内の命令で切替えるが事ができるようです。 PIC16F84A→PIC16F819へのプログラム移行に伴い、PICの教本など を読みましたが、分からない事が多くて、山勘の'あてずっぽう'感覚での取り組みであり なんとなくのプログラム移行となりましたが、とても勉強になりましたです。(^^)
・ ・ ・ ・ ・
●序に、使用する出力ピンを増やしたプログラムも作りましたです。 LED使用の出力ピン(PORTAの7本)を増やしました。 点灯の順番は PORTA( RA0→ RA1→ RA2→ RA3→ RA4→ RA6→ RA7 ) ↓ PORTB( RB0→ RB1→ RB2→ RB3→ RB4→ RB5→ RB6→ RB7 )、これを繰り返す。 ■プログラムです。(出力ピン使用合計は、15本です) → 16F819LED02.ASM
■PORTAは、何かと・・・ @RA4ピンを使用したのは・・・ このピンは、特別な回路構成で、出力がオープンドレインになっており、内部でVddに 接続されていないので、出力で使う場合はプルアップするなど外部で電圧を加えてやる必 要があるのですが、LED点灯ができましたので使う事にしました。 大丈夫かな〜(^^? ARA5ピンを使用しなかったのは・・・ MCLR端子(RA5ピン)によるリセットはしないので、RA5ピンとして設定しました が、入力のみ使用できるので、出力ピンとして使えなかったです。 BRA6、RA7ピンを使用したのは・・・ 外部接続のセラロックを外して、内蔵オシレータ(内部クロック)に変えたので、このR A6、RA7が空ピンとなりましたので、試しに使いました。
・ ・ ・ ・ ・
●PIC16F88へ移行 16F88は、USART機能(シリアル通信)が装備されており、16F819とピン 互換がありますので、プログラムを単純コピーしてから作成しました。 ■変更箇所は・・・ @標準ヘッダ、定義ファイルを該当するものに変更しました。 LIST P=PIC16F819 → P=PIC16F88 INCLUDE "P16F819.INC" → "P16F88.INC" Aコンフィグレーションビット(CONFIG)が2種類(CONFIG1、CONFIG2)になりました。 ; ●クロック発振モード(OSC)の指定 :_INTRC_IO ; ●ウォッチドックタイマの動作指定:_WDT_OFF ; ●パワーアップタイマの許可指定 :_PWRTE_ON ; ●MCLRピンの機能選択指定 :_MCLR_OFF ; ●低電圧書き込み許可の指定 :_LVP_OFF ; ●コードプロテクトの指定 :_CP_OFF ; __CONFIG _CONFIG1, _INTRC_IO & _WDT_OFF & _PWRTE_ON & _MCLR_OFF & _LVP_OFF & _CP_OFF ; ●内部外部クロック切替モード(IESO)の指定 :_IESO_OFF ; ●フェールセーフクロックモニタ(FCMEN)の指定 :_FCMEN_OFF __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
■プログラムです。(出力ピン使用合計は、15本です) → 16F88LED02.ASM 点灯の順番は PORTA( RA0→ RA1→ RA2→ RA3→ RA4→ RA6→ RA7 ) ↓ PORTB( RB0→ RB1→ RB2→ RB3→ RB4→ RB5→ RB6→ RB7 )、これを繰り返す。
・ ・ ・ 28ピンのPICで、LEDプログラムを動かしてみる。 ・ ・
●16F886−I/SP(28ピン)…I/Oポート(24本) 16F819(18ピン)プログラムを単純コピーしてから作成しました。 @標準ヘッダ、定義ファイルを該当するものに変更しました。 LIST P=PIC16F819 → P=PIC16F886 INCLUDE "P16F819.INC" → "P16F886.INC" Aコンフィグレーションビットは、2種類(CONFIG1、CONFIG2)です。 ;****************************************************************************************** ;* コンフィグレーションビット1の設定 * ;****************************************************************************************** ; ; ●低電圧書き込み許可の指定 :_LVP_OFF :低電圧書き込みを禁止する ; ●フェイルセーフクロックモニタの指定 :_FCMEN_OFF:フェイルセーフクロックモニタの無効 ; ●内部・外部クロック切替の指定 :_IESO_OFF :無効 ; ●ブラウンアウトリセットの指定 :_BOR_OFF :低電圧リセットしない ; ●EEPROMコードプロテクトの指定 :_CPD_OFF :プロテクトしない ; ●プログラムコードプロテクトの指定 :_CP_OFF :プロテクトしない ; ●マスタ・クリア・リセットの指定:_MCLRE_OFF:無効 ; ●パワーアップタイマの指定 :_PWRTE_ON :パワーアップタイマ(PWRTE)の動作を許可する ; ●ウォッチドックタイマの動作指定:_WDT_OFF :ウォッチドックタイマ(WDT)の動作を禁止する ; ●クロック発振モード(OSC)の指定 :_INTRC_OSC_NOCLKOUT : 内部クロック使用する ; (RA6,RA7は汎用入出力ピンとなる) __CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OF ;****************************************************************************************** ;* コンフィグレーションビット2の設定 * ;****************************************************************************************** ; ; ●Flashメモリへの書込みの指定 :_WRT_OFF :プロテクトしない ; ●リセットの検出電圧を指定 :_BOR21V :2.1V __CONFIG _CONFIG2, _WRT_OFF & _BOR21V
■プログラムです。 → 16F886LED01.ASM 点灯の順番は PORTB( RB0→ RB1→ RB2→ RB3→ RB4→ RB5→ RB6→ RB7 )、これを繰り返す。
・ ・ ・ 40ピンのPICで、LEDプログラムを動かしてみる。 ・ ・
●16F887(40ピン)…I/Oポート(35本) 16F886(28ピン)プログラムを単純コピーしてから作成しました。 @標準ヘッダ、定義ファイルを該当するものに変更しました。 LIST P=PIC16F886 → P=PIC16F887 INCLUDE "P16F886.INC" → "P16F887.INC" Aコンフィグレーションビットは、2種類(CONFIG1、CONFIG2)です。 ;****************************************************************************************** ;* コンフィグレーションビット1の設定 * ;****************************************************************************************** ; ; ●低電圧書き込み許可の指定 :_LVP_OFF :低電圧書き込みを禁止する ; ●フェイルセーフクロックモニタの指定 :_FCMEN_OFF:フェイルセーフクロックモニタの無効 ; ●内部・外部クロック切替の指定 :_IESO_OFF :無効 ; ●ブラウンアウトリセットの指定 :_BOR_OFF :低電圧リセットしない ; ●EEPROMコードプロテクトの指定 :_CPD_OFF :プロテクトしない ; ●プログラムコードプロテクトの指定 :_CP_OFF :プロテクトしない ; ●マスタ・クリア・リセットの指定:_MCLRE_OFF:無効 ; ●パワーアップタイマの指定 :_PWRTE_ON :パワーアップタイマ(PWRTE)の動作を許可する ; ●ウォッチドックタイマの動作指定:_WDT_OFF :ウォッチドックタイマ(WDT)の動作を禁止する ; ●クロック発振モード(OSC)の指定 :_INTRC_OSC_NOCLKOUT : 内部クロック使用する ; (RA6,RA7は汎用入出力ピンとなる) __CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OF ;****************************************************************************************** ;* コンフィグレーションビット2の設定 * ;****************************************************************************************** ; ; ●Flashメモリへの書込みの指定 :_WRT_OFF :プロテクトしない ; ●リセットの検出電圧を指定 :_BOR21V :2.1V __CONFIG _CONFIG2, _WRT_OFF & _BOR21V
■プログラムです。 → 16F887LED01.ASM 点灯の順番は PORTB( RB0→ RB1→ RB2→ RB3→ RB4→ RB5→ RB6→ RB7 )、これを繰り返す。
・ ・ ・ ・ ・