マイコンソフト 悩み事相談室 3 [無断転載禁止]©2ch.net
レス数が900を超えています。1000を超えると表示できなくなるよ。
.
∧ ∧
( ´・ω・) < コンフィグって何? 昆布なら知ってる。 ボラチルって何? ボラは魚だよ。
( ∪ ∪ ,.-、 ,.-、 ,.-、 ,.-、
と__)__) (,,■) (,,■) (,,■) (,,■)
PIC AVR H8 ARM
学校でC言語を習ったことがあるので「楽勝でしょ」って、マイコンを始めたけど、
わからないことだらけ。誰か教えて!
PCとは別世界の、マイコンのソフト。難しいよね。
ツールの使い方、ツールの設定、マイコン特有のC言語の書き方、
「デバッグモードにプログラミングモード。何?」 Eclips, Emacs って何?
VBAしか知らないよぉ、という人まで、
各社マイコンに関するマイコンソフト相談室です。
質問者は、「初心者質問スレ」の>>1を見て、分かり易く質問を書いてね。
回答者は、威張らない、バカにしない、言葉使い注意で、親切に教えてあげてね。
あっ、そうそう。
ハードウェアに関する質問は、それぞれのマイコンのスレに、達人がいるから。
過去スレ
1 2014/09/11〜
2 2016/07/31〜 http://rio2016.2ch.net/test/read.cgi/denki/1469905691/l50
では、質問、ドゾ〜 JAXAが日本語の資料を作っていたわ
ttp://sma.jaxa.jp/TechDoc/Docs/JAXA-JERG-2-400A.pdf
物理層は日本語の資料が作られているようだ。論理層以上はCCSDSの英語版しかないっぽい
多少なりとも通信の理解があれば眺めるだけでだいたい判ると思う
物理層の時点で誤り率が〜以下になる・・・みたいに設計されているんで通常の運用で同期が取れないほど
ビットが化けるなんて事はない
またCCSDSの資料によれば同期コードはBCHで符号化されているらしい。1〜2ビット化けたくらいではびくともしないだろう
はやぶさ2に関してはJAXAのはやぶさ2 Fact Sheetが良くまとまっている
搭載している通信系はXバンドとKaバンドの2種類
Xバンドはアンテナがローゲイン、ミドルゲイン、ハイゲインと3種類ある。Kaバンドはハイゲインのみ
運用はXバンド、観測データを下ろすのは速度を稼ぎやすいKaかXバンドかな
>>817
機上の自律化機能を使ってFM変調、地上のスペアナを使って復調って奴ですな
1ビットが8秒、実効ビットレートは0.0625bpsだったらしい
ソースは第9回宇宙科学シンポジウムのはやぶさセッションの発表とその講演集
以前はWebでpdfが公開されていたんだが残念ながら消滅したようだ
って組み込みである以外マイコン関係ねぇ・・・ >>819
> またCCSDSの資料によれば同期コードはBCHで符号化されているらしい。1〜2ビット化けたくらいではびくともしないだろう
BCHの復号モードのSECの意味ぐらい理解してから書けよ
マジで恥ずかしいぞ w 自分はエラー訂正符号に詳しい訳じゃないしBCH符号はRS符号より訂正能力が高いくらいの認識しかない
誤っているならそれで良いけど煽るんじゃなくソースを提示して論理的に説明してくれませんかね? マイコンのシリアル通信だろ
UART介在してるのに同期も取れなくてエラー訂正もへったくれもない
同期からやるんだったら信号をADでサンプリングしてetcからの話になる
糸口が見つからなきゃ同期も取れないのだから相関取って最尤推定とか
本格的にやるならね >>823
パイオニアの事も忘れないで・・・(´・ω・`) >>821
だから自分が上げた資料ぐらい理解しろよ
SEC=Single Error Correction
の意味もわかってないのか? 標準ライブラリのソース探してきて
それを使え
ツウはスタートアップから一通り自分でチェックするものだ このマイコンを最低限動作させるのに必須の設定内容は?
たったこれだけの情報も明文化されておらずサンプルコードと格闘せざるを得ないマイコンは多い
ペリフェラルの初期化なんかも同様。マニュアルにレジスタ操作のフローチャートが記載されているマイコンは少ない 初めてそのCPUに触れる人でも、読んで「理解すれば」プログラムを書けるように
マニュアルには必要な事項が記載されている。
また要所にアセンブラとCのプログラム例も記載されている(少なくともAVRのマニュアルには)
マニュアルを読んでもプログラムが書けないなら、
まだまだプログラミングの実力が足りないという事だから
マニュアルの内容に文句を言う前に本やネットで勉強した方が良い。
CPU製作会社のドキュメント製作部門の担当者が怒るぞw むかつくのは昔ならハード屋の領分がすべてソフトでレジスタ設定しろって流れなことだよ。
今のハード屋なんて線つなげときゃ終わりじゃん。せいぜいアナログ回路くらい。 >>831
てめーのカスみたいに浅い経験だけで偉そうに語ってんじゃねえよ。 昨今の高機能なペリフェラルがいっぱい付いていてフレームワークの使用が前提のマイコンのマニュアルはそこまで書いてあるようには見えないな
ペリフェラルの機能上は出来るはずだがフレームワークでは出来ないようなことをしたい場合大体ソースコードとにらめっこになる
あと8bit世代ならROM数KB/RAM数百Bですむような内容なのにフレームワークだけでROM数十KB/RAM数KBとか ペリフェラルはデータシートだけでは説明不足なのが多くてアプリケーションノートの
サンプルプログラムを読むしかないのが多い気がする 順番があったりタイミングがあったりするからねえ
つらつらとレジスタの説明があるだけじゃわからない 糞なマニュアルしかない、ふざけたサンプルしかない、てのもあるからね
あたまいてーよ 仕事だと分厚いデータシート読む余裕もないこと多いしな 斜め読みくらいしないと「この機能とこの機能は排他です」とか落とし穴ある。 >>840
斜め読みだと絶対見落とす。
RX621 の IO ポートの入力バッファを On にする設定は、まさか SPI の設定にまで効いてるとは思わずハマった。 言ってることが現実に合わない。現実を知らないな。さてはニワカだろう。
という論法は必ずしも合ってないよな。
指導者の、励ましとか方法論とか教訓とかは、往々にして現実には合わないことが多いけれど、
それをもってその指導者がニワカだとは言えないよな。 >>834
そのフレームワーク作成者は何を見て書いてるんだろうね。メーカー内部には懇切丁寧なマニュアルがあるのかな。
そのマニュアル開示すればみんな助かるし、cpu選定に有利だろうにね。
cpu開発者がコード書いてる?んな事ないだろうし。 今はネットで検索してコピペのスピード時代だぞ
いちいちマニュアルなんて読んでられねぇよ
俺以外の誰か一人ががんばればいいんだよ >>845
ニワカとか罵倒してたのが居たが
本音はそれだよな。 最低限の何が自分のコードに必要か何が不要がくらいは判らないとコピペプログラマーにもなれない。 マルチタスキングする場合はコピペだけじゃうまくいかなくね? >>848
ソースで提供されているライブラリを組み込むときに、端から端まで理解して使うことも少ないかも。
結果的に自分が使っていないものとかも入っているだろうし、書いた人には恐らくわかっていることでも、
自分にとってはオマジナイであることも。
というか過去に自分のソースを組み込むときにも、すでにオマジナイ化している部分もあったりして。 仕事なら「time is money」だから、
コピペで工数(納期)が短くなるなら、コピペを採用するのは当然だと思う。
私はプログラミングが余暇の趣味なので、
「他人が書いたプログラムは出来るだけ採用しない」
という方針でやっている。(その分、楽しみが減るので)
この前、tiny2313用のI2Cマスター制御プログラムを、
(ターゲットは秋月のAQM0802A-FLW-GBWという液晶表示器)
マニュアルだけを見ながらアセンブラで書いたら何時間も掛かってしまった。
でも苦労した分、完成時の喜びも大きい。
自分で書いた後、メーカー発表のサンプルと比較する時もあるけど、
なぁるほどぉ、とすごく勉強になる。 >>849
小さなCPUでマルチタスクする時は、
個別案件ごとに細部を色々と工夫しなければいけないからでは? 割り込みとポーリング時分割の考え方で何の問題もない
arduinoのスケッチと同じ プログラム以外も含んでしまうのですがディスクリートに相互容量方式のタッチセンサーを実装している資料ってありませんかね
アマチュアのタッチセンサーの作例は自己容量方式ばかりのようですし、アプリケーションマニュアルを見るとタッチセンサーペリフェラル付きの
マイコンとそれ用のライブラリが前提になっていたりして、センサーからどのように読み出すのかを書いている資料が見つかりません
簡単な自己容量方式ではなく手間のかかる相互容量方式にしたい理由は検出したい面積がかなり広いためです ここで良いのか分かりませんが、質問させてください。
その昔、コンピューターの読み取り装置として紙テープリーダーというのがあったと聞きました。
紙テープに穴が開いたり空いてなかったりで1と0を判別すると思うのですが、
8ビットで穴がパラレルで8個空いてるとすると、
リード信号はどこから得られるのでしょうか?
それとも回路の読み込み速度が 、テープが送られる速度より十分早いので、どれか1つの穴からの信号がくれば、もうリードしてしまうと言うことでしょうか >>855
わからないときは、とりあえずWikipediaで見てみるのが良いと思う。
https://ja.wikipedia.org/wiki/紙テープ
かならず開いてる穴がありますよ。 >>856
ありがとうございました。
5bit 3bit の間にある小さい穴がそれですね。
ありがとうございました。
テープが途中で切れた時は、ラブアウトしたテープとともに、糊でつければ良いんですね。
頭いいと思いました。 光学式の紙テープリーダーはそのスプロケット穴を基準に読み取ってるから
パンチ屑が取れてないとデータを読み飛ばすんだよ >>858
なるほど。
リード信号と同時に、紙テープの駆動用のギアが噛む穴なんですね。
穿孔するのは機械的に難しいですが、
リーダーなら光センサーで作れそうな気がします。
紙テープの駆動は手で引っ張るということで。 ルネサスのマイコンを使おうとしたら、やめろと言われた。
入手性の問題らしい。自動車関係しか売る気ないんだって。
残念だわ。 日本のメーカーは商社と手を組んで、
大手にはペコペコ頭を下げるけど、
中小企業にはフンゾリ返って偉そうな態度で接してくる。
いわんや趣味の電子工作においておや。 >中小企業にはフンゾリ返って偉そうな態度で接してくる。
これ、むかつくね。
安倍君の言う「サラリーマンの平均給与が上がった」とかいう話と似てる。
調査する対象が大企業ばっかり。中小企業は対象外なら、
そりゃ上がったと言えるかも知れない。 >>863
あと、今のサラリーマンに、企業内にいる非正規の人がふくまれてなさそう。 初心者質問です。やさしく教えてください。
3~5接点のロータリースイッチ5個ほど同時に使いたいのですが、他のスイッチとの兼ね合いでピン数節約の為アナログ入力を使おうかと思ってます。
可変抵抗器をイメージしてこんな回路で組んでます。
https://imgur.com/YfrGDLm
ロータリースイッチ一個につき一回路使い、アナログ入力範囲に応じてスイッチ位置を判定しようかと思うのですが、どんな問題が考えられるでしょうか?
ネット調べるとこんな回路が紹介されていたので私の回路では何か問題があるのかとおもうのですが。。。
https://synapse.kyoto/tips/ResDiv/page001.html >>865
それで問題ないと思いますよ。
ただスイッチが遠いところにあるとするとあなたの回路では電源、グランド、アナログ入力
と配線が3本必要になるけど、リンクの回路ではグランドとアナログ入力の2本で済むという
違いはある。
あと、オープンになる可能性があるなら入力の電位を確定させる対策が必要かな。 基本的な組込みの設計の仕方でメインでやらせること、タイマ割り込みでやらせることの切り分けが分かりません。処理内容は以下の通りです。arduinoUNOを使っています。
·IOポート読出し(digital*7 adc*2)
·IOポート状態による状態分岐
·adc値ldfフィルタ、演算
·IOポート出力
·一定処理回数毎のEEPROM書き込み
·エラー判定
·エラー処理
·LED表示
·LCD表示
EEPROMとエラー処理をメインで、他はタイマ割込かなと思っているのですが。
また、割込周期の見積方がわかりません、1ms程度でできるものなのでしょうか? 確かに、難しいところがありますよね。
以下の3つに分けて考えましょう。
1. main()
2. タイマー割込
3. 関数
1. main()は、細かいことは書かないで「装置全体の動作の流れ」がわかるように書くと良いです。
2. タイマー割り込みは、いろいろできますが、多重割り込みになると面倒ですので、
サッと抜けるような処理だけ書きましょう。
時間は、1msで行けると思います。(PICは楽勝。アルデーノは知らない)
3. 関数
main()で使用する関数の中身を書きましょう。
こんな感じです。
interrupt_timer....(){
count++
}
void main(){
st = 0;
while(1){
if( st==0 ){ // 0のとき
init(); st=1; // 初期化して、1へ
} else if( st==1 ){ // 1のとき
if( SW1==on ){ // SW1が押されたら
LED1=on; LED2=off; LED2=off; // LEDをセットして
fprintf(xx, "Get1 \r\n"); // シリアルで送信して
st = 2; // 次へ
} else if( SW2==on ){ // SW2が押されたら、
LED1=off; LED2=on; LED2=off; // LEDセットして
Mootor_L( on ); // モーター回転on
count = 0; // 時間カウンタreset
st = 3; // 次へ
}
} else if( st==2 ){ // 2のとき
if( count > 800 ){ // 800ms経ったら
st = 3; // 次へ
}
} else if( st==3 ){ // 3のとき
if( SW_stop==on ){ // StopSWが押されたら
fprintf(xx,"STOP....\r\n"); // シリアル送信して
Mootor_L( off ); // モーター回転off
st = 1; // 1へ戻る
}
}
}
} arduino でやるって言ってるのに、なんでmain()とか書いてんだよ。 ありがとうございます
IOだけタイマで同期させて監視しようかと思います >>870
loop() と見てくれればいいじゃんか。 時間見るのはmillis()見ればいい。 割り込み要らん。 >>86
まとめてコメントアウトしたい時に、#if 0 は便利。 >>867
全ての入力をタイマ割り込みで変数にセット
それから各種タイマーカウンターも全部インクリメント
他は全部メインで、変数とカウンターの値見て分岐と処理
メインで入力を直接見て処理を占有する手法は初心者しかやらん millisでtick見てりゃ割り込み全く要らないなあ。 割込みは使えるようにしておいたほうがよいが、実務ではなるべく避けるのが身のため。
どうしても必要な時だけ使うのが吉。
カウンタしか使わないなら、そもそも割込み要らない。Arduinoだと裏でやってるかもだけど。
逆に、RTOS実装するなら、使うCPUの割り込みのすべてに精通要 この業界n十年いるが割り込みの必要ない実務案件に遭遇した事無いよ。 Arduinoで時間見ること限定で割り込みがいらないと言ってる人と
一般論として「カウンタしか使わないなら、そもそも割込み要らない」と言ってる人がいるような。
カウンタであっても割り込みを無理して避けるより、使うほうが簡単なことが多いような。 >>875
頭いいですね。
>全ての入力をタイマ割り込みで変数にセット
この場合、チャタリングのフィルターは、どこでやりますか?
割り込み内部、メイン? 言葉足らずみたいだったし書き足しておこうかな。
(>>867の内容ならArduinoなんだし)millisでtick見てりゃ
(自分でわざわざ書き起こす)割り込み全く要らないなあ。 今なにげに>>869のコード見てたら気づいた。ものすごい初歩的なバグが紛れてる。
> if( count > 800 ){ // 800ms経ったら
768msくらいのタイミングで条件成立してしまうことがあるよ。 ちゃんと突っ込んどかないと、このレベルのゴミ情報をブログで拡散させちゃう人いるじゃない。 >>880
そもそも割り込み中に、入力を変数にセットするんだから
割り込み処理前後でハード的なチャタリングあっても
onしたらon
offしたらoffのどちらかの処理を1回しかしないんだから
メインでその情報使って処理したって誤作動するようなものになりようがない
フィルタ掛かってるようなものだからな デジタル入力のチャタリング除去例
まずは、ある時間(start)から指定時間(pass)が経過しているか判断する関数。
時間単位はmsで、経過していればtrue、そうでなければfalseを返す。
uint8_t pass_chk(uint16_t start, uint16_t pass){
if (millis() - start < pass) return false;
return true;
}
チャタリング除去結果と監視時間用の変数を用意&初期化
uint8_t inbuf = 0xff;
uint16_t chatt_start = millis();
10ms毎にPINDをサンプリングして、4回一致したビットのみを更新。
最小30msのチャタリングフィルタとなる。
if (pass_chk(chatt_start, 10){
static uint8_t a = 0xff, b = 0xff, c = 0xff;
uint8_t d = PIND;
chatt_start += 10; // start更新
inbuf |= a & b & c & d; // 全OFF反映
inbuf &= a | b | c | d; // 全ON反映
a = b; b = c; c = d; // サンプルデータシフト
}
ほかの処理はinbufを入力と見なして動けばいい。
負論理に脳がついていけないならここで反転してもいい。
インターバルとサンプリング数は個人の好みでご自由に。
Arduinoじゃないならmillis()相当を自分で作るべし。 >>887
頭悪い奴
そんな「遅延ありき糞処理関数」誰が使うんだね?
フラグをビット反転させる処理で
頭に、前回ビット反転させてから○ms経過した場合だけ受け付けるようにするだけでいい
○ms経過してりゃ入力した瞬間に処理が始まるし
チャタリング中には反転処理に進まない だからー スイッチ入力なんざ100msに一回読んでりゃあ、他になんもやることなんぞ無いわな。 >>887は産業プログラマかな?
とても常識的な内容でチャタリング除去だけじゃなくて不完全入力のフィルタも兼ねてる。
>>888はノイズ試験ってやったことない? ポートを適切な間隔で2回以上読んで一致を取るのはデバウンスの基本だが、
それすら知らない人のいかに多いことか。 2回の間隔は何msくらいが良いのでしょうか?
0.5secだとスイッチ応答が変な感じだし、
0.1sec暗いでしょうか? >>894
王道な方法を示してくれよ。俺も知りたい。 >>893
どれほどチャタリングが継続するスイッチなのかによるけど、
デフォは30〜50msくらいでいいと思う。
自動販売機が100〜200msくらいかな。チョンと押したくらいじゃ反応してくれんし。 >>895
オンディレイタイマーで済むことを
なんでわざわざ2回以上読んだり一致処理しなきゃならんの?
頭悪い え?1回だけなら意図した信号かインパルスノイズか判断つかないじゃない。
頭悪い・・・・ あ、「チャタリング」しか考えてないからそういう思考になるのか。
「デバウンス」はそれ以外の要因も含んでるんだからそりゃ話がすれ違うわな。 君のマイコンはスイッチ入力しか仕事がないんだろうけど、他の人のマイコンはもっと仕事がある そうそう、長く引き回したオープンコレクタ信号なんかは
チャタリングはないがノイズが乗ったりするからね。
いちいち個別のピンを2回読みなんて時間のかかることはやってられないし、
スキマ時間で全ピンのデバウンスやっとけばいい。
10msに1回程度のポーリングもできないなら割り込みでもいいさ。 >>898
オンディレイタイマーすら知らんのか
どうりで2回入力して一致確認するようなアホ処理を思いつくわけだわw えーっと、ハードウェアによるオンディレーの事言ってるなら16キーには16個いるよね。1個いくら?
ソフトによるディレーならデバウンス処理の方が軽いよ。
あなたにとってはアホ処理なんだね。了解した。
そんなアホが世界に何人いるか検索してみても楽しいかもよ。
飲み会があるので名残惜しいけどネタに付き合うのは終わりだ。すまん。 >>902
世界中のマイコン技術者はほぼほぼアホ、という事か ttp://elm-chan.org/docs/tec/te01.html
これ読めば解決 >>905
良いこと言ってるんだけど、
for(;;) { を平気で使っているのが嫌い。
while(1){ だろう。 次のページも読めない奴ばかりかよ
ttp://elm-chan.org/docs/tec/te02.html
実用的に使うならこれが最低ライン。定期的なポーリングだけだとノイズを拾ったら誤動作確定
ノイズが多い環境なら2回一致でも危ないからもっと増やすことも検討せざるを得ない
誤動作の結果がクリティカルな場合はワンアクションで動作しないようにするとかの対策も考えないと ダメだな。
マジでノイズで誤動作防止するなら、ノイズがスレッショルド超えるような事態そのものを
起こさない回路にすべき。
二回読み一致したらオーケーとか、マジでやばいもんには危なすぎる。 でもお前ら趣味でも仕事でもそのレベルのもの作ったこと無いんだろ? このスレにChaNさん以上のエンジニアはいるのか? 昔モータドライバの組込みやってたときは1ms周期でポートレジスタ読んで10連続一致で確定としてた
EMG入力だけはエッジ割込一発確定
RX62Tとか出始めの頃のRenesasサンプルコードも似たような感じだった
まぁ1msはサーボループに同期させてるだけ >>906
コンパイラによるけど大抵のコンパイラはwhile(1)は警告を出すので俺も無限ループはfor(;;)を使う 組み込み用途で無限ループに警告を出されるのは難儀だな >>913
そうなんですか。勉強になりました。
慣れの問題だろうけど、
For(;;)は、読んでも何をしているのかサッパリわからない。
そこ行くと、while(1)は、英文の意味通り、よくわかる。 >>915
> For(;;)は、読んでも何をしているのかサッパリわからない。
条件節を省略したら常に真とみなすことすら覚えられないならまあしょうがないんじゃねw レス数が900を超えています。1000を超えると表示できなくなるよ。