マイコンソフト 悩み事相談室 3 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
16F1827を使って水平義を作ってるのですが、センサーとPICのAD変換、LEDで形は出来たものの、音を鳴らすのが良い方法が解らず苦労しています。
角度が大きい時はピッ、ピッとゆっくり鳴らし、水平に近づくとピピピと早く、水平でピーと連続音にしたいのですが、良い方法は無いでしょうか? タイマーの使い方 ブザーをどう実現するか、とか。
書くと長いよ >>768
例えばタイマーで割り込ませてブザーの繋がっているポートを常に反転させる。
音を出すときだけ、TRISAで入出力設定を出力にする。出力にしている時間はもう一つのタイマーで制御して、ピッと言う音を出す。
このような方法で出来る物でしょうか? (水平を零度として)角度のN倍サイクルは音を出さない、みたいなのはどうだい 3の倍数と3のつく角度の時だけファニー音が鳴りまつ データ1個8bit使って常時インクリ
その7〜0bit目を参照すれば、すべてデューティ1:1の波形になる
センサー値を8bitにデコードし
その最上位bitを拾ってそれとand取れば
勝手にデータ量が多ければゆっくり、データ量が少なければ早く鳴る >>772
なるほどシンプルなアルゴリズムで面白い。
+1の速度を変えれば音の高さも変えられる。
8段階に変えるための「その最上位bitを拾って」が少し手間かな。
あと、各音の周波数の増減が1オクターブに限定される点はどうなんだろ。
(私が誤解していなければの話しだけど) オクターブ?
音の高さを変えるほどの周波数でインクリすんのか?
ただのピピピの間隔だろw
全音符から64分音符とかの範囲で考えろw >>776
あっち荒れてるからこっち来たんじゃね? 仕様を変えて低い連続音から高い連続音へPWMだとコードは短いけど、水平か分かりにくいか PWMで音演奏
エンベロープできて一人前
昔、PC88でやってたなぁ switch文の中の casesは、1段インデント付けますか? それともおなじ位置でしょうか? { } の中に入るごとにインデントを1段増やす
ラベルは1段減らす
これが基本 スタイルは人それぞれ
だけど、ソース整形ツールがある
ルールをファイル定義しておいて一気に修正してくれるもの(Cuty)とか
コマンド指定するastyleとか。
astyle --style=1tbs -s4 -S -N -Y -M80 -p -j -k1 -U -H foo.c
人のソースが読みづらい時にも。 静電容量型の接触検出(STM32 のTSC,PICのmTouchなど)を使った方にお尋ねします。
アクリル板越しでも接触検出できますか? >>785
別に正解じゃねーだろ
合わせた方が楽なだけだろw Windowsで使えるARM7TDMI向けのコードを吐けるclang/LLVMのビルド済みパッケージって無いのかな?
自分でビルドしようにもWindows環境向けの情報が少ないしそんな古いCPU向けの奴なんて見あたらない
lldがらみのチュートリアルも欲しいけど組み込み向け乗ってどこにあるのか・・・ >>788
方式によるけどね。
タッチセンサの検出方法って各社がそれぞれの方法を特許で押さえていて、
他社が真似できない。各社の原理を良く見た方がいいと思うよ。
mTouchみたいな弛張発振は特許にならないほどありきたりな方法で
簡単だけど、どうしてもセンサ部分が高インピーダンスになってくるので
耐ノイズ性や安定性の面では不利かな。
今まで見た中ではルネサスの第2世代方式が一番すぐれものだった。
https://www.renesas.com/jp/ja/solutions/key-technology/human-interface/touch-sensor-system2.html
https://www.youtube.com/watch?v=qIgsneAIg5A&feature=youtu.be
動画みたいに、10mmのアクリル板でも木でもOK。
パネル面の上から水が垂らされてるような状態でも検出できてたし。 >>47
最初は、見やすさ優先で良いだろ。
無駄な処理有っても、ある程度は最適化かかるし。 教えてください。
ノイズの多い環境でのシリアル通信は、通信上どんな工夫をして良いか考えています。
まず考えたのは、パリティを付加することですが、ノイズが2回来ると検出できない思います。
次に考えたのが、同じ文字を何回か送って、何度か一致したら、それは合格とすることです。
前者も後者も、確率の問題かなと思いました。
以上です。 >>793
CRC も RS も LDPC も確率の問題 >>793
1文字中2回もノイズでやられてるってんなら物理層の対策の方が先だろう。 >>793
1 速度を落として、ノイズフィルターをガッツリ入れる
2 誤り訂正符号追加する
好きな方を 調歩同期だろ
スタートビットダメだったら文字丸ごとダメ
そんなに伝送路悪いのだったら
拡散符号にでもするかw >>798
いやいやはやぶさとかの通信担当者かも知れんぞ w >>802
宇宙通信の同期機構はもっとしっかりしているしデータの保護もリードソロモン符号で堅牢っすよ >>803
> データの保護もリードソロモン符号で堅牢っすよ
物理層って意味わかる? w マジレスすると宇宙通信の成立性は事前に証明した上で打ち上げるから
機器が故障したり予定外の軌道を飛んだりしない限りしないかぎり
物理層のエラーが多くて運用に支障をきたすなんて事はあり得ない 生まれた子の性別を伝えたいなら
赤・青の狼煙爆破させればいいじゃん というかどのレベルで話せばいいわけ?w
1.一般人
2.高周波通信は判っている
3.人工衛星や探査機のシステムについて理解がある >>809
>はやぶさ2ではX帯での通信機能も備え、天候が良ければKa帯、悪ければX帯を使うなど2種類の電波を使い分け、効率的に運用する。
らしいけど、何が3系統? というか>>804は一般人って感じじゃないんだが>>802,807だと素人丸出しだ >>810
お前のレベルで話せばいいよ
>>811
ああ、はやぶさ2はKaバンドも使うんだったな、忘れてたわ
それ入れれば4系統か
ただ、物理層って周波数だけじゃ無いぞ
アンテナ4系統ある意味を考えなよ
>>812
はいはい、俺のことはどうでもいいからお前のレベルで話せよ >>804
極近距離の有線ならともかく、
通信ではエラーが出る前提で設計しないと駄目だろ。 >>813
『オレは知ってるぜ」じゃなくて答えてくんない?本当はわかってないんだろ。
4系統って何だよ? そういえば、超低速通信でポチポチやってたりしたっけね。 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 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かな?
割り込みやらの初期化もしてないし。 単純にvoid loopの書き間違いだと思ってたよ。
だってソース通りなら基本的に即HALTやん。 >>972
割り込み入ったらSLEEP解除ってのは、マイコンで良くある。 スタートアップコード自作ならmainの外でどんな動きにも出来る >>969
> > もうほとんどFPGAじゃないか?と思った。
> これはよくわからん
always に似てると思ったんじゃない? Verilogか…
VHDL使ってたからピンとこなかったわ 教えてください
switch文で質問があります
switch (制御式) {
case 値1: 文1
case 値2: 文2
default : 文3 break
}
通常は各case文の末尾にbreakをおきますが、
それがない場合は、どのような動きになるのでしょうか?
・値1の時は、文1 文2 文3 を実行する
・値2の時は、文2 文3 を実行する。
・値3の時は、文3を実行する。
という理解で、正しいでしょうか? >>977
セミコロンがないのでバイナリ生成されず >>978
ありがとうございます。
とても覚えやすくて、ありがたかったです。
ありがとうございました。
>>980
ありがとうございました 教えてください。
マイコンで、AD変換→EEPROM記録を定周期で行っているとき、
電源が抜かれて0Vになった場合、記録中のデータ書き込み完了や破損を防止したいです。
そのめに考えたのは、
・大きな電解コンデンサで電源低下を持たせる
・電源電圧2V〜5Vのマイコン、EEPROMを選定し、5V→2Vの間で作業完了
上記の結果、少なくてもその回の書き込みを完了させてから落ちることを考えました。
しかし前者ではコンデンサが大きくなりそうで、スマートではないなぁと思っています。
そうしなくても、ソフトウェア的に何かテクニックがありますでしょうか?
これまでのデータが喪失しないこと、今回のデータは最悪喪失でもよいです。 >>982
書き込みは6ms位で終わるから、コンデンサで持たせる で良いと思う。
ページ単位なら同じ書き込み時間で32byteとか書ける。
データをバッファに溜めてるなら、電源低下をなるべく早く検出して、残ってるのをEEPROMに書き込み。 そもそもプログラム中に給電が止まったときの影響範囲ってマニュアル等に書いてないの? ソフト的には「一定電圧以下では書き込みを行わない」しかないっしょ。
書き込み時間の確保や低下検知後の動作はハードの問題。
少なくとも書き込み実行しちゃった後の時間を確保するためのコンデンサは必須だよ。
それが大きくなるか小さいので済むかもハードの問題。 >>982
・電気二重層コンデンサでバックアップしたら、マイコンとEEPROMぐらいなら秒オーダーでもつよ。(マイコンによりけりだけど)
・電源低下はm秒より短いサイクルで検出したいし、モーター、リレー、ディスプレイなどの電源はマイコンの電源から切り離せるようにしたい。
・>>984の方法が確実では。Z80の時代からSRAMのバッテリバックアップはよくあった。
・今なら、書き込み時間の短いFRAMもあるし、なんなら、一部のMSP430みたいに、FRAMを搭載したマイコンもあるし。 >>982です。
みなさん、どうもありがとうございました。
やはり、電圧が残っている間に、チャチャって済ます ですかね。
以下のように考えてみました。
1. 電源断をいち早く知る
2. 短時間に書くようにプログラムを工夫する。
3. 記憶媒体を見直す。
1. 電源断をいち早く知る
電源RESET ICかコンパレータICを使用して、4.0Vを↓したら、外部割込をかける。
(NMIは使ったこと無い)
2. 短時間に書くようにプログラムを工夫する。
・マイコン内部のRAMにBufferするのをやめて、毎回毎回書き込む。
・バースト書き込みはやめて、1byteずつ毎回、Address, R/W, Dataで書き込む
3. 記憶媒体を見直す。
・EEPROM→FRAM 使ったこと無いんですが、パラレルバスのICでしょうか。
ワンチップマイコンなので、外バスが出ていなくて、要検討です。
SPIのFRAMがあれば、書き込み時間を検討してみます。
4. 次点
・電源の改善に、空気二重層を付ける→入手難のようですね。Panasonic?
書き込みが完了したら、空気キャパシタを遮断するようなスイッチ必要検討。
マイコンがスリープすれば良いか。
屋外で使用したいので、電解コンデンサの容量減少も考えないと。
みなさん、いろいろと、どうもありがとうございました。 EEP-ROMで足りるもの(アクセス速度や回数制限が問題にならない)を
FARMやバックアップ付きSRAMに変える意味はほとんどない。
データ書き込みプロセスを始めたら、終わるまで止まっちゃならんのはすべて同じ。 >>989
> データ書き込みプロセスを始めたら、終わるまで止まっちゃならんのはすべて同じ。
そこは同じだけど速度が全然違うだろw >>991
そんなものは設計次第
>>992
反論できず涙目?w 速けりゃ電圧維持時間ゼロでもいいのか?
ちゃんと設計せにゃならんだろ?
> 終わるまで止まっちゃならんのはすべて同じ。 薄れ逝く意識 弱り逝く体力で遺されたダイニングメッセージ
判別でけんかったり 内容がデタラメだったり
そんな記憶値 簡単に信じたらあかんで 抽斗は多い方がいい。
自分の流儀にあわないものでも好き嫌いなしに抽斗に入れておけば役に立つことがある。 あ、多い方がいいのは抽斗の中身だね。
(カモシカのような脚ってどんな脚?) >>994
SRAMとかに随時書き込んでるなら電圧維持時間ゼロでもいいだろ。
書き込みシーケンス途中で落ちるのが悪いんだから。 >>998
いいわけ無いだろ
書き込みの瞬間に電源落ちてアドレス不安定になったらどこに書くかもわからんし
シーケンスの意味がわかってないなら黙っとけ このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 1180日 7時間 14分 26秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。