X



トップページ電気・電子
1002コメント364KB
初めてのPIC 0x0e
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001774ワット発電中さん
垢版 |
2018/02/13(火) 21:26:39.79ID:06sF7iiY
.
  _       _    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
0829774ワット発電中さん
垢版 |
2018/04/23(月) 12:43:31.78ID:jAF0VgmE
>>826
まともに検証してないだけだと思う

>>827
日本語なんかいらんだろ
更新してなくてもどうでもいい
0830774ワット発電中さん
垢版 |
2018/04/23(月) 12:52:25.66ID:QrgYmlPT
つか他のデータシート全部英語なわけでマイコンだけ日本語にしてもらっても無意味。
0831774ワット発電中さん
垢版 |
2018/04/23(月) 13:00:20.21ID:jAF0VgmE
>>826
1人の書き込みだと思ってるのか?
少なくとも>>682 >>798は別の人

ていうか、
逆にバグ有りUARTを使ってて気づかないっていう方が驚きだ
普通に割り込みで作れば2重送信の可能性があるコードになる
あとはタイミングだけ
簡単な負荷テストで発生する

PICユーザーは動作検証しない
って言ってるようなものだ
0833774ワット発電中さん
垢版 |
2018/04/23(月) 14:12:52.98ID:Jm4vGESD
エラッタ知ってる大先生は他のCPUやらチップやらのスレでも
後進の指導にご尽力なさってるのかしら
0834774ワット発電中さん
垢版 |
2018/04/23(月) 14:29:03.65ID:7ylKcI55
>>828
STMは英語のサポートチームがサポートしてくれる分ましかな?
ADI社は英語の資料を見ろって言っておきながら英語の資料のデータが無いから教えられないとか言い出す。
しかも国内サポートがてんでばらばらだから御社の〇〇様にこういう感じでサポートして頂いたのですがっていう一連の流れを出さないと、みんな「そこAだから」みたいな一番最初の答えしかくれなかった
まあ5年位前だから改善しててほしいんだけど。

>>829
上司が気に入ってどうにかなる時は良いんだけど、
自分が気になるけど上司は興味無い時とか日本語資料ないと困るんだよね。
うちだけだと良いんだけど。
0836774ワット発電中さん
垢版 |
2018/04/23(月) 16:34:53.86ID:0GiMBSOH
>>826
PIC16F1574/5/8/9に対してはエラッタが出てるんだよ。
実際にはエンハンストミッドレンジ全部に関わっているはずなのに他の
ファミリーに対してはエラッタを出してないのが問題視されているところ。

PIC16(L)F1574/5/8/9 Family Silicon Errata and Data Sheet Clarification
http://ww1.microchip.com/downloads/en/DeviceDoc/80000642C.pdf
>1.1 Transmit Mode
>Under certain conditions, a byte written to the
>TXREG register can be transmitted twice. This
>happens when a byte is written to TXREG just as
>the TSR register becomes empty.
0840774ワット発電中さん
垢版 |
2018/04/23(月) 22:36:17.49ID:0GiMBSOH
>>839
そのエラッタは気付かなかった。
どうせモジュールは使い回しで、マイクロチップ内ではどのチップで同じ
問題があるかは分かっているはずで、どういう基準で対応してるのかな。
0841774ワット発電中さん
垢版 |
2018/04/24(火) 04:42:53.24ID:4lnVGYH5
遅いから割り込みが発生してTXREGにライトするタイミングならダブル送信は発生しない。
丁度TXREG が空になったタイミングだと発生する場合があるだけ。
送信割り込みフラグ確認してから送信バッファーなどの処理をしてからTXREG をライトすれば問題ない。
0843774ワット発電中さん
垢版 |
2018/04/24(火) 06:44:53.15ID:R0opAjvi
同じモジュールを使っててもその間の配線が違えば
遅延も違ってくる。
→ピンやソフトから見えるタイミングも違う可能性がある。

十羽一絡げにしてギャーギャー言ってる人達、なんだかね…
0844774ワット発電中さん
垢版 |
2018/04/24(火) 06:50:13.09ID:vfSZoOUP
十把一絡げ、だよな。

アヒルみたいなのが10羽、紐でまとめて縛られてギャーギャー騒いでいる様子を想像した。
0846774ワット発電中さん
垢版 |
2018/04/24(火) 07:07:59.47ID:vfSZoOUP
10羽ひとカラアゲ…

さておいて。

>>839のErrataのWork around 回避策? に、

Monitor the Transmit Interrupt Flag bit (TXIF).
Writes to the TXREG register can be performed
once the TXIF bit is set, indicating that the
TXREG register is empty.

って書いてある。TXIFを見よ。立ってたら空っぽだ。と。

割込みがかかるときって、TXIFが立つときではなかったっけ。

このスレで問題にされているのは、送信割込みで2重送信が発生する、ということだと思うのだけど、
それだと因果関係が前後するような気がする。別の問題?


俺自身の習慣が>>841みたいなことなので、問題になっていないのかな?
0847774ワット発電中さん
垢版 |
2018/04/24(火) 07:19:35.84ID:rQtzCYq7
TSRが空になる瞬間の書き込みがマズいんだから
TXREGが空である確認をしても対策になってない
0848774ワット発電中さん
垢版 |
2018/04/24(火) 07:26:04.65ID:wur0/mM1
wレジスタ → TXREG → ShiftRegister → Tx端子
          ↓TXIF   ↓TRMT
先にTXREGが空となり、続いてShiftRegisterが空になったその瞬間にwレジスタから書くと
TXREGとSR両方にコピーされてダブルってことやからErrataのは回避策になってないんだよな
TXIFとTRMTをポーリングしてTXREG書くとか、ウェイト入れてSRが捌けるのを待つとかすべき
0849774ワット発電中さん
垢版 |
2018/04/24(火) 07:27:30.07ID:rQtzCYq7
TMRTは対策にはなるが
それをどうやって実装するのって話になる

割り込みでループして待つ?
タイマー割り込みで監視?
どっちも最悪ですね
送信割り込みの意味がない

もう一個
TMRTを待ってから送信では送信データに毎回隙間が空いてしまう
受け側がFIFO+タイムアウト割り込み
みたいな高級な回路だったら
1バイトずつ割り込みがかかる最悪な動作
それこそ攻撃みたいなパターンになってしまう
そんな問題のある可能性のある送信じゃ製品には出来ない
0850774ワット発電中さん
垢版 |
2018/04/24(火) 07:37:00.45ID:rQtzCYq7
こんなことをずいぶん前にも書いた気がする

現象を書いたら
「お前のバグだ」
コードをアップしたら
「こんなコードじゃうまく動かないのは当たり前」
エラッタだとわかったら
「回避は簡単」「対策できないのはお前がアホだから」

PICスレは非常に民度が低い信者のスレだと思ったよ
0851774ワット発電中さん
垢版 |
2018/04/24(火) 07:38:13.00ID:wur0/mM1
巨大な受信バッファ持ってるPCが受信相手なら隙間だらけの送信でも全然問題なっしんぐなので
自分はTRMTポーリングで対処してます
PICが受信相手でもFIFO溜まった時点で割込みかかるので隙間だらけの送信でも負荷増えないし
0852774ワット発電中さん
垢版 |
2018/04/24(火) 07:43:30.47ID:rQtzCYq7
FIFOがたまった時点で割り込みが発生するだけだと
FIFOのデータが少ないときは受信したことがわからないので
受信してから隙間が空いた時にも割り込みがかかる
っていう回路がある
0853774ワット発電中さん
垢版 |
2018/04/24(火) 07:45:03.89ID:rQtzCYq7
PCだとRS-232Cの負荷なんて誤差レベルだが
負荷は増えてるかもしれない
0854774ワット発電中さん
垢版 |
2018/04/24(火) 07:54:48.66ID:vfSZoOUP
>>848
>先にTXREGが空となり、続いてShiftRegisterが空になったその瞬間にwレジスタから書くと
>TXREGとSR両方にコピーされてダブルってことやから
確かにこの問題は以前に話題になっていたと思う。

で、問題は、
>Errataのは回避策になってないんだよな

これは、>>839のErrataの回避策を指してのことだと思うのだけど、別の問題ってことはないですかね。
最初の問題を直したつもりで、別の問題が出てきたとか。
0855774ワット発電中さん
垢版 |
2018/04/24(火) 08:00:02.19ID:vfSZoOUP
>PICスレは非常に民度が低い信者のスレだと思ったよ
民度は眺めるものではなくて、自分でなんとかするもの。

サッカースタジアムや、羽生パレードのあとのゴミも、みんながみんなゴミを捨てなかったのではなくて、
捨てた人がいても、それを拾った人がいるから、結果としてスゲーって思ってもらえるわけだし。
0856774ワット発電中さん
垢版 |
2018/04/24(火) 08:04:19.17ID:rQtzCYq7
今気付いたけど
TRMTと書いてあるマイコンと
TMRTと書いてあるマイコンと
両方あるみたい

上のリンクのエラッタは両方TMRT
データシートのエラッタが仕様になっちゃったみたいな?
0859774ワット発電中さん
垢版 |
2018/04/24(火) 09:47:23.33ID:izqJBaBe
初めてスレで延々とやる話題かね
本スレでやればいいのに
0860774ワット発電中さん
垢版 |
2018/04/24(火) 10:55:25.39ID:elhCr7SK
>>853
そんなことはない。トータルの転送量だけ考えるとたいしたことなさそうだが、
232Cを10ポート20ポートつないでフルフルで動かすとPCの負荷はけっこう大きい。
CPU負荷だけの問題じゃないぞ。ハードやドライバの作りにもよるが。
0863774ワット発電中さん
垢版 |
2018/04/24(火) 12:05:32.06ID:JfzX5cw2
俺のエラッタ回避方法は
1. 割り込み禁止が1文字送信時間を超えるようなコーディングをしない。
2. n文字送信関数で最初の1文字送信のときにリングバッファが空ならTRMTが1になるまで待つ。
0864774ワット発電中さん
垢版 |
2018/04/24(火) 12:52:06.32ID:elhCr7SK
>>861
232や485を10や20つなぐPCなんて工場とかではザラなわけだがWindowsあたりだとけっこうコケる
TCPでセッション100張るほうがうんと負荷軽くて楽
チップセットとプロトコルが頭いいと楽だね
0865774ワット発電中さん
垢版 |
2018/04/24(火) 12:54:47.66ID:xDXYG0tm
Microchipが重視していない姿勢を鑑みるに
ごく一部のユーザーが特殊な条件で使用する時のみ
影響する事象なので
EnhancedMidrange全型番のエラッタに載せてないんだろうね
ほとんどの初心者には影響ないからスルーして良いかと
0867774ワット発電中さん
垢版 |
2018/04/24(火) 13:05:39.26ID:avxJ9V6C
>>863
最大2文字分のビジーループが発生する
稀なタイミングしかオーバーヘッドが発生しないのと
ハードが不要なのが利点か

おれのUARTエラッタ回避法は
フリーランタイマーでヤバいタイミングを調べて
可能性があればnop 1個でタイミングをずらす
ビジーループは無いがタイマーを使う
(タイマーは共用可能)
割り込み禁止期間の制限は特に無い
0868774ワット発電中さん
垢版 |
2018/04/24(火) 14:59:36.41ID:58dfx+0t
18F46K22でI2Cを使うのでMCCでMSSP1を選んだが動作しない。
EUSART1、TMR0、ADCは動作しています。
SCL1とSDA1のピンはHighのままです。
I2C1.hのEMULATED_EEPROM_Write/Readをコピペしているが、
PICKit3のデバッグでPAUSEにすると
while(status == I2C1_MESSAGE_PENDING) ;から抜け出せないようです。
MSSP2にしても同じです。
EasyタブはI2C Master/Enable MSSP/Slew Standard/SDA Hold 300nS/7bitで
I2C Clockの0x03≦0xA0≦0xFFで99.379KHzと表示されてます。
RegistersタブはBCLIとSSPIのチェックとADD=0xA0/BUF=0x0/CON1=0x28/CON2=0x0/CON3=0x8/STAT=0x80
SSP1MSKが0xFFで赤くブリンクしているのが気になります。
0869774ワット発電中さん
垢版 |
2018/04/24(火) 15:53:22.15ID:+WRSdb8B
PICエラッタの最良の対処方法はPICを使わないこと。
何故にマルチタスクも動かせないようなこんな低レベルCPUにこだわるのか?
0871774ワット発電中さん
垢版 |
2018/04/24(火) 17:02:59.56ID:X1ScF0Ni
人の財布の中覗いてケチつける
他人の家の冷蔵庫開けて食材にケチつける

朝鮮人文化には馴染めません
0872774ワット発電中さん
垢版 |
2018/04/24(火) 17:16:47.07ID:+WRSdb8B
こだわっていないし、ケチもつけてませんよぉ。
ただただ疑問に思っただけ、理由を知りたかっただけです。
PICの何がそんなに魅力なのか?
もしかしたらPIC信者ってMなのか?
ハハハ、私のレスは無視して下さい、ちょっと退屈していただけなので。
0873774ワット発電中さん
垢版 |
2018/04/24(火) 17:31:14.75ID:R0opAjvi
他の会社のCPUにもエラッタは有るんだけど
0874774ワット発電中さん
垢版 |
2018/04/24(火) 17:41:00.95ID:gijGFcCB
春になるとわくものに釣られすぎ。別人だろうけど、他の板のスレにもこの時期になるとわいてくる。
0875774ワット発電中さん
垢版 |
2018/04/24(火) 18:47:22.37ID:lIO8jw8O
去年から年中エラッタ、エラッタ吼えてますよあの人
0876774ワット発電中さん
垢版 |
2018/04/24(火) 18:57:58.16ID:bnV5Dkpe
PIC信者を NGワード化して久しいが
これがまだ続くなら エラッタ もNGワード
にしようかと。兎に角しつっこいからな。
0878774ワット発電中さん
垢版 |
2018/04/24(火) 20:45:05.51ID:xyHEfl0h
ここまでPICをdisってるエラッタおじさんはどんなCPU使ってるの?
0879774ワット発電中さん
垢版 |
2018/04/24(火) 21:54:34.61ID:bnV5Dkpe
もうウザイから、たった今、エラッタもエッタラも NGワードに登録したぜよ
0881774ワット発電中さん
垢版 |
2018/04/24(火) 22:13:46.55ID:50p198lT
>>878
文句言いながらもここを覗きに来てるって事は、根っからのPIC信者なんだろ。
0882774ワット発電中さん
垢版 |
2018/04/24(火) 23:42:55.54ID:vfSZoOUP
趣味でも仕事でも、ファンだから使う、は有りうる。
仕事でその理由は有りえない、と思う人は、そういう立場を知らないだけのこと。
なぜファンなのか、他のものの比べた上で判断したのか、なんてのは野暮。
0883774ワット発電中さん
垢版 |
2018/04/25(水) 00:04:12.68ID:S3bTZ6vT
バグを知らないで遭遇したらとんでもない時間を浪費することになるし
納期を間に合わせるために原因不明のまま対処療法の対策で納品する
なんてことにもなりかねない。
感情的にならないで有益な情報として受け入れた方がいいと思うけどな。
0884774ワット発電中さん
垢版 |
2018/04/25(水) 00:07:33.90ID:0PS/es3J
ライタを持ってるから
本を買って持ってるから
PCに環境を作ったから
使い方を覚えて染み付いてるから
買い置きが残ってるから
これまで書いたコードが流用できるから
困ったことや痛い目に遭ったことがないから

全て消極的理由だが、趣味なら乗り換えない理由としては十分
別に特段の魅力は感じてなくてもPICで良いって人間もいるんだからほっといてくれ
ほんと余計なお世話
0885774ワット発電中さん
垢版 |
2018/04/25(水) 00:48:54.42ID:MTGmtNA+
こういうのに難癖つけるやつに限って
自分の使っているチップ型式を云わないのな

AVRとかだったりするのかねぇ
0886774ワット発電中さん
垢版 |
2018/04/25(水) 03:12:38.31ID:u8fROgri
> 困ったことや痛い目に遭ったことがないから

というより、困ったことや痛い目に散々遭って、それを時間をかけて
克服してきた実績と自信があるから、違うチップでまたやり直すの
やだなあみたいな先入観があるな。

#流用できる完動するコードがある、に帰着するかもしれないが。
0887774ワット発電中さん
垢版 |
2018/04/25(水) 06:38:56.81ID:Rywnw9Xh
導入の壁乗り越えて
自分なりのお気に入りライブラリー揃えてしまうと
今更他のマイコンに乗り換えるモチベーションか
0888774ワット発電中さん
垢版 |
2018/04/25(水) 06:42:12.00ID:wRI2g9bE
PIC自体の良いところが何一つ出て来ないところが泣けるねえ
0889774ワット発電中さん
垢版 |
2018/04/25(水) 06:43:45.80ID:g4rG95E1
PICに問題があるからダメだって話はするくせに、問題のないチップは出てこない。
PICは問題が多いというが、結局のところ多かろうが少なかろうが自分が使うところにその問題があるかどうか。
バグがたとえゼロでも供給に不安があるならダメだろう。
バグは開発段階で回避できるかもしれないが、製造段階で全く互換で置き換えられるものの供給が滞るとかなりイヤ。
ユーザーが多いほど問題は既知のものになりやすい。
ネットで情報発信しているユーザーが多い方が、問題解決はしやすい。
0890774ワット発電中さん
垢版 |
2018/04/25(水) 06:49:12.00ID:g4rG95E1
>>888
いちいちまとめることもしないけれど、見えてないフリしてるだけだと思う。
勝手に泣いてろ。
0891774ワット発電中さん
垢版 |
2018/04/25(水) 07:41:17.17ID:jPiSVkL0
取るに足らない問題に当たった0.1%以下の人間がギャンギャン吠え続け
問題がないか,自分で解決したほぼ100%の人たちは黙ってる
0893774ワット発電中さん
垢版 |
2018/04/25(水) 09:56:07.04ID:lDLEToeS
DIPパッケージ、PPS、外付部品少なくて頑丈

今更な長所だけど趣味には重要だよ
0894774ワット発電中さん
垢版 |
2018/04/25(水) 10:42:37.67ID:5d9B/hP4
入手性とか考えたらホビーユースだとPICかAVRぐらいしかないし、PICの内蔵ペリフェラル機能は活用できると便利だから使ってる。
0895774ワット発電中さん
垢版 |
2018/04/25(水) 11:16:30.06ID:TIJK9eAp
>>867
リングバッファでなくてTXIEを見れば、ビジーループを最大1文字分にできることは知っているんだが、なんとなく気持ちわるくてね。
0896774ワット発電中さん
垢版 |
2018/04/25(水) 11:28:03.34ID:4yUtx/6g
>>868
どうも 868 です。
PIC18F47K42で同様な現象の記事を見つけましたが私には理解できません。
http://www.ccsinfo.com/forum/viewtopic.php?p=217541

下のコードを追加するようなんですが、どのファイルなのかわかりません。
//Select I2C with PPS
#PIN_SELECT SCL1IN = PIN_C3
#PIN_SELECT SCL1OUT = PIN_C3
#PIN_SELECT SDA1IN = PIN_C4
#PIN_SELECT SDA1OUT = PIN_C4
#use i2c(Master,Slow,I2C1,FORCE_HW)
最後のスレの
//Select I2C with PPS
#PIN_SELECT SCL1 = PIN_C3
#PIN_SELECT SDA1IN = PIN_C4
#PIN_SELECT SDA1IOUT = PIN_C4
//Using the peripheral name always forces hardware
#use i2c(Master,Slow=100000,I2C1)
が正解なのかも知れないが、どこに挿入するのだろう?
0900774ワット発電中さん
垢版 |
2018/04/25(水) 13:19:43.53ID:4yUtx/6g
>>897
こんな感じです。
EMULATED_EEPROM_Read関数はMCCが生成したi2c1.hの例文をコピペして、main関数の前に定義しました。
EMULATED_EEPROM_Read関数のwhile(status == I2C1_MESSAGE_PENDING) ;から抜けられないようです。
オシロでSCL1(RC3)とSDA1(RC4)を観察してもHighの状態です。
双方とも4.7KでVDDにプルアップしています。
I2CデバイスはDS1307(カレンダー)です。
TMR0とEUART1とADCは動作しています。

void ReadDateTime(uint8_t *pDateTime)
{
uint8_t dt[8];
// Read DS1307 Reg.
EMULATED_EEPROM_Read(0x68, 0, dt, 8);
*pDateTime++ = ((dt[6] >> 4) * 10) + (dt[6] & 0x0f);
*pDateTime++ = ((dt[5] >> 4) * 10) + (dt[5] & 0x0f);
*pDateTime++ = ((dt[4] >> 4) * 10) + (dt[4] & 0x0f);
*pDateTime++ = ((dt[2] >> 4) * 10) + (dt[2] & 0x0f);
*pDateTime++ = ((dt[1] >> 4) * 10) + (dt[1] & 0x0f);
*pDateTime = ((dt[0] >> 4) * 10) + (dt[0] & 0x0f);
}

void main(void)
{
uint8_t DateTime[6];
SYSTEM_Initialize();
INTERRUPT_GlobalInterruptHighEnable();
INTERRUPT_GlobalInterruptLowEnable();
INTERRUPT_PeripheralInterruptEnable();
TMR0_SetInterruptHandler(timer);
printf("Start!&#165;r&#165;n");
ReadDateTime(DateTime);
ここに来ない
0901774ワット発電中さん
垢版 |
2018/04/25(水) 13:33:20.45ID:aEth5XWW
>>895
TXIEを見た後TXREGにセットするまでの間に
割り込みがバタバタっと来たらアウトじゃないか?
0903774ワット発電中さん
垢版 |
2018/04/25(水) 13:42:18.51ID:4yUtx/6g
>>897
コピペの関数もそのまま添付します。
void EMULATED_EEPROM_Read(
uint16_t slaveDeviceAddress,
uint16_t dataAddress,
uint8_t *pData,
uint16_t nCount)
{
static volatile I2C1_MESSAGE_STATUS status;
I2C1_TRANSACTION_REQUEST_BLOCK readTRB[2];
uint8_t writeBuffer[3];
uint16_t timeOut;

// this initial value is important
status = I2C1_MESSAGE_PENDING;

// build the write buffer first
// starting address of the EEPROM memory
writeBuffer[0] = (dataAddress >> 8); // high address
writeBuffer[1] = (uint8_t)(dataAddress); // low low address

// we need to create the TRBs for a random read sequence to the EEPROM
// Build TRB for sending address
I2C1_MasterWriteTRBBuild( &readTRB[0],
writeBuffer,
2,
slaveDeviceAddress);
// Build TRB for receiving data
I2C1_MasterReadTRBBuild( &readTRB[1],
pData,
nCount,
slaveDeviceAddress);

timeOut = 0;

while(status != I2C1_MESSAGE_FAIL)
{
// now send the transactions
I2C1_MasterTRBInsert(2, readTRB, &status);

// wait for the message to be sent or status has changed.
while(status == I2C1_MESSAGE_PENDING) ;

if (status == I2C1_MESSAGE_COMPLETE)
break;

// if status is I2C1_MESSAGE_ADDRESS_NO_ACK,
// or I2C1_DATA_NO_ACK,
// The device may be busy and needs more time for the last
// write so we can retry writing the data, this is why we
// use a while loop here

// check for max retry and skip this byte
if (timeOut == SLAVE_I2C_GENERIC_RETRY_MAX)
break;
else
timeOut++;

}
}
0904774ワット発電中さん
垢版 |
2018/04/25(水) 14:57:04.90ID:4yUtx/6g
mainのprintf("Start!&#165;r&#165;n");を以下の行に変えたてみたが、SCL1もSDA1もHのままだわ。
printf("TEST1&#165;r&#165;n");
SSP1STAT = 0xC0;
SSP1CON1 = 0x28;
SSP1CON2 = 0x00;
SSP1CON3 = 0x08;
SSP1ADD = 0x9F;
SSP1BUF = 0x00;
printf("TEST2&#165;r&#165;n");
printfは正常に表示された。
別のソフトでRC3,RC4をGPIOでOUTにしてH/Lの出力を確認できたから生きているはず。
0905774ワット発電中さん
垢版 |
2018/04/25(水) 15:24:18.89ID:5d9B/hP4
>>904
オシロがあるならI2C.hで宣言されてるシンプルなリード、ライトをためしてみたら?オシロでなにも無いようなら、初期化周りが怪しい気がする。関数内だからこっちはどうなってるかわからんが。
0906774ワット発電中さん
垢版 |
2018/04/25(水) 15:38:52.91ID:eCcunkaK
PC USBロジアナ安いからおすすめ
〜\1000程度で買える
RS232やI2Cの解析なんかには十分な
24MHzサンプリング8ch
amazonとかebayで買える
0907774ワット発電中さん
垢版 |
2018/04/25(水) 15:40:07.33ID:TIJK9eAp
>>902
>>863のリングバッファが空だったらってとこを、TXIE(TX割り込みイネーブル)が0だったらと変えるだけ。
0908774ワット発電中さん
垢版 |
2018/04/25(水) 15:56:00.57ID:4yUtx/6g
>>905
main.c内に下記のtest関数を定義して、MCCの初期化と割込み許可直後でtest関数を呼び出した。

void test(void)
{
static volatile uint8_t buh[16];
I2C1_MESSAGE_STATUS status = I2C1_MESSAGE_PENDING;

I2C1_MasterRead (buf, 4, 0x68, &status);
printf("%02x, %02x, %02x, %02x&#165;r&#165;n", buf[0], buf[1], buf[2], buf[3]);
}

オシロにはHレベルのままでI2C1_MasterRead関数から返ってきた。
4バイトとも0x00でした。
何故かその後に呼び出されるReadDateTime関数内の
EMULATED_EEPROM_Read(0x68, 0x0000, dt, 8)から抜けられるようになった。
でもデータは全て0x00でオシロにも出てこない。

別ソフトで1mS周期割り込みでRC3,RC4を毎回反転するのを書き込むとオシロにちゃんと矩形波が現れる。
0909774ワット発電中さん
垢版 |
2018/04/25(水) 16:03:38.28ID:4yUtx/6g
>>905
MCCの初期化部分が先のコードです。

SSP1STAT = 0xC0;
SSP1CON1 = 0x28;
SSP1CON2 = 0x00;
SSP1CON3 = 0x08;
SSP1ADD = 0x9F;

何故かSSP1CON2が無かったので追加したが変化なし。

この状態で
SSP1BUF = 0x00;
すれば送信が発生すると思うのだが?
初期化間違っているのかな?
SPIは何度も使ったけどi2cはPICでは初めてです。
0910774ワット発電中さん
垢版 |
2018/04/25(水) 17:14:24.29ID:5d9B/hP4
>>909
設定はそれで問題ないはず。速度は計算してないから、合ってるかわからんけど。
BUFFにデータ入れるまえにCON2.SEN=1でスタートコンディション発行しないと駄目。これだけでSDAは一旦Loになるはず。
0911774ワット発電中さん
垢版 |
2018/04/25(水) 18:07:06.07ID:ozfwihV9
>>910
ありがとうございます。
明日、試します。
MCCのコードをPIC16系と見比べたけど同じだった気がする。
明日こそ!
0912774ワット発電中さん
垢版 |
2018/04/25(水) 19:10:38.65ID:Iegs2HCt
>>907
それはわかってる

TXIEを見てから送信バッファに書くまでのタイミングに
UART以外の割り込みが来て、
そこからUART割り込みでTXREGに書くまでに
ダブるタイミングになったらマズイだろ
って思ったけど
割り込みが1文字送信時間分占有しないと問題が起きないし
1文字占有したら受信もマズいので
まああまり気にしなくていいかな

ボーレートが速くてUSBも使ってたりする場合は注意が必要っていうくらい
ソフトのバッファでも猶予が倍になるだけて同じだな

一応条件に加えておいた方が良いかと
0913774ワット発電中さん
垢版 |
2018/04/26(木) 07:48:00.18ID:pjy6qYAx
>>910
おはようございます。

SCL1、SDA1が共にLowになりました。

SSP1CON2bits.SEN1 = 1;
SSP1BUF = 0x00;

MSSP1は生きているようなのでもう一度PIC16FとPIC18FでのMCCコードの違いを探します。
0915774ワット発電中さん
垢版 |
2018/04/26(木) 11:35:24.22ID:0ynxSK/6
PICのI2Cはエラッタだらけ
MKやMMにI2Cが無いのはエラッタで全く使い物にならないからスペックから消した
不自然にI2Cが無いのはそういう理由
MZは使い物にならないけどスペックに載ってる
0916774ワット発電中さん
垢版 |
2018/04/26(木) 12:53:24.82ID:Xj/+jZB9
エラッタエラッタうるせーバカだな
おばQのOちゃんかよ
0918774ワット発電中さん
垢版 |
2018/04/26(木) 14:02:37.95ID:pjy6qYAx
>>910
解決しました!
PIC16FのMCCコードと比較した結果

I2C1_Initialize関数の最後に// add行を追加
// clear the master interrupt flag
PIR1bits.SSP1IF = 0;
PIR2bits.BCL1IF = 0; // add
// enable the master interrupt
PIE1bits.SSP1IE = 1;
PIE2bits.BCL1IE = 1; //add

I2C1_BusCollisionISR関数に下記add行挿入
PIR2bits.BCL1IF = 0; // add

I2C1_MasterTRBInsert関数の前に以下のインライン関数を定義
inline void I2C1_WaitForLastPacketToComplete()
{
while(i2c1_state != S_MASTER_IDLE)
{
// If your code gets stuck here it is because the last packet is never completing
// Most likely cause is that your interrupt is not firing as it should. Check if you have
// correctly enabled all MSSP, Peripheral and GIE interrupt settings.
}
}
I2C1_MasterTRBInsert関数の最後の
// for interrupt based
if (*pflag == I2C1_MESSAGE_PENDING)
{
while(i2c1_state != S_MASTER_IDLE)
{
// force the task to run since we know that the queue has
// something that needs to be sent
PIR1bits.SSP1IF = true;
}
} // block until request is complete
を以下に差し替え
// for interrupt based
if (*pflag == I2C1_MESSAGE_PENDING)
{
I2C1_WaitForLastPacketToComplete();

// The state machine has to be started manually because it runs only in the ISR.
// If we called the ISR function here function duplication would double the code size
// because this function would be called both from interrupt and from mainline code.
PIR1bits.SSP1IF = true;

} // block until request is complete
これでI2C通信が正常に動作しました。
DS1307のアドレスポインタは8bitなのでEMULATED_EEPROM_Read関数の16bitを書き換えました。
0920774ワット発電中さん
垢版 |
2018/04/26(木) 16:39:20.13ID:wsiyshJn
うっかりするとエラッタの存在見落としがちだから、
騒いで騒ぎ過ぎは無いと思う
エラッタ情報をデータシートと分けてあるのは
嫌がらせ超えて隠蔽体質だと思うよ
PDFファイル合冊して発行すればいいのに
それともデータシートのどこかに書いてある?
0922774ワット発電中さん
垢版 |
2018/04/26(木) 17:25:12.14ID:tI778vpf
製品としての仕様であるデータシートと
実装の問題であるエラッタは分けといてくれる方がいい
シリコンリビジョンが上がる度にデータシートが更新されるなんてあり得ません
0923774ワット発電中さん
垢版 |
2018/04/26(木) 17:58:30.70ID:uI7+7JKe
エラッタなんてここじゃなくて、あっちでやってほしい
全然意味がわかんなあいーー
0924774ワット発電中さん
垢版 |
2018/04/26(木) 18:25:12.30ID:wsiyshJn
>>922
いや、シリコンリビジョンが上がってもデータシートが更新されないなんてあり得ません
エラッタも治らないならいい加減仕様として明記しろって話だよ
0926774ワット発電中さん
垢版 |
2018/04/26(木) 19:18:07.16ID:zrSq8Rut
リビジョンなんかほとんど変わらないし
変わってもエラッタ直らないし

使えないものはデータシートから消してほしい
レス数が900を超えています。1000を超えると表示できなくなるよ。

ニューススポーツなんでも実況