外部セラロックを使わないで、内部PLLを使って、32Mhzで
動作させるために、16F1827に16F88のプログラムを移
植しました。
今回、移植するのに、丸々3日ほどかかりました。はまっ
てしまったのは、二つでした。
一つ目は、大いなる勘違いで、
for( ; ; )
の使い方を誤ってました。そのため、A相、B相のパルスが
正しく発生できませんでした。16F88で作った時は、パルス
の発生を前後の余裕をもってしていたので、その余裕が、
ロジックの誤りを吸収してくれたようです。初期値1~5まで、
5回のループを作りたいのに、
for(i=0;i<5;i++)
のような記述をしてました。これでは、0~4までの5回の
ループになってしまいます。正しくは、
for(i=1;i<=5;i++)
でした。
もう一つは、原因がよく分からないのですが、クロックを早く
すると、PORTが思った動作をしてくれなくなるようで、
PORTレジスタとLATレジスタ
と
PICとMikroC
に記事がありました。
早速、LATレジスタを使って組み直すと、見事動きました。
動いたプログラムです。ゴミが沢山残ってます。
main.c
特に、メインの処理では、switch分とif分が混在してます。
原因をあれこれ探るためにやった名残です。
もしかして、このように、PICは癖があるのかもしれませんね。
AVR等は、どうなんでしょうか。
**************************
* 追記 *
**************************
もしやと思い、諸兄の記事を参考に、ポートのビット操作
の間に’nop’を一ついれて動かして見ました。
あれほどなやんだのが嘘のように、通常の書き込みで、
LATレジスタを使わないで、動きました。
’nop’をいれたプログラムです。
main.c
やはり、諸兄はすごい。
AGENT: Mozilla/5.0 (Windows NT 6.1; rv:42.0) Gecko/20100101 Firefox/42.0
猛牛ロックさん、こんばんは。書き込みありがとうございます。
16F1939は、「 命令はすべて 1 サイクルで実行」ということは、AVRと同じ、1クロックなんでしょうか。だとすると実質、4倍ですね。
今日いろいろたぐっていたら、16F459の記事を見つけました。このPICは、48Mhzまで設定ができるようです。
http://sky.geocities.jp/home_iwamoto/page/P16F/P16_A11.htm
新しいPICなのかどうかは分かりませんが、○月、○ルツ、○立等では、取り扱いがないようです。
細部でいろいろ違いがあるので、あまりいろんなPICには手を出したくないのですが、日進月歩ですねえ。
AGENT: Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko
16F1939(40PIN、240円)のスペックをみてかなり惹かれました。
DIP40ピンにしては安いのもそうなのですが、一番目を引いたのは内臓クロックで32Mhz出ること。
更に「 命令はすべて 1 サイクルで実行」という部分です。
(普段AVRでは内臓8Mhzばかりなので逆に4倍の能力になりますね))
「処理能力が高い」と言う事が、必ずしもいいマイコンとは限らないですが最大36ものI/Oを制御するわけですから
やはり能力が高い方が安心できます。でも、実際に処理能力で困ったことはいままでありません。
多分、1/4遅くともほとんど困らないように思います
AGENT: Mozilla/5.0 (Windows NT 6.1; rv:42.0) Gecko/20100101 Firefox/42.0
猛牛ロックさん、書き込みありがとうございます。
AVRは、本当に、私から言うと、すっきりしゃっきりなんですね。PICは4クロックで1命令だけど、AVRは1クロックで、1命令だとうような記事もみかけました。スピードでも、有利なんでしょうかね。また、新しいPICでは、仕様がAVRに近づいてきた、みたいな記事もみかけました。
今日は、諸兄の記事から、ヒントを得て、ちょっとためしてみました。ポートのビット操作を連続しないで、間に、インラインアセンブラーで、’nop’をいれて動かしてみました。
あっけなくうごきました。この辺がPICが難物たるゆえんかもしれません。
AGENT: Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko
今回の件と関係あるのか私には判りませんけど、AVRのI/Oの構造としては
DDR 方向レジスタ 0なら入力、1なら出力
PORT 出力レジスタ DDRが出力(1)で0ならロー出力、1ならハイ出力。
(DDRが入力(0)で0ならプルアップ無、1ならプルアップ有り)
PIN 入力レジスタ DDRが入力(0)なら、普通に読み取り
(DDRが出力(1)の場合、1を書くとトグル動作)
となります。AVR(ATTINY、ATMEGA)は全ピン共通です
今回のLATレジスタの件はAVRは入出力のレジスタが分かれている(PORTとPIN)あたりの問題でしょうか。
PICはこれからなので違いは何とも言えません。私にとってAVR=普通(標準)で他は何もありませんから。
私にとって解るのは上記のように、判りやすい構造という訳では無いですが、「全て共通」という部分が
AVRの特徴だと思います。
全て、1ピンごとにプルアップ抵抗が付いていて、オープンコレクタ(ドレイン)出力はありません。
全機種で内部クロックがある。2,3種?以外のチップは全てADC、EEPROMが付いている。
処理能力は使用クロックと同じ。(価格は様々ですが、処理能力は全て共通です)
更に、1ピンあたり40mAまで出力可能なので初心者には優しいです。
(例えば、秋月の30mAのPCBリレーなんかもそのまま繋げる事は可能です。また、
フォトカプラなども内部プルアップ抵抗を使ってそのまま使って入力させたりも出来ます)
基本部分ではどれも同じなので、「間違え」は少ないです。
その点PICは色々特色があって、気を使います。その上種類も多すぎです。
いや、魅力的なものも多いし、種類も多いに越したことはないのですが、古いものが淘汰されないところが
難しくさせているのかも知れません。(入門者にとって)