マイコンソフト 悩み事相談室 3 [無断転載禁止]©2ch.net
レス数が950を超えています。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
では、質問、ドゾ〜 ありがとうございます
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 for(;;)とwhile(1)だと、どちらが高速なのでしょうか。 >条件節を省略したら常に真とみなす よりも
>終了条件が無いんだから、永久ループ。 のほうが、しっくり来るね。 >>926
ありがとう。読んだ。
国語もおぼつかない小学生に、プログラムの勉強が必要か?
他の国に負けないように とか、そういう見栄なのでは? その国語教育がなっていない。
ほかの教科をふくめテストの設問で「次の中から適当なものを選べ」なんて書いている時点で国語に対する危機感が足りない。
いまなお文学的表現に偏りすぎで「情緒的で流麗で読みやすい作文」を「事実を解釈に幅なく表現する作文」より優先しすぎだし
読解でも「行間を読むこと」を「書いてあることから事実だけを抽出するここと」より優先しすぎ。
そんなものだから、感情的に偏った読み方をして、ほかの教科の教育だってうまくいってない。
テキストでもテストでも、教える側が「そう読むか!」と嘆くような解釈をするケースが少なくないのだそうだ。
プログラミング教育で「解釈に幅のない表現」の力がつけば良いと思うんだ。 グラフィックLCDに字描く時の定番ライブラリってあるのでしょうか? トーンデコーダを並べるのが大変なんで、マイコンでやってしまおうと思ってるんだけど
A/D変換した後何をすれば良いのかヒントはありませんか? DFTする。該当する周波数は8つしかないから8回でOK レスありがとう、色々調べてみます。
空線信号やDTMFならIC使った方が楽なんですけどね… トーンデコーダって書いてあるからDTMFのデコードだと思っていたわ。だから8回
特定の周波数にピークが立っているだけの判別で良ければ判別すべき回数分のDTFで良いけど
バックグラウンドについても何らかの判別を行う必要があるならFFTする必要があるかもしれませんね マイコンソフトやってて、馬鹿な俺をご披露
・#includeしているファイルを修正してるのに、ちっともバグが取れない。
よく見たら、.BAK ファイルを修正していた。
・割り込みの中の変数をmainで見ようと、Global変数を取ったのに、
ちっとも読めない。よく見たら、割込中でstaticで取っていた変数だった。
Globalよりstaticのほうが強いのね。
・ソース中の定数を変えてるのに、まったく変化しない。よく見たら、コメントの数値を変えていた。 >>935
1つめと3つめはアレだが、2つめはわかってよかったじゃん。
自分は、10進数の桁数揃えようとして頭に「0」追加したら、8進数になることを知らずにもんげー悩んだよ。
それと、昔は全角スペースが表示されなかったんで、何でコンパイルエラーになるのかわからなかったりとか。 ポインタサイズを最適化してくれる処理系とかないのかな [ネットストーキングするために必要な物リスト]
◯ボールペン(ネットで調べた情報を書きとめるために)
◯ノート(ネットで調べた情報を書きとめるために)
◯老眼鏡(ネットで調べた情報を見るために)
◯足つぼマッサージ板(ネット検索で疲れた足をいたわるために)
◯マグカップ(お茶飲みながら作業するために)
全てダイソーで揃います H8/3069FってIOポートのDDRをビット単位で操作できないのでしょうか? H8の事もう全く覚えてないけど、
仮にDDRがWrite Onlyでも手が無い訳じゃない、
別に変数持ってビット演算してその結果をDDRに書け。 >>941
言語が書いてないがC言語ならメーカー提供のI/Oレジスタ定義ファイルに
ビット単位のunionがあれば簡単にできるよね。
まあ>>942の通りアセンブラでもできるか。 >>941
構造体で書けば、1GPIOごとのI/O方向は、設定できる。
ただ、内部アクセス的には、8bit単位で書き込んでると思う。 BSET/BCLR。実態はマイクロコードの実行だと思うけど 符号付き14bit A/Dの変換値を、画面に表示するプログラムを考えました。
以下の通りなのですが、何か考え方が間違っているようでしたら
教えてください。
h_AD = get_14bit_AD(); // 14bitADの値を 16進で取り込む
f_AD = (float)h_AD; // float値にする 0001→1.0 0000→0.0 ffff→-1.0
f_measure = (5.0/1.0) * (f_AD/8192,0); // 変換する +5.0V→ADに+1.0V入る。14bitADなので±13bit
printf( "AD=%fxx.xx\r\n", f_measure ); // 表示 符号付き14bit ADCなんてあるんだ
> f_measure = (5.0/1.0) * (f_AD/8192,0);
f_AD*(5.0/1.0/8192.0);
に変形しよう
乗算1回になる
浮動小数点演算は変形で値が微妙に異なる事があるので
コンパイラが最適化しにくい f_AD*(5.0f/1.0f/8192.0f);
fを付けないとdoubleで計算してしまう
マイコンだとdoubleもfloatも同じ精度の物もあるけど >>946
0xFFFF は 65535 だから float にキャストしても 65535.0 じゃない?
> printf( "AD=%fxx.xx\r\n",f_measure ); // 表示
AD=1.23456xx.x とかなりそう。 わざわざ符号付きって書いてあるんだから
get_14bit_ADもh_ADも符号付きなんじゃないの? 実際にやってみて悩めばいいと思うけどな。
他人にあらかじめ見てもらって悪いところを全部直してもらう
なんてことやってたら一人でプログラム作れるようにならないし
楽しくないだろ。 だいじょうヴイ
楽しみ方は人それぞれだし
天下無敵のコピペがあるじゃないかw CPUを使った既製品ハード+コピペソフトの電子工作の素晴らしいところは、
「コンピュータを動かしている俺、何て頭が良いんだ」
と気持ちいい誤解を素人にさせてくれるところだなw 趣味の電子工作は気楽で良いよな
同僚が作ったバグのせいで取引先に呼び出されて
エライ人達5、6人に取り囲まれて
原因と対策を延べよ、なんて詰問されたりしないだろうし >>956
>原因と対策を延べよ、なんて詰問されたりしないだろうし
原因なんて「検査の見落としでした」しかないでしょ?
どんなバグがあろうがなかろうが、出荷前検査で確認してあれば良い訳だから。
対策は「検査項目を増やし、検査員を1人追加します」
結局、多項目の検査を複数回、複数人でやる以外に対策は無いんだよね。 >>958
趣味でしかコードを書いたことがないヤツの発想 >>958
天才が独りでやった方が間違いは少ない。 「検査の見落としでした」
「検査項目を増やし、検査員を1人追加します」
何も報告してないのと一緒
出直してこい ミスは絶対にゼロにはならないし、問い詰めること自体が意味が薄いことが多いんだよなあ。
Windowsのバグがあったから、っていちいちユーザーがマイクロソフトの上級エンジニアを呼び出して、
納得いくまで詰問するわけじゃないことぐらいわかってるのに、そのことは棚に上げて、詰問するんだしな。
詰問される側になったこともあるし、愚かなことに詰問する側もやったことがあるけど、作業環境の問題とか
わりとはっきりと対策できること以外は、たいていが担当者個人の資質に依存することだし。
かといって、継続的な製品なら、その人を担当から外すとか、その外注さんを変えてしまうとか、そうそう
できるものでもないしね。
チェック項目やチェック担当者、ハンコ欄を増やすのは割と最悪の納得だよな。
https://pbs.twimg.com/media/EA7jtfYVUAAe6Mb?format=jpg&name=small
https://japanese.engadget.com/jp-2019-12-17-1-2-2019.html まぁ、実害(金銭的な損害)が発生すると、たいていの場合は目の色が変わってくるんだよね
会社によっては謝罪だけでは済まない場合もあるし 以前、こんなソースを見たことがある。
mainが、タイマー割込ごとに動作するという。
void main(){
if( wrikomi==1 ){
warikomi=0;
処理を書く
}
}
もうほとんどFPGAじゃないか?と思った。
分かりやすくて好きだけどね。 これが変とか言われたら結構な割合で世の中の組込みコードは変という事になる。 タイマー割込ごとにmainが動作するというわけでもないし
>>964は馬鹿なのか? すぐにmain()を抜けるんだね。
無限ループの中にif(warikomi == 1)が入ってるのはあると思うけど。 >>964
> mainが、タイマー割込ごとに動作するという。
これは見たことないな
割り込みをフラグで拾ってメインルーチン側で処理すると言うのはそれなりに見るけど
> もうほとんどFPGAじゃないか?と思った。
これはよくわからん >>968
そうだよね。抜けたらHaltかな?
割り込みやらの初期化もしてないし。 レス数が950を超えています。1000を超えると書き込みができなくなります。