Shrike-lite
2026.01.25
PICマイコンを振り返る
2026.01.21
最初のきっかけは1995年12月号のトラ技の特集(例によって間違いも結構あった)
そこで興味を持って、マイクロチップ社のデータブックを取り寄せた。当時は英文のみで分厚い本だった。
当時はネットでPDFファイルを入手することはできなかった。
パソコン通信のアクセスポイントが有り、そこからダイヤルアップで接続して書込用ソフトか、サンプルプログラムか何かを取ってきた事がある。通話料を気にしながらのアクセスで、あせりそう。
とにかく、PIC16C84を手に入れた。さてこれをどうやって書き込もうか。
当時有名だったのはPCのパラレルポートに接続する回路で、アプリケーションノートの何番だっけ。(AN589)
実際に作ったけど・・・最終的には書き込めた。途中でうまくいかない事があって、あれこれ試行錯誤した。そこらへんはよく覚えてない。
トラ技に載っていたシリアル通信で書き込むライターを作るために、その制御プログラムの書き込まれたPICが必要だったから、それを書き込む為のライターが要るという、たまごとにわとりのような話。
ただ、それは1種類のPICしか書けなかった。しばらくは、それで何とかなった。
そのうちに秋月のキットが出て乗り換えた。アルミケースを加工して組み込み、わりと最近まで(使わなくなっても)持っていた。
PIC16C84はPIC16F84になり、やがてA付きのPIC16F84Aになった。(以下PICは略す)
その次に乗り換えたのは16F628で、これもA付きの16F628Aになった。
A無しからA有りに乗り換える時、プログラムを修正しないと動かなかった。ここのところが面倒だった。確かI/Oの初期設定でコンパレータか何か。
非常に興味を持ったのは8ピンPICで、確か最初は12C508
容量の違いで508と509が有った。
最初はワンタイムか窓付きだけ。フラッシュは無かった。
その窓付きは確か当時二千円ぐらい?
これは最初に動かそうとした時、なかなか動かなくて苦労した。
CONFIGの設定を完全に理解していなかったと思う。調べてあれこれ変えて試すことの繰り返し。ようやくLEDの点滅。
8ピンに入るなんて純粋にすごいなーと思った。ただ、機能的には物足りなかった。タイマー割り込みなどが無かった。TMR0がカウントアップするだけ。
その頃、現場で遊技機の検査をする業者(裏ROMや不正な部品が仕込まれていないか調べる)が、「こんなものが付いていた」と持ってきたのがPIC16C84を使った「ぶら下がり」基板。
それと、フラットケーブルコネクタの中に仕込まれた8ピンPIC。よくこんなもん作るなあ、と。
そしてEEPROM内蔵の12CE508。518だったか。これも窓付きとワンタイムで、窓付きは中をのぞいてみると2チップ構成になっていた。とりあえずくっつけて作った感じ?
個人的にPICの法則と呼んでいる事があって、何かというと、I/Oポートの割り付けでいつもピンが微妙に足りない。
18ピンPICだとピンが不足する。それじゃ次は28ピンだ。いや40ピンだ。
28ピンは16F873、40ピンは16F877を使うようになり、それと18F4550も使った。
書込機の課題はどうしたかというと、結局は純正が一番ということで落ち着いた。
当時PSTART PLUSを秋月から買った。
会社ではマイクロチップ純正のPICSTART PLUSを買って使っていた。
バージョンアップごとに対応するPICの型番が増えてきたけど、17C44だっけ。最初は40ピンの窓付きPICが入っていた。
その容量が足りなくなったんだろう、基板に置き換わったけれど、当初それが壊れやすかった。
物理的に壊れるんじゃなくて、ファームウェアが飛んでしまう。ふとした事で動かなくなり、秋月に問い合わせて書き換えてもらった。
そのうちに安定して、現在も使える状態にある。
使いたい時に使えないと困るから、同じ物を2台も買って持っていた。
自分で書き換えられないか試したことがある。基板の回路を追って、PGCとPGDなどの端子を調べて別のライターから。
いつだったかマイクロチップ社のセミナーが九州で開催され、参加した時にICD2 LEの販売があったと思う。これを手に入れたら書込が飛躍的に速くなった。
これは解剖して回路図を書き起こしたんだっけ。顕微鏡を見ながらパターンを追って・・・同じ働きをする物を自作した。
最初からずっとアセンブラを使っていて、このマイコンのアーキテクチャはC言語向きじゃないだろう、メモリを食うだろうと思いこんでいました。
それに最初の頃、Cコンパイラは高価でした。買ってまで試そうと思わなかったですね。秋月で安いのが出てなかったっけ。使い方がわからなくて放置してそれっきりだったような。
いつからCコンパイラを使い始めたかというと、確か2009年あたりじゃないかと思う。
今までアセンブラで長々と打ち込んでいたのがシンプルに書けて、もっと早くから使えばよかったなと後悔。
タイミング的にギリギリな所はアセンブラで書くのは仕方ない。
ただ、ちょっと浮動小数点の計算が入るだけで容量が膨れ上がるから、なるべくそんな処理は避けるように工夫する必要があった。
くせのあるPICだったけど、慣れてしまうとあまり気にならなくなり、しかもC言語を使っているとそれがなおさら感じられなくなる。
これでいいと思っていたら、Arduinoが出始めた。出始めたというより以前からあったんだろうけど、知られるようになった、自分が知った頃か。
私は最初ArduinoではなくAVRをAVR Studioで使っていた。こっちのアーキテクチャのほうが素直で良いなと、但しアセンブラは試したことがない。
仕事でも結構複雑なプログラムを作ったりして、かなり活躍した。
PICについては、やっぱり慣れもあるし、もともとそれで作られた物の改良などを請け負ったりしてそれなりに使い続けていた。
ただ、18Fシリーズは1種類しか使った覚えが無いような。それとdspicも使ったことがない。
Ethernetをいじった時に使ったのは何だったか忘れた。
仕事でやったのは、たとえば最新ソースが失われて、PIC現物から読み出すしかない、最新ソースを再現してくれというもの。しかも、それに新機能を加えてくれ、と。
なんだろうな。担当者が失踪したのかPCが壊れたのか間違って消したのかは定かでない。
まあでもプロテクトがかかってなくて良かった。
そこから逆アセして、旧版のソースは有ったのでそれと照合しながら相違点を埋めていって徐々に再現した。
なんと、16F877のプログラムメモリを広範囲に使っている。バンク切り替えだらけ。これが地獄の入口よ。
バンク切り替えイチイチメンドクセー!!
新機能の追加でプログラムを書き足すと、バンクをまたいでしまうのである。あふれないように見直してみるが、やはり詰めようがないのでどこか空いている所へ移動できないか検討したりして何とか入れ込む。
それで動かしてみると暴走する。
また見直して、これが原因だったかと特定して、これはどうにかならんものかと頭を抱えて、また直して試して・・・
もうアセンブラやめてCで全部書き直したほうがマシじゃないのかと。でも容量的に厳しくなるかもな。やっぱり地獄に変わりは無く、再度この仕事が来ても受けたくないな。
そこで興味を持って、マイクロチップ社のデータブックを取り寄せた。当時は英文のみで分厚い本だった。
当時はネットでPDFファイルを入手することはできなかった。
パソコン通信のアクセスポイントが有り、そこからダイヤルアップで接続して書込用ソフトか、サンプルプログラムか何かを取ってきた事がある。通話料を気にしながらのアクセスで、あせりそう。
とにかく、PIC16C84を手に入れた。さてこれをどうやって書き込もうか。
当時有名だったのはPCのパラレルポートに接続する回路で、アプリケーションノートの何番だっけ。(AN589)
実際に作ったけど・・・最終的には書き込めた。途中でうまくいかない事があって、あれこれ試行錯誤した。そこらへんはよく覚えてない。
トラ技に載っていたシリアル通信で書き込むライターを作るために、その制御プログラムの書き込まれたPICが必要だったから、それを書き込む為のライターが要るという、たまごとにわとりのような話。
ただ、それは1種類のPICしか書けなかった。しばらくは、それで何とかなった。
そのうちに秋月のキットが出て乗り換えた。アルミケースを加工して組み込み、わりと最近まで(使わなくなっても)持っていた。
PIC16C84はPIC16F84になり、やがてA付きのPIC16F84Aになった。(以下PICは略す)
その次に乗り換えたのは16F628で、これもA付きの16F628Aになった。
A無しからA有りに乗り換える時、プログラムを修正しないと動かなかった。ここのところが面倒だった。確かI/Oの初期設定でコンパレータか何か。
非常に興味を持ったのは8ピンPICで、確か最初は12C508
容量の違いで508と509が有った。
最初はワンタイムか窓付きだけ。フラッシュは無かった。
その窓付きは確か当時二千円ぐらい?
これは最初に動かそうとした時、なかなか動かなくて苦労した。
CONFIGの設定を完全に理解していなかったと思う。調べてあれこれ変えて試すことの繰り返し。ようやくLEDの点滅。
8ピンに入るなんて純粋にすごいなーと思った。ただ、機能的には物足りなかった。タイマー割り込みなどが無かった。TMR0がカウントアップするだけ。
その頃、現場で遊技機の検査をする業者(裏ROMや不正な部品が仕込まれていないか調べる)が、「こんなものが付いていた」と持ってきたのがPIC16C84を使った「ぶら下がり」基板。
それと、フラットケーブルコネクタの中に仕込まれた8ピンPIC。よくこんなもん作るなあ、と。
そしてEEPROM内蔵の12CE508。518だったか。これも窓付きとワンタイムで、窓付きは中をのぞいてみると2チップ構成になっていた。とりあえずくっつけて作った感じ?
個人的にPICの法則と呼んでいる事があって、何かというと、I/Oポートの割り付けでいつもピンが微妙に足りない。
18ピンPICだとピンが不足する。それじゃ次は28ピンだ。いや40ピンだ。
28ピンは16F873、40ピンは16F877を使うようになり、それと18F4550も使った。
書込機の課題はどうしたかというと、結局は純正が一番ということで落ち着いた。
当時PSTART PLUSを秋月から買った。
会社ではマイクロチップ純正のPICSTART PLUSを買って使っていた。
バージョンアップごとに対応するPICの型番が増えてきたけど、17C44だっけ。最初は40ピンの窓付きPICが入っていた。
その容量が足りなくなったんだろう、基板に置き換わったけれど、当初それが壊れやすかった。
物理的に壊れるんじゃなくて、ファームウェアが飛んでしまう。ふとした事で動かなくなり、秋月に問い合わせて書き換えてもらった。
そのうちに安定して、現在も使える状態にある。
使いたい時に使えないと困るから、同じ物を2台も買って持っていた。
自分で書き換えられないか試したことがある。基板の回路を追って、PGCとPGDなどの端子を調べて別のライターから。
いつだったかマイクロチップ社のセミナーが九州で開催され、参加した時にICD2 LEの販売があったと思う。これを手に入れたら書込が飛躍的に速くなった。
これは解剖して回路図を書き起こしたんだっけ。顕微鏡を見ながらパターンを追って・・・同じ働きをする物を自作した。
最初からずっとアセンブラを使っていて、このマイコンのアーキテクチャはC言語向きじゃないだろう、メモリを食うだろうと思いこんでいました。
それに最初の頃、Cコンパイラは高価でした。買ってまで試そうと思わなかったですね。秋月で安いのが出てなかったっけ。使い方がわからなくて放置してそれっきりだったような。
いつからCコンパイラを使い始めたかというと、確か2009年あたりじゃないかと思う。
今までアセンブラで長々と打ち込んでいたのがシンプルに書けて、もっと早くから使えばよかったなと後悔。
タイミング的にギリギリな所はアセンブラで書くのは仕方ない。
ただ、ちょっと浮動小数点の計算が入るだけで容量が膨れ上がるから、なるべくそんな処理は避けるように工夫する必要があった。
くせのあるPICだったけど、慣れてしまうとあまり気にならなくなり、しかもC言語を使っているとそれがなおさら感じられなくなる。
これでいいと思っていたら、Arduinoが出始めた。出始めたというより以前からあったんだろうけど、知られるようになった、自分が知った頃か。
私は最初ArduinoではなくAVRをAVR Studioで使っていた。こっちのアーキテクチャのほうが素直で良いなと、但しアセンブラは試したことがない。
仕事でも結構複雑なプログラムを作ったりして、かなり活躍した。
PICについては、やっぱり慣れもあるし、もともとそれで作られた物の改良などを請け負ったりしてそれなりに使い続けていた。
ただ、18Fシリーズは1種類しか使った覚えが無いような。それとdspicも使ったことがない。
Ethernetをいじった時に使ったのは何だったか忘れた。
仕事でやったのは、たとえば最新ソースが失われて、PIC現物から読み出すしかない、最新ソースを再現してくれというもの。しかも、それに新機能を加えてくれ、と。
なんだろうな。担当者が失踪したのかPCが壊れたのか間違って消したのかは定かでない。
まあでもプロテクトがかかってなくて良かった。
そこから逆アセして、旧版のソースは有ったのでそれと照合しながら相違点を埋めていって徐々に再現した。
なんと、16F877のプログラムメモリを広範囲に使っている。バンク切り替えだらけ。これが地獄の入口よ。
バンク切り替えイチイチメンドクセー!!
新機能の追加でプログラムを書き足すと、バンクをまたいでしまうのである。あふれないように見直してみるが、やはり詰めようがないのでどこか空いている所へ移動できないか検討したりして何とか入れ込む。
それで動かしてみると暴走する。
また見直して、これが原因だったかと特定して、これはどうにかならんものかと頭を抱えて、また直して試して・・・
もうアセンブラやめてCで全部書き直したほうがマシじゃないのかと。でも容量的に厳しくなるかもな。やっぱり地獄に変わりは無く、再度この仕事が来ても受けたくないな。
PICの発振子
2026.01.05
近頃のPICマイコンはクロック源も内蔵され、クリスタルやセラミック発振子を外付けしなくても済むようになり、ずいぶん楽になりました。部品点数の削減にもなります。
以前はクリスタルやセラミック発振子を外付けしていたのでした。
クリスタルにセラミックコンデンサ2個、あるいはコンデンサ内蔵のセラミック発振子です。
コンデンサ内蔵のほうが使いやすかった。
それでも中央ピンにGNDをひっぱってくるのは、手作りだったらリード線が必要でちょっとした手間でした。
PIC16F84とか628Aなど、もう古いけど同様の18ピンPICはXTAL端子とVDDが近いので、セラミック発振子の中央GNDピンをVDDにつなぐという手がありました。
えっ、それで大丈夫なのか。大丈夫です。
VDDでもVSSでも交流的には同じだからどっちにつないでも良いという理解をしていました。
それで実際に色々な基板を作り、発振回路に関しては問題なしです。
理屈できちんと説明できるかというと説明できなかったりしますが、心配ならGNDにつなぐだけです。(そりゃそうだ)
そういえばPICマイコンのリセット回路も最初は外部に組んでいました。
リセット回路の出力を/MCLRピンに入力していたのです。
そのうちに出てきた新しいPICシリーズではリセットが内蔵されるようになり、/MCLRは単にプルアップだけで済むようになりました。
最初は不安で、しばらくは従来のリセット回路をそのままつないでいました。確認がとれた時点から、リセット回路の部品実装を変えて、プルアップの抵抗だけ実装するようにしたような。
じつは、PICがうまく立ち上がらない現象に苦しんだ経験があり、それでかなり神経質になっていました。
PICの/MCLRピンはシュミットトリガ入力なのかどうか?も重要なポイントでした。もちろんシュミットトリガ入力です。
Z80の頃にはそうではなかったので、トラブルを起こしていました。それで74LS14を通していたものです。このために余分なICがひとつ必要でした。
リセット回路の充電は、マイコンから見ればゆっくりした動きで、HなのかLなのか微妙な所をゆっくり通りますので、どっちつかずの状態となります。それでH/Lを小刻みに繰り返したりと不安定な動きとなり、マイコンの動作がおかしくなります。
そこで74LS14を通してH/Lをきれいにしてやります。大雑把にいうと、HとLのしきい値がそれぞれ違えてあるので、微妙な境界線を横切ることがないわけです。
以前はクリスタルやセラミック発振子を外付けしていたのでした。
クリスタルにセラミックコンデンサ2個、あるいはコンデンサ内蔵のセラミック発振子です。
コンデンサ内蔵のほうが使いやすかった。
それでも中央ピンにGNDをひっぱってくるのは、手作りだったらリード線が必要でちょっとした手間でした。
PIC16F84とか628Aなど、もう古いけど同様の18ピンPICはXTAL端子とVDDが近いので、セラミック発振子の中央GNDピンをVDDにつなぐという手がありました。
えっ、それで大丈夫なのか。大丈夫です。
VDDでもVSSでも交流的には同じだからどっちにつないでも良いという理解をしていました。
それで実際に色々な基板を作り、発振回路に関しては問題なしです。
理屈できちんと説明できるかというと説明できなかったりしますが、心配ならGNDにつなぐだけです。(そりゃそうだ)
そういえばPICマイコンのリセット回路も最初は外部に組んでいました。
リセット回路の出力を/MCLRピンに入力していたのです。
そのうちに出てきた新しいPICシリーズではリセットが内蔵されるようになり、/MCLRは単にプルアップだけで済むようになりました。
最初は不安で、しばらくは従来のリセット回路をそのままつないでいました。確認がとれた時点から、リセット回路の部品実装を変えて、プルアップの抵抗だけ実装するようにしたような。
じつは、PICがうまく立ち上がらない現象に苦しんだ経験があり、それでかなり神経質になっていました。
PICの/MCLRピンはシュミットトリガ入力なのかどうか?も重要なポイントでした。もちろんシュミットトリガ入力です。
Z80の頃にはそうではなかったので、トラブルを起こしていました。それで74LS14を通していたものです。このために余分なICがひとつ必要でした。
リセット回路の充電は、マイコンから見ればゆっくりした動きで、HなのかLなのか微妙な所をゆっくり通りますので、どっちつかずの状態となります。それでH/Lを小刻みに繰り返したりと不安定な動きとなり、マイコンの動作がおかしくなります。
そこで74LS14を通してH/Lをきれいにしてやります。大雑把にいうと、HとLのしきい値がそれぞれ違えてあるので、微妙な境界線を横切ることがないわけです。
初期値の話
2025.09.19
EEPROMやバックアップRAMに、設定内容などを書き込んでおき、起動時に読み込む事で初期設定に反映する、といった使い方は良くあります。
この時、読み込んだ値が正常な範囲か、妥当な値であるかを必ずチェックして、もし問題があれば適切に処理することが重要です。
ふ~ん、という感じですが、一度失敗すると良くわかります。
EEPROMやバックアップRAMの内容は、何らかの原因で化けることがあります。
そして、EEPROMは新品の状態で0xFFになっています。
これらの事実を前提にして、そういった異常値で誤作動しないよう、プログラムに対策を組み込みます。
EEPROMの初期値問題は、ずっとデバッグに使っていた試作機だと気づかないことです。初めて製品版の基板を動かす時に、アレッとつまずくのです。新品のEEPROMは0xFFだから。
たとえば、ある設定内容は1~10の範囲を前提としているのに、0xFFが来たらおかしなことになります。
ただ単にEEPROMを読み込んで、その値をそのまま使ってはいけないのです。値が規定範囲に有るか、もし外れていたら初期値に戻すといった処理が必要です。
意外と市販の製品でも考慮されていない物があるようです。
自分の修理仕事の経験でも、回路的には正常なのにどうしても動かないものがありました。他社さんが修理をギブアップして、うちに回ってきました。
結局それはEEPROMの内容が化けていて、起動時に読み込んだ異常値で暴走していたことがわかってきました。
幸いなことに正常な個体が有り、そこからEEPROMの内容を複写してやると、正常に動くようになりました。
原因はリセット回路がいい加減で、特に電源を切った時のゆっくりした電圧低下で暴走し、その時にEEPROMを誤って書き換えていたようです。対策として、電圧検出ICを追加し、ある電圧より下がったらマイコンが動かないように止めるようにしました。
普段操作しない場所に押しボタンを隠しておき、あるいはディップスイッチの空いている所を利用するか、とにかくそれをONにしたまま電源を入れると、EEPROMがクリアされてデフォルト値が書き込まれるようにする仕掛けをするのも良いでしょう。
この時、読み込んだ値が正常な範囲か、妥当な値であるかを必ずチェックして、もし問題があれば適切に処理することが重要です。
ふ~ん、という感じですが、一度失敗すると良くわかります。
EEPROMやバックアップRAMの内容は、何らかの原因で化けることがあります。
そして、EEPROMは新品の状態で0xFFになっています。
これらの事実を前提にして、そういった異常値で誤作動しないよう、プログラムに対策を組み込みます。
EEPROMの初期値問題は、ずっとデバッグに使っていた試作機だと気づかないことです。初めて製品版の基板を動かす時に、アレッとつまずくのです。新品のEEPROMは0xFFだから。
たとえば、ある設定内容は1~10の範囲を前提としているのに、0xFFが来たらおかしなことになります。
ただ単にEEPROMを読み込んで、その値をそのまま使ってはいけないのです。値が規定範囲に有るか、もし外れていたら初期値に戻すといった処理が必要です。
意外と市販の製品でも考慮されていない物があるようです。
自分の修理仕事の経験でも、回路的には正常なのにどうしても動かないものがありました。他社さんが修理をギブアップして、うちに回ってきました。
結局それはEEPROMの内容が化けていて、起動時に読み込んだ異常値で暴走していたことがわかってきました。
幸いなことに正常な個体が有り、そこからEEPROMの内容を複写してやると、正常に動くようになりました。
原因はリセット回路がいい加減で、特に電源を切った時のゆっくりした電圧低下で暴走し、その時にEEPROMを誤って書き換えていたようです。対策として、電圧検出ICを追加し、ある電圧より下がったらマイコンが動かないように止めるようにしました。
普段操作しない場所に押しボタンを隠しておき、あるいはディップスイッチの空いている所を利用するか、とにかくそれをONにしたまま電源を入れると、EEPROMがクリアされてデフォルト値が書き込まれるようにする仕掛けをするのも良いでしょう。


2026.01.25 14:20
|

