1 :
774ワット発電中さん :
2010/06/25(金) 21:02:29 ID:o4lD3qe7 _____
/ /|
/ ( ゚∀゚) /.∠フ 個人でも手軽に使える
/ /.∠フ || . Atmelの8-bit RISCマイクロプロセッサを
/ __ o/.∠フ || 中心に語るスレッドです。
∠| ̄ ̄凵 ̄ ̄|∠フ || *AAは「AVR H8 etc. マイコン総合スレ Part3」からいただきました。
.|| |_____|/||
Atmel AVR 8-Bit RISC
http://www.atmel.com/products/avr/
実は初めてのスレ立てなんだけどこれでいいのかな?
上出来だと思うよ乙
乙 でも、レディオテクニカ有志〜 と HERO'S Download(暫定) は 修正が必要では?
>>1 これは乙じゃなくてポニーテールなんたらかんたら
まるで、ATMELの出す、エラッタのエラッタのやうではないか。
10 :
774ワット発電中さん :2010/06/26(土) 09:57:38 ID:+7Su4Jnv
1乙 地味に伸びますなw
おつつ
立てなくて良いのに・・・・。
おっつ 発展期待
H8があればAVRなんていらねーww
趣味ならDIP
>>14 H8も使うときは使うが電源が電池レベルの時に使おうとは思わん。まだR8Ctinyなら…
AVRなら気をつければCR2032でも使いものになるのが強みの一つだと思う。
>>16 なるほど、いいかもしれないね。
俺ChaN氏のところ以外はほとんどデータシートしか見てないんでこういうの知らない
んだ。
中華Android端末を見ていて… 家にあるNetworkGatewayKitに液晶繋げればAndroid動くかな?と思ったのだけど 既にAVR32-AT32AP7000がディスコンになっている件に付いてwww
中華ドロイドの中だとmoonse e7001ってのが良いらしい なぜかポータブルAV板にスレがある
AVRは異常に使い易いと思うし計算も速いんだが、 1つだけ欠点があるとすれば、debug-wireが糞
少なくとも8bitAVRに関してはプログラムメモリへのアクセスがRAMへのアクセスと 別なのがイヤ。Cではちょっと使いにくいことがあるな。 32bitAVRは知らないんだが、さすがに同じポインタでアクセスできるんだろうな?
>>21 ありがとう、やっぱり AVR はやめとくわ。
いったいどんな用途に使おうと思ってんだよ。。。
RAM実行可能かとかそういう話でしょ。 AVRがというよりハーバードアーキテクチャの仕様。 ところでAVR32ってlinuxも乗るわけだけど、 この辺どうなってんのかね。外付けRAMだと フラッシュと同じプログラム側アドレスにできるってことかな。
AVRStudioのエディタに行番号を表示するオプションなどありませんか?
>>24 21の言ってる意味は、
ROMに割り当てたテーブルが普通に読めないからだろ
すまん、俺が
>>21 (ちなみに
>>22 は俺じゃない)なんだが
使用目的は確かに
>>27 なんだが、気になってる所は
>>24 の話。
AVR8はハーバードアーキテクチャがモロにソフトに影響してるって話。
内部的にはハーバードアーキテクチャでもキャッシュとかで細工してソフト的には
見えないようにしてるマイコンもあるから、AVR32はそうなのかなと思って。
昨今RISCでハーバードではないCPUも珍しいけどな、 PCカウンタが32くらいあるのなら、RAM方面のバスもアドレス区分で割り当ててるのが普通と思われ。。
データシートみると同一の物理マップにあるから
>>27 とか
>>24 みたいなこと気にする必要ないんじゃない。
>>28 それ、メモリマップ的にコードとデータが独立してるかどうかって話でしょ。
で、今のARV32のUタイプはMPU(メモリ・プロテクション・ユニット、ARM用語)だから
同一メモリ空間内でマップされてるよ。
ディスコン化したAPタイプのAVR32は普通のMMUなので仮想メモリ対応のゴージャスな奴だったけど。
>>30 ,
>>31 ありがとう。やっぱりそうなってるんだな。
今度ヒマができたら自分でも読んでみるわ。
そもそも、xmegaと違って、AVR32ってAVRと互換性ないんじゃ?
同一メモリ空間内でマップってことは、 内部の命令デコードも同じってことなのかな? まあ調べればいいんだけど
やっぱUPSにはついてたほうがいいよね〜?AVR
>>37 スレタイ100回音読してから、半年ROMってろ
ググるまでなんのことだかさっぱりだったぜ… 自動電圧調整(Auto Voltage Regulateかな?)だったのか。
41 :
774ワット発電中さん :2010/07/01(木) 16:33:42 ID:TtUqUu1f
マイコンでDC/DCコンバータ構成してる例なら何度か見た
Adult Video Recorder?
43 :
チラ裏 :2010/07/03(土) 10:40:56 ID:xesk/3Ge
乙です。 埋まるのはいつにになることやらw
俺は2.2kΩの抵抗が好きだ なぜなら赤3本で分かりやすいから
5本線の抵抗は嫌いだ、だいたい読み間違う。
混ざったら終了>チップコン
33kも好きだな
つまんで測定するテスターがあるからそれを使えば大丈夫。
1/4Wのカーボン抵抗が好き オレの中で、いかにも抵抗ってのはコレだな 出来れば基板に寝かしてやりたいけど、スペースの都合上中途半端に立たせることのが多い スマンな、苦労をかけて・・・
AVRスレはここで終了しました。 これからは抵抗スレになります。
今 USART でパソコンとシリアル通信してるんだけど、ちゃんとパソコンに送れない ピンをショートさせてパソコンから送ったシリアルをそのままパソコンにバックさせると、正常に送受信出来てるから、問題は AVR 側だと思う で、色々調べた結果、次のように受信してた ・受信したシリアルが反転しているっぽい ・受信したシリアルが 1bit 左にずれているっぽい 例えば、A を送ると A = 0b01000001 のハズが、実際に受信しているビットは } = 0b01111101 となってる なぜだろう? ちなみに、パリティなしストップビット1非同期モードです
出力は負論理 ドライバーいれるかで反転させる
>>53 ありがとー!!!
早速 MAX232N 買ってきた
そういう事だよね?
インバータでよかったのに・・・ ソフトで反転することも出来たのに・・・
TTL(C-MOS)とRS-232Cを直結してたってこと?
トランシーバ用意できるんならその方がいいわな
だね 端おってやるとなにが問題なのかわかりづらくなる
RS232Cモドキなら別だけど、PC本体のシリアルポート(デスクトップ機 ならほぼ確実に)は+12V/-12V出してくると思うけど、そんな基礎的な ことさえ知らんのかいな。 ゆとりエンジニア(0.5mmピッチは日常の自称プロとか)は、たとえ問題 があっても、火や煙を出すといった素人目にも明らかな異常状態でも 起こらない限り、動けば結果オーライなんだろうなぁ。 オシロなんて飾りだな。 すごいなぁ。
論理が逆になってるのが気づかなかっただけで 電圧が+/- 12 というのはあまり関係ないんじゃ? マーク状態の電圧みてれば あれと思ったかもしれないけど・・
最近の若いもんは って言うのが仕事な窓際さん?
…。 規格上は+-10Vって綺麗さっぱり解りやすい値で 12Vってのは太古のドライバICが必要とする電源電圧じゃないの??
あれ? rs232cは+/-15Vじゃないん 12でも15でも、分圧すればだいじょうび 入力が5Vでも十分・・・(工作の範囲で) もろ直デモ燃えるようなことはない。AVRは強い子だから・・・ しかし、USART =rs232c だけじゃないよね!
チップや規格の定格を超えた使い方は、まあ趣味の範囲なら 動けばOKでも良いだろうけど 動かないときはまずそこをつぶしておかないと何をデバッグしているのか わからなくなるかと
規格だと 速度20k距離15ftまでだけど 構内100-200mひっぱり回してもけっこう動くんだ だめなら 構内モデムとかにするけど非同期だと511通らないし・・
66 :
774ワット発電中さん :2010/07/05(月) 19:10:01 ID:PwibZo8D
+側は抵抗2個の分圧(例:10kΩ+4.7kΩ)なり、抵抗+ツェナーでVdd-vss範囲 にできるが、マイナス電圧が掛かると入力保護Di経由でGNDに流れる。 直列に抵抗を1個入れただけでは、CMOSのAVRの入力ピンはインピーダンスが 高いので、分圧抵抗としては機能しない。ただの気休め。(w 昔の仕様では8V以上くらいだったか、最近のEIA規格だと5V以上くらいで よく、実質的には3V以上程度の電圧で動く。 最新の規格上での扱いは どうだか知らないが、古いTTLレシーバもの時代から、(入力がIC内部で GNDにプルダウンされていて)オープン=0Vでも、マーク状態と同じ挙動 だった。 それと、レシーバのSN75189Aは5V単一電源だけど、ちゃんと入力に負電圧 が掛かっても壊れない回路になってる。 ±15Vは出力側の最大電圧で、MAX232やそのコンパチ品が出回る以前の、ほぼ すべての古いPCの232Cポートのトランシーバは±12V電源を使っている。 趣味の範囲なら許されるとか言ってるけど、知らないんだから仕事でも同じ ことやってそう。 以前、マイコンボード同士をシリアル通信させるのに、GND同士を繋いで いなくて、指摘したら『でも通信できてます』なんて言う香具師がいた。 ある意味、無知って最強だなと思った。
そこで抵抗1本と直列2個入りダイオードですよw ってそこまでするならトランジスタの方が良いか。
RSの受けの規格は+−5Vくらいかと、 NECのPCがアホで+−12V以上無いと識別できない糞仕様だっただけ。
70 :
774ワット発電中さん :2010/07/05(月) 19:53:36 ID:PwibZo8D
NECのPC-9801シリーズも、IBMPC-XT/AT互換機も、富士通や日立のパソコン も、当時の機器の232Cのトランスミッタ/レシーバは、ほぼ漏れなくSN75188 /SN75189Aないし相当品を使ってた。USARTにAT互換機の8250/16550とは違う 8251Aを使っていただけ。 75189Aのコントロール端子に付ける外付け抵抗 とオフセット電圧で入力ヒステリシス幅をいじれるど、±数Vの範囲で、NEC だけレシーバの感度が大きく違うという話は記憶にないな。そんなじゃ、98 同士以外とシリアル通信できんし。 出力側は±12Vを出しても、長くて細い信号ケーブルだと、配線抵抗とレシーバ の入力抵抗で分圧されて入力端子電圧が下がるんで、レシーバ側の入力電圧 の最低電圧はそれを見込んで低く設定されている。
>>66 >直列に抵抗を1個入れただけでは、CMOSのAVRの入力ピンはインピーダンスが
>高いので、分圧抵抗としては機能しない
入力インピーダンスに係わらず
>マイナス電圧が掛かると入力保護Di経由でGNDに流れる。
だろ!
じゃなきゃ よい子のAVRはとっくに昇天しとる。ハズ
>>71 それは厳密には「分圧」じゃなくて、保護Diに流れる順方向電流の電流
制限として働くだけ。
だから、入力端子電圧はVddを超える正電圧印過時には「Vdd+保護DiのVf
≒5V+0.7V」、GNDより低い負電圧印過時には「Vss−保護DiのVf≒0V-0.7V」
になる。絶対最大定格の入力電圧だな。
実際に、232Cの±12Vに直結でもデバイスが死ななかったとしたら、内部に
同様な保護抵抗が仕込んであるんだろうね。シリアルマウスの電源取った
りするくらいで、232Cトランシーバはそこそこ電流を流せるから、保護ダイ
オードだけだと、トランシーバの最大電流めいっぱい流れる。
しかし、デバイス売る方も、こんな使われ方されることまで考えて対策
する方が、論理設計よりタイヘンだろうな。
AVRやPICユーザの基本技術の低さは救いようがないな。
AVRのピンで直接リレーの駆動はできますか?
どのリレーかにも寄るだろ
試しにリレーを直接つなげて駆動してみればいい 結果は報告してくれよなw
AVR Butterflyで色々遊ぶのが初心者には無難なのかな?
論理が反転してるとスタートビットもズレるから通信できてると思っても変なデータになるよね 個人的には秋月のUSB−シリアルコンバータの使いまわしが最強かなぁ もちろん趣味レベルの話ね
>>81 論理が反転してたらフレーミングエラー出まくりで通信どころじゃ
ないよ。
アイドル状態('1'の連続)が、ブレーク状態('0'の連続)になるね。 何か送信すれば別だけど、アイドルビットの連続送信だけでは、'H'→'L'へ のレベル変化検出が起こらないので、スタートビットの開始('1'=アイドル ビットまたは直前に送信したキャラクタのストップビットから'0'=スタート ビット)が検出されないから、待機が続いている状態ではフレーミングエラー が連続する状況にはならないと思う。
>>74 一応同意しておくが、それだけマイコンが気軽に使えるようになったってことだ。
すごい盛り上がりで吹いたw
>>77 ユニバーサル基板で組んだときにコンデンサ5個つけるのは、結構面倒だったりするので
外付け無しですませられるなら、それはそれでちょっと嬉しい。
確かに高いんだけどさ
あの程度の工作をメンドウとかw
あほか、手間じゃなくて、様々なコストだろ・・・
業者に出せば一穴いくらだけど、業者に出す時点で表面実装だよなぁ・・・ こんなことだから2SC1815がディスコンになるんだよ!
1815の次は何が来るんだ?
1815ってディスコンなの? それは困る 秋月の在庫がいつまで持つか・・・
>>93 1815だけじゃなくて、リードタイプ全滅ですwww
詳しくはディスコンスレで。
digikeyからパナのチップフィルム数種についてラストオーダ・メールが来ていたけど
あっちは同等品まだあるし…
秋月の在庫は1年近くはもつと思う
96 :
94 :2010/07/08(木) 00:23:02 ID:nOVx/F92
あ、全滅なのは東芝のリードタイプね。 今回はFETとかも派手にディスコンっぽいね。
ちょっと東芝の○○さんに文句言ってくる
98 :
774ワット発電中さん :2010/07/09(金) 07:58:28 ID:XVumUnTf
1815なんて150mAぽっちだからなぁ。 普通2SC2120だろ。
100mA以上流すスイッチング用途なら最近は何も考えずにMOS-FETだなあ。 p-chもn-chもゲート電圧3.3V以下でもドライブできるのが増えてきて楽ちん。
リード部品が無くなる、て話のところへFETを持ち出すヤツって素敵w
>>99 ちょうどそんなの探してたんですが、どんなのが定番ですか?
>99 2SJ244, 2SJ279, 2SJ317, 2SJ439, 2SJ465 ... Pchの3Vスイッチは鈴商かサトーにそこそこあるけど、Nchは国内では厳しくね? DigikeyでFDN337Nだろjkというのは置いとくとして、 2SK2493位じゃ。
その辺とか直接ゲートにつないでまともに使えるのか? 負荷電流によるだろうけど
fetはすぐディスコンになる なにも考えずに使える定番がない 記号が直感的に分かり難い なんど逆につけたか
105 :
99 :2010/07/09(金) 14:37:53 ID:+VhBX9bl
流れを読んでなくてスマンかった。ちょっと大きいめの電流スイッチなら、ってつもりだった。 実際使ってるのはチップ品だしorz 定番てのはないと思います。 digikeyかmouserで(忘れた)まとめ買いして箱にころがってる、Fairchildの n-ch : FDN327N p-ch : FDN304PZ をコイルとか小型モーターのPWMドライブで深く考えずに使ってる。 どちらもVgs=1.8vでRds=100mΩくらい。電流定格2A以上。 ポート〜ゲートに100Ω直列、ゲート〜ソースに470k並列くらいかな。
>105 サンプル二つだがw FDN304Pは定番と言っていいかも。うちも標準的に使っている。 ゲート容量が大きくて遅いのと、12Vに耐えないのでこれだけで全てをまかなうのは厳しいんだよな。 >103 FDN304Pや2SJ439の1000pF越えは気をつけるとしても、2SJ244,2SJ317は100pF以下だし。 モノによるとしか。
メインのソースフィルで指定されている #define って、ライブラリとして呼び出してるソースファイルには適用されない? ヘッダファイルには届いてるっぽいんだけど
よく状況がわからないが、プリプロセッサの動作を理解していないように思える。 Cの話だよな? #defineはそれを含むソースファイル中、それの出現した位置以降にのみ影響を与え る。他のソースファイルや、バイナリリンクされるファイルには影響は与えない。
>>108 ありがとー
そのファイル内でしか有効じゃないってことかな
const でグローバル変数として設定すれば、プログラム全体で使える変数として認識してくれるのかしら
>>107-109 AVRとか、組込プログラミング以前の問題のような。
定数を定義したヘッダファイルを #include すれば、別のファイルからも
参照できるし、BASICあたりからプログラム始めたのか、ヘッダファイルの
目的や意図を理解していないのかな?
extern 宣言で外部参照扱いしていない限り、他のソースファイルは、その
変数の存在を知らないし、ライブラリはコンパイルされた時点で完結して
いるから、ライブラリ側でextern 宣言されていない場合は別の次元空間に
存在する同名の変数となるか、public 宣言されていれば、リンク時に多重
定義でエラーになる。
const宣言(Read Only属性)を付けるかどうかは無関係。
externはライブラリ側には必要ない 利用する側でexternすることで利用可能になる 存在を知らせたくない場合はstaticにする
>>111 変数をどっち(ライブラリ/アプリ)が持つかによるでしょ。
> externはライブラリ側には必要ない
> 利用する側でexternすることで利用可能になる
これは、あくまでライブラリ側が変数の実体を持って、アプリ(ライブラリ
利用側)から参照している場合。 この場合、ライブラリのヘッダで変数名が
公開されているはずなので、初期値を代入すればよく、#define で定数と
して定義する必要はない。 単に、ソースの書き方を知らないのかもしれ
ないが。
一方、ライブラリ内部に変数の実体を持たず、変数の実体を、アプリ(ライ
ブラリ利用側)に持たせるような書き方もできる。 この場合、ライブラリ
側のソースでは、extern(ヘッダに記述されている必要はない)宣言しておき、
アプリ(ライブラリ利用側)に変数の実体をもたせることもできる。この場合、
コンパイルでエラーは出ないが、変数の実体を用意せず、ライブラリを使え
ば、リンク時に参照エラー(未解決)となる。
どうも、ID:usYOWkP2 は、定数のマクロ定義(プリコンパイル時の文字列
置換)と、変数定義や、宣言の違いを理解していないように思える。
ID:lpaq6xLB どもです ライブラリと言っても、別ファイルにしたモジュール(関数)への適応です 詳しく書いてないのでよくわからないですよね、すみません ProgramA └ main.c ProgramB └ main.c Library ├ kansu.h └ kansu.c こんな感じのフォルダ構成で、ProgramA や B と増えていったときに、共通の関数にアクセスしたいと思います ところが、ProgramA と B ではクロックやマイコン自体が違うので、「#define F_CPU 20000000UL」など、それぞれのプログラム(main.c)で定数が定義されています この定数によって、kansu.c ではディレイ時間などを計算します この場合、kansu.c から main.c の F_CPU を拾えないかなって話でした ライブラリの関数に対して引数で渡せばいいんだろうけど、定義された定数を別の手段で別ファイルの関数に送らないといけないっていうのがなんか無駄かなと思った次第です 独学過ぎて基礎がなってなくて、説明まで下手でごめん
GDL ver2.3.2.1 を使ってロボ作成しようと思ったんだけど、最初から躓きが ATmega32 BTC067Bで今テストプログラム書いてるんだけど rs_printf("Hello\n");をCOMポート接続、SIMPLE TERMで f→転送→g→実行 で結果を画面に出すと文字化けされて出てくる(・変な漢字) 基盤からハンダ付け〜マイコンセットを自作でやったんだけど プログラミングが駄目なのか、作成段階でぶっ壊れたのかどっちでしょう? #include <avr/io.h> #include <avr/interrupt.h> #include <rs.h> char txb[10], rxb[10]; int main(void) { rs_init(br57600, txb, sizeof(txb), rxb, sizeof(rxb)); sei(); rs_printf("Hello\n"); return(0); } すれ違いだったら申し訳ない
それは多分、ボーレートがあってないのでは。 シンプルタームでボーレート切り替えてみてはどうでしょう
>>115 ありがとうございます。きちんと表示されました。
調べてみたところ GCC = 57600設定の、STだと115200(default)になってました。
こちら、ST変えてみた所、fとかの入力する時に既に文字化けしてしまうため、
プログラムの方を115200に修正しました。
これは環境依存で、固定になるのでしょうか?
システム→デバマネ→COM1だと9600bps
ウームム
解決した後に新たで申し訳ないのですが、
四則計算が行われないようなのですが、なぜでしょうか?
int A,B,C;
A = 10;
B = 20;
C = A + B;
rs_printf("A+B= %d", C);
結果としては gA+B= カーソル位置で、結果が出ません。
Cでは問題ない書き方だと思いますし、他サンプル見てもprintf内は問題ないと
思うのですが、こちらもまた設定になるのでしょうか?
117 :
116 :2010/07/12(月) 16:05:42 ID:OiOq5WBg
失礼しました。 四則演算の方は解決しました。 A+B =%d 123456 の6文字までしか表示されないんですね… Bと=の間に空白があったため、なかったようです。 10+20の結果が3となって表示されました。(0が足りない) うーむsizeofで10とっているのに6文字 8bitだとしても 1 2 4 8 / 16 32 64 128 でもうちょっと表示してくれてもいいような気がするのですが… 何ででしょう?
>>113 #defineされた定数はそのファイル内でしか見えないので、ライブラリ(に限らずバイ
ナリでリンクされるオブジェクト)に対しては引数で渡すのが正解。
もしそのライブラリ内で何度も使う予定があるなら、ライブラリの初期化時に一度だけ
渡して、ライブラリ自身のグローバル変数にでもコピーしておくとよい。
別のやり方としては、ライブラリのヘッダー(例としてhoge.h)に
#define T2DIV(FREQ) ((unsigned int)(F_CPU / FREQ))
void hoge_setdiv(unsigned int d);
とか書いておき、
それぞれのプログラムから
#include "hoge.h"
#define F_CPU 20000000UL
void fuga(void)
{
hoge_setdiv(T2DIV(1000)); /* 1kHz */
}
のように呼び出す手もある。少し融通はきかなくなるが、定数項がコンパイル時に計算
されるので速いコードが生成される。ただ、F_CPUの定義を忘れたりするとわかりにくい
コンパイルエラーが発生するので要注意。
>>118 やっぱりそのソースファイル内でしか使えないのね
ただひとつだけ釈然としない点があって、
そもそも何故そんなことを思ったのかというと、例えば標準ライブラリの delay.h とかで #ifndef F_CPU とか使われてますよね
これって、int main(void) のあるソースファイルで定義した定数(F_CPU)をちゃんと認識していて、定義しないと「# warning "F_CPU not defined for <util/delay.h>"」がしっかり機能している
main.c で #define された定数が別のファイルで参照されている事例だと思うのですが、どうなんでしょ?
>>116-117 >>116-117 おそらく、通信速度(ボーレート)の設定誤差。
16MHz(16000000Hz)クロックから、115200bps(×16クロック)を生成しようとする
と、ボーレート分周比が割り切れない値(≒8.68)になる。 下記データシートの
143/346ページ参照。
ttp://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf UBRRレジスタには整数値しか設定できないので、切り捨てられた小数点以下の
差が、ボーレート誤差となる。
より誤差が少なくなるよう、小数点以下を四捨五入して「9-1=8」を設定して
いた場合でも、実際の通信速度は111,111bps(-3.5%)になる。
57,600bps(×16クロック)でもやはり分周比は割り切れない値(≒17.36)になるが、
小数点以下を丸めた値(17-1=16)を設定した実際の通信速度は58,824bps(+2.1%)
と誤差が少なくなる。
38,400bps(×16クロック)であれば、分周比はほぼ整数(≒26.04)になり、小数
点以下を丸めた値(26-1=25)を設定した実際の通信速度は38,462bps(+0.16%)
とほとんど誤差がない。
ボーレート誤差が大きくなると、キャラクタの後ろ(上位)bitほど同期がずれて
データがうまく拾えなくなる。 ただし、bitの切れ目の区別があるわけではない
ので、「パリティなし」の場合、上位bitが'1'の連続したキャラクタは続くスト
ップビット(1)やアイドル状態('1'の連続)をデータとみなされて、正常受信でき
たりする。
>>119 ==
>>113 >>112 前者の(ライブラリ側が変数の実体を持つ)やり方で解決する場合 ...
kansu.c 内で「F_CPU」を直接参照するコードを書かず、
unsigned long s_numCPU_ClockFreq=F_CPU;
とでもグローバル変数を定義しておいて、s_numCPU_ClockFreqの値を使う。
一方、main.c側では、
extern unsigned long s_numCPU_ClockFreq; /* 別のファイルで変数が定義されていることを宣言 */
void main()
{
s_numCPU_ClockFreq=F_CPU;
}
とすることで、main.cを含むプロジェクトをビルドする際に指定した、
F_CPUの値で、プログラム開始時にs_numCPU_ClockFreq中身を書き換える
ことができる。
ライブラリ側で変数をstatic宣言して隠蔽し、値をセットしたり取得
したりするヘルパ関数を別途用意してもいい。
>>112 後者の(アプリ側が変数の実体を持つ)やり方で解決する場合 ...
kansu.c 内で「F_CPU」を直接参照するコードを書かないのは同様、
extern unsigned long s_numCPU_ClockFreq; /* 別のファイルで変数が定義されていることを宣言 */
しておいて、s_numCPU_ClockFreqの値を使う。一方、main.c側で、
unsigned long s_numCPU_ClockFreq=F_CPU;
とする。
avr-gccに付いてくる標準ライブラリ(avr-gccフォルダ内の /include/util/delay.h 参照)
のdelay_ms()等は、ヘッダのソースを見れば判るけど、F_CPUの値を直接参照して中身の
ループ回数を決定しており、のこの方法では解決できない。
また、delay_ms()は、通常の関数(サブルーチン)ではなく、インライン関数として展開
されたコードがそれぞれの場所に埋め込まれている。
delay.h から関数を自分のソースへコピペして、delay_ms() → my_delay_ms()などと
別の関数名として、F_CPUの値を使っている部分を、s_numCPU_ClockFreqに置き換え、
delay_ms() の代わりに my_delay_ms() を呼べばいい。
ただ、毎回doubleの値から計算すると誤差が大きいので、1ms単位等のループ回数を
main()の最初で1回だけ計算してグローバル変数に格納しておき、[N]msのディレイ
が必要な場合には、delay_1ms()関数を[N]回呼ぶというネスト構造にした方がいい。
>>119 delay.hがコンパイル時に使われるのはdelay.hをどこかのソースで#includeしたとき。
だからmain.cがdelay.hを#includeしていればmain.cのコンパイル時にmain.cでF_CPU
が#defineされているかどうかをチェックする結果になる。
ヘッダーファイルにライブラリに存在する関数の定義があったとしても、コンパイラ
から見ればそのヘッダーファイルとライブラリオブジェクトには何の関係もない。
(手違いでライブラリとそれに対応するヘッダーの内容が食い違っていると大惨事が
起きることがある)
>大惨事 pgrw
今ふと思いついたが、もし ・68000のようにアドレスレジスタとデータレジスタが別にあるアーキテクチャで ・引数がレジスタ渡しでコンパイルされる の環境が存在すると foo.c: void wrmem(char *p,char x) { *p = x; } bar.c: void wrmem(char x,char *p); /* 実体(foo.c)とプロトタイプが一致してない! */ void hoge(char *buf) { wrmem(0,buf); } みたいなのが普通に動いちゃったりするんだろうか…もちろん特大の地雷になるが…
>地雷 pgr w
誰かincludeの動作を説明してやれよw ・defineが有効なのは、コンパイラに渡されたそれぞれの"ファイルの内容"の中でのみ(もちろんdefine以降) ・incudeは、コンパイラに渡す前にプリプロセッサによってincludeされたファイルで置き換えられる なので、includeされたファイルは、include元の"ファイルの内容"に含まれてコンパイルされる includeは、指定したファイルの内容を自動でコピペしてくれてるってこと
それを言うならincludeの動作じゃなくてプリプロセッサの動作だろ
わからない人間を指してw付けるのは何となく程度が低いかなっと
せっかくいいこと書いてるのに、
>>126 はツンデレだな
で、delay.hの件は
>>122 に、
includeの動作は
>>126 に書いてあるとおり
ソースをmain.cとsub.cとかに分割した場合、動作のイメージとしては
1.main.cに対してmain.c内に記述されたincludeをコピペ
2.コピペされて完全体となったmain.cを単体でコンパイル
3.sub.cも同様に単体でコンパイル
4.出来上がったオブジェクトファイルとかライブラリとかをリンク
細かいコンパイラの動作はともかく、概念はこんな感じ
コンパイラディレクティブの使い方がわからんというより、 プログラムを複数のソースファイルに分割する設計のパターンがわからんのだろうな。 「main.cの中でdefineされたシンボルの定義をkansu.cにも行き渡らせたい」 というのはすでにおかしな方向に行こうとしてるわけで、 「共通のシンボルを定義するヘッダファイルを作り、それを各.cファイルからincludeする」 という定番の方法を教えてあげれば済む話だと思う。
基本的にF_CPUは最終的なhexを生成するMakefile上で 定義するもので、makeでリビルドされないライブラリから F_CPUのような定数を参照したい場合には、ライブラリの 関数引数などで動的にユーザーから渡してもらう。 基本的にこの戦略以外は取ってはならないと思うよ。 あるいは、ライブラリをサポートするF_CPU毎に分ける。
ただしavr-gccの生成コード効率面から言えば、 こういった定数を動的に渡す戦略はありえないので、 F_CPU(Makefile)が変わる度に、ライブラリを含めた 全体のリビルドを行わせた方が良い・・
ってか、avr-gcc使ってる限りはCPU速度をプロジェクトで設定すれば、わざわざソースで書かなくても良いような・・・ 勝手にコンパイラオプションで渡してくれるし makeも普通に使ってりゃ生成してくれたので十分だ
133 :
116 :2010/07/13(火) 08:48:46 ID:a91YzZMO
>>120 詳しい説明ありございます。データシートもDLし見ました。
うーん、設定が悪いのかやはりうまくいきません。
一番良い状態がやはり GDLで
char txb[10],rxb[10];
main関数内で rs_init(br115200, txb, sizeof(txb), rxb, sizeof(rxb));
sei();
int 計算用変数〜計算
rs_printf("A+B=%d", C);
STプロパティ(ボーレート115200) で、結果が
A+B=3になります。(6文字までしか出ない本来の結果は10+20=30)
ボーレートも色々変更してみましたが、最終的に
STのプロパティは115200(default)でないと、GDL設定で色々変更しても
ATL1.2 や、 f:~~~ g:~~~の画面が文字化けしてしまい、何もできないこと
300〜115200までしか幅を変えれなかったので、パターンを試してみましたがだめでした。
プログラムとかではなくて転送が判らないのが全く判らない…
そして上のほう見てて思ったのだけれど、プログラム全体でマクロ定義したものを使いたい
のであれば、
sharedata.h(共有データ.ヘッダー)を作ってそこに#define XXXX (yy)
みたいなのを作ればいいんじゃないのかな?
皆さんありがとう 大変参考になります まだなんか分かりかねる挙動なので教えてください 以下のファイルがあるとします(プログラム的な実用性は別として) ・Usart.h -------------------------------------------------- #ifndef F_CPU #warning "Usart.h [The F_CPU is not set. It provisionally sets it to 1MHz.]" #define F_CPU 1000000UL #endif #ifndef U_BAUD #warning "Usart.h [The U_BAUD is not set. It provisionally sets it to 9600bps.]" #define U_BAUD 9600 #endif -------------------------------------------------- ・Main.c -------------------------------------------------- #define U_BAUD 19200 #define F_CPU 20000000UL #include "Usart.h" int main(void) { while(TRUE){nop();} } --------------------------------------------------
これをコンパイルすると、下のようなソースをコンパイルしたのと同じだと思ってるわけです
・Main.c
--------------------------------------------------
#define U_BAUD 19200
#ifndef F_CPU
#warning "Usart.h [The F_CPU is not set. It provisionally sets it to 1MHz.]"
#define F_CPU 1000000UL
#endif
#ifndef U_BAUD
#warning "Usart.h [The U_BAUD is not set. It provisionally sets it to 9600bps.]"
#define U_BAUD 9600
#endif
int main(void)
{
while(TRUE){nop();}
}
--------------------------------------------------
ところが、これをコンパイルすると、警告として「Usart.h [The U_BAUD is not set. It provisionally sets it to 9600bps.」が表示されてしまうということで、
>>107 を投稿したのです
それでも何故か、F_CPU の警告は出ないので「ヘッダファイルには届いてるっぽい」という一文はここから来てます
自分の理解力の問題なんだろうけど、わからん!
>>135 +#define F_CPU 20000000UL
#define U_BAUD 19200
書き忘れです
137 :
116 :2010/07/13(火) 10:08:13 ID:a91YzZMO
>>135 mainでdefineする意味あるの?hとぶつかりあってる気がするけど…
個人的には#include から始まって、次に#defineのほうがいいと思ったりもする
mainでU_BAUDとF_CPUをマクロ定義して、User.h呼び出し
そしてUser.hでもifndef = 定義されていないだから
F_CPUが#defineされて、mainと被る warningに文字セット
更にしたにいってU_BAUDもifndefだから通過してmainのU_BAUDと被る
んでwarningに#defineで入ってるのに更にぶち込もうとしてるわけで…
かくなら
mainは
#include "User.h"だけにして
User.hのwarningをwarning1とかwarning2とかにしたらいいんじゃない?
一緒のwarningじゃないとダメなのかしら
間違ってたらゴメン
138 :
116 :2010/07/13(火) 10:13:02 ID:a91YzZMO
>>135 多分mainにするとこんな感じ
#define U_BAUD 19200
#define F_CPU 20000000UL
#warning "Usart.h [The F_CPU is not set. It provisionally sets it to 1MHz.]"
#define F_CPU 1000000UL
#warning "Usart.h [The U_BAUD is not set. It provisionally sets it to 9600bps.]"
#define U_BAUD 9600
int main(void)
{
while(TRUE){nop();}
}
main.cの値はUser.hにはいかない(’’
>134 その書き方自体は合ってるぞ。それでwarningが出る筈はない。 おかしいところは他にある。
>>134-136 既に
>>139 氏が指摘しているが、
「#define U_BAUD 19200 」よりも後の行で「#include "Usart.h"」している
>>134 の main.c をコンパイルしたのなら、そもそも、
「Usart.h [The U_BAUD is not set. It provisionally sets it to 9600bps.」
という警告は出ないと思う。
F_CPU の警告が出ないのは、おそらく「AVR Studio」内でプロジェクトの一部と
して作成してビルドしていて、プロジェクト設定の「General」タブのCPUクロック
設定(Frequency: xxxxxxxx Hz)から、「-DF_CPU=xxxxxxxxUL」というコンパイル
オプションが自動生成されているからでしょう。
ただ、プロジェクト設定と異なる「#define F_CPU ...」を、「#ifndef 〜 #iendif」
で囲まないで、ソース中に記述していると、再定義エラーになると思う。
「Project Options」ウィンドウの、左リボンで「Custam Options」を選べば、
「Custom Compilation Options」の右側リストボックスに、クロック設定が
反映された「-DF_CPU=xxxxxxxxUL」があるはず。
「AVR Studio」の[Build]-[Export Makefile]メニューからmakeファイルを生成し、
作成されたAmakeファイルの中の「CFLAGS += ...」の行から「-DF_CPU=xxxxxxxxUL」
の部分を消して、コマンドラインから「make」するなり、コマンドプロンプトから
直接avr-gccのコンパイルを実行すれば、「U_BAUD」の扱われ方と同じ結果になる
はず。
今回のような場合は、以下のようなコードで解決できる。 ● LibUsart.h -------------------------------------------------- #ifndef F_CPU #warning "Usart.h [The F_CPU is not set. It provisionally sets it to 1MHz.]" #define F_CPU 1000000UL #endif #ifndef U_BAUD #warning "Usart.h [The U_BAUD is not set. It provisionally sets it to 9600bps.]" #define U_BAUD 9600 #endif void SetCpuFrquency(ULONG nClockFreq); void SetBaudRate(USHORT nSpeed); -------------------------------------------------- ● LiLibUsart.c -------------------------------------------------- #include "LibUsart.h" static ULONG s_dwCpuFrquency=F_CPU; // ここでの初期値は LibUsart.c コンパイル時の「F_CPU」 static USHOT s_wBaudRate=U_BAUD; // ここでの初期値は LibUsart.c コンパイル時の「U_BAUD] void SetCpuFrquency(ULONG nClockFreq /**< CPU動作クロック(Hz単位) */ ) { if(!s_dwCpuFrquency) // 0Hzで初期値に戻す s_dwCpuFrquency=F_CPU; else s_dwCpuFrquency=nClockFreq; SetBaudRate(s_wBaudRate); // CPUクロック変更でボーレートを再計算して設定 } void SetBaudRate(USHORT nSpeed /**< 通信速度(bps単位) */ ) { // USART機能(Tx/Rx)停止 ... Code省略 if(!nSpeed) // 0bpsでデフォルト(O除算エラー防止を兼ねる) nSpeed=U_BAUD; // nDiv=(UINT)(((double)s_dwCpuFrquency)/(16.0*nSpeed)+0.5)-1; UBRR=nDiv; // USART機能(Tx/Rx)開始 ... Code省略 } --------------------------------------------------
(続き) ● MyProject.h -------------------------------------------------- #ifndef F_CPU // コンパイルオプション「-DF_CPU=xxx」未設定時に適用 #define F_CPU 2000000UL // 今回のCPUは2MHzとする(デフォルト) #endif #ifndef U_BAUD // コンパイルオプション「-DU_BAUD=xxx」未設定時に適用 #define U_BAUD 38400 // 今回のUARTは38400bpsとする(デフォルト) #endif #include "LibUsart.h" -------------------------------------------------- ● main.c -------------------------------------------------- #include "MyProject.h" // プロジェクト共通の定義 int main(void) { SetCpuFrquency(F_CPU); SetBaudRate(U_BAUD); … } --------------------------------------------------
CPU速度をハードから読み取れるようには出来ないんでしょうか?
>>143 君が自分の速度を読み取るときには何を使いますか?
早く動いていると重くなるとかか?
>>143 絶対精度を知るなら、外部から基準になるパルスを与えなければ無理だろ
単純にマイコンのクロックを出すならCLKOUTのヒューズを立てればPB0から出る
そのパルスをカウントしろ
147 :
774ワット発電中さん :2010/07/13(火) 21:29:45 ID:yrFXbgdm
>>144-145 モールドパッケージの体脂肪率をA/Dで計測して、メタボ率を...。
>>146 CLKOUTのパルスを数えるにしても、自身が何MHzの水晶で駆動されているか
わからないのに、32.768kHzのRTCとか、確実な時間単位がわかるハードが
ないとダメだと思うが?
内蔵タイマを使って[N]msといった基準時間を作る場合には、あらかじめ
F_CPUなどから分周比を計算しておく必要がある。
精度はともかく、一時的に内蔵RC発振(例えばmega328Pなら8MHzの1択)に切り
替えてやれば、基準時間はF_CPU=8000000UL決め打ちで時間を作れるが、内蔵
RC発振で動いている状態では、外部発振の水晶は止まっている。
WDT(約128kHz)を走らせて、WDT割り込みがかかるまでにいくつタイマーが カウントできるかで、おおまかなクロック周波数は分かるよ。 AT90USB162 のブートローダーは 8MHz/16MHz X'talのどちらが接続されてるかを この手法で判定して、USBブロックに 8MHz入力するように PLLCSRを設定してる。
勉強になるな
150 :
116続 :2010/07/15(木) 08:38:06 ID:qx/f7NWJ
何とか何とか進めていって、サーボモーターで躓いてしまったorz 2日悩んだけど解決しない… BTC067Bで、マイコン=9Vアルカリ電池→5Vレギュレータ変換 サーボ=1800mAh単三ニッケル水素電池*4 =テスタでみると5.8-5.9V位 サーボから伸びている線が 端子が出ていない方向から見て 橙 赤 茶 多分これは、 橙=信号 赤=V 茶=GND だと思うんだ んでサーボを1*40ピンから切り取った奴(3つニョキ)接続 回路図的には、 橙→1kΩ→PC0 赤→+電圧(赤線) 茶→スイッチ につなげてるんだが、全く動かない 接続している部分(|||←ピンにグリグリ押し込むとピクピク動く) んで逆にしてみるとやっぱりピクピク動くが、ピーという異音が聞こえてくるときと 変な回転を始める時がある(マイコン電源切ってても回転始まった) 目視してる分にはハンダ同士の接触は見られない テストに、初期搭載されているLEDを点滅させるよう送ってみたらきちんと点滅した プログラム的にも多分問題はなさそうとは思うんだけど、やはりハンダ付けだろうか… プログラムに続く
151 :
116続 :2010/07/15(木) 08:59:02 ID:qx/f7NWJ
プログラム #include <avr/io.h> //IO #include <avr/interrupt.h> //割り込み #include <avr/signal.h> //割り込みベクタ #define WAIT_TIME (500)//500ms(0.5秒) #define MSEC_TIME (250)//1ms #define GO (90) #define BACK (120) #define INTERRUPT (40000) //20s毎に割り込み //グローバル変数 char G_servoPos; //サーボ角度 SIGNAL(SIG_OUTPUT_COMPARE0) { PORTC &= ~(1 << PC0); TCCR0 &= ~(1 << CS02); TCNT0 ^= TCNT0; } SIGNAL(SIG_OUTPUT_COMPARE1A) { PORTC |= (1 << PC0); OCR0 = G_servoPos; TCCR0 |= (1 << CS02); } //プロとタイム宣言 void waitMs(int msec); //待機関数
152 :
116続 :2010/07/15(木) 09:00:37 ID:qx/f7NWJ
プロトタイプ宣言だったすまん //メイン関数 int main(void) { //PC0設定 DDRC |= (1 << PC0); PORTC &= ~(1 << PC0); //タイマーカウント1設定 TIMSK |= (1 << OCIE1A); TCCR1B |= (1 << WGM12); OCR1A = INTERRUPT; //タイマーカウント0の設定 TIMSK |= (1 << OCIE0); SREG |= (1 << SREG_I); TCCR1B |= (1 << CS11); while(1){ G_servoPos = GO; waitMs(WAIT_TIME); G_servoPos = BACK; waitMs(WAIT_TIME); } } void waitMs(int msec) { int cnt; //引数分待機 for(cnt = 0; cnt < msec; cnt++){ TCNT2 = 0x00; //1ms待機 while(TCNT2 < MSEC_TIME){ ; } } } 使用サーボは GWS S03T / 2BB トルク 8.0kg-cm 速度0.27sec/60゜(6V) 重量 46g サイズ 39.5x20.0x39.6mm パルスモニターを持っていないんだがやっぱり買うべきかなぁ…
>>150 > 回路図的には、
> 橙→1kΩ→PC0
> 赤→+電圧(赤線)
> 茶→スイッチ
> につなげてるんだが、全く動かない
とりあえずソフトはまだ見てないが、定数の定義が正しいとしたら、
サーボのパルス周期が長すぎる気がするな。...
気になったのだが、「茶→スイッチ」の「スイッチ」の先はどこへ?
動いているんだから、サーボ電源の「0V」へ繋がっているのか?
それと、サーボ用電源(1800mAh単三ニッケル水素電池*4)の「0V」と、
BTC067Bマイコン用電源(9Vアルカリ電池)の「0V」はちゃんと接続して
あるよな?
それぞれの電圧はあくまでそれぞれの「GND(0V)」からの相対的な電位で
あって、絶対零度みたいに、どこから見ても0Vとか存在しないから。
ゆとり教育の成果のあらわれなのか、どうも最近は、基本的なコトを知ら
ずに電気やソフトいじってる香具師が多い。
まだ個人の趣味ならいいが、それを仕事でやってたりする。
もはや驚きを通り越して怖い。知らないって最強かも。
154 :
116続 :2010/07/15(木) 10:47:43 ID:qx/f7NWJ
>>153 橙→1kΩ→PC0
赤→+電圧(赤線)
茶→スイッチON部分→マイコンのGND(マイコン接続とは反対側)
スイッチの中央部分はサーボ用のGNDと接続
マイコン用のスイッチとサーボ用のスイッチで分けてある
簡単な回路図(回路図モドキになってしまうが)ちょっと書いてみる
ウェイト用のタイマ2の分周比とタイマスタートはどこいった?
156 :
116続 :2010/07/15(木) 11:03:23 ID:qx/f7NWJ
>>154 まずは、何がやりたい目的(できるだろうという考え)で、わざわざ[GND]
同士の間にスイッチを入れているのか、それから聞いてみようか?
158 :
116続 :2010/07/15(木) 11:17:18 ID:qx/f7NWJ
>>157 マイコンだけの電源とサーボだけの電源を分けたかった為
マイコンだけの処理をしたいときにサーボも動いたら困るなーと
最も電池を抜けばいいじゃないって言われたら確かに、って今更に
思ったけど
159 :
116続 :2010/07/15(木) 11:33:33 ID:qx/f7NWJ
>>155 ごめん、抜けてたわ…
修正コメント加筆 連レスすまん
#include <avr/io.h> //IO
#include <avr/interrupt.h> //割り込み
#include <avr/signal.h> //割り込みベクタ
#define WAIT_TIME (500)//500ms(0.5秒)
#define MSEC_TIME (250)//1ms
#define GO (90)
#define BACK (120)
#define INTERRUPT (40000) //20s毎に割り込み
//グローバル変数
char G_servoPos; //サーボ角度
//タイマカウンタ0の比較割り込み
SIGNAL(SIG_OUTPUT_COMPARE0)
{
PORTC &= ~(1 << PC0); //割り込みが発生した場合PC0を0にする
TCCR0 &= ~(1 << CS02); //同時にタイマカウンタ停止(256分周)
TCNT0 ^= TCNT0; //タイマカウンタ0を初期化
}
//タイマカウンタ1の比較割り込み
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
PORTC |= (1 << PC0); //割り込みが発生した場合PC0を1にする
OCR0 = G_servoPos; //比較レジスタに位置(角度)を保存
TCCR0 |= (1 << CS02); //タイマカウント0をスタート(256分周)
}
//プロトタイプ宣言
void waitMs(int msec); //待機関数
160 :
116続 :2010/07/15(木) 11:34:38 ID:qx/f7NWJ
//メイン関数 int main(void) { //PC0設定 DDRC |= (1 << PC0); //特殊レジスタにPC0set PORTC &= ~(1 << PC0); //0でAND //タイマカウント1設定 TIMSK |= (1 << OCIE1A); //タイマカウント1比較割り込み Aを許可 TCCR1B |= (1 << WGM12); //タイマカウント1をCTCモード OCR1A = INTERRUPT; //20ミリ秒(8分周)セット //タイマーカウント0の設定 TIMSK |= (1 << OCIE0); //タイマカウンタ0の比較割り込みを許可 SREG |= (1 << SREG_I); //全ヶ所割り込み許可 TCCR1B |= (1 << CS11); //タイマカウント1 20ミリ秒(8分周)開始 //無限ループ while(1){ G_servoPos = GO; //角度を90度に設定 waitMs(WAIT_TIME); //0.5秒停止 G_servoPos = BACK; //角度を120度に設定 waitMs(WAIT_TIME); //0.5秒停止 } } //指定された時間動作を待つ関数 void waitMs(int msec) { int cnt; //待機時間計算用 TCCR2 |= (1 << CS22); //64分周でタイマカウンタ2を開始 //引数分待機 for(cnt = 0; cnt < msec; cnt++){ TCNT2 ^= TCNT2; //タイマカウント2初期化 //1ms待機 while(TCNT2 < MSEC_TIME){ ; //タイマカウント2が250以上になったら抜ける } } }
>>158 低電圧だからいいけど、GNDは接続して、電源スイッチは+側に入れるべき。 本当に動く
状態に接続されているのか、ソフト側の問題なのか、話の続きはそれからだ。コピぺでは、
問題を切り分ける能力は身に付かない。
とりあえず、割り込みやPWMを使わずに、PWMパルスをPC0へ出すコードを適当に書いてみた。
メモ帳で書いてコンパイルできるかどうかも試していないのであしからず。
配線があっていれば、おおむね4秒周期でサーボが首振り動作するはず。
//-------------------------------------------------------------------------------
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#define SERVO_PORT PORTC // サーボ制御パルス信号出力に使うポートの定義
#define SERVO_CTRL (0) // サーボ制御パルス信号出力に使うポートのbit位置(0=bit0)
void main()
{
bool cw_ccw=false;
int nPulseCount,nPulseWidth_H,nPulseWidth_L;
int nSpeedCount;
volatile uchar *pDataPort;
pDataPort=SERVO_PORT; // サーボ制御パルス信号出力に使うポート(PORTx)
*(pDataPort-1)=(1<<SERVO_CTRL); // データ方向レジスタ(DDRx)
nPulseWidth_H=15; // 初期位置=1.5ms(中心)
for(;;) // 無限LOOP
{
for(nSpeedCount=0;nSpeedCount<10;nSpeedCount++) // 何パルス出力したらサーボ角度を変更するか(20ms単位*10=200ms=0.2ms)
{
nPulseWidth_L=20-nPulseWidth_H; // 'L'期間を求める
*(pDataPort)|=(1<<SERVO_CTRL); // サーボ制御パルス信号出力=On('H')
for(nPulseCount=0;nPulseCount<nPulseWidth_H;nPulseCount++)
delay_us(100); // 0.1ms単位
*(pDataPort)&=~(1<<SERVO_CTRL); // サーボ制御パルス信号出力=Off('L')
for(nPulseCount=0;nPulseCount<nPulseWidth_L;nPulseCount++)
delay_us(100); // 0.1ms単位
for(nPulseCount=0;nPulseCount<(200-20);nPulseCount++) // 全体周期の調整(20ms-2ms)
delay_us(100); // 0.1ms単位
}
if(cw_ccw)
{
if(++nPulseWidth_H>=20) // 2.0ms以上になったら
cw_ccw=false; // パルス幅減少方向へ(回転方向の反転)
}
else
{
if(--nPulseWidth_H<=10) // 1.0ms以下になったら
cw_ccw=true; // パルス幅増加方向へ(回転方向の反転)
}
}
}
//-------------------------------------------------------------------------------
163 :
116続 :2010/07/15(木) 13:32:39 ID:qx/f7NWJ
>>161 サンプルありがとう
確かにGNDにスライドスタートは変な気がする
とりあえずサンプルが動くかチェックしてみる
まだコードの動きが全部分かったわけじゃないから解読中だけど
分からない所が
コンパイルエラーとしてはcにはbool型がないので
そこは#define false (0) true (1)とtypedef int boolで直したら
消えたんだけど
volatile uchar *pDataPort;
が良く分からない。
今調べてる最中だけど、
volatileはボーレートを、unsigned char型のポインタ型で宣言して
ポインタに、SERVO_PORT PORTを入れる
PORTに関してはPORTCを使っているからこれを
#define SERVO_PORT PORTCに変更
エラーがやっぱり
volatile uchar *pDataPort;だけ残っている
後は警告で
for(nPulseCount=0;nPulseCount<nPulseWidth_H;nPulseCount++){
delay_us(100);// 0.1ms単位
}
のdelay_usに発生(他の場所はなし)
もうちょっと考えてみる
こういった何だろう、C言語入門だとか見たいに初心者でも分かりやすく
書いてあるお勧めのサイトとかあったら教えて欲しい
164 :
116続 :2010/07/15(木) 13:39:15 ID:qx/f7NWJ
>>162 携帯今日持ってきてないから、問題解決出来なかったら
明日にはupするわ…
最も何回もハンダ→取り外しやってたら基盤のワッカが取れて
ハンダが流れこまなくなって違う場所に移設→配線で酷い事になってるんだが・・
基盤自体は100円だし、買い換えるしかないか…
コードに関しては、次書く機会あったら是非活用させて貰うわ
エラー内容
testPro.c:17: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
testPro.c:17: error: 'pDataPort' undeclared (first use in this function)
testPro.c:17: error: (Each undeclared identifier is reported only once
testPro.c:17: error: for each function it appears in.)
testPro.c:31: warning: implicit declaration of function 'delay_us'
> エラーがやっぱり > volatile uchar *pDataPort;だけ残っている 下記のように、「uchar」→「unsigned char」に変更。 volatile unsigned char *pDataPort; あるいは、 typedef unsigned char uchar で、エラーは出なくなるかと。つい、いつものクセが出て。(w バイト型のデータポートを指す「pDataPort」ポインタを介して、I/O レジスタにアクセスしているだけ。 なんでかと言うと、「DDRx」と 「PORTx」を別々に#defineすると、片方だけ修正し忘れとかするんで。 全部のAVRについて調べたわけじゃないけど、「DDRx」は「PORTx」の1つ 下の番地(アドレス)にあるので、pDataPortに。PORTxの番地(アドレス)を セットしておくと、 *(pDataPort)=nByteData; // 「PORTx」レジスタへの値の書き込み *(pDataPort-1)=nByteData; // 「DDRx」レジスタへの値の書き込み となる。今回のようなケースでは、余りメリットはないが、関数へレジスタ のアドレスを渡すような時に使える。 void PortPullUp(volatile BYTE *pPORT,BYTE cData,BYTE cMask) { *(pPORT )|=(cData&cMask); *(pPOR-1)=cMask; } PortPullUp(PORTB,0x05,0x55); PortPullUp(PORTC,0x0A,0xAA); > testPro.c:31: warning: implicit declaration of function 'delay_us' こっちは、プロトタイプ宣言がないという警告。 「delay_us」→「_delay_us」先頭に'_'(アンダースコア)付きに変更で エラーは出なくなるかと。 _delay_us()自体は'[C:\WinAVRxxxxxxxx/avr/include/]util/delay.h'で マクロ定義されているインライン関数。
166 :
116続 :2010/07/15(木) 15:15:25 ID:qx/f7NWJ
>>165 コメント+分かりやすい説明有難う
_付ければいいなんて目から鱗だわ
@アドレス位置も確かにって感じで、スッキリして良い
結論から言うと
ハンダor配線がやっぱり駄目なようだ_|=|○
プログラムをf→gで送っても駄目だし、SWをOFF→ONにしてもうんともすんともいわない
基盤がもう駄目な子だから、今使ってる基盤より一回り位大きいの買って再セット
してみるわ
再セットしても駄目だったらまたきます…
取りあえず、修正してまとめて追加したテスト用コード一応載せておきます
167 :
116続 :2010/07/15(木) 15:16:59 ID:qx/f7NWJ
http://ja.pastebin.ca/1900864 URLが出来るのね
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#define SERVO_PORT PORTC// サーボ制御パルス信号出力に使うポートの定義
#define SERVO_CTRL (0) // サーボ制御パルス信号出力に使うポートのbit位置(0=bit0)
#define false (0) // false擬似BOOL
#define true (1) // true 擬似BOOL
typedef int bool; // BOOL型作成
int main(void)
{
bool cw_ccw=false; //サーボの回転方向判定セット
int nPulseCount,nPulseWidth_H,nPulseWidth_L;
int nSpeedCount;
volatile unsigned char *pDataPort; //Byte型データポートへのポインタ作成
pDataPort=SERVO_PORT;// サーボ制御パルス信号出力に使うポート(PORTC) をセット
*(pDataPort - 1) = (1 << SERVO_CTRL);// データ方向レジスタ(PORTC($15-1) = DDRC($14))
nPulseWidth_H = 15;// 初期位置=1.5ms(中心)
for(;;)// 無限LOOP
{
for(nSpeedCount = 0; nSpeedCount < 10; nSpeedCount++)// 何パルス出力したらサーボ角度を変更するか(20ms単位*10=200ms=0.2ms)
{
nPulseWidth_L = (20 - nPulseWidth_H);// 'L'期間を求める
*(pDataPort) |= (1 << SERVO_CTRL);// サーボ制御パルス信号出力=On('H')
for(nPulseCount=0; nPulseCount < nPulseWidth_H; nPulseCount++){
_delay_us(100);// 0.1ms単位
}
*(pDataPort) &= ~( 1 << SERVO_CTRL);// サーボ制御パルス信号出力=Off('L')
for(nPulseCount = 0; nPulseCount < nPulseWidth_L; nPulseCount++){
_delay_us(100);// 0.1ms単位
}
for(nPulseCount = 0; nPulseCount < (200 - 20); nPulseCount++){// 全体周期の調整(20ms-2ms)
_delay_us(100);// 0.1ms単位
}
}
if(cw_ccw == true){
if(++nPulseWidth_H >= 20){// 2.0ms以上になったら
cw_ccw=false; // パルス幅減少方向へ(回転方向の反転)
}
}
else{
if(--nPulseWidth_H <= 10){// 1.0ms以下になったら
cw_ccw=true; // パルス幅増加方向へ(回転方向の反転)
}
}
}
return(0); //正常終了
}
169 :
161 :2010/07/15(木) 16:19:17 ID:6pVDJzx8
自己ふぉ。(;_;) ... さらに訂正追加(T_T) [誤] pDataPort=SERVO_PORT; // サーボ制御パルス信号出力に使うポート(PORTx) ↓ [正] pDataPort=&SERVO_PORT; // サーボ制御パルス信号出力に使うポート(PORTx) [&]をつけないと、pDataPortにはI/Oアドレスではなく、I/Oポートから読んだ 値がアドレス値として入り、全然関係ないポートにアクセスしてしまう。 面倒なので、試しに手元のハードで動かしてみた。サーボモータを繋いでいない けど、一応オシロでポート出力を確認して、ちゃんと動いている。 _delay_ms()や、_delay_us()は、ソフトループで実現しており、クロック 依存なので、ビルドする際は、AVR Studioのプロジェクト設定またはMAKEの オプションで、「F_CPU(CPU Frequency:Hz単位)」を正しく設定して、クロ ック周辺のヒューズ設定も確認すること。
最初の質問見て、なんとかしてやろうか、と思ったが 未読を読み進めるうちに萎えた
おまいらのせいでレスが止まったじゃないか 何か話題振れよ
若者のAVR離れか
みんなArduinoに流れたとか?
Arduinoは実験、仮組みで使うものだろうから(完成品の度に買い足すわけない) 仮にユーザーが増えたんなら、AVR入門者層が厚くなったってことで、まぁいいことだろう。
あれをAVR入門というのもちょっとなぁw
Arduinoは、邪道です。 ありゃぁ子供の玩具の世界です。
Arduino使ったことのないオレに3行でAVRとの違いを説明してくれ
>>178 ・ブートローダ変更で、ライタI/FがSPIからUARTに変更している。
・みんなパクリまくりで、周辺回路がゆるーく共通化されている。
・ボードにAVR乗せるだけなので、誰でもハードデベロッパになれる。
間違ってないよね?
arduinoはICやら周辺デバイスやらの動作テストするのに 手軽なんだよなー。
>>181 CS02,01,00 はTimer0用
CS12,11,10 はTimer1用
CS22,21,20はTimer2用
の分周比の設定ビットで、それぞれのビットの値で直接クロックの割り算をしているわけではなく、
1/1とプリスケーラで1/8, 1/16, 1/32, 1/64, 1/128, 1/256, 1/1024に分周されたクロックから、
使い勝手の良さそうなものを接続して選択している、ついでにここで外部クロックの選択も行ってる、
という回路構造なので、しょうがないっす。
実際の分周比は、使ってるチップの、使ってるタイマー用のデータシートなりを参照してね。
>これを複数書いていたらプログラムが長くなります。
の意味がいまいち分からんけど、設定するビットの算出とか、その逆ってことなら
テーブル(配列)作ればいいんじゃない?はずしてたらスマソ。
>>182 なるほど!分かりやすい説明ありがとうございます。
CSxyのxはタイマーx部分何ですね。
yがビット番号とするのであれば、
CS11というのはタイマー1の、1ビット目を1にするのですから、分周が、
000 停止, 001 なし, 010 8分周, 011 64分周, 100 256分周として
ビット番号1 = 010なので8分周というのは分かりました。
しかし、CS22の64分周が分かりません。
当てはめるのであれば、タイマー2の2ビット目 = 256分周になるのではないでしょうか?
長くなるという意味ですが、CS22 = 64分周として、
理解出来る書き方では、 1<<CS01 | 1<<CS00 = 64分周と、多少ですが長くなるという意味です。
CS0xにしているのはCS21とCS20でも同じ動作になるのか上の64分周見て疑問に思ったので0で表記させていただきました。
>>183 まず、Timer2は、Attiny2313には搭載されてなかったはず。
Timer2のあるAtmega88でいうなら、Timer0/Timer1とTimer2の設定ビットは意味が全然違っていて、
下のようになっておりますです。
Timer2は別のレジスタのビットで内部/外部クロックを選択するので、その分、たくさん
分周比を選択できるようになってるようです。
ビットってのは、正確に言うなら、「タイマーのビット」ではなく、
「タイマーコントロールレジスタのビット」なので、Atmelの中の人が作ったハードウェアの構造次第で
それぞれについてる意味づけは、なんでもありなわけですよ。
Timer0 (TCCR0BレジスタのCS02,CS01,CS00)
000 停止
001 1/1
010 1/8
011 1/64
100 1/256
101 1/10224
110 T0端子立ち下がりでカウント
111 T0端子立ち上がりでカウント
Timer2 (TCCR2BレジスタのCS22,CS21,CS20)
000 停止
001 1/1
010 1/8
011 1/32
100 1/64
101 1/128
110 1/256
111 1/1024
>>184 なるほど…タイマーによって、分周のビット割り当てが違うんですね
64分周にしようとした場合、CS0xであれば、011であっても
CS2xの場合100になってますね。
CS22の場合、 Timer2の2bit目を1にする=100, 1 << CS22で確かに64分周になります。
もやもやが解けました。
もう少し詳しくデータシートを読みなさいって事ですね、勉強になりました。
ありがとうございました
そこで >8 >16 なわけですよ
187 :
774ワット発電中さん :2010/07/22(木) 15:21:35 ID:Albafiha
エントリーが328pって人も増えてるんかねぇ いまだ2313でシコシコハァハァしておりますw
どこで売ってるのか、どこに拡張ボードがあるのかわからねえ
16ビットタイマーと8ビットタイマー
>>188 リアル店舗なら若松にあったよ。
もちろん若松価格だけど。
むごいさん価格か・・・
2SC1815が製造中止というのは本当ですか? でも100個もストックあるからいいんですけどね
今どき定番も何も無くなってるから、影響は無いだろう
アマチュア用途では無問題。 いまどきTO-92もなかろうということで、既に2SC1815の在庫は棄てた。 p.s. いつの間にかAVRでもHEXファイルにfuse設定を入れられるようになってたのか…。
それは俺に対する挑戦なのかな? AVRもDIPがあるから重宝しているのと同じで、リード部品が無くなったらブレッドボード試作の難しくなる。 初心者に秋月でTiny13とブレッドボードと適当なリード部品買わせて、半田レスで導入できるのが魅力だ。 回路が出来上がってしまえばリード部品入らないし、Tiny13も千石の8S2になるんだけどね。
今さら昔秋月で買った手持ちのTiny26使っているんだけど、 BOD4.0VでSTK500上で5.0Vに設定しても、ポートいぢるとなぜかRESET掛かってまう。 ポートにはSTKのLED繋がってるだけなんだけどなぁ、 テスターで測っても電源電圧は5.0Vキープされてるんだけどダメなもんかねぇ・・・ 個体差もなくレール買いしたの殆どそうなるw
198 :
197 :2010/07/28(水) 05:25:44 ID:qRQQn3t1
お騒がせしました。 STK500上でTiny26を使う都合ジャンパーを飛ばしていたのを忘れていました。 ポートB側の使用に制限があると思われ回路図を読んでみます。 多分ポートが衝突しているものと思われます。
199 :
197 :2010/07/28(水) 06:08:51 ID:qRQQn3t1
回路的に問題は無かったでござる。 なぜかISPのSCK(B2)と衝突していました?? ISPって実行時に開放されるよね?? STK500が故障したのかな・・・w
がんばれ
>>195 HEXファイルにfuse設定
詳細を教えて
AVRのピンの出力インピーダンスはどれくらいですか?
同時に書き込めたらそんなにうれしいものなのかな?
色々と工作してると昔のプログラムのヒューズ設定とか忘れてるから HEXに内包されるのは有難いかも知れんねぇ。
206 :
202 :2010/07/28(水) 22:40:33 ID:KzMtri1H
AVRのピンの出力インピーダンスを測定してみたら、約50Ωぐらいでした 結構大きいですね
207 :
774ワット発電中さん :2010/07/29(木) 00:02:38 ID:Ffjy5WfK
mega8のフューズビットを上位下位を間違って反対にしてしまっていて CKSELを111にで書き込んでしまって以降、AVRSPで書き込めなくなってしまったんですが、 外部クロックつけるしかないですかね… 水晶がないのとPICがあまってるんで PICの内発を出力してXTAL1につなげば生けるかなとか思っています
>>203 ありがとうございます。
>>204 ヒューズの書き込み処理を時々忘れちゃうんです。
なので、プログラムと一緒に書き込めるとTiny2313一個分くらい嬉しいです
210 :
774ワット発電中さん :2010/07/29(木) 04:04:49 ID:I2hpPkNz
安全性とか誤操作防止のために わざとポリシーでさせないのかと思ってた
WinAVRで初めてAVRを使って遊んでいます。 __delay_ms関数を使うとコードが肥大化して、2313だとメモリが あっという間に足りなくなってしまいます。そこで、インラインアセンブラを 利用したwait関数がありましたので、それを利用することで、時間の管理は 達成できたのですが、インラインアセンブラについてお聞かせください。 どうしても意味がわからない点が下記の点です。 time*=(F_CPU/1000000); 省略 "sbiw %1,1\n\t" ←ここがよくわからない。lpcntを1引いている? "brne Entry%=\n\t" :"=&a"(lpcnt) :"w"(time) brneでZeroフラグがたたないとループを繰り返すと思うのですが、 引かれる値が格納される変数(たぶんlpcnt)とtimeがどこで関係しているか? がわからなくて、なぜZeroフラグが成立するか理解できないのです。 申し訳ありませんが、おばかな私に御教示いただけると幸いです。
インラインアセンブラはAVR固有のものでもあるまい、 ググって解決できるものはググれっておもうぞ
>>212 容易に質問をしてしまい、申し訳ありません。
AVR固有でないというヒントから、GCCのインラインアセンブラの
書き方を読んで理解しました。timeの値を1だけ引いているようですね。
ヒントを頂き、ありがとうございました。
215 :
チラ裏 :2010/07/30(金) 20:54:25 ID:GbZo8q+Z
心の底から乙
>>211 _delay_msは変数を渡すと浮動小数点計算になるので、えらいコードがでかくなる
定数を渡すか、自作の関数で下みたいな感じのを作ると良い
my_delay(n){
do
_delay_ms(1);
while(--n);
}
もちろんインラインアセンブラで頑張るのも良い
自分はこうしてる void Delay_ms( t ) { while (t--) { _delay_ms(1); } }
知ってて書いていれば問題はないが、
>>217 と
>>218 は、引数n(t)に0を
与えられた時の挙動に互換性がないな。
ループ分遅くなるしなぁ
>>220 ループ処理の誤差は、その分(例えば10us)を考慮して、
_delay_ms(1); を
_delay_us(990); とかにすればいいんでないの?
そこまで追い込んだところで、ループの最中に割り込み処理が入れば、
その分が誤差になるけど。
ウェイト入れるのに遅くなるって言われても・・・
正確にしたいならアセンブラでどうぞ
いやいやアセンブラでがんばっても正確にはならんよw 誤差蓄積が嫌ならタイマー使うし、あくまでも適当なウエイトだよ
正確さが要るならCPLD外付け
226 :
774ワット発電中さん :2010/08/03(火) 00:02:10 ID:yjaz9+Xg
>>225 Morphy One IIe ですね。 クロックの周波数精度や温度特性、ジッダに
ついては、外付けのトリマで調整するんですね。 わかります。
思い出せそうで思い出せない。トリマと言っているがトリマじゃなかったような。
バリアブルコンデンサー?
バリキャップ
231 :
774ワット発電中さん :2010/08/03(火) 20:47:36 ID:zXeFK97I
あんなもんはただの特性の悪いダイオードだ
AVR wikiがよく落ちる.....
あんなもんはただの特性の悪いダイオードだ
attiny8313が欲しい
500円くらいでいいから8K版のtiny2313が欲しい。
そんなもんはtinyじゃない
tiny2313のピン数とI/Oモジュールに対してそこまでROMが欲しい理由がわからない ややこしいテーブルだろうか?
>>238 ROMライタを多機能化するためじゃない?
SOP, SSOPのAVRマイコンが欲しい。。
>>240 8s2とか8s1ってSOPじゃないの?
UART付きの861でもいい
ここでよいかわからないのですが... AVRを使ってCHAN氏の回路を参考にして、SDCARDの リーダーライターを作ろうと思っています。AVRは5Vで動かしたいのですが、 SDCARDは3.3Vですので、そのままフルスイングしてしまうと壊れそうです。 電源回路にレギュレータとレベル変換ICを使ったものを見かけます。 電源部はそれでいいとして、レベル変換のところは、ICを使わず、 各信号レベルをツェナーでドロップしたものを使っても大丈夫でしょうか?AVRとSDの 電源を別で管理したいのですが、皆様の良い知恵をお教え頂ければ幸いです。
考え方としてAVR5VでのUSB-IFでの回路とか(ライタなどで参考になると思う)で 3.3V対応できるんじゃないかな。たぶんだけど。
>>246 早速のアドバイスありがとうございます。
ライターを自作した経緯で、どうやってUSBの信号電圧を、
合わせているのだろう?と調べた結果、信号線とグランドの間にある
ツェナーがその役割を果たしていることを思い出し、これなら、
SPIモードで動かすSDに使えるかもしれないと思ったしだいです。
しかし、ネットでいろいろ参考になるかサイトを見ても、ツェナーで
やっている例が見つからず質問させていただいたしだいです。
USB-IFについても調べてみます。
大量販売しないなら1K程度の抵抗でもいいじゃまいか
PICの例だけど、PIC5V、三端子で3.3V作ってSDのVDDに PICのSDOとSCKとCSは抵抗分圧で下げて、SDからのSDOは直結 でも波形なまる ただの抵抗の癖に
どこかに小さい乱数発生プログラムないですか?
それはAVRへの移植性とプログラムサイズを考慮すると 良い選択とはいえません
>>251 擬似乱数ならそんなにステップ数食わないけど、
起動ごとに同じにならないようなシードを得ることが難しい
ADCにノイズが必ず入るようなものを拾ってシードとするとか?
やっぱ何のために必要な乱数なのか教えてほしーな
熱雑音をADCすると疑似ですらない本物乱数が手に入るぞ
>>257 回路が面倒なだけのような・・・ サンプルplz
そんなこと言われてもうち、ポンデライオンやし 乱数に関する四方山話 反射型液晶の反射板はざらざらになっていて、その型を作る時に乱数を使ったけど、 どうやっても周期性が目立ってしまうので、仕方なく硬貨をばらまいてデータを取った デジタルリバーブの仕組みは無数のランダムな反射の寄せ集めだけれど、 そのランダムさの規則性がどうしても音の癖として聞こえてしまうので、 乱数の発生のアルゴリズムが音質を決める
>>248-250 アドバイスありがとうございます。
レスポンスが遅くなり、誠に申し訳ありません。
趣味の範囲なので、大量販売はしないので、
CMOS使わなくてもいければ安いなってくらいにしか
考えていなかったのですが、
>>248 さんの教えてくれた
説明は非常に興味深かったです。ありがとうございます。
>>250 さんの方法は非常にシンプルですね。
試してみたいと思います。
本当にいろいろお教え頂き、ありがとうございました。
262 :
774ワット発電中さん :2010/08/16(月) 18:50:22 ID:5xfZX0Uh
すいません初めてAVRを使っている者です。 ISPとI/Oポート兼用になってる端子を今はディップスイッチで分離してますが、スイッチなしで 兼用にする方法はありますか? 3ステートバッファとかいりますか?
>>262 回路による、としか言いようが無いけど、例えば
・キー入力として使用していて、プルアップからキーONでGNDに
→キーを押さなければ無接続(内蔵プルアップ)orプルアップのみ(要数KΩ以上)と同じ
・液晶へのデータ出力ピン
→ライタから書き込み対象のAVR&液晶両方ドライブできるし、
液晶なら変な入力しても大した問題にならない
とかなら共用できる。逆に
・AVRが動作してない時(ISP以外はHi-Z)に何が入力されるかわからないピン
・モータのドライブとか、変な信号入ると外部回路がマズイ動作をするピン
は分離しないと
その辺も考えて、ISP用のピンにそういう回路を割り当てておけばおk
~RESET=LOでHiZにしとけば面倒がない
先日、SDのために5V→3.3Vの変換をICなしで出来ないか? という質問をしたものです。 おかげさまで、分圧抵抗を使って行うことが出来ました! 本当にいろいろお世話になりまして、ありがとうございました。 今はまだセクタ読込みまでしか出来ていませんが、 メモリカードをマイコンで使うことが出来るようになり、感謝しています。 ありがとうございました!
SDカードだけならいいけど、他のSPIデバイスもある場合は 抵抗分圧や抜き差しを考慮すると隔離した方がいいかもしれない。 アナログスイッチを間にはさむとか。
そもそも信号線はプルアップすべしという説は
SPIはプルアップ必要なかったんじゃなかったっけ?
>>268 SPIにプルアップが不必要だってのは、
3ステートとかOCでドライブされる可能性があるデータ線が無いってだけの話で。
SDカードとか活線挿抜前提だと
不用意に信号線がオープンになる可能性は色々とある。
不安を覚える様な用心深い人は策を講じる事だろう。
270 :
262 :2010/08/19(木) 03:51:14 ID:apIofHwz
かむさえよー
>>267-269 実は、カードの出し入れでリセットがかかってしまう
現象になり、???と思っていました。
そこで、別途全体駆動を簡易的に3.3Vにして
回路図どおりにプルアップとプルダウンをして
直結したところ、リセットがかからなくくなったので、
改めて、プルアップの意味を実体験しました。
LCDも電源だけ5VでI/Oは3.3Vで動いたので、
実回路も部品点数が少なくなるのでこちらのほうが良いように
思えてきました...orzあれだけ悩んだ末これかYO!
信号線のプルアップ、肝に銘じて起きます。
今回はSDだけでなく、さまざまなことをお教え頂き
ありがとうございました。感謝します。
通電した状態で抜き差しして良いような回路だったんだろうか? 通電状態で抜き差しよいようにしようとしたらなんかめんどくさいような。
>>272 まだ、「マイコンでSDcardを使う」ということが「手段」でなく「目的」
なレベルですので、電子回路を学んでいる段階です(笑)
SDのような広大な記録領域使えたらいいなーなんてことを
おぼろげに思っていて、実際にやってみていろんな問題にぶつかり、
ここでたくさんのアドバイスがいただけて、感謝しています。
SDCardから見たら通電状態の抜き差しは良くないでしょうけど、
今の私から見たら、とりあえずFATアクセスできたので「良し」としています。
SDついでで CMD0とCMD1はちゃんと終了するけど、 CMD17を出すと00が返ったり05が返ったりする 00だとちゃんと読めるけど05だと当然読めてない 何が不安定なんだろ
高電圧書き込みをサポートしてるギャングライターやプログラマは市販されているでしょうか。 値段が高いやつでも構いません。 以上、よろしくお願いします。
STK500 あたりか
ありがとう。 でも生産ラインで使いたいので、STK500はちょっと・・・。
普通のROMライターメーカーに聞いた方が早くない? アトメル製品のどこまでサポートしてるかを
ラインで使うくらいならICの卸に聞けば済むんじゃないか?
>>279 , 280
了解です。月曜日に代理店に連絡してみます。
ありがとうございました。
最近は実装してから書き込むんだよな・・・ ISPライタで生産ラインに耐えるものって無いのかね。
生産ラインでISPなんか使わないだろ
いや、実装してから書き込めば、どんなのでもISPじゃ....
実装してISPすると、QCからクレーム来たりするんだよね会社によっては。
そうは言ってもTQFPなブツとかTSOPなフラッシュROMは 実装後にATEかなんかでJTAG使ってISPだろJK
>>285 それはチップの状態で書き込んでから実装しろと?
何のためのフラッシュなんだ
ベーキングさせたり頭の固い会社はあるんですよ未だに ISPなんて信用されてない・・・
ゴメン。BOST中に書き込むのが一般的だと思ってた。 LSIメーカーによってはP/Wで書き込んでくれるけど、基本的に100K/月とか要求されるから無理。 で、BOSTボードなんて毎回作成だから、ISPも毎回異なる。
オレのATINY2313、VCCとGNDを間違えたが、つなぎなおしたら何事もなく動いた。 タフなやつだなこれ。
>>289 後は、ISP残しておくことで、リバースエンジニアリング
しやすい環境を残しておくなってことぐらいしか頭に浮かばない・・・
実際の生産現場ってどういう考えなんだろう?
大規模生産だとかっちり決まったものになるだろうけど、
少量多品種生産だと変更なんて当たり前だしなぁ・・・。
ISP残さなくてもブートで自己書き換えルーチン入れちゃうけどね バグのメンテって絶対あるだろうから
クランプダイオードはそれなりに大きく作ってあるからな
おまいらちょっと聞いてくれよ、AVRとはあまり関係ないんだけどさ サーボの信号を出力するのはいっせーのでカウント始めて時間ごとにパルス止めるでどうにかなるんだけど、 入力するのってどうすりゃ良い訳?割り込み使おうと思ったけど考え方が悪いのかタイマー幾つあっても足りないんだけど・・・
>>290 保護回路が入っているから逆につないでも壊れない
>>294 サーボモータって使ったことないんで脳内だけど、
・タイマーをサーボのパルスより十分長い周期でフリーランさせる
・サーボパルスの立ち上がりで割込みかけて、タイマーをクリア
・サーボパルスの立ち下がりで割込みかけて、タイマー値を読み取る
最後のステップは、タイマーのインプット・キャプチャが使えるなら、それでもOK
てなかんじかな、と思う。要するに、PWMの逆変換。
出力の方もPWMでいけるような気がするけど、なんせ脳内なんで。
>>295 電流自体は保護回路に逃げても、保護回路が過熱してICそのものが壊れるんだよ
299 :
774ワット発電中さん :2010/08/28(土) 10:51:30 ID:WJOlCTKV
生業の人も来るんですねここw
>>296 サーボモーターって20msぐらいごとに1.5+-0.5msぐらいのパルス出すと動くんだけどさ
これを同時に5チャンネルサンプリングしようとすると自分の頭だと
1チャンネルごとに割り込み+タイマー回す(5個もタイマーは無いし、どれかでリセットするにしても他のやつはカウント中のはず)
1チャンネルごとに一度ずつタイマーを回す(最悪で100msじゃ遅すぎる)
しかもその上でサーボの出力の為にタイマー使ったり
AD変換も同時にこなそうとかもうアババババなんだけど
これは下手にハードの機能でどうにかするより、
単純に20usごとぐらいで割り込んでソフトで処理したほうが良いのかな?
割り込みなんて一切使わなくてもその都度タイマーで剪lを求めれば 各チャンネル独立制御できるでしょう、サーボの精度考えると8chくらい余裕で制御できそうだけど
>>300 入力の方は、タイマークリアなしで、
立ち上がり時のタイマー値と、立ち下がり時のタイマー値を引き算すれば得られるから、
タイマーが共通の1個にできるね。
>>302 単純にそれやってくとオーバーフロー時に値飛ぶからダメだろと思ったが、
それは逆に例外として計算すれば良いのか
変な方向に頭向かってたみたいだ…聞いてよかったおまいらサンクス
avropendous って使ってるひといませんか?
目を付けてた商品が軒並み売り切れてんだがマイコンブームでも来たのか?
あー、PS3のハックが成功したんでそれの需要でしょ。
AVRが注目されることはいいことなんだろうけど... こんなことで注目されたら、趣味でAVR使ってる 人間までPS3の違法改造してるみたいじゃないか...orz
胸が熱くなるな
310 :
774ワット発電中さん :2010/09/02(木) 15:27:32 ID:Gzx/CccK
今日追加分がもう売り切れだぞ
苺のやつまで売り切れか 凄まじいな
だがこれを機にAVRの世界に興味を持ってくれる人が 増えてくれるさ〜
うちの2313で作れるかな?
>>313 ソフトUSBの速度だと、ネゴ最中にPS3のOSが起動しちゃうから速度的に厳しいかもねぇ・・・
強大なディスクリプション叩き込んでスタック溢れさせるのが目的のようだし。
どゆこと?PS3のソフトがコピーできるってこと?
316 :
774ワット発電中さん :2010/09/02(木) 22:03:02 ID:siebzrVY
「こんなこともできるのか!」と裾野が広がると喜ぶべきなのか、 「違法コピーに使う奴でしょ」とレッテルを貼られると嘆くべきなのか。 まぁ、正直、こんな使い方できるのかと、変な感心したが。
システム設計時にUSBからの侵入なんて普通思いつかないよな B級映画にあるような、鯖にUSBメモリ突き刺して侵入とかも そんなに荒唐無稽でもなかったか
一頃、パーツ屋のPICを買って行ってそのままプレステにはんだ付けして、 動かないと文句を言う人が後を絶たなかったので、 わざわざ注意書きがしてあった
319 :
774ワット発電中さん :2010/09/02(木) 23:29:10 ID:siebzrVY
しかし、通販サイト見ると、ホントにいろんなところで売り切れてるね。 でも、買ってはみたけどうまくいかない、おバカちゃんがたくさん 湧きそうな予感がする・・・・ あと、ヤフオク転売屋が沸く・・・・
そんなに自作技能を持った人で溢れていたのか 日本の未来は明るい
>>319 ネットでコンパイルされたバイナリ拾って書き込むだけだからサルでもできるよ
322 :
774ワット発電中さん :2010/09/03(金) 00:32:33 ID:fhz/sl3I
しかし、たかがPS3のためにAT90USBKEY買うって、AT90USBKEYが かわいそうすぎて涙が出るわ。
323 :
774ワット発電中さん :2010/09/03(金) 04:48:26 ID:V5GAqiGA
ちょ、AT90USBKEYでできるのか。 双方向USBの勉強用に2個買ってたわ
世界レベルで売り切れなのかAT90USBKEY PS3オソロシス PSGrooveってオープンソースらしいから 早くPICへ移植してAVR特定マイコンの枯渇なくして欲しい
Arduinoでもできる?
>>325 CPU性能は問題ないと思うけど、ちゃんとしたUSBコントローラが無いと難しいよね
327 :
774ワット発電中さん :2010/09/03(金) 15:39:02 ID:V5GAqiGA
AVRからルネサス系なら余裕で移植できるんだが 何せPS3のハックに興味がない
手持ちでUSB使えるのはPICの2550だけなので、これでなんとか
AVR使いてそんなに自己中問題児が多いのか?
たまたま居ただけでしょ、わざわざ曲解しなくてもいいよ
avr.jpなんてドメインを取ったのか atmelが動けば簡単に吹き飛びそうな気がする
不正アクセス禁止法(笑)
AVRのアーキテクチャが簡単で実行速度が速くて入手性がいいってことだよ いわせんな
336 :
774ワット発電中さん :2010/09/04(土) 18:30:42 ID:ADcmDzAm
>>333 結局、PDFは有料だ〜って言っていたのは、ナシってことになったんですかね?
何の話
有料申し込みはは0件だった ようはそういうことでしょう。自己中心的な人物がうんたらかんたらといっているが、 鏡を見たほうがいいと思うな。
「都内の一軒家が買える程度」の額って7千万とか億ってこと?
オレは、HERO'S Downloadさんのサイトには ATiny2313使ってたころお世話になったから素直にありがとうと言いたい 色彩センスとか、元ドキュより断然見やすかったですしね 金は無いので大きな事も言えんけどさ。
ドメイン買う余裕ができたってことは、 就職や金策がうまくいったのか。よかったね。
金が手に入って苦労がなくなると 気前よくなるもんな 人間ってわかりやすいよね。
人間そんなもんさ
っていうか、貧乏になるとそれだけであり得ないほど考えがすさむ
あと病気とかもすさむ 世界を呪うようになる
人間やめますか? それとも電気屋やめますか?
この時期に再開だと某ドングル目当てで購入した人が似たような問題を起こしそうなんだけど大丈夫かなぁ。
ドングルの人はHEX焼くだけだしデーターシートなんて見ないでしょ。
今回は問題をおこした人がいた場合、 それを誘導したホームページがHERO'S にリンクを貼っていても、 責任を取らされずに、むしろそのホームページの管理者に対して、 刑事訴訟に持っていけるだけの、土台を作った訳でしょ? というか、被害届が出せる事が重要なのだと思うけど。 もっとやれ。俺はデータシートさえ借りられたら良い。
いまいちよくわからんが、危うく、現品みたいにおすた化しかかっていたということなの?
353 :
774ワット発電中さん :2010/09/05(日) 18:48:36 ID:05yO4XxV
オレも、現品comの人と同じになったのかと、書き込もうと思ってたところ。 同じ電波が、ゆんゆん出てる。
>>346 そう考えると、エロゲに出てくる病弱美少女って
本当に天使だよな。同級生2の桜子大好きだよ。
PS3クラックって、USBkeyのフラッシュメモリなんかも使ってるのかな? ただHEX焼くだけならdigikeyでチップ一括で買って格安基板作って 「USB学習用のマイコンボードです」って売ればうはうはじゃね。 きっと中国人がやるだろう。 マイコンの中をブランクにしておけば、咎められる理由はないものな。
357 :
チラ裏 :2010/09/06(月) 08:31:51 ID:4L3lX/rl
ども、チラ裏翻訳です。 Heroさんところが復活したんですね。おめでとうございます。 自習翻訳は続けるけど、急ぐ理由もなくなったんで、こちらはマイペースでいきます。 というわけで、また名無しにもどります〜\(・∀・)
359 :
774ワット発電中さん :2010/09/06(月) 10:35:26 ID:I5cM8vRH
電波ゆんゆんかあw
360 :
774ワット発電中さん :2010/09/06(月) 11:37:03 ID:I5cM8vRH
avr.jpだが、協賛に秋月とか。 どーゆー経緯でこうなった。 社長、説明してくださいw
なんだか電波臭がするな 英語のデータシート読めないやつはやらないほうがいいよ
翻訳・編集で営利的に儲けちゃ駄目なのかね? 年会費1,000円ぐらい取ってもいいと思うけどね。半年会費としてワンコインの500円(税込みで525円)とか。 でも、課金システム・認証システムを構築するのにお金がかかるんだよなあ。 また原始的な方法で(送金無料な銀行を使うとして)振込みの確認やテンプレメールの送信等の対応でも大変だろうし、有料利用者の管理が大変になりそうだし。 5年掛け捨てみたいな感じで5,000円を振り込んでもらって、サービスは突然終了することがある旨で運営するか。 5,000円だと敷居が高いから3,000円にして、3年でもいいのかな?
>>362 この場合は、ATMELや代理店が認めるとは思えなかったけどね。
ボランティアも、収入がなければやっていけないのは道理で言ってる内容自体は理解できました
過激な表現になっちゃったのは、引用を表示しないサイトとかが増えて不快だったからじゃないかな
特に、千秋ゼミのサイトとかパクリまくりwww
>>356 サンプルプログラムのソースリストと、「試してみましょう」みたいなのがすごい事になるのか・・・
>>364 すでに
>PSGroove is also in the midst of being ported to the PIC18F2550 chip.
だそうだからAT90USBの品薄根拠は終了でしょう。
特殊なUSBメモリとしてしか使わないなら USBホスト付きで高価なUSB1287である理由は何もないからね。
367 :
774ワット発電中さん :2010/09/06(月) 18:29:45 ID:TxYygm0o
要はアトメルジャパンが、マイクロチップジャパン並みに頑張って個人顧客へのサービスもしてくれれば いいんだがなえぇ。
なんでもいいが、秋月かどっかの秋葉店頭で USB付きAVR売って欲しい arduinoのUSBホストなら千石にあるんだがなあ
>>363 御大層なこと言ってるが結局ATMELから物言いをつけられたから金取って見せようと
するのやめて無料で公開に戻したんだろうと思う
御巣た化し始めた決起はmega328pのヒューズビットの記述ミスあたりかな
mega88p,mega168pまではビット定義が互換だけどmega328pだけは実デバイスでは一部の
ビット定義が違ってて間違って書いちゃうと元に戻すのが厄介になる奴
370 :
774ワット発電中さん :2010/09/06(月) 20:45:20 ID:8a54VjRm
>>357 こっちはこっちでぼちぼちやって欲しいな。
自分も手伝いたいけどLEDピコピコレベルだからなあw
>>369 また自己厨が勝手な憶測をwww
ATMELから物言いを付けられた形なら金は取れないけど
非公開のままにしとけばよかっただけだな
裏でどう話が動いたかわからんが
一応、ユニ電子と秋月が協賛してくれたから公開状態に戻ってる。
これからの充実はあまり期待せずに
今のうちに英文マニュアルも読めるように準備しておくのが吉だ。
日本語解説記事 > 英文データシート > 日本語データシート なんだよな なんかしらんけど、翻訳されてると逆に理解できなくなる
英語データシートだけでLEDピコピコしたのに
374 :
774ワット発電中さん :2010/09/06(月) 23:01:43 ID:I5cM8vRH
>>372 >翻訳されてると逆に理解できなくなる
確かに強制的に日本語訳してしまうと判らなくなる部分もあるね。
シリアルプログラミング、バウンダリスキャン、…
でも英文データシートを横引きすれば良いんで、素直に日本語訳があるのは有難い。
AVR Studioとかのヘルプとかは、日本語訳してくれてとても便利だった覚えがある。
有志の翻訳=実質HEROだったからな 最初からこの人だよーて名前売っとけば本人も今頃ホクホクだったと思うよ