プログラミング関連
PICのプログラミングに関連した内容の紹介です。


作品1:なんちゃってJDM
下の回路でPIC16F84A,648A,PIC12F629の書込みが確認できました。88,675,683は駄目でした。
ソフトはIC-PROGを使用します。バージョンは何でもOKです。
HARDWARE内のI/O遅延は1〜40どこでもOK、INTERFACEはDIRECT I/O、WINDOWS APIどちらでもOKです。
消去時及び書込み時にMCLR⇔VSS【電解コンデンサのマイナス側】間の電圧を12〜14VにVR50KΩで合わせてください。
当方のPCでは0Ω時、WIN98 NOTE(4GB物)で12.8V、Me DESKTOPで16.4V、XP DESKTOPで15.0Vとバラバラでした。
しかし0Ωのまま(16.4V、15.0V)でも普通に書込み出来ました。(そのまま100回ほど書込みをしました。)
PICの個体差や機種によって14Vを超えるときがありますが多分大丈夫だと思います。
個体やPC環境によっては14V以上必要かも知れません。
JDMやRCDライターをお持ちの方は一度作って遊んでみてください。もちろん初挑戦でもOKです。

注意1:書込みは出来ますが読み出し(READ)が出来ません。従って照合(VERIFY)がエラーになります。
しかし書き込まれています。こんな回路で書込み可能 ・・・不思議です。
JDMのサイト(英文)にヒントが書かれています。裸電球を使うなどとシャレっ気のある説明があります。
注意2:当方がおもちゃ感覚で考えた物です。何があっても責任は負いません。おもちゃだと思って扱ってください。

追記:84Aで約3年前に書込みしその後放置しておいた物の中から消去、書込み、共に不能の物が数個ありました。
675で消去、書込み、共に可能な物が見つかりました。(_HS_OSC 設定に限る)
上記の原因は不明です。(製造ロットによる品質誤差、個体差、経年変質等が考えられます。)

VR50KΩの代わりに10KΩの固定抵抗でも行けました。
プログラミングソフト「WinPic」でPIC12F675 683の書込みが出来ました。

ツェナーダイオードが入手出来ない場合は赤色または黄色のLED を2個直列に配線して代用できます。
書込み時に点灯してきれいです。


補足説明
PICをやるためにはPIC(IC)本体にプログラム(ここではhex)を入力させるプログラマー(装置)と
ソフト(サイトからのフリーソフト)が必要になります。

あなたのお使いのパソコンがデスクトップでこのような端子が付いていたらJDMプログラマー

と言う安価で自作出来るモノが利用出来ます。

USB端子しか付いていない場合はン万円のマイクロチップ社純正品を買うか秋月電子製の7000円程のキット買って作るか
もうひとつの私の知っている選択肢はhttp://feng3.cool.ne.jp/  FENG3さんのHPから行けるウェブショップ「ハーフマット」さんで

W509シリーズのプログラマー(キットと完成品がある)を4000円程度で買うか。デス。私も買いましたが調子良いです

先程お話したJDMもこの「ハーフマット」さんで安価で購入出来ます。    

http://halfmat.ocnk.net/product-list/2  ←ここに並んでます

ソフトはFENG3さんのHPにも書いてあります。私はicprog105Dってのを使ってます外国製ですが日本語訳のソフトも用意してくれている

方がいます。ありがたいことです。

icprogのダウンロードは http://www.ic-prog.com/icprog105D.zip  で

日本語訳はROCさんのHP  http://jashi.org/index0.html を見てください。 http://jashi.org/pic/


またはここでダウンロードしてください。(簡単な説明付き)
winNT 2000 XP VISTA をご使用の方はこの説明が役に立ちます。
ダウンロード




作品2:PIC12F675/629用OSCCAL見つけ出し
OSCCALなんて消えちゃっても良いと思うんですけど電話の通話音で耳チューニングするシステムです。
チューニングの様子の音です。メディアプレイヤーは音程が下がって聞こえる可能性があるので良くありません。
リアルプレイヤーはOKです。電話の通話音を聞きながらお試しください。

チューニングの様子です。40秒あたりは狂っています。47秒あたりで合っています。
チューニングの様子

下の動画が400Hzの音です。同時に再生してみるとわかります。

ASM、HEX、回路図の詰め合わせ(使用説明付き)ダウンロード




作品3:PIC16F88/PIC16F648Aのプログラムメモリー800Hの壁の超え方
4KワードのPICに於いて通常のプログラミングではプログラムメモリー800Hを超えるのは困難です。
その方法を自分なりに考察しまとめてみました。PIC16F88用、PIC16F648A用のサンプルASMファイル付きです。
ダウンロード




作品4:PIC16F716をPIC16F84Aに替わって使う
PIC16F84Aの半値以下というお安いPIC16F716(秋月価格110円)は84Aの代替として使用することが出来ます。
84Aと比較して優れている部分もありますが劣るところもあります。
劣るところはEEPROMがありません。EEPROMとはプログラム上で得た数値を停電記憶しておける場所です。
LEDを点灯したりするプログラムではまずは必要がないので84Aの代替としては有効だと思います。
優れている点はA/D変換やPWM制御が出来ることです。しかしこれらは84Aにはありませんのでを無効にして使えばよいわけです。
PIN配置も84Aと同じなので安心です。PICの取替えだけで回路の変更は不要です。
さてプログラムの書式の説明です。
コンフィグは
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _BOREN_OFF & _HS_OSC
という感じです。 次に先ほどの優れている部分のA/Dを無効にする設定を加えます。
84Aでは

BSF STATUS,RP0
MOVLW B'00011'
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
BCF STATUS,RP0

という感じですが716では

BSF STATUS,RP0
MOVLW B'00011'
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
MOVLW B'00000110' ;追加
MOVWF ADCON1 ;追加
BCF STATUS,RP0

と2行加えるだけです。この設定はRA0,RA1,RA2をA/D変換用ではなくデジタルI/Oポートに割り付けるものです。
そしてもうひとつファイルレジスタの番地の割付の変更があります。
84Aは0CHからのスタートでしたが716は20Hからになりますので

TIMER1 EQU 0CH
TIMER2 EQU 0DH
TIMER3 EQU 0EH

と書くところが

TIMER1 EQU 20H
TIMER2 EQU 21H
TIMER3 EQU 22H

となります。簡単に

TIMER1 EQU 2CH
TIMER2 EQU 2DH
TIMER3 EQU 2EH

と変更してもOKです。
参考プログラムとして当サイトのトップページ最下段にあるダウンロード 内のSAMPLE4を716用に書き直してみました。
716_SAMPLE_1.zip
この716用のHEXファイルは84Aにそのまま書き込むことも可能です。






作品5:PIC16F88のA/D変換値10bitを10進数で表示する

PIC16F88のA/D変換機能で得られた数値を10進数で表します。
10bitで0〜1023の表示になります。これはLCDへの表示ですが7セグにも応用できます。
 考え方は簡単で得られる数値は10bitなので前半の8bitをADRESLへ格納し残りの2bitをADRESHへ格納します。
まず前半の8bitについて説明します。
ここは0〜255の数値が得られるだけなので問題はないと思います。
10進数への変更はまさしく10進数の計算をプログラムで作っているだけなのです。
ADRESLの数値になるまで「INCF ****1,F」をループさせます。
そして「****1」が10になったとき「****1」は0にクリアして次のループにある
「INCF ***10,F」を通過させます。
10進数で「24」という数値をこのループに通すと「****1」には「4」、「***10」には「2」が得られます。
つまり「24」という数値を処理するためには24回ループを通過させ、最高値「255」のときには255回通過させるわけです。
こうすると「****1」には1の位、「***10」には10の位が得られます。
同様に「**100」が100の位、「*1000」が1000の位となっていきます。
次に後ろの2bitの扱いですがとても簡単です。
「01」場合は「****1」に「6」、「***10」に「5」、「**100」に「2」を代入します。(256)

MOVLW D'6'
MOVWF ****1

といった感じです。
同様に「10」の場合は「2」「1」「5」(2X256=512)、「11」の場合は「8」「6」「7」(3X256=768)となります。
説明が逆にになりましたがこのあとに前半の説明の8bitをこの数値の上にループで加算していくわけです。
かわりづらい説明かもしれませんがこの内容を踏まえてプログラムの「MAIN2」「MAIN3」を見るとわかると思います。
あとはLCDへの表示ですがこれは他の多くのサイトに詳しく書かれているのでそちらを参考にしてください。
10進数の数値に30を足すとアスキーコードの番号になります。
0→30、6→36という感じです。プログラムでは

MOVLW H'30'
ADDWF ****1

という感じです。
ループを相当数する為に時間がかかるように思いますが実際の実用から見ると全く問題ない時間のようです。
回路も簡単ですので一度お試しください。

asm、hex、回路図の詰め合わせ
ダウンロード




作品6:「Error - section '.org_2' can not fit the absolute section. Section '.org_2' start=0x00000004,・・・」の解決法

古いバージョンのMPLABを使用していたときはOKだったのに新しいバージョンに変更したら
「Error - section '.org_2' can not fit the absolute section. Section '.org_2' start=0x00000004,・・・」
というメッセージが現れてビルドに失敗してしまう事例がありました。
これを解決する方法がありますので紹介します。

ウイザードは「アブソリュート」に変更して実行をします。
ウイザード完了後も変更はできます。
Project>Build Options>Project>MPASM/C17/C18Suite で
シグナルファイルアセンブリプロジェクトをジェネレートアブソリュートコードでOKにクリックします。
そしてプロジェクト画面で「Debug」モードではなく「Release」モードでビルドすると成功すると思います。

なぜこのような事態になるかというと私見ですがMPLABがPICKIT3のデバッグ機能に対応させるために
プログラムのビルドの手順が変更になったと思われます。
PICをデバッグするときの情報がPICのプログラムファイルの300H〜3FEH番地に影響させるためにデバッグモードでは
300H〜3FEH番地を空白に、つまり何も書かないようにしておく必要があるようでです。
リリースモードでは300H〜3FEH番地を影響させないために問題無くビルド出来るようです。

しかし、デバッグモードでもビルドさせる方法があります。
300H〜3FEH番地へ「CALL」命令で入ると大丈夫なようです。
「CALL」命令はデバッグよりも強制力が強いようで優先されるようです。
プログラムの書き方として後半は概ね「CALL」命令で入ることが多いのでこの問題に出くわすことが無かったかも知れません。
たまたま大きなプログラムを作ったときに現れるエラーということかも知れませんね。

「TVゲーム、動画」の項の作品5:1人用壁打ちテニスゲーム【PIC12F675 629】のasmファイルにこのエラーが現れました。
プログラムを「ORG 300H」と仕切ってから「CALL」命令で入るとOKになりました。
一度ご覧になってください。暇のある方は「ORG 300H」を抜いて試してみてください。エラーになってしまいます。
「ORG 300H」を抜くと「CALL」命令で2FF番地に入って300Hへは通常のステップで進みます。
つまり「CALL」命令以外で300Hへ入っているのでエラーになるわけです。

上記を試してもエラーが消えない場合もあるかも知れません。
その場合はasmファイルをお見せいただいて一緒に解決の道を探しましょう。

【後記】
上記の現象はMPLAB-IDE v8.89では解消されておりました。









★古いタイプのMPLAB IDE★
【クリック】
OR
【クリック】





ご意見ご感想質問何でもどうぞの掲示板はこちら <<<クリック>>>

 

内緒でお話がしたい人はこちらまで
picdetukuttemimasita@yahoo.co.jp

トップページへ戻る