PIC専用のスレ Part 59 エラッタの話題も歓迎
______
/Microchip ./|
/ ( ゚∀゚) / | アセンブラのアの字もわからない
|~ ̄ ̄ ̄ ̄ ̄| /. 超初心者からHEXが読めてしまう
|/Z./Z./Z./Z_|/ || 鬼プロフェッショナルの為のスッドレ(#゚Д゚)だ!モ゙ルァ
||. ||. ||. ||
.
大人気のPICマイコンのスレ
なんといっても情報が豊富だし、開発環境も多いし、パッケージも豊富
使いやすくて、しかも安い。やっぱりPICだよね
例の如く基本リンクね
http://www.microchip.com/ マイクロチップ本社(Microchip Technology Inc. )
http://www.microchip.co.jp/ マイクロチップ テクノロジー ジャパン 株式会社
http://www.microchip.com/maps/microcontroller.aspx Microchip Advanced Part Selector (Maps)
またーりやっておくんなまし
種類が多くてワカランって人は上記パーツセレクタで、機能から最適製品を絞り込もう!
教えて君はとりあえずGoogle( (p)http://www.google.co.jp/ ) くらい使おう
テンプレ内の秋月小売価格も在庫が捌ければ、次の仕入れからは昨今の為替相場変動にならって
適宜価格改定されてます。ここの表記価格とは違うかもしれないのでそのつもりで
回答者する人の注意
. 最初に回答したい気持ちは分かるけど、質問者の内容を、落ち着いてよく読もう。
質問者する人の注意
. あなたの周囲しか通じない変な省略語は使わずに、なるべく詳しく説明してね
前スレ:
Part 58 https://rio2016.5ch.net/test/read.cgi/denki/1526808360/
Part 57 http://rio2016.5ch.net/test/read.cgi/denki/1517669525/ >>411
1線の方法を教えてください。
できるわけないのに。 こんな感じかな?
Data, Shift Clock
[ダイオード+CR]の微分回路で1線で シリアルデータとクロックを作れる。
データ兼クロックのラインは、Lの時間でH/Lを切り替えられる。
まず、立ち下がりエッジでLに落ちてチャージとともに上がっていく信号を作る。
立ち下がりからすぐに立ち上げたらLをサンプリングできる。
立ち下がりから時間が経過したあと立ち上げたらHをサンプリングできる。
Latch Clock
データ兼クロックがLのあいだCを急速にディスチャージしてHのときにゆっくりチャージする回路も[ダイオード+CR]で作れる。
これで、速いパルスの連続の間はL、それがなくなったらHになる信号を作れる。
特にLatch Clockはシュミットトリガを通したいな。 >>415
ラッチクロックはあまり気にする必要ない気がする。
余計なシフトは困るけど。 >>417
>ラッチクロックはあまり気にする必要ない
たしかに。閾値付近で複数回の立ち上がりとして認識されても問題はないだろうね。 1線でのシフトレジスタ(HC595)を使う方法について
参考になりそうなサイトが有ったのでURL貼っときます
https://www.romanblack.com/shift1.htm >>420
シンプルなのですが、このやり方だと1bit分(QA)を使わない事で解決してると思うので
全ての出力を使うなら420さんの様な方法になると思います 1線式で8bitすべて使う場合の回路で比較的部品数の少ない方法だとこんな感じですかね?
https://i.imgur.com/tJljpfF.png
シミュレーション上ではそれっぽく動作してる様に思う >>423
すまん、画像(グラフ)だと抵抗等の定数がいい加減すぎて、閾値に対して余裕がない感じですね
RCK(LD)の抵抗を大きくするかキャパシタの容量を増やせばもっと余裕ができると思う 入力寄生容量使えば、抵抗2本とキャパシタ1個でいけるか。ラッチにすんごく時間かかりそうだけど。
かかるの嫌ならD使って、もっと速めたければピン増やせ、と。 I2CのEEPROMが書き込みできる、ROMライターを探してるのだけど
色々探してるのですが、良いのがないので
知ってたら教えてください。
ROMは、AT24C02を書き込みます。 ここPICのスレなんだけど……
PICで読むならPICで書けばいいんでは?
そもそもI2CのEEPROMのライタなんて大差ないと思うんだが
良い悪いの判断基準(要件)は何? CH341Aなんちゃらっていうやつが安くていいんじゃない?
書き込みアプリは探さないといけないけど WS2812Bを3.3Vで動かしている例があるようだけど
無点灯のとき実力として何Vで停止するの? CLCの無いデバイスでWS2812Bを制御する場合
1bitごとの割り込みだと
(今何個目の何ビット目とかの)ステートの保存で余裕がないけど
やっぱり割り込み使わずに命令サイクルだけでタイミング調整するのが無難? 8bitマイコンで、32MHz(FOSC/4 = 8MHz)の話してる?
割り込みじゃ無理だと思う。
アセンブラ使って実装したよ。 割り込みは使わずPWMは使うのが無駄(nop)が少ないんでは 作ってみたらわかるんだが、32MHzでも2インストラクションしか
ONの1状態には時間がないから、PWMでも結局タイミングを合わせて使わないといけない。
それをするなら、直接IOを叩いたほうが効率的 効率の考え方の違いだけのような?
PWMを使うと脱調しない範囲で本来の出力周期よりループを早く回せる
節約できるのが1命令だけでも8bit単位のループで8命令稼げる
ループの中の1命令ではほぼ何もできないが
ループの外の8命令なら色々できる
逆にそこまで頑張る必要がないなら労力として非効率とも言える PICのアセンブラでないので申し訳ないが、
CCPを使うとして、
mov W , ON
testAndSkipIf0 colorR , bit7
mov W , OFF
mov CCPR1L , W
確かに4命令で、あと4(5とか6でも良い?)命令自由に使えるとも言える。
しかし、これループもせずに、RGB全部のすべてのBITに対して
延々と命令書くのか?Wレジスタも消えるし。
いや別にいいけど。
IOを直接叩くのなら、R、G、Bについての
それぞれのループ3つ書くだけで済む。
(800kくらいの設定で考えたので9命令クロック)
ワード数では1ループ8命令、次のロードで1命令で30ワード+α程度
たしかにPICのプログラムメモリはそれなりに潤沢
ちなみにこれをループさせようと思うと
shift colorR , left
decrementAndIf0Skip counter
jmp to front
mov W, 8
mov counter , W
が必要になる。
ループはこの時点で8クロックかかり、1クロック程度余るのかもしれないが、
この、次のロードに1クロック余分にかかるのが曲者で
TMRのループと非常に相性が悪い。この方法は使えないかもしれない。
IOを直接叩く場合、BSFが使えるため、Wレジスタが空く。
このため、カウンタをWに入れておけば、きれいに周期的な出力ができる。
IOを叩く場合、周期的である必要はないが。
だから、結論としては、延々長いアセンブラを書き、
8~9命令中4,5命令をなにかに使うか、
IOを叩くループを書いてプログラムを短く、ついでにタイミングを気にせず書くか、
の違いだ。 しかし、基本的にPICはWレジスタとの間の計算しか
ほとんどできず、細切れになった4,5命令で、Wレジスタが
揮発する状態で何ができるのかというとちょっと悩む。 あと、ループしないにしてもIOでも
BSF
BTFSS BCF
BCF
の必要なのは4命令なんだ。
場所はちゃんとしないといけないが。
Wレジスタは空くし、CCPのリソースまで何のために使っているかは
よくわからんとしか言えない。 ループ回すって書いてあるのに何でループ使わない前提になっているの? データ「0」ばっかり送るとか、「1」ばかり送るなら、
PWMでループすればいいと思います。 おそらく、私の考えとあなたの考えの間に理解のずれがあるようです。
私にはどういうループを短くする手段なのかわかっていません。
PWMを使う、LEDを操作する時点で、DUTYは変えないといけませんよね。
そのうえで、PR2も変えるというようなことを考えておられるのでしょうか。
変えることが可能なら、全体の転送時間は短くなりますね。
それがループを短くするということでしょうか。
しかし、単にDUTYを変えるだけで、4サイクルかかります。
PR2を変えるのにまた同じくらい時間を要しては、PR2を変えると破綻するだけで、
結局命令が足りずできない気がしています。 出力先がIOかDUTYの違いで大差ないと思うんだが
何か大きく変えなきゃいけない理由はあるんか? いえ、前の方がPWMで回したほうが効率がいいと言われるので、
比較してみただけです。
同じか、めんどくささを考えるとIOのほうがよさげです。 要するに、私がIOのアセンブラで書くと良いよ、と書いたのに対し、
PWMのほうが効率が良いと、レスが付いたものですから、
実際に書くとどう違うかちょっと考えて、
やっぱりIOのほうが良いだろうという結論を私は出しました。 大差ないのに同意しといてなんでPWMだと良くないのかが説明されててモヤモヤするな
ビットテストにとらわれてローテートでキャリーによる分岐が使えることを見落としている? 前提としてバンクセレクト不要にしたらLレベルの時間調整でnop入れる余裕があるでしょ?
そのループの中のnopを1つ削る
Lレベルの時間が不足する分はタイマで待たせる
削った8命令分を他のことに使う
バンクセレクト不可避とか前提が違うなら比較にならないからどうとでも言える なるほど、説明を省いたからPWMが良くない理由がよくわからないと。
デューティを変えるだけなら、IOもPWMも同じ命令数がかかる。
これはいいよね。
IOを使うと、Wレジスタを使わなくていい。
これがIOの1つのメリット。
デメリットは、IOだと位置が完全固定になること。
しかし、NOPで待たなければならない、とあるが、この1命令、
何か別のことに使ってもいいかもよ。
だから、使える命令の位置関係に制約があるけど、使える命令数は変わらない。
PWMの一番のデメリットは自走すること。
どこかで
TMR2ON=0
TMR2=X
TMR2ON=1
を入れないといけない。
そして、ちゃんと数えて、
PWMがちゃんとPWMとして機能するように命令を並べないといけない。
ONから数えて何番目だから・・・と最初を見つけ出すのが一番めんどくさいと思っている。
そして、「データ1」を送信するとき
1100000000
データ0を送信するとき
1111100000
この
11XXX00000
のXXXの部分でPWMのデューティサイクルを変えるようにしてしまうと
破綻が起こる。
ここを常に気にしながら、こまかーく設定をしていかないといけない。
繊細な人ならいいけど、いや、繊細な人にしても、いろんなパターンを入れて
テストしないとちゃんと動くって言えないかもしれないプログラムを書くのって
どうよって思う。
あとで何か変更したいとき、どうするの?
また、最初と最後にデューティ0を出力するか、しかるべき位置でタイマを止めなければならない。次のLEDにランしたまま引き継ぐと、どこでどうなってるのか意味がわからなくなる。
そして、PICの周辺回路を専有してしまう。
これもデメリット。
ところで、複数のLEDをつけて、送信することを前提に考えているから
これを関数化して呼び出したいわけだが、
そのときに何度もこの関数呼ぶことを前提に考えて、
この空き命令に何か処理させたいことって何なのか、
私にはちょっとわかんないんだけど。
以上。 ところで、TMR2ON=1って書くと、
その同じ命令サイクルでTMR2はカウントアップするの?
それとも次のクロックから?
同様にCCPR1L=Xって書くと、そのデューティが反映されるのは、
その命令と同時?
細かく仕様を知ったPICのプロフェッショナルになるならともかく、
めんどくさいことこの上ない。 >ビットテストにとらわれてローテートでキャリーによる分岐が使えることを見落としている?
これについてはわからないので、説明願いたいな あと、上に書いた内容は、
bit7から0まで、ループすることなく愚直にずらずらっと書くことを前提に
命令の余りの数などを書いている。
これをループで書くと、ループの制御に命令を食われ、
空き命令はほぼないことはご理解いただきたい。 あなたが賢いんだか賢くないんだか、私には少なくとも理解ができない
>Lレベルの時間が不足する分はタイマで待たせる
これについてももうちょっとよくわかるように説明してほしい。
どういうこと? 自分の言いたいことだけ言うんじゃなくて
もうちょっと読む人のこと考えて書いて貰えんかな
> デューティを変えるだけなら、IOもPWMも同じ命令数がかかる。
厳密に同じかは別としてそうね
> IOを使うと、Wレジスタを使わなくていい。
それはそう
> TMR2ON=0
> TMR2=X
> TMR2ON=1
> を入れないといけない。
うん、だから入れるよね?
使う前に準備して使い終わったら片付ける
日常生活でも基本だね
> 11XXX00000
> のXXXの部分でPWMのデューティサイクルを変えるようにしてしまうと
> 破綻が起こる。
> 同様にCCPR1L=Xって書くと、そのデューティが反映されるのは、
> その命令と同時?
PWMの動作の理解間違ってない?
デューティが反映されるのはタイマーがカウントアップした時だよ
あとはどのタイミングにデューティを書き換えても動作に関係ない
だからPWMの周期(10サイクル)より短い9サイクルでループを回してもいいよねってこと
> これをループで書くと、ループの制御に命令を食われ、
> 空き命令はほぼないことはご理解いただきたい。
だからIOと大差ないっつてるだろーが s/カウントアップ/カウントオーバー/
素で間違えた 自分の考えた方法で問題が無いなら変える必要はない
理解できない方法を無理に使う必要もない
でも理解できていないのに自分の理解の範囲で勝手に批評するな!
以上 なるほど、Dutyはそういうタイミングで更新されるんですね。
勉強になりました。
理解できていない、と言われると、まあ、そうなるのかもしれませんね。
しかし、完璧に理解しているかどうか、どうやって判断するんでしょうか。
自分は完璧だ、と思うことでしょうか?
無理だと思います。
批評というかですね、良いとか悪いは、私の意見です。
あなたの意見は違うかもしれません。
意見ですから。
それは言う自由があります。
理論的な正解はあると思っていますので、理論的に間違っていたら
指摘してください。それが勉強だと思っています。 教わり方を勉強した方が良いね。
なんかムッとする内容だったから。
じぁあね。 なるほどね。
私にはまだ難しいなぁ。
ま、ともかく私も勉強させていただきました。
ありがとうございました。 WS2812Bを制御するのにEUSARTのAsyncモードでできそう
内蔵クロック8MHzx4か16MHzx4ができるPICでボーレートを8Mbpsに設定すると
START:1+DATA:8+STOP:1で800kキャラクタ/秒になる
data 0: H375ns+L875ns 0 00111111 1 書き込みデータ0xfc
data 1: H625ns+L625ns 0 00001111 1 書き込みデータ0xf0
CKTXP=1にして論理を反転して送信する
キャラクタ間で10命令または20命令実行できる
試してないから間違ってるかも スタートビットとストップビットを信号の一部として使うアイデアは面白いけど
出力バッファ1キャラクタしかないから
RGB値1ビットずつセットする必要があるという根源的問題が残る
(割り込みを使うのが厳しいし他の処理がほぼできない)
PWMに対する利点がPWMを使わないくらい? そもそも最近のデバイスでCLCが使えないのって低コスト全振りのPIC16F152くらいじゃ?
老人の懐古趣味の世界 次はCLBで自由自在やね。 はーやくこいこい 13145シリーズ CLCを使ったやり方ってどうやるの?
ざっくりとでいいので教えてもらえませんか? >>466
なんかいろいろできそうだな・・・と思ったけど、最大で20ピン? 単機能周辺デバイスを作るのがおもなターゲットかな?
趣味用には遊べそうだけど。 USBオーディオDACを作っているがやっと動いた。とは言っても習作(安物AK4490REQ)なのだが
本番はAK4491EQ+AK4499EXEQで作る。チップ価格が高いのでまずはソフトテスト用環境構築。
・メインマイコン16F887
・ディスプレイマイコンPIC16F886
・COMBO384 I2C変換マイコンPIC16F88
AK4490REQでも1.8V内蔵レギュレータ使わないで外部供給にすると結構いい音でたまげたわ
https://i.imgur.com/dvuOo86.jpeg
https://i.imgur.com/DJiN44H.jpeg ピン数必要ならそれこそFPGAを使えばいいんじゃないの
単にGPIO増やしたいだけなら152シリーズ併用で
下手なGPIOエキスパンダより安いし
という訳で秋月で152シリーズを扱うようみんな要望出してくれ! >>472
言うだけ野暮だけど外部回路がキモならPICどうでも良くない?
もっと高性能で安価なUSB付きのマイコンボードあるじゃん
あとソフトテスト用環境とはいえノイズ対策はそれでいいの? >>474
DACのレジスタ設定がI2Cなんよ
PIC使っても良いだろ PICの得意領域にPICを使う←わかる
PICの苦手領域をあえてPICで挑戦してみる←わかる
PIC使っても良いところにPICを使う←で?
ってだけだよ >>473
件のとその辺のFPGAの底辺とを比べても、どえらい差があるでしょ。価格といいLUT数といい。
たくさんの入力の特定条件をわしゃっとハードウェアデコードしてPICに割り込みかけたい、とかにはピン数ほしいよ。 152てPIC16F152xx? これ、どんな特長があるんです? >>477
ピン数ほしいよって言ったところで現時点で無いもんは無いんだから…… 無ければPICから離れるだけのこと。
希望を述べてはいけない法も無し。 microchipは数百円のEEPLDを売ってて
> たくさんの入力の特定条件をわしゃっとハードウェアデコードしてPICに割り込みかけたい
みたいな一方通行でソフトウェア処理とのインタラクションが少ない用途は既にカバーしている
おそらく「その辺のFPGAの底辺」ってのが想定が違っていて
Microchip自身が力を入れ始めている小規模FPGAとは別に
LatticeのiCE40あたりの市場をターゲットにしていると思われる
もっと言えばルネサスがForgeFPGAとか言い出したから
「既存」の需要の確保、防衛として先手を打ったというところでは?
で、ForgeFPGAの量産品はいつ一般市場に出るんだろうか? 市場の反応が良ければ多ピンの品種にも展開していくんじゃないですかね。
ピンにアサインできる自由度も増えて。 >>481
数100円の「PICひとつ」でやりたいなぁ。安価、コンパクトが売りだと思っているんで。
数100円で100MHz超の32bitマイコンとか使える時代なんだし。もうハードウェア要らんかも、な処理能力になりつつある。 >>483
CLBが32個でマクロセルが4つみたいよ。 >>485
や、CPUコアの話ね
セル数は十分だから18か24シリーズで出してほしい
psoc好きで使ってるがコストとか消費電力とか色々いまいちなんだよね >>481
ルネサスは中国資本になって好調になったのでは? 何かと誤解してない? そしてだから何?
ForgeFPGAという製品の話であってルネサスという会社の話はしてない PICxxアーキテクチャって言うよね
あと古いPIC16とPIC16F1はだいぶ別物 みなさますみません。
知っている方が居られましたら教えて頂きたいです。
PIC16F1825を使用して、CCP4をシングルPWMで
出力しようとしています。CCP1〜CCP3まではシングルで
出力出来るのですが、CCP4だけなぜか出力出来ません。
試しにMCCで出力したコードを使用しても、CCP4だけ
出力されません。さらに、デバッグヘッダAC244043でも
同様でした。エラッタにも無いような気がします。
ピンが足らず、CCP4を使ったのが失敗でした・・・。 >>493
大体そうですよね。なので、いつもは使わないMCCを使ってみた。
設定すると、デューティ関係なくHi(100%?)が出る。タイマ及び
他の設定はもちろんCCP1〜CCP4全部同じです。CCP1とCCP3,
CCP2とCCP4がペアみたいになっていますが、CCP3は問題なく
単独で出力されるんですよね。 RC1 9 AN5 CPS5 C12IN1 CCP4 P1C(1)
これのCCP4って入力しかなくね?
CCP4の出力はModulatorのソースにしかなってないような >>495
うわー。ほんとですね。PINOUT DESCRIPTIONの表ではOutput Typeが
「CMOS」ではなく「ー」になってる。 逆に言えば無変調にしたらMDOUTから出たりせんの? MDOUTだとP1Bと同じ6ピンだから6ピンを使うならECCP1が使える ああ、そうか
じゃあP1Cで出力すればいいってことでは?
PPS対応のデバイスに移行した方が幸せな気もするが 皆様有難うございます。500Hzにして、分解能荒くなるけど、
ソフト処理でPWM出すことにしました。32段階ぐらいなら
いけるでしょ。空きピン無いし基板作ってしまったので
9ピンRC1で何とかします。
CCPx PWM x=1〜3とか書いてくれればいいのになあ。 DC24Vから1.8V作ってPIC動かしたいんだけど
PIC自身で降圧チョッパ動かした例ってある?
電池一本駆動の昇圧の例はあるんだけど 原理的にできるのは分かるんだけど
NMOSでやろうとするとゲート回路の電圧設計が結構繊細なんよね……
やっぱりスイッチングレギュレータIC使う方がいいのか NJW1933が秋月で80円だからなぁ
大きさもMOSFETと変わらんし
低電圧域は最新デバイスでも同期整流でも効率頭打ちだし PIC16F131ファミリーもPICkitminusでサポートされたようだね
肝心のデバイスが入手できてないが あと秋月でICD5入荷したな
どういう人が買うのか分からんが PICをこれから始めようと思っている者です
プログラミングの経験はありません
色々検索して後閑哲也さんのサイトにたどり着いて
CD付きのC言語の書籍を買おうかと思いましたが
内容的に古過ぎたり、本当に初歩的なことが書いていないような事が
レビューに書かれていたりします
価格等から12Fシリーズ辺りで始めたいと思っているのですが
これを読んでおけば良いというおすすめの書籍やサイトはありますか?
アドバイスいただければ幸いです
回路図はある程度読めます プログラミング経験がないってことはマイコンも初めてでしょ?
自分もPIC派だったんだけどさすがに今から始めるのにPICは勧めないな
ライタも高いし
Arduinoでもいいのでは ホビーならarduinoが簡単だね
仕事でやるならPIC18Qがいいんじゃない
本は色々穴があっても後閑さんのがいいと思う ありがとうございます
最終的には小型に作ったりしたいと思っています
ライターはPICKIT3を安い時に買ってます
本は現在のXCの時代のものでないのでそのまま使えないというようなのも見ました
Arduinoが簡単みたいですが、ハードが違うという事はこちらで始めてしまうと
PICで作りたいと思った時にそのままでは移行できないですよね?
C言語のルールとか恐らく当たり前の事はサイト等を見ても書いていないので、
各ファイルの役割とか基本的な事から書いてある物だと助かります
Arduinoだと良い本やサイトはありますか
基本から学ぶにはハードから見直した方が良いでしょうか? PIC32MZ2048EFでADC 16xオーバーサンプリングと980サンプルDMAしたいのだが、オーバーサンプリング中に何らかの割り込みが入るとオーバーサンプリング停止してしまうね。
DMAで各入力レイテンシーを最小にしたいと思ったが、うまくいかないものだ。
STM32H7ではこんなことは無いのに、PIC32はムズイ。