5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

AVRマイコン総合スレ Part19

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/


2 :774ワット発電中さん:2010/06/25(金) 21:04:15 ID:o4lD3qe7
◎前スレ◎
Part18 http://science6.2ch.net/test/read.cgi/denki/1267885927/
Part17 http://science6.2ch.net/test/read.cgi/denki/1261051995/
Part16 http://science6.2ch.net/test/read.cgi/denki/1252285807/
Part15 http://science6.2ch.net/test/read.cgi/denki/1247238097/
Part14 http://science6.2ch.net/test/read.cgi/denki/1239940189/
Part13 http://science6.2ch.net/test/read.cgi/denki/1231687664/
Part12 http://science6.2ch.net/test/read.cgi/denki/1223778551/
Part11 http://science6.2ch.net/test/read.cgi/denki/1212840469/
Part10 http://science6.2ch.net/test/read.cgi/denki/1203495784/
Part9 http://science6.2ch.net/test/read.cgi/denki/1192625746/
Part8 http://science6.2ch.net/test/read.cgi/denki/1177933605/
Part7 http://science6.2ch.net/test/read.cgi/denki/1162464623/
Part6 http://science4.2ch.net/test/read.cgi/denki/1148195387/
Part5 http://science4.2ch.net/test/read.cgi/denki/1125327648/
Part4 http://science3.2ch.net/test/read.cgi/denki/1108290187/


3 :774ワット発電中さん:2010/06/25(金) 21:06:06 ID:o4lD3qe7
<参考になるページ>
・AVR-wiki  http://avrwiki.jpn.ph/wiki.cgi
       もう一つのリンク先
       ttp://himitsu.jpn.ph/avrwiki/wiki.cgi

・AVR情報多い-chanさんのpage
  http://elm-chan.org/

・avrfreaks.net avrgccその他AVR関連の総本山(英語)
  http://www.avrfreaks.net/

・レディオテクニカ有志による 翻訳版 AVRデータシート・AVRツールの解説書
  http://homepage1.nifty.com/radio_tech/

・TAP-Config
  http://ww2.tiki.ne.jp/~maro/

・自分で作ってしまえ!電子工作スレッドテンプレート集
  http://jbbs.shitaraba.com/bbs/read.cgi/study/3329/1067910158/

・HERO'S Download(暫定) 有志による日本語のAVR資料他
  http://moon.gmobb.jp/hero/


4 :774ワット発電中さん:2010/06/25(金) 21:07:21 ID:o4lD3qe7
実は初めてのスレ立てなんだけどこれでいいのかな?


5 :774ワット発電中さん:2010/06/25(金) 22:16:09 ID:wWd8IjTK
上出来だと思うよ乙

6 :774ワット発電中さん:2010/06/25(金) 22:34:40 ID:cp6VFwdJ


でも、レディオテクニカ有志〜 と HERO'S Download(暫定) は
修正が必要では?

7 :774ワット発電中さん:2010/06/25(金) 23:21:37 ID:zG0XdiHL
>>1
これは乙じゃなくてポニーテールなんたらかんたら

8 :774ワット発電中さん:2010/06/26(土) 00:49:40 ID:jKuiVHUY
>>6
あぁぁ、しまった。肝心なところを直していなかったぁ。

ええと、次のスレ立てる方は前スレ291さんのページへの案内をお願いしますね。
ttp://awawa.hariko.com/chira-ura/index.html

案内文は…「ATMega168データシート新翻訳」ぐらい?


9 :774ワット発電中さん:2010/06/26(土) 07:19:12 ID:Cl8bzIQY
まるで、ATMELの出す、エラッタのエラッタのやうではないか。

10 :774ワット発電中さん:2010/06/26(土) 09:57:38 ID:+7Su4Jnv
1乙
地味に伸びますなw

11 :774ワット発電中さん:2010/06/26(土) 14:03:32 ID:GYPWi3ZR
おつつ

12 :774ワット発電中さん:2010/06/27(日) 08:42:08 ID:y3/Tm6Vt
立てなくて良いのに・・・・。

13 :774ワット発電中さん:2010/06/27(日) 23:00:24 ID:lnTH97Pl
おっつ

発展期待

14 :774ワット発電中さん:2010/06/27(日) 23:23:32 ID:y3/Tm6Vt
H8があればAVRなんていらねーww

15 :774ワット発電中さん:2010/06/27(日) 23:44:01 ID:/kpk5vNQ
趣味ならDIP

16 :774ワット発電中さん:2010/06/28(月) 02:25:34 ID:b3Kb635O
1乙

テンプレにAVR解説書籍を加えるといいと思うがどうだろう。
データシート読むにしろ先に基本を知っていれば助かるはず。
(以下、AVR使ってるけど工作やUSB,I2Cの解説が中心という書籍は除外)

<AVR解説書籍>

試しながら学ぶAVR入門
http://shop.cqpub.co.jp/hanbai/books/46/46041.htm
マイコンの基礎と電子工作とWindowsアプリケーションの作り方

AVRマイコン・プログラミング入門
http://shop.cqpub.co.jp/hanbai/books/42/42131.html
ATmega48/88/168の主要な機能を豊富な図解と実例でわかりやすく解説

AVRマイコン・リファレンス・ブック
http://shop.cqpub.co.jp/hanbai/books/37/37301.htm
AVRのCPUアーキテクチャ,豊富な内蔵周辺機能を詳細解説


17 :774ワット発電中さん:2010/06/28(月) 14:09:50 ID:EB2oFCyZ
>>14
H8も使うときは使うが電源が電池レベルの時に使おうとは思わん。まだR8Ctinyなら…
AVRなら気をつければCR2032でも使いものになるのが強みの一つだと思う。

>>16
なるほど、いいかもしれないね。
俺ChaN氏のところ以外はほとんどデータシートしか見てないんでこういうの知らない
んだ。


18 :774ワット発電中さん:2010/06/28(月) 21:57:30 ID:8/gtgSMJ
中華Android端末を見ていて…
家にあるNetworkGatewayKitに液晶繋げればAndroid動くかな?と思ったのだけど

既にAVR32-AT32AP7000がディスコンになっている件に付いてwww

19 :774ワット発電中さん:2010/06/29(火) 11:46:34 ID:OwciBS74
中華ドロイドの中だとmoonse e7001ってのが良いらしい
なぜかポータブルAV板にスレがある

20 :774ワット発電中さん:2010/06/29(火) 21:46:43 ID:tp2bwZIa
AVRは異常に使い易いと思うし計算も速いんだが、
1つだけ欠点があるとすれば、debug-wireが糞

21 :774ワット発電中さん:2010/06/29(火) 22:49:33 ID:TgGmNHCF
少なくとも8bitAVRに関してはプログラムメモリへのアクセスがRAMへのアクセスと
別なのがイヤ。Cではちょっと使いにくいことがあるな。

32bitAVRは知らないんだが、さすがに同じポインタでアクセスできるんだろうな?


22 :774ワット発電中さん:2010/06/29(火) 23:57:45 ID:sUdxgSWr
>>21
ありがとう、やっぱり AVR はやめとくわ。

23 :774ワット発電中さん:2010/06/30(水) 02:00:50 ID:raLT+ORn
いったいどんな用途に使おうと思ってんだよ。。。

24 :774ワット発電中さん:2010/06/30(水) 04:17:04 ID:xjGxoN5D
RAM実行可能かとかそういう話でしょ。
AVRがというよりハーバードアーキテクチャの仕様。
ところでAVR32ってlinuxも乗るわけだけど、
この辺どうなってんのかね。外付けRAMだと
フラッシュと同じプログラム側アドレスにできるってことかな。

25 :774ワット発電中さん:2010/06/30(水) 08:01:32 ID:NuutDyME
AVRStudioのエディタに行番号を表示するオプションなどありませんか?


26 :774ワット発電中さん:2010/06/30(水) 08:03:41 ID:serdi4vq
>>25
ググレカス

27 :774ワット発電中さん:2010/06/30(水) 11:39:46 ID:3OcCNDnB
>>24
21の言ってる意味は、
ROMに割り当てたテーブルが普通に読めないからだろ

28 :774ワット発電中さん:2010/06/30(水) 13:32:27 ID:lfJ6Fxwi
すまん、俺が>>21(ちなみに>>22は俺じゃない)なんだが

使用目的は確かに>>27なんだが、気になってる所は>>24の話。
AVR8はハーバードアーキテクチャがモロにソフトに影響してるって話。

内部的にはハーバードアーキテクチャでもキャッシュとかで細工してソフト的には
見えないようにしてるマイコンもあるから、AVR32はそうなのかなと思って。


29 :774ワット発電中さん:2010/06/30(水) 13:45:12 ID:3OcCNDnB
昨今RISCでハーバードではないCPUも珍しいけどな、
PCカウンタが32くらいあるのなら、RAM方面のバスもアドレス区分で割り当ててるのが普通と思われ。。

30 :774ワット発電中さん:2010/06/30(水) 13:58:53 ID:RC7hQPPa
データシートみると同一の物理マップにあるから>>27とか
>>24みたいなこと気にする必要ないんじゃない。

31 :774ワット発電中さん:2010/06/30(水) 15:05:26 ID:gbGxHgHD
>>28
それ、メモリマップ的にコードとデータが独立してるかどうかって話でしょ。
で、今のARV32のUタイプはMPU(メモリ・プロテクション・ユニット、ARM用語)だから
同一メモリ空間内でマップされてるよ。

ディスコン化したAPタイプのAVR32は普通のMMUなので仮想メモリ対応のゴージャスな奴だったけど。

32 :774ワット発電中さん:2010/06/30(水) 16:40:43 ID:lfJ6Fxwi
>>30,>>31
ありがとう。やっぱりそうなってるんだな。
今度ヒマができたら自分でも読んでみるわ。


33 :774ワット発電中さん:2010/06/30(水) 19:17:50 ID:Wt8CW4l1
そもそも、xmegaと違って、AVR32ってAVRと互換性ないんじゃ?

34 :774ワット発電中さん:2010/07/01(木) 02:33:43 ID:+/IUrg1x
同一メモリ空間内でマップってことは、
内部の命令デコードも同じってことなのかな?
まあ調べればいいんだけど

35 :774ワット発電中さん:2010/07/01(木) 14:08:41 ID:5QMQkx/N
やっぱUPSにはついてたほうがいいよね〜?AVR

36 :774ワット発電中さん:2010/07/01(木) 14:34:27 ID:HDvL1No0
>>35
面白いと思って言ってるの?

37 :774ワット発電中さん:2010/07/01(木) 14:47:06 ID:5QMQkx/N
>>36
いや。まじで。AVRってそうでしょう?

38 :774ワット発電中さん:2010/07/01(木) 14:50:29 ID:HDvL1No0
>>37
スレタイ100回音読してから、半年ROMってろ

39 :774ワット発電中さん:2010/07/01(木) 14:54:32 ID:nHdNyBKL
ググるまでなんのことだかさっぱりだったぜ…
自動電圧調整(Auto Voltage Regulateかな?)だったのか。


40 :774ワット発電中さん:2010/07/01(木) 15:44:02 ID:40j3NmT5
Part13でのボケのがまだマシだな…
http://2chnull.info/r/denki/1231687664/515-523


41 :774ワット発電中さん:2010/07/01(木) 16:33:42 ID:TtUqUu1f
マイコンでDC/DCコンバータ構成してる例なら何度か見た

42 :774ワット発電中さん:2010/07/02(金) 15:25:49 ID:NTfG30vl
Adult Video Recorder?

43 :チラ裏:2010/07/03(土) 10:40:56 ID:xesk/3Ge
>>8
スレたて乙です。
案内に載せてもらえるように、1000までに完了目指して頑張ります。

8章追加しました。
ttp://awawa.hariko.com/chira-ura/index.html

44 :774ワット発電中さん:2010/07/03(土) 17:39:33 ID:9iiQhNRD
乙です。
埋まるのはいつにになることやらw

45 :774ワット発電中さん:2010/07/04(日) 22:38:34 ID:7Ez4bkk/
俺は2.2kΩの抵抗が好きだ
なぜなら赤3本で分かりやすいから

46 :774ワット発電中さん:2010/07/04(日) 22:55:39 ID:AvhLf7/s
5本線の抵抗は嫌いだ、だいたい読み間違う。

47 :774ワット発電中さん:2010/07/04(日) 23:26:11 ID:fuDy3Z8V
混ざったら終了>チップコン

48 :774ワット発電中さん:2010/07/04(日) 23:49:59 ID:Of3ijDGX
33kも好きだな

49 :774ワット発電中さん:2010/07/04(日) 23:50:43 ID:rHkJpou6
つまんで測定するテスターがあるからそれを使えば大丈夫。


50 :774ワット発電中さん:2010/07/05(月) 00:08:30 ID:Qda38bnn
1/4Wのカーボン抵抗が好き
オレの中で、いかにも抵抗ってのはコレだな
出来れば基板に寝かしてやりたいけど、スペースの都合上中途半端に立たせることのが多い
スマンな、苦労をかけて・・・

51 :774ワット発電中さん:2010/07/05(月) 08:14:44 ID:qLrHxFuZ
AVRスレはここで終了しました。
これからは抵抗スレになります。

52 :774ワット発電中さん:2010/07/05(月) 09:21:53 ID:L9W29xTJ
今 USART でパソコンとシリアル通信してるんだけど、ちゃんとパソコンに送れない
ピンをショートさせてパソコンから送ったシリアルをそのままパソコンにバックさせると、正常に送受信出来てるから、問題は AVR 側だと思う

で、色々調べた結果、次のように受信してた

・受信したシリアルが反転しているっぽい
・受信したシリアルが 1bit 左にずれているっぽい

例えば、A を送ると

A = 0b01000001

のハズが、実際に受信しているビットは

} = 0b01111101

となってる
なぜだろう?

ちなみに、パリティなしストップビット1非同期モードです

53 :774ワット発電中さん:2010/07/05(月) 09:30:01 ID:+7HumNnK
出力は負論理 ドライバーいれるかで反転させる


54 :774ワット発電中さん:2010/07/05(月) 12:09:52 ID:L9W29xTJ
>>53
ありがとー!!!
早速 MAX232N 買ってきた
そういう事だよね?

55 :774ワット発電中さん:2010/07/05(月) 12:22:29 ID:B4ewmqdd
インバータでよかったのに・・・
ソフトで反転することも出来たのに・・・

56 :774ワット発電中さん:2010/07/05(月) 12:33:21 ID:KsDDYVPm
TTL(C-MOS)とRS-232Cを直結してたってこと?

57 :774ワット発電中さん:2010/07/05(月) 13:33:23 ID:hW2syPQq
トランシーバ用意できるんならその方がいいわな

58 :774ワット発電中さん:2010/07/05(月) 14:22:42 ID:+7HumNnK
だね 端おってやるとなにが問題なのかわかりづらくなる


59 :774ワット発電中さん:2010/07/05(月) 17:09:35 ID:PwibZo8D
RS232Cモドキなら別だけど、PC本体のシリアルポート(デスクトップ機
ならほぼ確実に)は+12V/-12V出してくると思うけど、そんな基礎的な
ことさえ知らんのかいな。

ゆとりエンジニア(0.5mmピッチは日常の自称プロとか)は、たとえ問題
があっても、火や煙を出すといった素人目にも明らかな異常状態でも
起こらない限り、動けば結果オーライなんだろうなぁ。

オシロなんて飾りだな。 すごいなぁ。

60 :774ワット発電中さん:2010/07/05(月) 17:18:35 ID:+7HumNnK
論理が逆になってるのが気づかなかっただけで
電圧が+/- 12 というのはあまり関係ないんじゃ? 
マーク状態の電圧みてれば あれと思ったかもしれないけど・・


61 :774ワット発電中さん:2010/07/05(月) 17:56:25 ID:GHpwcWON
最近の若いもんは
って言うのが仕事な窓際さん?

62 :774ワット発電中さん:2010/07/05(月) 18:10:32 ID:KACn1k+P
…。
規格上は+-10Vって綺麗さっぱり解りやすい値で
12Vってのは太古のドライバICが必要とする電源電圧じゃないの??

63 :774ワット発電中さん:2010/07/05(月) 18:17:22 ID:B4ewmqdd
あれ? rs232cは+/-15Vじゃないん
12でも15でも、分圧すればだいじょうび 入力が5Vでも十分・・・(工作の範囲で)
もろ直デモ燃えるようなことはない。AVRは強い子だから・・・

しかし、USART =rs232c だけじゃないよね!

64 :774ワット発電中さん:2010/07/05(月) 18:33:08 ID:/gHceoqT
チップや規格の定格を超えた使い方は、まあ趣味の範囲なら
動けばOKでも良いだろうけど
動かないときはまずそこをつぶしておかないと何をデバッグしているのか
わからなくなるかと

65 :774ワット発電中さん:2010/07/05(月) 18:43:43 ID:+7HumNnK
規格だと 速度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同士を繋いで
いなくて、指摘したら『でも通信できてます』なんて言う香具師がいた。

ある意味、無知って最強だなと思った。

67 :774ワット発電中さん:2010/07/05(月) 19:16:30 ID:/gHceoqT
そこで抵抗1本と直列2個入りダイオードですよw

ってそこまでするならトランジスタの方が良いか。

68 :774ワット発電中さん:2010/07/05(月) 19:29:30 ID:Xz748wSo
RSの受けの規格は+−5Vくらいかと、
NECのPCがアホで+−12V以上無いと識別できない糞仕様だっただけ。

69 :774ワット発電中さん:2010/07/05(月) 19:48:29 ID:WnkdUMjw
RS-232-Cの規格
http://www.alpha-works.com/work/logic/interface/serial/rs232c_base.html
<図1> 信号と電圧レベルの対応

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を出しても、長くて細い信号ケーブルだと、配線抵抗とレシーバ
の入力抵抗で分圧されて入力端子電圧が下がるんで、レシーバ側の入力電圧
の最低電圧はそれを見込んで低く設定されている。

71 :774ワット発電中さん:2010/07/05(月) 20:12:04 ID:B4ewmqdd
>>66

>直列に抵抗を1個入れただけでは、CMOSのAVRの入力ピンはインピーダンスが
>高いので、分圧抵抗としては機能しない

入力インピーダンスに係わらず
>マイナス電圧が掛かると入力保護Di経由でGNDに流れる。
だろ!

じゃなきゃ よい子のAVRはとっくに昇天しとる。ハズ


72 :774ワット発電中さん:2010/07/05(月) 20:56:30 ID:xKrOPE1Q
普通はMAX232使うけど、無いときは
とりあえず04使っている
http://elm-chan.org/docs/rs232c.html

安いからなw

73 :774ワット発電中さん:2010/07/05(月) 20:59:57 ID:PwibZo8D
>>71
それは厳密には「分圧」じゃなくて、保護Diに流れる順方向電流の電流
制限として働くだけ。

だから、入力端子電圧はVddを超える正電圧印過時には「Vdd+保護DiのVf
≒5V+0.7V」、GNDより低い負電圧印過時には「Vss−保護DiのVf≒0V-0.7V」
になる。絶対最大定格の入力電圧だな。

実際に、232Cの±12Vに直結でもデバイスが死ななかったとしたら、内部に
同様な保護抵抗が仕込んであるんだろうね。シリアルマウスの電源取った
りするくらいで、232Cトランシーバはそこそこ電流を流せるから、保護ダイ
オードだけだと、トランシーバの最大電流めいっぱい流れる。

しかし、デバイス売る方も、こんな使われ方されることまで考えて対策
する方が、論理設計よりタイヘンだろうな。

74 :774ワット発電中さん:2010/07/05(月) 21:01:02 ID:KsDDYVPm
AVRやPICユーザの基本技術の低さは救いようがないな。

75 :774ワット発電中さん:2010/07/05(月) 21:22:16 ID:xKrOPE1Q
232Cドライバは
外付け無しのが500円
http://akizukidenshi.com/catalog/g/gI-00197/
0.1u*5が200円
http://akizukidenshi.com/catalog/g/gI-00469/
1u*5が70円か
http://akizukidenshi.com/catalog/g/gI-02377/

76 :774ワット発電中さん:2010/07/05(月) 21:31:42 ID:15zvrSRn
AVRのピンで直接リレーの駆動はできますか?

77 :774ワット発電中さん:2010/07/05(月) 21:59:37 ID:PwibZo8D
>>75
> 外付け無しのが500円
> http://akizukidenshi.com/catalog/g/gI-00197/

どうせ薦めるんだったら、こっち(@200)でそ。
ttp://akizukidenshi.com/catalog/g/gI-00469/
※外付けコンデンサをサービスしています(0.1uFx5個)
※ICソケットをサービスしています。

2個セットだと、さらにお得(@150)ザマス。
ttp://akizukidenshi.com/catalog/g/gI-03030/
※ICソケット、外付けコンデンサ付(0.1uFx5個、ICソケット1個)×2セット

>>76
ドライブするリレーのコイル電流と、同時にドライブするリレーの数に
よる。

当然だけど、AVRの電源電圧とリレーのコイル電圧は同じであること。
ACリレーも駆動できない。

78 :774ワット発電中さん:2010/07/05(月) 21:59:50 ID:mL8kMtss
どのリレーかにも寄るだろ

79 :774ワット発電中さん:2010/07/05(月) 22:39:38 ID:6I4Vg60u
試しにリレーを直接つなげて駆動してみればいい

結果は報告してくれよなw

80 :774ワット発電中さん:2010/07/05(月) 22:59:12 ID:q7vte5ru
AVR Butterflyで色々遊ぶのが初心者には無難なのかな?


81 :774ワット発電中さん:2010/07/05(月) 23:35:42 ID:Qda38bnn
論理が反転してるとスタートビットもズレるから通信できてると思っても変なデータになるよね
個人的には秋月のUSB−シリアルコンバータの使いまわしが最強かなぁ
もちろん趣味レベルの話ね


82 :774ワット発電中さん:2010/07/06(火) 01:47:32 ID:GdQ9DLL5
>>81
論理が反転してたらフレーミングエラー出まくりで通信どころじゃ
ないよ。

83 :774ワット発電中さん:2010/07/06(火) 07:55:21 ID:zVwNUnya
アイドル状態('1'の連続)が、ブレーク状態('0'の連続)になるね。

何か送信すれば別だけど、アイドルビットの連続送信だけでは、'H'→'L'へ
のレベル変化検出が起こらないので、スタートビットの開始('1'=アイドル
ビットまたは直前に送信したキャラクタのストップビットから'0'=スタート
ビット)が検出されないから、待機が続いている状態ではフレーミングエラー
が連続する状況にはならないと思う。


84 :774ワット発電中さん:2010/07/06(火) 17:09:28 ID:n/ctvkqB
>>74
一応同意しておくが、それだけマイコンが気軽に使えるようになったってことだ。

85 :774ワット発電中さん:2010/07/06(火) 19:34:07 ID:FHRcOqS9
すごい盛り上がりで吹いたw

86 :774ワット発電中さん:2010/07/07(水) 00:03:57 ID:5TV2HB4m
>>77
ユニバーサル基板で組んだときにコンデンサ5個つけるのは、結構面倒だったりするので
外付け無しですませられるなら、それはそれでちょっと嬉しい。
確かに高いんだけどさ

87 :774ワット発電中さん:2010/07/07(水) 08:45:44 ID:Aq948y24
あの程度の工作をメンドウとかw

88 :774ワット発電中さん:2010/07/07(水) 20:49:19 ID:AGvG6MC2
あほか、手間じゃなくて、様々なコストだろ・・・

89 :774ワット発電中さん:2010/07/07(水) 20:57:01 ID:NM9a2Rsh
業者に出せば一穴いくらだけど、業者に出す時点で表面実装だよなぁ・・・

こんなことだから2SC1815がディスコンになるんだよ!

90 :774ワット発電中さん:2010/07/07(水) 23:03:15 ID:hlE8uJaa
>>89
http://akizukidenshi.com/catalog/g/gI-03793/
200個買っとけ

91 :774ワット発電中さん:2010/07/08(木) 00:01:04 ID:F9IKZhWx
1815の次は何が来るんだ?

92 :774ワット発電中さん:2010/07/08(木) 00:10:19 ID:u2xa2Yux
>>91
2SK-30Aって代替あったっけ?


93 :774ワット発電中さん:2010/07/08(木) 00:10:32 ID:dshIbG9h
1815ってディスコンなの?
それは困る
秋月の在庫がいつまで持つか・・・

94 :774ワット発電中さん:2010/07/08(木) 00:19:06 ID:nOVx/F92
>>93
1815だけじゃなくて、リードタイプ全滅ですwww
詳しくはディスコンスレで。

digikeyからパナのチップフィルム数種についてラストオーダ・メールが来ていたけど
あっちは同等品まだあるし…

95 :774ワット発電中さん:2010/07/08(木) 00:20:29 ID:khU4wc8/
秋月の在庫は1年近くはもつと思う

96 :94:2010/07/08(木) 00:23:02 ID:nOVx/F92
あ、全滅なのは東芝のリードタイプね。
今回はFETとかも派手にディスコンっぽいね。

97 :774ワット発電中さん:2010/07/08(木) 07:35:42 ID:fJGgDGnp
ちょっと東芝の○○さんに文句言ってくる

98 :774ワット発電中さん:2010/07/09(金) 07:58:28 ID:XVumUnTf
1815なんて150mAぽっちだからなぁ。
普通2SC2120だろ。

99 :774ワット発電中さん:2010/07/09(金) 08:33:05 ID:+VhBX9bl
100mA以上流すスイッチング用途なら最近は何も考えずにMOS-FETだなあ。
p-chもn-chもゲート電圧3.3V以下でもドライブできるのが増えてきて楽ちん。

100 :774ワット発電中さん:2010/07/09(金) 09:22:51 ID:kRSfVZHH
リード部品が無くなる、て話のところへFETを持ち出すヤツって素敵w

101 :774ワット発電中さん:2010/07/09(金) 11:47:52 ID:MlzgTF69
>>99

ちょうどそんなの探してたんですが、どんなのが定番ですか?

102 :774ワット発電中さん:2010/07/09(金) 12:04:16 ID:cOTshGO9
>99
2SJ244, 2SJ279, 2SJ317, 2SJ439, 2SJ465 ...
Pchの3Vスイッチは鈴商かサトーにそこそこあるけど、Nchは国内では厳しくね?
DigikeyでFDN337Nだろjkというのは置いとくとして、 2SK2493位じゃ。


103 :774ワット発電中さん:2010/07/09(金) 12:44:56 ID:5RaFXkRa
その辺とか直接ゲートにつないでまともに使えるのか?
負荷電流によるだろうけど

104 :774ワット発電中さん:2010/07/09(金) 13:42:24 ID:Yt/+XTDA
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並列くらいかな。

106 :774ワット発電中さん:2010/07/09(金) 17:28:06 ID:cOTshGO9
>105
サンプル二つだがw
FDN304Pは定番と言っていいかも。うちも標準的に使っている。
ゲート容量が大きくて遅いのと、12Vに耐えないのでこれだけで全てをまかなうのは厳しいんだよな。

>103
FDN304Pや2SJ439の1000pF越えは気をつけるとしても、2SJ244,2SJ317は100pF以下だし。
モノによるとしか。


107 :774ワット発電中さん:2010/07/12(月) 09:30:27 ID:usYOWkP2
メインのソースフィルで指定されている #define って、ライブラリとして呼び出してるソースファイルには適用されない?
ヘッダファイルには届いてるっぽいんだけど

108 :774ワット発電中さん:2010/07/12(月) 11:35:38 ID:o7SeOPCp
よく状況がわからないが、プリプロセッサの動作を理解していないように思える。
Cの話だよな?

#defineはそれを含むソースファイル中、それの出現した位置以降にのみ影響を与え
る。他のソースファイルや、バイナリリンクされるファイルには影響は与えない。


109 :774ワット発電中さん:2010/07/12(月) 11:48:39 ID:usYOWkP2
>>108
ありがとー
そのファイル内でしか有効じゃないってことかな
const でグローバル変数として設定すれば、プログラム全体で使える変数として認識してくれるのかしら


110 :774ワット発電中さん:2010/07/12(月) 12:14:34 ID:lpaq6xLB
>>107-109
AVRとか、組込プログラミング以前の問題のような。

定数を定義したヘッダファイルを #include すれば、別のファイルからも
参照できるし、BASICあたりからプログラム始めたのか、ヘッダファイルの
目的や意図を理解していないのかな?

extern 宣言で外部参照扱いしていない限り、他のソースファイルは、その
変数の存在を知らないし、ライブラリはコンパイルされた時点で完結して
いるから、ライブラリ側でextern 宣言されていない場合は別の次元空間に
存在する同名の変数となるか、public 宣言されていれば、リンク時に多重
定義でエラーになる。

const宣言(Read Only属性)を付けるかどうかは無関係。

111 :774ワット発電中さん:2010/07/12(月) 13:08:29 ID:519dRjB8
externはライブラリ側には必要ない
利用する側でexternすることで利用可能になる
存在を知らせたくない場合はstaticにする

112 :774ワット発電中さん:2010/07/12(月) 14:24:53 ID:lpaq6xLB
>>111
変数をどっち(ライブラリ/アプリ)が持つかによるでしょ。

> externはライブラリ側には必要ない
> 利用する側でexternすることで利用可能になる

これは、あくまでライブラリ側が変数の実体を持って、アプリ(ライブラリ
利用側)から参照している場合。 この場合、ライブラリのヘッダで変数名が
公開されているはずなので、初期値を代入すればよく、#define で定数と
して定義する必要はない。 単に、ソースの書き方を知らないのかもしれ
ないが。

一方、ライブラリ内部に変数の実体を持たず、変数の実体を、アプリ(ライ
ブラリ利用側)に持たせるような書き方もできる。 この場合、ライブラリ
側のソースでは、extern(ヘッダに記述されている必要はない)宣言しておき、
アプリ(ライブラリ利用側)に変数の実体をもたせることもできる。この場合、
コンパイルでエラーは出ないが、変数の実体を用意せず、ライブラリを使え
ば、リンク時に参照エラー(未解決)となる。

どうも、ID:usYOWkP2 は、定数のマクロ定義(プリコンパイル時の文字列
置換)と、変数定義や、宣言の違いを理解していないように思える。

113 :774ワット発電中さん:2010/07/12(月) 15:13:39 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 を拾えないかなって話でした

ライブラリの関数に対して引数で渡せばいいんだろうけど、定義された定数を別の手段で別ファイルの関数に送らないといけないっていうのがなんか無駄かなと思った次第です


独学過ぎて基礎がなってなくて、説明まで下手でごめん

114 :774ワット発電中さん:2010/07/12(月) 15:27:21 ID:OiOq5WBg
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 :774ワット発電中さん:2010/07/12(月) 15:40:58 ID:/38uktU9
それは多分、ボーレートがあってないのでは。
シンプルタームでボーレート切り替えてみてはどうでしょう

116 :774ワット発電中さん:2010/07/12(月) 16:00:37 ID:OiOq5WBg
>>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
でもうちょっと表示してくれてもいいような気がするのですが…
何ででしょう?

118 :774ワット発電中さん:2010/07/12(月) 16:43:08 ID:o7SeOPCp
>>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の定義を忘れたりするとわかりにくい
コンパイルエラーが発生するので要注意。


119 :774ワット発電中さん:2010/07/12(月) 16:55:05 ID:usYOWkP2
>>118
やっぱりそのソースファイル内でしか使えないのね

ただひとつだけ釈然としない点があって、
そもそも何故そんなことを思ったのかというと、例えば標準ライブラリの delay.h とかで #ifndef F_CPU とか使われてますよね
これって、int main(void) のあるソースファイルで定義した定数(F_CPU)をちゃんと認識していて、定義しないと「# warning "F_CPU not defined for <util/delay.h>"」がしっかり機能している

main.c で #define された定数が別のファイルで参照されている事例だと思うのですが、どうなんでしょ?

120 :774ワット発電中さん:2010/07/12(月) 17:04:16 ID:lpaq6xLB
>>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'の連続)をデータとみなされて、正常受信でき
たりする。

121 :774ワット発電中さん:2010/07/12(月) 17:14:43 ID:lpaq6xLB
>>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]回呼ぶというネスト構造にした方がいい。

122 :774ワット発電中さん:2010/07/12(月) 17:22:12 ID:o7SeOPCp
>>119
delay.hがコンパイル時に使われるのはdelay.hをどこかのソースで#includeしたとき。

だからmain.cがdelay.hを#includeしていればmain.cのコンパイル時にmain.cでF_CPU
が#defineされているかどうかをチェックする結果になる。

ヘッダーファイルにライブラリに存在する関数の定義があったとしても、コンパイラ
から見ればそのヘッダーファイルとライブラリオブジェクトには何の関係もない。
(手違いでライブラリとそれに対応するヘッダーの内容が食い違っていると大惨事が
起きることがある)


123 :774ワット発電中さん:2010/07/12(月) 17:43:29 ID:519dRjB8
>大惨事

pgrw

124 :774ワット発電中さん:2010/07/12(月) 18:33:56 ID:o7SeOPCp
今ふと思いついたが、もし
・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);
}

みたいなのが普通に動いちゃったりするんだろうか…もちろん特大の地雷になるが…


125 :774ワット発電中さん:2010/07/12(月) 18:50:12 ID:519dRjB8
>地雷

pgr w

126 :774ワット発電中さん:2010/07/12(月) 23:05:21 ID:7TtlEPsK
誰かincludeの動作を説明してやれよw
・defineが有効なのは、コンパイラに渡されたそれぞれの"ファイルの内容"の中でのみ(もちろんdefine以降)
・incudeは、コンパイラに渡す前にプリプロセッサによってincludeされたファイルで置き換えられる

なので、includeされたファイルは、include元の"ファイルの内容"に含まれてコンパイルされる
includeは、指定したファイルの内容を自動でコピペしてくれてるってこと

127 :774ワット発電中さん:2010/07/12(月) 23:24:00 ID:519dRjB8
それを言うならincludeの動作じゃなくてプリプロセッサの動作だろ


128 :774ワット発電中さん:2010/07/13(火) 00:20:00 ID:l6lToWX0
わからない人間を指してw付けるのは何となく程度が低いかなっと
せっかくいいこと書いてるのに、>>126はツンデレだな
で、delay.hの件は>>122に、
includeの動作は>>126に書いてあるとおり

ソースをmain.cとsub.cとかに分割した場合、動作のイメージとしては

1.main.cに対してmain.c内に記述されたincludeをコピペ
2.コピペされて完全体となったmain.cを単体でコンパイル
3.sub.cも同様に単体でコンパイル
4.出来上がったオブジェクトファイルとかライブラリとかをリンク

細かいコンパイラの動作はともかく、概念はこんな感じ

129 :774ワット発電中さん:2010/07/13(火) 01:05:07 ID:XNMDCPZt
コンパイラディレクティブの使い方がわからんというより、
プログラムを複数のソースファイルに分割する設計のパターンがわからんのだろうな。

「main.cの中でdefineされたシンボルの定義をkansu.cにも行き渡らせたい」
というのはすでにおかしな方向に行こうとしてるわけで、
「共通のシンボルを定義するヘッダファイルを作り、それを各.cファイルからincludeする」
という定番の方法を教えてあげれば済む話だと思う。

130 :774ワット発電中さん:2010/07/13(火) 05:09:47 ID:E0f5VKUo
基本的にF_CPUは最終的なhexを生成するMakefile上で
定義するもので、makeでリビルドされないライブラリから
F_CPUのような定数を参照したい場合には、ライブラリの
関数引数などで動的にユーザーから渡してもらう。
基本的にこの戦略以外は取ってはならないと思うよ。
あるいは、ライブラリをサポートするF_CPU毎に分ける。



131 :774ワット発電中さん:2010/07/13(火) 05:24:13 ID:E0f5VKUo
ただしavr-gccの生成コード効率面から言えば、
こういった定数を動的に渡す戦略はありえないので、
F_CPU(Makefile)が変わる度に、ライブラリを含めた
全体のリビルドを行わせた方が良い・・

132 :774ワット発電中さん:2010/07/13(火) 08:09:57 ID:l6lToWX0
ってか、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)
みたいなのを作ればいいんじゃないのかな?

134 :774ワット発電中さん:2010/07/13(火) 09:47:14 ID:xMEs+wUi
皆さんありがとう
大変参考になります

まだなんか分かりかねる挙動なので教えてください
以下のファイルがあるとします(プログラム的な実用性は別として)

・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();}

}
--------------------------------------------------


135 :774ワット発電中さん:2010/07/13(火) 09:48:17 ID:xMEs+wUi

これをコンパイルすると、下のようなソースをコンパイルしたのと同じだと思ってるわけです

・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 の警告は出ないので「ヘッダファイルには届いてるっぽい」という一文はここから来てます

自分の理解力の問題なんだろうけど、わからん!

136 :774ワット発電中さん:2010/07/13(火) 09:49:34 ID:xMEs+wUi
>>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にはいかない(’’

139 :774ワット発電中さん:2010/07/13(火) 10:59:59 ID:kV1/FBCw
>134
その書き方自体は合ってるぞ。それでwarningが出る筈はない。
おかしいところは他にある。


140 :774ワット発電中さん:2010/07/13(火) 11:30:12 ID:yrFXbgdm
>>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」の扱われ方と同じ結果になる
はず。


141 :774ワット発電中さん:2010/07/13(火) 11:41:28 ID:yrFXbgdm
今回のような場合は、以下のようなコードで解決できる。

● 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省略
}
--------------------------------------------------


142 :774ワット発電中さん:2010/07/13(火) 11:42:16 ID:yrFXbgdm
(続き)

● 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);

  …
}
--------------------------------------------------


143 :774ワット発電中さん:2010/07/13(火) 14:15:38 ID:IaYJFTXZ
CPU速度をハードから読み取れるようには出来ないんでしょうか?

144 :774ワット発電中さん:2010/07/13(火) 14:41:20 ID:bj3La155
>>143
君が自分の速度を読み取るときには何を使いますか?

145 :774ワット発電中さん:2010/07/13(火) 17:49:53 ID:2n/WNlRI
早く動いていると重くなるとかか?

146 :774ワット発電中さん:2010/07/13(火) 20:33:34 ID:Fqn0ouiY
>>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発振で動いている状態では、外部発振の水晶は止まっている。

148 :774ワット発電中さん:2010/07/13(火) 21:44:35 ID:SmTOWXY9
WDT(約128kHz)を走らせて、WDT割り込みがかかるまでにいくつタイマーが
カウントできるかで、おおまかなクロック周波数は分かるよ。

AT90USB162 のブートローダーは 8MHz/16MHz X'talのどちらが接続されてるかを
この手法で判定して、USBブロックに 8MHz入力するように PLLCSRを設定してる。

149 :774ワット発電中さん:2010/07/13(火) 23:03:44 ID:Fqn0ouiY
勉強になるな

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

パルスモニターを持っていないんだがやっぱり買うべきかなぁ…

153 :774ワット発電中さん:2010/07/15(木) 09:58:13 ID:6pVDJzx8
>>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と接続

マイコン用のスイッチとサーボ用のスイッチで分けてある

簡単な回路図(回路図モドキになってしまうが)ちょっと書いてみる

155 :774ワット発電中さん:2010/07/15(木) 11:02:18 ID:G0mXC3Rf
ウェイト用のタイマ2の分周比とタイマスタートはどこいった?

156 :116続:2010/07/15(木) 11:03:23 ID:qx/f7NWJ
こんな感じ
http://uproda.2ch-library.com/lib268419.jpg.shtml

157 :774ワット発電中さん:2010/07/15(木) 11:10:30 ID:6pVDJzx8
>>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以上になったら抜ける
}
}
}

161 :774ワット発電中さん:2010/07/15(木) 11:55:45 ID:6pVDJzx8
>>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;          // パルス幅増加方向へ(回転方向の反転)
    }
  }
}
//-------------------------------------------------------------------------------

162 :774ワット発電中さん:2010/07/15(木) 13:12:19 ID:iPYwGadd
デジカメで接続部の写真撮ったりすると問題解決に役立つ。
あとコードはこういうのを使うとタブが消えなくて便利。
http://ja.pastebin.ca/

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'

165 :774ワット発電中さん:2010/07/15(木) 14:50:11 ID:6pVDJzx8
> エラーがやっぱり
> 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); //正常終了
}

168 :774ワット発電中さん:2010/07/15(木) 16:15:57 ID:p9PMFwSa
数行なら別にここでもいいんだが、
糞コード連投されると読む気すら無くなるから。
わかるな?
http://codepad.org/
http://ja.pastebin.ca/


定数はなるべくdelay_us(100);とか>=20とかちりばめないで、
自分で#defineしてる箇所にでもまとめてくれなさい。
それから回路図はちゃんと書け。

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単位)」を正しく設定して、クロ
ック周辺のヒューズ設定も確認すること。

170 :774ワット発電中さん:2010/07/15(木) 19:54:13 ID:sJpxHlLx
最初の質問見て、なんとかしてやろうか、と思ったが
未読を読み進めるうちに萎えた


171 :774ワット発電中さん:2010/07/15(木) 20:11:25 ID:AtrMEPnc
>>170
me too.

172 :774ワット発電中さん:2010/07/19(月) 00:30:03 ID:P0c6xjas
おまいらのせいでレスが止まったじゃないか
何か話題振れよ

173 :774ワット発電中さん:2010/07/19(月) 00:43:53 ID:kSHCCGUL
若者のAVR離れか

174 :774ワット発電中さん:2010/07/19(月) 09:08:44 ID:7m0WYQaz
みんなArduinoに流れたとか?

175 :774ワット発電中さん:2010/07/19(月) 14:27:20 ID:+n7wXNXP
Arduinoは実験、仮組みで使うものだろうから(完成品の度に買い足すわけない)
仮にユーザーが増えたんなら、AVR入門者層が厚くなったってことで、まぁいいことだろう。

176 :774ワット発電中さん:2010/07/19(月) 17:11:26 ID:pxMgWO8k
あれをAVR入門というのもちょっとなぁw

177 :774ワット発電中さん:2010/07/19(月) 17:16:39 ID:wDtEy9Vq
Arduinoは、邪道です。
ありゃぁ子供の玩具の世界です。

178 :774ワット発電中さん:2010/07/19(月) 21:51:34 ID:7prdxYgy
Arduino使ったことのないオレに3行でAVRとの違いを説明してくれ

179 :774ワット発電中さん:2010/07/19(月) 22:54:25 ID:bxkzkG3J
>>178
・ブートローダ変更で、ライタI/FがSPIからUARTに変更している。
・みんなパクリまくりで、周辺回路がゆるーく共通化されている。
・ボードにAVR乗せるだけなので、誰でもハードデベロッパになれる。

間違ってないよね?

180 :774ワット発電中さん:2010/07/19(月) 23:21:03 ID:x0byie5x
arduinoはICやら周辺デバイスやらの動作テストするのに
手軽なんだよなー。

181 :774ワット発電中さん:2010/07/22(木) 09:09:24 ID:Ot4KvWMn
マイコン講座で初心者入門見てたけど分からないことがあります。
http://delegate.uec.ac.jp:8081/club/koken/wiki/?%A5%DE%A5%A4%A5%B3%A5%F3%B9%D6%BA%C2%2F%A5%BF%A5%A4%A5%DE%A1%BC%A5%E6%A5%CB%A5%C3%A5%C8

CS設定の部分でCS00 01 02で各種ビットを立てる位置があって、立てればいいのは分かったのですが、
これを複数書いていたらプログラムが長くなります。

色々探してみると、CS11で8分周 CS22で64分周 CS02で256分周
というのを見つけました。

CS02を1立てれば256分周になるのは分かります。「1<<CS02」
ですが、CS11とCS22で8と64分周になるのが分かりません。
8分周であるのでしたら「1<<CS01」でいいのではないでしょうか?
64分周に関しては意味不明です。

お願いします

182 :774ワット発電中さん:2010/07/22(木) 09:55:35 ID:LfIbNNp0
>>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に分周されたクロックから、
使い勝手の良さそうなものを接続して選択している、ついでにここで外部クロックの選択も行ってる、
という回路構造なので、しょうがないっす。

実際の分周比は、使ってるチップの、使ってるタイマー用のデータシートなりを参照してね。

>これを複数書いていたらプログラムが長くなります。
の意味がいまいち分からんけど、設定するビットの算出とか、その逆ってことなら
テーブル(配列)作ればいいんじゃない?はずしてたらスマソ。

183 :774ワット発電中さん:2010/07/22(木) 10:15:19 ID:Ot4KvWMn
>>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で表記させていただきました。

184 :774ワット発電中さん:2010/07/22(木) 10:35:06 ID:LfIbNNp0
>>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


185 :774ワット発電中さん:2010/07/22(木) 10:43:22 ID:Ot4KvWMn
>>184
なるほど…タイマーによって、分周のビット割り当てが違うんですね
64分周にしようとした場合、CS0xであれば、011であっても
CS2xの場合100になってますね。
CS22の場合、 Timer2の2bit目を1にする=100, 1 << CS22で確かに64分周になります。

もやもやが解けました。
もう少し詳しくデータシートを読みなさいって事ですね、勉強になりました。
ありがとうございました

186 :774ワット発電中さん:2010/07/22(木) 12:56:37 ID:csg9Qi59
そこで >8 >16 なわけですよ

187 :774ワット発電中さん:2010/07/22(木) 15:21:35 ID:Albafiha
エントリーが328pって人も増えてるんかねぇ
いまだ2313でシコシコハァハァしておりますw

188 :774ワット発電中さん:2010/07/22(木) 19:24:07 ID:nCZziXrE
どこで売ってるのか、どこに拡張ボードがあるのかわからねえ


189 :774ワット発電中さん:2010/07/23(金) 00:00:18 ID:QQ1rZ37J
16ビットタイマーと8ビットタイマー

190 :774ワット発電中さん:2010/07/23(金) 07:19:25 ID:PijbwYAm
>>188
リアル店舗なら若松にあったよ。
もちろん若松価格だけど。

191 :774ワット発電中さん:2010/07/24(土) 00:35:35 ID:aiWye9gm
むごいさん価格か・・・

192 :774ワット発電中さん:2010/07/25(日) 09:22:08 ID:fFzuloGi
2SC1815が製造中止というのは本当ですか?
でも100個もストックあるからいいんですけどね

193 :774ワット発電中さん:2010/07/25(日) 14:24:26 ID:hbuoh5H+
これかい?
ttp://slashdot.jp/hardware/article.pl?sid=10/07/05/0834218

194 :774ワット発電中さん:2010/07/25(日) 19:14:23 ID:HBCJKVj7
今どき定番も何も無くなってるから、影響は無いだろう

195 :774ワット発電中さん:2010/07/26(月) 01:23:03 ID:p8Ti/WpX
アマチュア用途では無問題。
いまどきTO-92もなかろうということで、既に2SC1815の在庫は棄てた。

p.s.
いつの間にかAVRでもHEXファイルにfuse設定を入れられるようになってたのか…。

196 :774ワット発電中さん:2010/07/26(月) 02:50:57 ID:EFwUgEjx
それは俺に対する挑戦なのかな?
AVRもDIPがあるから重宝しているのと同じで、リード部品が無くなったらブレッドボード試作の難しくなる。
初心者に秋月でTiny13とブレッドボードと適当なリード部品買わせて、半田レスで導入できるのが魅力だ。

回路が出来上がってしまえばリード部品入らないし、Tiny13も千石の8S2になるんだけどね。

197 :774ワット発電中さん:2010/07/28(水) 02:25:10 ID:qRQQn3t1
今さら昔秋月で買った手持ちの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

200 :774ワット発電中さん:2010/07/28(水) 13:27:32 ID:Ckv7X3QZ
がんばれ

201 :774ワット発電中さん:2010/07/28(水) 13:47:54 ID:ORortwr2
>>195 HEXファイルにfuse設定

詳細を教えて


202 :774ワット発電中さん:2010/07/28(水) 22:02:41 ID:KzMtri1H
AVRのピンの出力インピーダンスはどれくらいですか?

203 :774ワット発電中さん:2010/07/28(水) 22:06:27 ID:H8ISFi9w
>>201
ttp://www-ice.yamagata-cit.ac.jp/ken/senshu/sitedev/index.php?AVR%2Favrdude07#j019798d
ttp://www.style-21.jp/board/form9.cgi?action=res&resno=19056&id=ekousaku&rno=19124#19124

つまりは、ヒューズやEEPROMの書き込みに関してようやくPIC並になったってことか。
調べてみたら、avr-gccは2007年頃に対応していたらしい。


204 :774ワット発電中さん:2010/07/28(水) 22:14:00 ID:Ae6qWCVQ
同時に書き込めたらそんなにうれしいものなのかな?


205 :774ワット発電中さん:2010/07/28(水) 22:29:15 ID:qRQQn3t1
色々と工作してると昔のプログラムのヒューズ設定とか忘れてるから
HEXに内包されるのは有難いかも知れんねぇ。

206 :202:2010/07/28(水) 22:40:33 ID:KzMtri1H
AVRのピンの出力インピーダンスを測定してみたら、約50Ωぐらいでした
結構大きいですね

207 :774ワット発電中さん:2010/07/29(木) 00:02:38 ID:Ffjy5WfK
>>202
データシート嫁よ…

208 :774ワット発電中さん:2010/07/29(木) 00:29:53 ID:n27E9vRj
mega8のフューズビットを上位下位を間違って反対にしてしまっていて
CKSELを111にで書き込んでしまって以降、AVRSPで書き込めなくなってしまったんですが、
外部クロックつけるしかないですかね…

水晶がないのとPICがあまってるんで
PICの内発を出力してXTAL1につなげば生けるかなとか思っています

209 :774ワット発電中さん:2010/07/29(木) 03:06:16 ID:CkK1nn3O
>>203
ありがとうございます。

>>204
ヒューズの書き込み処理を時々忘れちゃうんです。
なので、プログラムと一緒に書き込めるとTiny2313一個分くらい嬉しいです


210 :774ワット発電中さん:2010/07/29(木) 04:04:49 ID:I2hpPkNz
安全性とか誤操作防止のために
わざとポリシーでさせないのかと思ってた

211 :774ワット発電中さん:2010/07/30(金) 13:16:32 ID:nt9nvbRa
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フラグが成立するか理解できないのです。
申し訳ありませんが、おばかな私に御教示いただけると幸いです。

212 :774ワット発電中さん:2010/07/30(金) 14:48:09 ID:fki8lHub
インラインアセンブラはAVR固有のものでもあるまい、
ググって解決できるものはググれっておもうぞ

213 :774ワット発電中さん:2010/07/30(金) 14:55:55 ID:fki8lHub
http://avrwiki.jpn.ph/wiki.cgi?page=avrgcc%A4%C7%A5%A2%A5%BB%A5%F3%A5%D6%A5%E9%A4%F2%BB%C8%A4%A6

ここでも読んでおくといい

214 :774ワット発電中さん:2010/07/30(金) 15:23:03 ID:nt9nvbRa
>>212
容易に質問をしてしまい、申し訳ありません。
AVR固有でないというヒントから、GCCのインラインアセンブラの
書き方を読んで理解しました。timeの値を1だけ引いているようですね。
ヒントを頂き、ありがとうございました。

215 :チラ裏:2010/07/30(金) 20:54:25 ID:GbZo8q+Z
ごぶさたです。チラ裏翻訳者です。月例報告。
今月は少しふんばって、タイマー/カウンター1までやりました。
ttp://awawa.hariko.com/chira-ura/index.html

コピペ率の高いタイマー/カウンター2の章まで完了したら、ちょっと最初から読み直して
リンク張り、修正、あと見やすさ・使いやすさ改良とかをやるつもりです。

216 :774ワット発電中さん:2010/07/31(土) 07:35:27 ID:BsYpgZaq
心の底から乙


217 :774ワット発電中さん:2010/07/31(土) 07:57:17 ID:JM9FZpmy
>>211
_delay_msは変数を渡すと浮動小数点計算になるので、えらいコードがでかくなる
定数を渡すか、自作の関数で下みたいな感じのを作ると良い

my_delay(n){
do
_delay_ms(1);
while(--n);
}

もちろんインラインアセンブラで頑張るのも良い

218 :774ワット発電中さん:2010/07/31(土) 13:19:36 ID:Bq0UZddd
自分はこうしてる

void Delay_ms( t ) {
while (t--) {
_delay_ms(1);
}
}

219 :774ワット発電中さん:2010/07/31(土) 16:22:54 ID:k44Wh8FY
知ってて書いていれば問題はないが、>>217>>218 は、引数n(t)に0を
与えられた時の挙動に互換性がないな。

220 :774ワット発電中さん:2010/07/31(土) 16:52:18 ID:FqnHSh02
ループ分遅くなるしなぁ

221 :774ワット発電中さん:2010/07/31(土) 17:00:18 ID:k44Wh8FY
>>220
ループ処理の誤差は、その分(例えば10us)を考慮して、

_delay_ms(1); を

_delay_us(990); とかにすればいいんでないの?

そこまで追い込んだところで、ループの最中に割り込み処理が入れば、
その分が誤差になるけど。

222 :774ワット発電中さん:2010/08/01(日) 22:28:46 ID:d2vrrtK4
ウェイト入れるのに遅くなるって言われても・・・

223 :774ワット発電中さん:2010/08/02(月) 03:24:38 ID:Doi9Eqmy
正確にしたいならアセンブラでどうぞ

224 :774ワット発電中さん:2010/08/02(月) 07:41:18 ID:y1D4GE8N
いやいやアセンブラでがんばっても正確にはならんよw
誤差蓄積が嫌ならタイマー使うし、あくまでも適当なウエイトだよ

87 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)