初めてのPIC 0x0e
■ このスレッドは過去ログ倉庫に格納されています
.
_ _ PICをさわるのは今日が初めて、という超初心者のためのスレです。
(O>――<O) PIC選び、PICを使った回路は、誰でも最初は不安なものです。
/ (・) (・) ヽ 恥ずかしがらずに何でも聞いてください。速攻で教えてくれますよ。
○ /▼\ ○ 質問のしかたは、初心者質問スレの発言1を見てくださいね。
|(ヽ二フ ) |
/  ̄ ̄ ̄ ヽ
f ヽ / | PIC関係のスレは、レベルに合わせて以下のスレもありますので、活用しましょう。
ヽ \ / ノ ・PIC専用のスレ
| \_ )(_/ ! 本家本元のPICスレです。口の悪い人もいますが、楽しくやってるみたい。
| | ここの話がわかるようになれば、あなたはもう一人前のPICerです。
| | ・マイコンソフト 悩み事相談室
| | ̄ ̄| | マイコンソフトやツールの質問は、こちらでどうぞ。的確な回答があります。
(_ノ ヽ_)
質問する時のコツ
・性格の悪い回答者はスルーしよう(相手すると逆効果)
・素人玄人などと 上から目線の回答者は、無視してください。相手してはいけません。
・そこそこ良い回答が出るまでしばらく再発言しないのもあり(良回答は後に出やすい)
・回答者のアドバイスで後日解決したら、結果報告しよう(とても喜ばれる)
・回答者は、僕たち初心者に優しくしてください。あなたも通ってきた道のはずです。
必要なソフトなど(基本無料)
統合開発環境 MPLAB X ttp://www.microchip.com/mplab/mplab-x-ide
コンパイラ (XC8 XC16 XC32) ttp://www.microchip.com/mplab/compilers (高機能版は有料)
コード生成プラグイン (MCC) ttp://www.microchip.com/mplab/mplab-code-configurator
マイクロチップ ライブラリ (MLA) ttp://www.microchip.com/mplab/microchip-libraries-for-applications
必要なハードなど
初心者はPIC16F1、PIC18F1以降の型番で始めると無理なく始められます。
プログラムの書き込みには書き込み器が必要です。持っていない場合はPICkit3(中華クローンでもまず大丈夫)を使いましょう。
PIC一覧、スペック検索 ttp://www.microchip.com/ParamChartSearch/chart.aspx?branchID=1005
さ、質問どうぞ〜っ
0x0d 2017/10/25〜 ttp://rio2016.5ch.net/test/read.cgi/denki/1508935254/
0X0C 2017/07/27〜 ttp://rio2016.2ch.net/test/read.cgi/denki/1501157324/
0x0B 2017/05/08〜 ttp://rio2016.2ch.net/test/read.cgi/denki/1494235320/
0x0A 2017/01/04〜 ttp://rio2016.2ch.net/test/read.cgi/denki/1483498857/
0x09 2016/09/07〜 ttp://rio2016.2ch.net/test/read.cgi/denki/1473238791/
0x08 2016/04/30〜 ttp://rio2016.2ch.net/test/read.cgi/denki/1461994030/
0x07 2016/02/05〜 ttp://wc2014.2ch.net/test/read.cgi/denki/1454648249/
0x06 2015/07/18〜 ttp://wc2014.2ch.net/test/read.cgi/denki/1437151298/
0x05 2015/04/07〜 ttp://wc2014.2ch.net/test/read.cgi/denki/1428391368
0x04 2015/01/02〜 ttp://wc2014.2ch.net/test/read.cgi/denki/1420205108 エラッタを報告しても
「ソフトのバグ」
「使い方が悪い」
という感じなので
一時期ここでも話題になったUARTの問題も>>639のような謝った認識の人が多いようです
意図的なミスリードかもしれません >>649
一人も協力的な人がいなければ議論になりません
そういうレベルのスレです UART送信ダブリのエラッタはPIC専用スレPart54-252で回避できるんやから
蒸し返さんでもええやろ 同じPIC系統で今まで問題なかったが、エラッタのために異常動作したコードを披露するとかやってよ。 >>650
>エラッタを報告しても
一般論ですが、ソースコードの開示と動作の説明をしないと意味ないですね。 >>652
54-252にエラッタのことなど書かれてないけど >>651
>そういうレベルのスレです
なんて諦めたような見方をするぐらいなら、あなたがここにいる意味はないと思います。 >>654
それはフェーズによります
いきなりソース開示なんてことは普通は行いません RX使っているけど、こいつもエラッタが結構です。
エラッタ回避のコードで対処するが、エラッタが修正されても何時生産ラインに紛れ込むかも知れないので回避コードのままだわ。 >>657
1個目のレスでソースなしで「エラッタがある」はともかく、
それに対する応答として「ソース出せよ」のリクエストがあれば、その時点でソースを出すフェーズです。
そうでなければ掲示板で議論もできないですし、
ソースを出すつもりもないなら、デマと区別もできなくなる恐れのある掲示板に正当なエラッタ報告をする意味が薄くなります。
デマと区別ができるのは、第三者検証が可能なようにすることができてこそです。 >>660
え? そうなんですか?
>>659のリンク先は普通にブラウザで見えてますが。 文章だけだと判りにくいのでUART内部構造図と合わせて読むと理解しやすい >>659
あ、見れました
読めばわかるけど割り込みを使えないということですよ
使い方が大きく限定されます
業務コードでUARTをポーリングなんて普通しませんので >>665
ぐるぐる回るな。
いつも具体例を出して議論をしましょう、って話なんですよ。
ソースコードが出てきているから、>>659のリンク先の議論もあとから評価もできるわけです。 >>662
ごめんなさい、2chmateだと駄目だった。 心配になったけど普通に送信割り込み使っていれば関係ないのね。
良かったわ。 結局情報が上がってもこういうミスリードする人のせいで間違った情報に化けるんです >>669
掲示板でやれば不特定多数、玉石混淆なんで
意図するしないにかかわらずそりゃミスリードは発生するわ
自分でブログでもPDFでも何でもいいから文書にまとめて発表したら? UARTはまだマシですが
EFのI2Cは全く使い物になりませんね
皆さん気を付けましょう 結局なんやかんや言ってるが自分の方が議論したりまともな情報を発信する気はないということだな
意図はわかったからNGにするわ >>672
>EFのI2Cは全く使い物になりませんね
ソースコードを出してください。有意義な話にしましょう。 >>673
まともに聞く気が無い人に発信しても無駄
と言うことは今までの流れでもわかるでしょう 本当に知りたいならそれ相応の態度で
まあ私なんかに聞かずにMicrochipや代理店に聞く方が良いとは思いますが >>670
そこ詳しく知りたいです。
割り込み発生でTXREGにライトした時点で二重送信になるの? >>681
TXIFで割込後にTXREG書くとごく稀にダブってしまう…
割込ルーチン入ったら1バイト送信時間分NOP()を並べるという対処療法で凌いだ >1バイト送信時間分NOP()を並べる
これは酷い
タイマー使ってポーリングのほうがマシだな
タイマーが空いていればだが >>682
割り込み時点でそこそこクロック消費してるのにnopかよ? >>681
TXREGに書いた時点で2重に書かれる
2重に書かれるかどうかは完全にタイミング依存
割り込みかどうかは関係無い 問題が発生するのは非常にシビアなタイミングであり
1命令サイクルでもズレれば問題は発生しないが
これを回避するのは難しく
何かしらを犠牲にする必要がある
何も犠牲にせずに簡単に回避出来ると主張する書き込みもあるが
その具体的方法について語られたとこは無い 報告があったのはPIC16F1459, PIC16F1454, PIC16F18313 だけど
PIC16Fで1で始まるもの全部という認識じゃなかったか いわゆるEnhanced mid rangeファミリーやね >>682
これってハードの設計ミスでしょ。
ホビーとしては許容できても産業用には信頼性が低くて使えないな。 エラッタ厨はTXREG以外のエラッタって何も話題にできないんだ? >>691
産業用ルネRL78でもSPI通信に爆弾抱えてるのだけど
代理店とやりとりして不具合回避して使った経験あるから
そんなもんだと諦めて使えばよろし 十年以上前にEMC試験やったことあるけどPIC16は優秀だったなー
他社8bitマイコンを最高クロックでぶん回すとノイズ撒き散らしてラジオ聴こえなくなったり
movaケータイ接近させるとレジスタ化けたり暴走したりとかあった
一方でPIC16は余裕で試験クリアしてた >>694
ヘーッ、そうなんだ。
そう言うのは次のロットから回路パターンが修正されてるとかは無いの? PIC32MXですが、IOをHi → Lo → Hiとタイマーカウンターでウエイト
いれてパルスを作ってみたのですが、どれだけ早くできるか
ウエイトを徐々に小さくしてみましたところ。500nsecが最速でした。
10MHz(100nsec)くらいまでいけると思ったのですが・・。 そんなに無理させて、チンチンに熱くなったりしないの? >>704
プログラムのスキルと仕様次第
LATAINVにセットし続ければ
コアクロックの半分の周波数まで出せる >>705
チンチンはたまには熱くなった方が良いです >>704
500nsっていうことはパルスの極性反転に250nsでクロックが最大の40MHzだと処理に(250/25=)10クロックサイクルかかってることになるね。
I/O命令とタイマー割り込み処理だけだけど結構クロック使うんだ。
だからPICに限らずマイコンはPWMとかパルスジェネレータを内蔵してるのかな? >>707
oh...
そんなワザがあったのですね
実は、関数でSPIを作ろうと思っていまして、SCLK=10MHzくらいに出来ないか
チャレンジしておりました。wait_fast(1) = 500nsec
それ以前に↓だと、SCLKがLowに貼り付いたまま・・・
void SPI_Data(unsigned iData)
{
int iCnt1,iCnt2=0;
int iloop=0;
unsigned int iBuf[770];
SCLK = 0;
SDO = 0;
LAT = 1; //データラッチ
wait_fast(1);
LAT = 0;
//データ格納
//10進数を2bit -> 配列に格納
while(iData>0){
iBuf[iCnt1]=iData%2;
iData=iData/2;
iCnt1++; //配列カウンタ用
iloop++; //データ カウンタ用
}
iloop=iloop-1;
//データ出力
for(iCnt2=iloop;iCnt2>=0;iCnt2--){
SCLK = 0;
if(iBuf[iCnt2]==0){
SDO=0;
wait_fast(1);
SCLK = 1;
}
else{
SDO=1;
wait_fast(1);
SCLK = 1;
}
wait_fast(1);
}
SDO = 0;
SCLK = 0;
} >>709
有難うございます。
PIC32MX340F で80MHzですが、汎用IOが単に遅いだけだと思っていました
内部処理なのですね・・ 割り込みで10クロック周期の処理なんて不可能
だから>>704は当然ISRによるポート処理ではないはず
もっとも、
なぜ40MHzが最大だと思ったのかもわからず、
80MHzで動作していて500nsが1回の処理の時間であれば40クロックですので
ギリ可能な感じ >>275
まぁ電子天秤の出力フォーマットは全部似たり寄ったりだからね
1個作れば他の天秤でも使える
安い優先ならPICKIT3(互換機)を海外通販で
でなければPICKIT4
作例の多い16F1455(USB内蔵)使ってMCCでさくっと
ただDACのアナログ出力が面倒なので、デジタルでどうにかした方がいいと思うよ
SDカードUSBメモリとか、PCにUSB出力とか
「PIC SD」でぐぐれば作例出てくる
DIPじゃないパッケージは大変なのでやめるべし
ArduinoやRasberryPiでもいいし
早く始めた方が、仕事が早く楽になると思うよ >>710
そういう低レベルな処理の最適化は得意
色々とアドバイス出来ると思います
wait_fastは関数?
であればNOPを並べただけのマクロに変更
あとはループアンロールなど基本的な最適化技術を学びましょう
最終的にはアセンブラ化ですかね なんとか、自作SPIでました
https://i.imgur.com/K3ICgzg.jpg
ソースが間違いまくってました。
unsigned iData -> unsigned int iData
int iCnt1,iCnt2=0; -> int iCnt1=0;
int iCnt2=0;
>>712
勉強になります >>715
>wait_fastは関数?
はい。
Timer1をカウントしてます。
iwaitの係数は"8"が限界でした。
周辺クロックは80MHz = 12.5nsecなので、計算上は12.5nsec x 8 = 100nsec
ですが、限界の500nsecになります。
void wait_fast(unsigned int iwait)
{
unsigned int val = iwait * 8;
TMR1 = 0;
while ( TMR1 < val){}
}
>あとはループアンロールなど基本的な最適化技術を学びましょう
・・・難しそうですね・
>最終的にはアセンブラ化ですかね
インラインアセンブラでしょうか? 皆さん、いろいろと有難うございます。
一旦オチ致します >>718
(暇なときに書いて)
前処理含めてSPI_Data全体を速くしたい?(処理時間短縮)
それとも通信時間だけ縮めたい?(バス占有時間短縮)
アセンブラはインラインじゃなくてループ全体をネイティブで
規模的にはアセンブラでも問題ないレベルなので 端子を好きに変えて良いならDMAも使える
そもそも何でPIC32MXのSPIの機能を使わない?
数が足りない?
端子を変えたい?
単に勉強用? >>711、>>712
ごめんなさい。
PICのことはよく知らず>>1にあるMicrochip社のホームページにあるチップの一覧表で最初に出てきたPIC32の仕様から40MHzを引っ張ってきてしまいました。
それにしてもポート反転処理に20クロックサイクルもかかるとは、規模が大きくなるとマイクロ命令を使ったハード処理が多いからなんだろうか? 8bitだとクロックを揃えたとしてももっとかかるよ xc8の無償版
数ヶ月経つとアセンブラ命令書いたら最適化されないと聞いたけど本当でしょうか?
sleep命令の後にNOP入れたいんだけど、本当の話なら困る インライン?
インラインアセンブラによってコンパイラの最適化が阻害されるのはごく普通のこと
影響があるのはせいぜい関数内とか近い部分だけだよ
インラインアセンブラを使う使わないに関わらず
無償版は最適化に制限がある
お金があってパフォーマンスが重要であれば
有料版を買いましょう
個人ならより速いマイコンを選ぶ方が良いでしょう >>722
C言語だからコンパイラのオーバーヘッドがあるっていう意味?
確かにそうだけどコードがシンプルだから最適化すればかなりコンパクトになるかと思って。。。
すみません。 すみません
未だにMPLABのアセンブルの見方が分からなくて・・・サイズしか判断できません
NOP入れるとサイズが倍になるので困ったなと
NOPぐらいは最適化して欲しいなー どうやってnopいれてるん?いろいろあると思うが。 シンプルに
sleep();
nop();
asm("nop");ではありません >>727
処理内容は見たの?
関数を2回呼んで、
その中でタイマー待ちをしたりしてるんだけど
そんなにシンプルか?
じゃあ逆に8bitだとどれくらいだと思った?
パッと見で >>730
それを「アセンブラ命令を書く」というのか...
インラインアセンブラと比べて見ては?
コンパイラの最適化の設定は0〜3まであって
無償版はお試し期間を過ぎると0〜1しか選べない
試したければ最適化の設定を1にしてみれば良い
そもそも今は3になってる? >>721
8bit (PIC16F18326)と32bit の処理時間を比べてみました
ループ1周
8bit 388クロック
32bit 41クロック
圧倒的に32bitの方が速いですね
32bitの方は80MHzですので
クロック周波数を加味するとさらに差が開きます
8bitは1命令4クロックなのと、関数コールに時間がかかっているのが主な遅い要因のようです
ちなみに、
純粋にCPUの処理時間を比べるために
タイマーの待ち時間はゼロにしました
それ以外は>>710 >>716 >>717 のままです >>734
ヘーッ、ビット数で大きく違うんだ。
参考になりました。
ありがとう。 32bitでアセンブラでガシガシに組んだら
1ビット平均4.5クロックくらいになりました
SCLK HIGH 2クロック / LOW 2クロック
残りはループやデータロードなどオーバーヘッド
ただし、
純粋にCPU部分だけの性能なんで
回路やバスがボトルネックになるかもしれません
非常識なコードまで含めれば
最短、2クロック + オーバーヘッド
になります >>710
もういないかもしれませんが
SDOやSCLKはLAT*bits.LAT**のdefineだと思いますが
これに直接代入は危険です
ISRや他のタスクで同じポートグループにアクセスしてない確認が取れた場合だけにしましょう
取れた場合も、移植時やコード変更時の無駄なトラブルを避けるため、
直接代入は止めた方が良いです
割り込み禁止で包む
ASET / ACLR 命令を使う
LL / SC 命令を使う
LAT*SET / LAT*CLR / LAT*INV を使う
など、アクセス中の割り込みでも問題ないように 8bitでアセンブラで考えてみたけと
ループやデータ読み込みを除いても
1ビット送信に20クロックもかかってしまう
非常識な方法でやっと10クロック
ベテランさんだともっと縮まるのかな?
℃玄人さんとか 定期的に、
8bitを過大評価
32bitを過小評価
した書き込みが有るんだよな
PICは8bit信仰が根強い ARMなんか、APBに書き出すと1サイクルなのに何十クロックもかかるよ。 ここはPICスレなんでよろしく
PIC32の競合となるCortex-Mならともかく
Cortex-Aの話が何の脈絡もなく突然出て来ても
「で?」としか言えん センサをI2Cで制御して無加工のままUARTで吐くような
単純処理にしか使ってないので8bitで十分なワシ UART送信を詰め詰めで送るほどシビアなタイミングは要求されてないので
1バイト毎にTRMTビットをポーリングしながらのんびり送信してます。
それゆえエラッタとは無縁なPICライフでハッピー♪ 電子工作未経験ですが質問させてください
例えば、PICを用いた自作キーボードを作りたい場合、
デバイス側としては、電子回路(USBシリアル変換モジュール・USBケーブル含む)と
PICに書き込むC言語だけで完結できるのでしょうか?
VB.netを勉強せずに済むなら、書籍代や時間労力を節約できるので
教えていただければ幸いです よろしくお願いします USBシリアル変換だと
PC側からキーボードとして認識しない
PIC16F1454などUSB機能の付いたマイコンを使いましょう
電子回路(マイコン、キー、USB端子などを含む)
プログラムをマイコンに書き込む為の道具(PICKIT4など)
統合開発環境(ソフト、無償)
が必要 開発言語はC言語のみでOK
もちろん開発に使うPCは必要
質問の答えになってます? 一から作るのか先人の作例を真似するのかにもよるが
未経験者には結構ハードルが高いと思う
できればもう少し段階を踏む方がよいのだが ■ このスレッドは過去ログ倉庫に格納されています