AVRマイコン総合スレ Part41
■ このスレッドは過去ログ倉庫に格納されています
ちょっとさっきくしゃみしたら 変換基盤に仮置きしていたATtiny10が全部消えたんだが? こないだ家電のケンちゃんで書き込み用補助具買ったばかりなんだが? 秋月の10個入り全部消えたんだが? 朝の鼻くそに混ざっていそうなんだが? 小せいのはICでなくお前のケツの穴というオチかい? >>673 缶のオペアンプを開けて中にATtiny85埋め込むか? >>684 バカヤロー鼻くそだって書いてあっだろ! 俺の繊細なケツからあんなもん出てきたらあっという間にパンツ血まみれ SSDなら耐久テストをしたサイトがあったな 東芝製が書き込み禁止にして保護するとか UART経由でターミナルに文字列吐いてからパワーダウンスリープするプログラム作ってみたんだけど、 void uputc(unsigned char x) { while( !(UCSR0A & (1<<UDRE0)) ) ; UDR0 = x; } ターミナルに表示される文字列の末尾が文字化けしてしまう。 (上記のプログラムは一文字UARTに送信する関数。 これを連続呼び出しすることで文字列をターミナルに送ってる) パワーダウンではなくアイドルスリープに変更したり、スリープそのものをしないようにすれば 末尾まで正常に表示されることからUARTの送信バッファから文字が全て吐かれる前に AVRがスリープしちゃってるのが原因じゃ無いかと踏んだ。 だったら送信バッファが空になるまで待てばいいじゃんと思い、 void uputc(unsigned char x) { while( !(UCSR0A & (1<<UDRE0)) ) ; UDR0 = x; while( !(UCSR0A & (1<<UDRE0)) ) ; } と修正してみたけど変わらなかった。他にも送信シフトレジスタが空になったとされるTXCフラグが1 になるまで待ってみたりしたけど、 while( !(UCSR0A & _BV(TXC0)) || !(UCSR0A & _BV(UDRE0)) ) ; これも変わらなかった。最後の一文字までターミナルに無事送り届けられたタイミングを知るには どうしたらいいのかな? >>689 AVRのプログラム経験あまり無いけどバッファが空に成った後に空ループ回しながら暫く待ってスリープは試してみた? TXCフラグは割り込みを使用していなければ、 プログラムから動的にクリアされなければならない。 UDR0 = x; の次に UCSR0A |= _BV(TXC0); っていれてみれば? >>690 の対症療法でもいいが…そもそも根本的な勘違いがある。TXCフラグの説明読んだか? 『The TXCn Flag bit is automatically cleared when a transmit complete interrupt is executed, or it can be cleared by writing a one to its bit location.』 とある。日本語にすると『TXCnフラグは、送信完了割込みを起こすか、自分で1を書くことで初期化できます。』ということだ つまり、送信完了割込みを使ってないのならば、自分で毎回クリアしないと、最初に何か送信して空になって1になったら…あとはずっと1のままだ!!! 送信中は0で終わったら1に勝手に変わるとかいう便利なものではないぞ??? なぜ動かないんだ!MPUのバグか? って時の99%は、データシートをちゃんと読んで 無かった自分のせい どうでも良いけど、なぜ loop_until_bit_is_clear(); 使わないんだ? >>690 ↓みたいにforループ1000回入れてみたら最後までターミナルに正しく表示されるようになったから たぶん送信バッファを確実に空にするまで待つ、という戦略であってると思う void uputc(unsigned char x) { while( !(UCSR0A & (1<<UDRE0)) ) ; UDR0 = x; for(int i=0;i<1000;i++) ; } >>691 ほ、ほんとだ! void uputc(unsigned char x) { while( !(UCSR0A & (1<<UDRE0)) ) ; UDR0 = x; UCSR0A |= _BV(TXC0); while( !(UCSR0A & (1<<UDRE0)) ) ; } これでも正しく末尾まで正しくターミナルに表示されるようになった! >>692 そういうことなのね。自分で1にsetしてやらないと0に戻らないのね。 勉強になった、ありがとうノシ Aliで売ってる1000円以下のJTAGって使い物になる? >>695 for(int i=0;i<1000;i++); って、最適化したら真っ先に消されるコードだろ? >>697 intの前に「volatile」付ければ? >>695 問題解決良かったね。 >>692 AVR初心者として参考になった。 ありがとう。 >>693 そう。焦れば焦るほどバグ、つまり自分のミスに気付かない。 俺はプログラミングは己れの煩悩を取り払う能力を養う最強の修行法だと解ったわ。 >>695 送信後のウエイト処理で見ているフラグが違うと思います。 while ( !(UCSR0A & (1<<TXC0)) ); こうじゃないですか? >>702 すんません 凡ミスしてた > while ( !(UCSR0A & (1<<TXC0)) ); そうです、それで正しいっす 所詮マクロだし推奨するのは構わんが強制することでもないべ AVRマイコンはプログラムメモリの自己書き替えはブートローダー用の領域に書き込まれた プログラムからしかできないんだな。アプリケーション用領域に書き込まれたプログラムからだと 書き替えのための処理が無視される。良く読めばデータシートにも書いてある。 PICマイコンからの類推で当然できるものだとおもってたから意外。 デバイスによる。 ブートローダ領域の無いものはどこからでも実行できる。 割り込みに呼応する関数は一般的にmain関数の前に記述するわけだけど、 volatile unsigned char x; ISR(USART_RX_vect) { x = UDR0; } int main() { ・・・ } 割り込みに呼応する関数を丸々関連するヘッダファイル(uart.h)に移動してやって そのヘッダファイルをincludeすれば割り込み処理も忘れずに定義できることを思いついてこうした、 #include "uart.h" int main() { ・・・ } 記述もすごくシンプルになって満足していたんだけどAtmel Studioのコンパイラーから3つの警告が出るようになった。 警告 2 type of '__vector_18' defaults to 'int' [enabled by default] 警告 1 return type defaults to 'int' [enabled by default] 警告 3 control reaches end of non-void function [-Wreturn-type] 割り込み処理をまるまるヘッダファイル(uart.h)に移動してやっただけなのになんでこんな警告が出るんだろう? あと話は全く変わるんだけど今ChaN氏のFatFs使ってSDカードに書き込みするプログラム組んでるんだけど 付属のf_puts関数でSDカードにデータを書くのは問題無く出来てるんだけど もう一つの付属のf_printf関数でSDカードにデータを書き込もうとするとエラーが返ってくる。 原因をしらみつぶしに調べていったところグローバル領域で宣言した配列の要素数がある程度大きくなると f_printfの方だけエラーが出るっぽいところまで突き止めた。(f_putsの方は要素数によらず常に書き込みに成功する) 具体的にはグローバル領域で、 volatile unsigned char hogehoge[255]; みたいな巨大配列を宣言するとf_printfによる書き込みが失敗する。 配列の要素数を少し減らして、 volatile unsigned char hogehoge[200]; にするとf_printfでも問題無く書き込みできるようになる。 ターゲットはATmega328P。 プログラムメモリもデータメモリも90%以下の値であることは確認済み。 オーバーフローしてるわけではない。 宣言した配列のサイズによってプログラムが異常動作するなんてことはありえるかね? >>709 ビルドログに出てくるデータメモリの使用率はグローバル宣言した変数分のみ。RAMはファンクション内で宣言した変数にも使われるから足りなくなることはある。 スタックもじゃね? グローバル変数+ローカル変数+スタック≦RAM でなければならん アセンブラで書いてないと取りうるスタックの最大量は読みにくい >708 ぱっと見だけど、char xがグローバル変数なのに、グローバル変数として宣言できてないのでは? そもそもヘッダファイルに入れる意味あるのか? 忘れずにと言うが、main関数のあるファイルからしかincludeしないなら、そこに直書きするのと何が違うのか >>708 #include "uart.h" の前かuart.hの中にavr/interrupt.hが無いから。 >>710 >>711 そういうことなのね コンパイルしてメモリ使用量が100%未満だからといって安心しちゃいけないのか >>713 volatile unsigned char x; だけmain関数の真上のグローバル変数領域に移設してみたけど エラーが出るようになっちゃった >>716 一応"uart.h"の前でavr/interrupt.hは宣言してあったわ ヘッダーファイルに割り込み処理を押し込もうとしたのはそもそもの間違いか 下手に楽しようとせずmain関数の上に書くようにするわ ありがとう >>717 ヘッダーに関数その物を書くのが作法違反っすよ >>717 volatile unsigned char x; の前で uart.h をインクルードしているのでは? uart.h の中で変数 x を使うコードが書かれていると、そんな変数知らないとコンパイラに叱られる 一見、すっきりした様に見えるけど、uart,h の中にプログラムコードを書くのは違うような気がする ISR() を外に出したいのなら uart.c のような別の *.c ファイルに記述して、 必要な定義類を uart.h に記載するのが良いでしょう Cがアホ言語かどうかはともかく、 なんでこんなにMCU向けにCがはやるようになったんだろ? FORTHなんか機械制御用として作られたユニークな言語だし、 小さなMCU向けにはVTLみたいなものでも十分だと思うけどな。 だれかアッと驚くようなD言語処理系でも作っておくれでないかえ。 >>723 いまさらテープドライブ? まあMCUならいいのかもね。 当時はさ CPU速度が遅くメモリも潤沢ではなかったが為に インタプリタ系言語が敬遠されたってだけだと思う PASCALもpコードの奴はトロいしw Cの設計思想はコンパイラ開発者に楽させるためだから、Cはあほ言語なんだよ。 プログラマに楽させるためのJavaとは真逆の設計思想。 Cはあほ言語なんだよ、だってさ。あの人いつも極論言ってカッコイイって思ってるのかな。クスクス。 なに使ってもダメな人はダメ アホなのは言語じゃなくて その言語の思想を理解できずに 「あほ」って言っちゃう方 所詮、道具なんだから気に入らなきゃ スルーして別の道具を選択するなり、 自分で道具から作りゃいいのに… >>718 >>719 反省しとります ヘッダーに記述するのやめておきますm(_ _)m >>730 自分でコンパイラ作るの? しかもアセンブラで? >>732 ツールってのはそうやって出来てきたんだよ 既存のツールにどうしても馴染めなきゃ、 諦めるか、自分でツールを作るしかないだろうが 今からC言語を学習する人は可哀想だね。 大抵の場合、組込みでしか役に立たないし…、しかも給与高く無いという。 まあ、趣味で使うなら作法とかそんなのは気にせずとりあえず動けば良いと思います。 食うために言語をマスターするという発想しか浮かばない境遇そのものが可哀相 C使ってても給料高い人はいくらでもいるけどな。 別に組み込み以外でも、ドライバ開発だったり、ライブラリの高速化とかで需要はあるだろう。 ドライバ開発とか、毎回とんでもない金がかかる。。。 自分でやれればいいんだけど、あれは無理。 何か一つの言語を深くマスターできていれば 他の言語もすぐにマスター出来る 逆も真で、ダメな奴はどんな言語を選んでも ものに出来ない C言語は習得が難しい割には、一般的には収入低いのは確か。 簡単な組み込みが多いからかな? OS周辺や、ドライバ開発となると、C言語出来るというより、単純に能力が高くないと無理なので、 収入高そうですね。 C言語出来るというだけでは、コピペできるか、ある程度スクラッチできるか、 ライブラリ作れるか、ドライバ作れるか、OS作れるか、言語そのもの作れるか、 と範囲が広すぎて、能力を把握できませんね。 「プログラミング言語別年収ランキング 2018」を見ると Cプログラマは最下位(10位)で可哀想にプログラマ業界のワーキングプアだ https://tech-camp.in/note/careerchange/49077/ 俺はMCUに関してはフルアセンブラ派なので競争相手が全く不在で こんな言語を超越して稼ぎまくっているから関係無いけどw >>744 クイックソートの例を見てみたけどCより遥かにスッキリ書けるね AVR用のコンパイラとデバッガは存在するの? Haskll てH言語? 「頻繁に IO を行うプログラム: IO などの不純な行為は Haskell は苦手。」 http://www.shido.info/hs/haskell1.html 自分は組込み屋ではないですし、Cは1年に1回程度チラッと仕様確認で見る程度ですね。あとは趣味のAVRで利用する程度です。 ただ、IT土方で薄給なのは事実ですが…。 ただ、どうせやるなら趣味でも仕事でも新しい方が“何となく“良い気がしませんか?(錯覚かも知れませんが) まあ、C以前の低級言語は、コンピュータの動作がどうなってるか学習も出来るので、やって損は無いとも思います。でも、やっぱり今更感が強いですね。 言語よりも、成果物だもんなぁ・・・・ 自分が成果物を出しやすい言語を使えばそれでいいわけで。 もちろん、職場とか取引先で指定もあるけど、ライブラリにして投げ渡すという手もあるし。 昔はみんなコツコツ薪を集めてお風呂を沸かしてたのに 最近の若い奴はボタン一つで風呂沸かしやがって ゆとり元年のガキが2010年入社だったが 最近のは更にゆとり教育期間が長くてもうえげつない動物みたいな奴ばっかだな >>751 ゆとりだけが原因じゃないんだぜ。 採用活動の制約のせいで経団連加入の企業は、 それ以外の企業が採った後の残りかすしか採用できてない現状。 >>751 それはご愁傷様。 こちらの観測範囲だと若い子ほど優秀な印象。 内向的ゆえかコミュニケーション能力高いし。 並みの子が来たがらない環境なんじゃない。 最近はそう言う情報も流れてるし。 最近のゆとりは魚が切り身で泳いでると思ってるとかどうたらこうたら 同じ処理の繰り返しって積極的に関数化した方がいい? プログラムメモリ的にも関数化した方がコンパクトになるのかな? 関数コールする度にスタックを食い潰して行くからなぁ ATtinyとかはSRAMがすくないので、極力関数化せずに、 マクロを多用している >>756 基本は、関数だけど。 スタック消費を避けたいときと、処理速度を上げたいときは、マクロも検討します。 ただ、デバッグが面倒になるときと、マクロの副作用もあるので慎重に。 とりあえず関数で書いて完成したらROMの許す限り展開するだけだな俺は メモリにも処理速度にも問題が無いならそんな余計なことはしないな俺は >>761 コンパイラの吐いたコード見て、思わずマクロにすることはありますね。 パラメタの数だけ、スタック退避されてビビル。 コンパイラの最適化によるけど、参照だけなら const つけるとか、 あえて、パラメタ変数をグローバルで宣言するとかもあるけど メモリ許せば、マクロかな〜 ケースバイケースで、指示が無い限りは、センスに任せるっていったところか。 スタック無しでもそこそこのパラメータ渡せるのに、 スタックにまでパラメータ積む様なコードって汚そうだなぁ。 ポインタ渡しとかにしときなよ。 >>763 avrgccに限らずって話ですよ。 コンパイラの最適化もあるし、 ポインタ渡しにしたら、変数アクセスごとに、インデクスレジスタを 更新しますからね、当たり前の話ですけど。 そのオーバーヘッドとコード領域の増加を避けたいこともあるのです。 AVRライターに純正のAVRISPMK2ってのがあるけど、これって何か特別優れた点があるの? 純正だから安心的な話じゃなくて機能的に。 と、言うのも中華な激安AVR(と比べると失礼かもしれないが)とくらべると明らかに基板の密集度が違う。 ほかの多くは電源供給できるが、この製品はそれもできない。 何か優れた点があるのかなのと気になって・・・ アトメル純正はどれも電源供給はできない。 『純正である』信用以外のメリットはこれと言って無いと言っていい。 しかも本家ISPmk2はとっくの昔に販売終了していて、あっても店頭の売れ残りだけ。 最新のデバッグインタ−フェースであるUPDIにも対応していない。 >>768 世の中にあふれるどのライターよりも複雑なんでなんかすごいのかと思ってたけどそんなことはなかったんですね。 つか、販売終了してたとは知らなかったです。 ポチる前に聞いておいてよかった。 他の物色します。これ結構いいお値段するんで・・・ 回答どもでした。 ライターでしかないISPmk2買う勇気があるなら、 デバッグもできるAtmel ICE買う方を勧めますよ。 attiny202/402/212/412の4種類あるね。DIPは無いけど。 mega808なんて出すのか。 120円くらいと予想。 USIはI2Cで使ってるので ソフトだと速度出ないし tiny3216が便利すぎてまとめ買いしたこればっか使っとるわ 速度出すなら水晶欲しいな…? VCC!GND!XTAL1!XTAL2!SDA!SCL!TXD!RXD! リセット殺しても他になんも付かねぇ!! どうでもいいけど8ピンのDIPかわいいよね >>776 3216が出る前に1616をまとめ買いしてめっちゃ使ってるw ICE使っても1ピン喰われるだけだし、デバッグは安定してるし、いい子だよ。 mega3208もお気に入り。 tiniy0/1シリーズなら内部20MHz有るんだから水晶要らないっしょ。 クロックの出荷時誤差書き込んでくれてるし、オートボーレート機能有るし。 てかそもそも水晶付けらんないし・・・ 代表特性だと全動作温度範囲で0.5%くらいに収まってるから大丈夫なんじゃない? クロックをオシロで見ながらドライヤー当てて見たけど全然動かん。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる