>>340 > 割り込みルーチン外で宣言していて、割り込みルーチン内で値を変更する変数にはvolatileを付ける、
> のつもり。
自分は以下のような目に遭いました。
typedef struct
{
char prm1;
char prm2;
} FOO;
volatile FOO gFoo;
割込み中で gFoo.prm1=1; にして、メインループで
while(1){
if (gFoo.prm1==1){
(処理)
break;
}
}
としたら gFoo.prm1=1 になったのにブレイクしなかった。
アセンブラソースを見ると while ループの直前に gFoo.prm1 をレジスタに
代入してループ内ではレジスタしかチェックしてなかった。
typedef struct
{
volatile char prm1; ←ここに volatile をつける
char prm2;
} FOO;
としたらちゃんとできた。
>>343 こういうの困るなあ
gcc自体のバグなのか仕様なのかAVRポートにバグがあるのか
こんな穴があったら眠れなくなるじゃねーか
gccのバージョンいくつですか?
>343は >としたら gFoo.prm1=1 になったのにブレイクしなかった。 まで読んだ時点で先がわかって、 >volatile char prm1; ←ここに volatile をつける こうするものじゃないかと自分は気付いたけど、 これはバグでも穴でもなくvolatileの付け所はもともとこういうものだと思うのだが。
>>344 最適化では、どのルーチンが割り込みで実行されうるかというところまでは把握せず
単にそのルーチンの流れに沿って見て、その範囲で変更され得ないと判断したらそのように扱うと言うことだろうな。
(ここではwhile節内にgFoo.prm1を書き換える処理がない=>一度だけレジスタに入れてそれチェックで充分)
割り込みで変えられて、それをチェックするなら、そういう変数にはみなvolatileつけろってことだろう。
もしもmain側に初期設定としてgFoo.prm1=0;なんてのがあれば、if分毎最適化でなかったことにするのかも。
>>345 じゃあ構造体にvolatile付ける意味は何すか?
348 :
343 :2009/02/13(金) 15:00:18 ID:Nc4X6BEq
>>345 > これはバグでも穴でもなくvolatileの付け所はもともとこういうものだと思うのだが。
もしかして
volatile typedef struct
{
char prm1;
char prm2;
} FOO;
て書いてたら良かったの?
>347 構造体の代入をするとき。 「volatile 構造体」でググるだけでもいろんなことが出てくる。
>348 「volatile 構造体」でググってみるとまさに例が出てくるよ。 こういった話だともうCのスレ行った方がいいかな。
>>349-350 具体的に判りやすい例を1つ挙げてもらえませんかね。
ググってもgccのバグとしか思えないんで。
>>352 たぶん、
>>343 のようなコードだと、gFooという変数=gFoo.prm1/prm2があるアドレスに対するvolatile属性がつくだけなのでは。
つまり、構造体を指し示すアドレスは変更されるかも知れないと考えてくれるが、
アドレスの示す先のデータが突然変わるなんてことには無頓着だとか。
まあそれでも内容が変わりうるには違いないので、本当は構造体内の変数全部volatileにならないと変じゃないかとは思うのだけど
実際あちこちのコード例見ると、AVRGCCに限らず、メンバーにvolatileつけてるのがあたりまえってことは、それが暗黙の了解なのかなと・・・・
volatileをちゃんと解説してる本なんて持ってないからよくわからない・・・
型修飾子は、常に変数に対して作用する。 だから、「volatileな構造体型」というものを定義することはできない。 「volatileな構造体変数」を宣言するか、「メンバ変数がvolatileな構造体」を定義すること。
ごめんよく見てなかった、構造体につけてるね。 バグだと思う。
>>353 そういやlinuxのカーネルソースにも
こんな感じの怪しいvolatileがあった気がする。
こういうとこでコンパイラを信用できないのは辛いなあ。
手元のプログラミング言語C++のリファレンスの型指定子の説明には
「volatile配列の各要素はvolatileであり、volatileクラスオブジェクトの
関数でない非静的メンバはそれぞれvolatileである」とある。
K&Rには「それは最適化に関係のある特別な性質をもつことになる」としか書いてない。
>>355-356 ありがとうございました。
>>355-356 テキトーな回答すんな、迷惑だろが
K&Rの定義ではvolatile型修飾子は最適化を抑制するべきものとされているが
ANSI C規格においてはその実際の動作は処理系定義であるとされている
つーわけでgccのマニュアルに書いてあれば仕様、なければバグ
>>343 ところで、この時のWinAVRのバージョン覚えてたら教えてくれないかな。
うちのWinAVR-20081205(-Os、-O3)では再現しなかった。
while(1){
if (gFoo.prm1 == 1) {
lds r24, 0x0094
cpi r24, 0x01
360 :
343 :2009/02/13(金) 17:33:42 ID:Nc4X6BEq
>>359 > ところで、この時のWinAVRのバージョン覚えてたら教えてくれないかな。
> うちのWinAVR-20081205(-Os、-O3)では再現しなかった。
20060421 で オプションは -03 でした。
gFoo.prm1をwhileを抜けた後で参照(書き込み)してるとか?
う−ん 俺も構造体メンバにvolatile指定することはあっても 丸ごと指定するっていう発想は無かったな
>359,360 WinAVR 20050214 (gcc 3.4.3)、avr-gcc 3.4.3, 4.3.2 でも再現しない。 volatile の解釈は正しく >351 になっていた。 i386用だが 4.1.3 も同上。最適化かえてみたが同じ。
俺は丸ごと指定する派
volatileなんて使うぐらいなら、全部アセンブラで書いた方がすっきりすると思う
>>360 ありがとうございます。
インスコ失敗したんでちょっと確認できませんでした。
>>365 それは極論
俺も丸ごと派
メンバにvolatileなんて考えたこともなかった
勉強になるわ
秋月でATmega88Pを買う予定なんですが、 ATmega88PってATmega88とは刻印で区別が付くでしょうか?
秋月のATmega88っていつから「P」になったんですか?
一時 在庫切れになったけど そこからだとおもう 在庫切れ前なので おれのはP無し
2−3ヶ月前にかったけど Pありがあるなんて知らなかった・・・・
前からあるやつの発売日おかしいよね
割と最近、mega88の在庫切らしたじゃん。そこからmega88Pに変わったんじゃないかな。 発売日2008/02/18はmega88(Pなし)を取り扱い開始した日なんじゃない? で、サイトリニューアルのタイミングで商品名称変更と説明補足と。 在庫切らす直前にたまたま店頭でmega88買っていたが、その時点ではmega88Pは無かったよ。
>>375 リニューアル前にmega88(P無し)を注文したら、P付きが届いたよ。
んでメールしたでふ。(当時)いま発注分は全てP付きになっています。
サイトの更新が間に合っていませんとのことでしたでふ
なんと。じゃぁ自分の勘違いかな。 在庫切れのレスがあった気がするので遡ってみたw >244 名前:774ワット発電中さん[sage] 投稿日:2008/11/08(土) 22:41:23 ID:02r3Hgjc >秋月のmega88売り切れって誰か100個買いでもしたんかー 自分が買ったのは2008/11/01で、これはmega88(Pなし)。 そういえば、店員に「メガはちはち下さい」と言って取ってもらった気がするので、 88Pがあったとしても88(Pなし)を渡してくれたのかもなぁ。
あ、いや待て、>375と>376は別に矛盾してないな。 在庫切れの時に88Pに変わったと仮定して、次回入荷が2008/11/08以降。 サイトリニューアルは2009/01/26。 …ていうかどうでもいいですね。スマヌ。
まぁ、でも秋月は良心的だったよ。 メールしたらmega88(P無し)をわざわざ送ってきたよ。 返信用封筒付いてたからmega88Pを送り返したけど。
ATMEGA168のアナログ入力ピンの最大定格って何Vですか? 仕様書にはVccと書いてあったと思うのですが、これ以上かけると壊れてしまうのでしょうか?
Reading signature .. 0x00, 0x00, 0x00 .. OK!
アナログ入力の最大定格ってVcc+0.5Vくらいじゃなかったけ? 「絶対最大定格」ってのはそこに書かれている以上の 電圧とか電流とかを、一瞬でもかけたり流したりすると 機器はあぼーんするよって言う数値なので 建前上は「壊れる」 でも俺は実際に絶対最大定格を越えた値で使ったことが無いので 実際のところはどーよ?ってつっこまれると 「壊れるんじゃないかな? ま、ちと覚悟はしておけ」 としか言えない。
13Vまでおおけえです
ピンにVCC以上掛けたら保護ダイオード通ってVCCのほうに流れていくだろ Vcc+0.5Vくらい の 0.5Vくらい はダイオードの電圧降下分。
1023VまでOKです
AVR ISPmk][でもAVR WRT2でもArduinoDuemilanoveからもsignatureが「00,00,00,00,」になっちゃうんだけど コレってチップ自体がダメぽ?
>>387 ロックビットが設定されてたらデバイス自体が認識しないんだっけ。
00,00,00,00になるってどういう状態なんだろうね?私も知りたい
389 :
380 :2009/02/16(月) 09:00:46 ID:UtthB8ht
そうですか、、 アナログの測定対象がVcc以上になる時があるので 分圧でもした方がよさそうですね。
>389 適当な抵抗噛まして,過電流さえ対処しとけば大丈夫。 (A/D端子はVCC+0.5V迄しか上がらない)
391 :
343 :2009/02/16(月) 09:29:40 ID:QyeeIfCb
343 です。
>>344-367 あたりでアドバイスをくれた皆さん、お騒がせしてすみません。
問題になったソースを確認してみましたが、私の勘違いだったみたいです。
typedef struct
{
…
} FOO;
volatile FOO gFoo;
この書き方は思った通りに動く事を確認できました。
volatile typedef struct ←ここに volatile を書いてもダメ
{
…
} FOO;
FOO gFoo;
これはバグではなく正しい解釈という事です。
>387 ISPプロセス初期段階のリセット失敗。 ISPではリセットを速いパルスで叩くけど、比較的ハイインピのラインなので 回路によっては内部的に L に落ち切れなくなる。 保護ダイオードに過電流がながれてたりとか、 入出力端子に巨大なキャパシタが直接ぶらさがってたりとか。 どっか(ISP周り以外の)回路がおかしいから配線をみなおせ。
>>389 Vcc以下とそれ以上について、どちらも精密に測りたいのか、Vcc以上は測れなくてもいい(壊れなければ)のかで話が違うかな。
前者なら、分圧などで制限、
後者なら、制限抵抗(+できれば外付けのダイオードクランプ)
13VはH8系のネタでした。
>>392 いやそれがブレッドボードでやっても同様なんダス。
共立AVRボードとかでも同様だったス。
ISPのライタしか持ってないのも今後困るだろうしって事で一応AVRドラゴン注文しておいたっス。
>>387 Vcc繋がってないとそんなんなった希ガスw
まさかとは思うが念の為
本来Vccはつなぐものじゃないとは思うけど、 ターゲット側のVcc給電は必要だし、それがライターのVccとあってないとおかしいことになるんだろうな・・・ ターゲットに電源亡ければVccもつなぐ事になるだろうし。 IOピンの保護ダイオード経由で中途半端に給電されちゃって中途半端に動くことはあるらしい。
ISPのVccって電源検出用だと思ってた。 Advancedで出てくるアレの。 と言うか、Vcc入れてないとAVR ISPmk][がそもそも使えなかった気がするっス。 ライタのVccってUSBバスパワーなのかな…?(AVR ISPmk][) だとしたら、合わせるってなるとライタからVcc引っ張り出せるようにしないと? 新品未使用(多分。買ったまま)のヤツでも同様の現象があるんで 多分、どっか俺が間違えてるんだと思うんスけど、ブレッドボードから直接ISPにブスブス刺してもなるんスよね…。 共立さんが出荷の時点でリセット無効とか書き込み禁止とかになってるって事ってないっスよね?
ISPコネクタのVCCはISP用信号のレベルコンバータに使われていると思いますよ
>>398 ブレッドボードでやるときの回路図というか結線図を書いてみそ
AVRISPmkIIの場合は1.8〜5.5Vという幅広い電圧に対応するために ターゲット電圧を取り込んでいるんだろうね。 ターゲットに電源供給してしかもVccを接続しないといかんということか。
>>400 職場なんで図は描けませんですorz
ISPコネクタからジャンパ線でMISOやらMOSIやらそれぞれ直接ぶち込んで
VccとGNDは外部から5Vのアダプタで、0.1μパスコンに。
VccとGNDはアダプタからとISPのVccとGNDに。
Arefは何も繋がず宙ぶらりんで。
って感じです。
今になって気付いたんスけど、AVccとAGNDってNCです?
>ISPコネクタからジャンパ線でMISOやらMOSIやらそれぞれ直接ぶち込んで うっかり逆だったり、とか?
>>403 直結のみも、プルアップもダメでやんした。
ちなみにATmega168で。
>>404 一度、うっかり逆でダメだったんで入れ替えてリトライしたのですが、やっぱりダメでやんした。
まさかここまで皆様に親身になって頂けるとは…感動です!
ATmega168のデータシートを読む Notes: 2. VCC - 0.3V < AVCC < VCC + 0.3V, however, AVCC should always be within 1.8 - 5.5V とあるけどAVCCの処理は?
>>407 Vcc→AVcc
GND→AGND
といった具合に繋いでました。
まさか発振してないなんて基本中の基本からミスってることは……ないよな、うん。
AVR RWTでねちっこく見たらリセット無効になってました。お騒がせして申し訳御座いませんでした!
ID変わってんぞ?
ATmega644PでRTCを使いたくてデータシートを読んだのですが、いまいち理解できませんでした。 RTCはタイマーのクロックとして32kHzを使用させるという解釈でいいのですか? 具体的にレジスタをどのように設定すればいいのでしょうか?
追記 32kHzの発振器がマイコンの中に内蔵されていて 専用レジスタの設定で、それをタイマーの発振源 に変更するのでしょうか? それとも、外部に用意されたクリスタルを 指定されたピンに接続してそれをタイマー の発振源にするのでしょうか?
どっちでも使える クロックソースの設定はレジスタじゃなくてヒューズで行う
LM35ってピン間違えるとチンチンになるね。 精度狂ったかな?
416 :
774ワット発電中さん :2009/02/16(月) 22:20:01 ID:jyuzsDTa
今、tiny2313を利用したちょっとした工作で、PD5に接続された トランジスターの1秒あたりのON(PD5がloになる)時間を計測し、 0.7s以上loの時とPD5のlo時間が0.4s以下の時とloの状態が0.4s〜0.7s以内続く時の 3つの状態によってそれぞれ分岐をさせるプログラムを作りたいのですが、 どんな命令を使用したらいいか分かりません。 どなたか、何かヒントになりそうな意見ございませんか? 助言、指摘なんでもかまいませんのでよろしくお願いします
>416 ループでも割り込みでもいいけど一定間隔でPD5を監視して"H"だったら カウンタ+1して。 1秒後にカウンタの値で分岐すばいいんじゃない(カウンタクリアも) ピン変化割り込み使うと軽くなりそうだけど、PD5じゃ使えないか。 それにしてなぜPD5固定?
418 :
416 :2009/02/16(月) 23:03:59 ID:jyuzsDTa
>>417 >それにしてなぜPD5固定?
プリント基板を作ってから割り込み変化に気付きました^^b
PD5のままで、なにか良い方法はないものでしょうか^^;
だから・・・例えば10ms毎のタイマ割込みでサンプリングして 1秒(100カウント)中にPD5=Loのカウント数(〜39, 40〜70, 71〜) で分岐すれば・・・ってこと。
タイマー割り込み使って、10msくらいの割り込みで無限カウンタ(PD5アサート0でも可だが)で ニゲート時の数値比較ですんなり行くんじゃないの? タイマー無いなら無限ループ中でそういう事をすればOKだと思うが。
タイマーの使い方をまだ熟知してないようだな
DIPのチップとブレッドボードで試作してからプリント基板に移した方がよかったのでは あとAVR Studioにデバッグ機能があるから、それである程度は確認できる デバッグ機能ははじめて使う人にはとっつきにくい感じだけど、 これ使いこなせないようじゃこの先大きなプログラム組むときに大変だよ
>>416 cnt=0;
for(i=0; i<10; i++){
if(!(PIND&0x20)) cnt++;
wait100ms(1); // ウェイトは
>>180 のリンク参考汁
}
if(cnt<4){ // 〜0.4s
} else if(cnt<7){ // 0.4s〜0.7s
} else { // 0.7s〜1.0s
}
単純に、これで良いという話?
あ、スペースは全角だから。ソースにコピペしないでね
>>416 >トランジスターの1秒あたりのON(PD5がloになる)時間を計測し、
うーん、その信号のLo/Hiの持続時間はそれぞれどれくらい?
Loが0.7sec続いてHiが0.3sec続くようなのなら
>>423 でいいけど、
Loが7msec続いてHiが3msec続くようなのなら、これではだめになる。
ICPでいいじゃん、と思ったらピン限定か。じゃぁポーリングかなぁ。PD6だったらICPが使えたのにねぇ
ジャンパ飛ばせばいいんじゃね?
1秒あたりなんだから1秒計測しておしまい、ってわけにはいかないのでは。 cntが連続していくつになるか数え続けて、 PD5状態が変わった時に条件分岐する処理になるかと。 cnt = 0; for (;;) { if(!(PIND&0x20)) { // Tr = ON (PD5=lo) cnt++; if (cnt >= 7) { cnt = 7; //オーバーフローを防ぐ // OFFが0.7s以上 } } else { if (cnt < 4) { // ONが0.4s以下 } else if (cnt < 7) { // ONが0.4〜0.7s以下 } cnt = 0; } wait100ms(1); }
ごめん ×OFFが ○ONが
もしかしたら、416は電波時計作ってるのかな? トランジスタで受けて、1,0,マーカーを識別するとか。
例えば350msのONのとき、wait100msだと読むタイミングで 3回カウントしたり4回カウントしたりするので wait10msやwait1msにしないと精度がでないよ。
エスパーがいるスレはここでつか?
433 :
423 :2009/02/17(火) 21:55:38 ID:6785rpBI
もはや416の思惑とは別次元かもしれませんが…
>>431 最初にwhile(PIND&0x20);してHiのあいだ空ループ、
ループを抜けた直後から等間隔なら、
あまり高レートにしなくても制度は確保できると思う。
仮に
>>423 をdata_read();という関数にしたとして、
main()
{
while(1){
if(!(PIND&0x20)) data_read();
// 他の処理
}
}
データを取りこぼすようならdata_read();の先頭で
wait1ms(5);とかしてタイミングをチとズラすとかする。
ここまで書くと俺が良く作る赤外線オモチャの受光部アルゴリズムまんまだよ。
4倍レートでサンプリングして何カウント?みたいな判定で誤動作してない。
この手のプログラムって、やたらタイマー使いたがる人が多いけど
wait+loopで済むならその方が単純明解だし、
他のマイコンにも移植しやすいソースになると思うんだよね。
光速?
船
> wait+loopで済むならその方が単純明解だし、 うっわ〜素人くさ〜
437 :
431 :2009/02/17(火) 23:19:56 ID:MqIjCt1X
>>433 Lエッジからならwait100msで問題ないです。
data_read();中は /*他の処理*/ が1秒間止まるので用途によっては心配かな。
2313Vって時計用の32Khz水晶できちんと駆動するもんですか? まだ9個あまってる>32Khz水晶
適材適所. 必要がないのにわざわざタイマ割り込みを使わなくてもいい.
>>433 >この手のプログラムって、やたらタイマー使いたがる人が多いけど
スリープ使いたいならタイマーは避けて通れないと思うよ。
ループだと電力浪費しまくる。
表示器がLEDとかFLで常時表示とかだと、関係ないけど。
>>439 そんなコジキハウスみたいなのやめて、
基礎設計しようや。
タイマー使えるときには大抵タイマー使っちゃうな。 一見意味不明なエラーが出るときもたまにあるけど、 それでも開発の効率が目に見えて落ちるほど難しい仕掛けではないと思う。タイマーって奴は。
他の処理も考慮せずに平然とwait100msなんて使うべきでない.
玄人の振りをして結局何も意見出してない
>>436 が居るスレはここですか?
>>443 俺、結構そういう処理入れちゃうけど、タイマー利用(?)とかで
みなさんどういう風にコーディングします?
自分の場合、例えばだけど、タイマーは7Segダイナミック点灯させておいて
main処理では平気でWait1secとかガシガシ入れたりする。
他の例は、バッファに入れた文字列をタイマー周期でUART出力とか…。
タイマーの分解能以下ならWaitは必要かもしれないけど、 それ以上はタイマーを使用してフラグ管理するべき。 無駄なWaitは今後の拡張性を阻害する。 また、割込み中の処理は必要最小限に留め、 速やかに開放し、割り込み同士の衝突をなるべく避ける。 割込み同士が衝突せずとも待たされてブレが生じるので。 メインループはそれぞれの処理をひたすら呼ぶ。 メインに列記された擬似スレッド関数内ではFuncで 状態に応じた処理を施す。 一般的にはこんな感じ。
>>445 いや、タイマー処理入れておいてループでウェイトとったらずれちゃうだろ・・・
それほど正確さを要する処理じゃないかも知れないけどさ
タイマー割り込み内でvolatile指定した1バイト変数をカウントアップして、
もしくはタイマ内で多バイトカウンタを回して、必要周回数に達したらvolatile変数のフラグを立てて
mainでは、その変数チェック→出番まだ→Sleep→タイマで起こされる→loop
出番があれば処理に飛ぶ
の連続で行けばいいのでは?
みんな タイマーを使おうぜ wait関数はLEDを点滅させる入門用に用意してあるだけ。 wait関数でも目的は達成できるけど やっぱり みんな タイマーを使おうぜ
タイマ所持のスレはここでつか
タイマ割り込みを使ってタスク切り替えだ!と叫び AVRにOS(orマルチタスクモニタ)は必要か?スレと化す………訳で無く。
クロックを1kHzにすれば、100ms待っても問題ないような気がする。
やっぱりタイマーか外部割込みでタイミングとって、暇な時はSleepとか 普段使う石って数種類だし、まともに書いた一番機能使ってるプロジェクト持ってきて、 処理を削除したソースをベースにしてる main { init呼出し後、スリープのループ } init { 初期化 } タイマー割り込み { カウントのみ } その他割り込み関数とか 後はmainでカウンタ見て処理して、初期化とかタイマー調節すれば出来上がり むしろwaitで他の処理とのタイミング気にする方がめんどい クリティカルな処理は割り込み内に書くけど、それ以外はmainで処理するな
453 :
445 :2009/02/19(木) 00:06:02 ID:FZkk19Ey
みんなありがとう、勉強になる。
>>446 ,447
volatile uint8_t nFlag_hogeを用意してAVRの割り込み優先度のアレみたいにして
ISR(タイマ)で、旗揚げゲームさせて・・・。mainでは、関数へのポインタか
if()elseif・・・・あたりでごりごり処理するってところ?
なんちゃってマルチタスクってところでしょうか。
我流で似たようなことをいざ導入するとなるとグチャグチャになってしまう。
main内のスレッドA、B、C…あったとして、B処理中に(高優先)Aフラグ立って、
BでモタモタしてたらAのタイミング失うとか…。並列処理(?)しようとして
どれも中途半端で、スタックあふれてアボンとか。
>>453 複数の処理をするならmain内の処理はタイマーの1ループ内に収まるようにしないとえらいことになるよ
本気でマルチタスクっぽくするなら、タイマー割り込み内でスタック操作して、
処理A,B,Cに順にリターンさせるとか。優先度つけるなら処理中フラグ見て処理先を決める
することなくなった処理は、他にCPU資源まわさなくてもいいならSleep、
他に廻したいなら強制的にタイマー割り込み発生させて次の処理に行くとかかな
まあそこまでする様な事に出会ったことは無いけど
>>453 本格的なプリエンプティプな処理はオーバーヘッドと
デバッグの効率を考えるとAVR程度のマイコンではお勧めできない。
RAMの容量からしてナンチャッテで十分。
高校のマイコン倶楽部の課題でやったのは エレベーター制御。 モーターのPWM駆動ではなく単にシーケンス部分。 ゴンドラの制御に扉開閉及びスイッチ検知、 レゴとマブチモーターの組み合わせだけど、なかなか面白かった。 使ったのはH8だったけどね。
しかし考えてみたら、電力消費や正確さを優先するなら、ICPかなにかを使うわな。 それをせずに、Tinyごときにマルチタスクとか面倒な仕組みを導入するのは疑問だ いい加減なハードの欠陥を、大掛かりなソフトで隠すのはよくない兆候な希ガス
それくらいのことで、「大掛かり」などとは程度が知れるな。
>>457 そんなアナタはPICスレがお似合いだよ
>>453 マルチタスクなんて大げさなことを考えず、どちらがお手軽かでいいのでは?
たとえば、1回きりの初期化のwaitでタイマ使うのもばからしいし、それほど正確さは要求されない、たとえばLCD制御の100usウェイトでタイマ使うのもあほくさい。そういうのは_wait_us()とかでいいと思う。
それに対して、繰り返し出現する比較的長いwaitとかで、そこそこ正確さもいるなら、やっぱりタイマ使った方が楽に正確さ確保できると思う。
電波時計の奴は・・・消費電力が気にならないなら&平行して行う処理に時間数十msecとかかかるものがないなら、どっちでもいいかな?
AVRはレジスタ多いからタスク切り替えだけで大変だ H8みたいにレジスタを束ねられないしメモリも少ない やるとしたら必然的に協調型で作るしかない 時間の掛かるタスクは自前で切り上げるように書く必要がある
H8とかだとシンクとソースでドライブ能力が違うのでシンクで使いますが AVRだとソースとシンク、どちらを使うのがベターでしょうか。 VCC,GNDともピンが1本の石だとどちらでも大差無いような気もしますが。
>>457 ICP使うには、入力信号が信用できないとなあ・・・
まあ、連続入力で有効にする機能(名前忘れた)と、
あり得ないほど短いパルスを切り捨てる処理を入れれば大丈夫かもしれんけど。
・・・なんかICP使った方がとっても楽なように思えてきた。ややこしいけど。
>>462 mega以降はどっちでも同じなので、電源落ちてるとき・断線やショート時など含め相手の都合か、わかりやすい方、慣れてる方でいいと思う。
シンクとソースって何ですか?
台所にある排水溝と蛇口
いやいや、流し台と調味料
>>465 ソースはプラス側へ(PNP型ドライバー)
シンクはマイナス側へ(NPN型ドライバー)
シンクはすーっ、でソースはふーっ
ブルドッグ
さすがAVRスレ、書込みのレベルが酷いな。 もっと技術的な内容で議論しろよ。
さすがAVRスレ、書込みのレベルが酷いな。 もっと技術的な内容で議論しろよ。
gcc使えるし素直だし 特に議論する事ないんだよ
PICみたいなお子様チップと違ってねw
PICにだってgccぐらいあるぞ。しかもMicrochip純正でな。
1命令4サイクルのPICで頑張れw
考えてから、ソースも晒せってことだよ
ネタ切れと言ってもこれは酷い・・・
SPIでSDカードの読み書きがしたいのですが、 ATtiny2313でできるでしょうか? SRAMが128バイトしかありませんけど。
SDは1ブロック512バイトがデフォルトだけど、それはFATの制限であって 確かブロックのバイト数を変更するコマンドがあった気がする 1ブロック64バイトぐらいに変更すればtiny2313でも扱えるかもしれない
読み出して、要らないデータを捨てればいいんじゃないでしょうか。 2313を複数個使うという手もあります。
あとは何に使うのかということだ 音楽データみたいにストリーミングデータなら、読んですぐ処理すれば メモリにセクタ全部蓄える必要がないから、それほどメモリは多く使わない
俺は事故とか自殺とか拷問とか刑罰は平気で見るんだけど 自傷行為かつ死なないというシチュエーションだけはだめだ 自傷行為でも最後に死ぬのが分かってると、なぜか安心して見れる あと他人に痛めつけられてるのも見れる でも死なないのに自分を傷つけているというその行為、 たとえば死なない程度のリストカットとか、ペニスを真っ二つに裂くとかは、 なぜかとんでもなく嫌悪感を覚えて自分の体が傷つけられてるような気持ち悪さを感じる
すまんスレ間違えた
絶対定格越えで死亡するのはいいけど バグって無限ループで暴走しまくるのは苦手なんですね
489 :
774ワット発電中さん :2009/02/21(土) 10:09:16 ID:S0D2Zjt1
ブキミなスレ違いだな
>490 素直にVMware買ってください。 自分もメインはMacだけど何かとwinは必要になるよ。
>>491 それなら素直に中古のWindowsノートを買うほうが建設的じゃないでしょうか?
493 :
774ワット発電中さん :2009/02/22(日) 23:57:15 ID:sASxSaXb
>492 場所とるので2台もいらないのです。 ほとんどMacで事足りてるので。
>490-492 横レスながら。 パラレルポートも付いた古いデスクノートを買うと、いっそう良い。 と思うのはオレだけでしょうか? シリアルすら付いてないような新しいもの、携行型などは当然ながら避けるとして。
失礼、Power PC用のもあるみたいですね。 MacからのBitBangはまだ試してないので、ぜひやってみてください。
Mac?なにそれ、おいしいの?
Mac信者はこれだから・・・
>場所とるので2台もいらないのです。 >ほとんどMacで事足りてるので。 2台置けないならMacは捨てればいいよ
案の定の脊椎反射だなあ。 信者でもないんだけど、まいいや。
自覚が無いのも信者の特徴だな。
AVRでテスターを作ろうと思うのですが、 内蔵の基準電圧の1.1Vはどれぐらいの精度なんでしょうか 分かる方いましたら教えてください
505 :
490 :2009/02/23(月) 11:12:43 ID:lKWOZj3j
>>505 ターゲットチップ(2313)のクロックはどうなってます?
以前、AVRisp2をavrdudeで使ったときに、
クロック設定をまちがえて同じようなエラーを出した事があるので。
507 :
490 :2009/02/23(月) 12:32:55 ID:lKWOZj3j
買ってきたまま(秋月でレール買い)の状態です。 なので、8MHzの8分周で1MHzです。 ターゲットに送るSCKを調節してみます。
508 :
490 :2009/02/24(火) 04:01:55 ID:e7SaMkRF
>>476 ぶっ、PICでC言語ったって、使える域には程遠いだろwww
再帰的コード書いたら即死だろ。
マカにAVRやる資格はねーよw 失せろ
>>509 ぷっ、
小規模マイクロコントローラで再帰コード使うってwww
再帰できないと使える域に達しない
>>509 がいるスレはここでつか?
MACって書いたら怒るんだろ?Macって書かないとw あんだけインテルチップやらWindowsやらに罵声あげときながら 内側にはインテル入ってるのを使ってるマックユーザーw 変なプライド持ってるからマックユーザーって大嫌いだったりする。 マカを辞書で調べたら 「Linuxに変わってからやっとマルチタスクに感動してる数世代遅れている可愛そうな人たち」 と書いてあった。
Windows vs Mac PIC vs AVR
Windows vs Mac って、もともとvsって考えてないからw 宗教団体林檎を相手にしたくないからねぇ PIC vs AVR 、PICって昔あった画像形式?
んでもってAVRは無停電電源なのか?
はぁ?
UPSではなくて?
入力電位変動が大きいときに、それを安定化させるためのハードないし機能を AVR (Auto Voltage Regulator) と言う。 Uninterruptible Power Supply とは独立な機能だがUPSに持たせていることはおおいな。
スレタイにAVR「マイコン」って書いてあるの読めない?
>>520 AVR搭載マイコンでつね、わかりまつ。
このスレからいくとマイコンでAVRを作るべきだろ
>>512 ん? 実用に耐えないで堪えたか?
じゃレベルを下げて’文字列’すら満足に使えないPICのCですが何か?
文字列使えないとかまたまたご冗談をw………冗談だよね?
’文字列’を扱えるCってあるの?
int x = 'ab'; で memcpy(&x, "ab", 2); 相当の動作をする C が稀にあった。 で PICでたまに名が出てくる HiTech Cのどこぞのアーキ用が該当していたような... というのが '文字列' の真意じゃないかとエスパーしてみる。 文化圏が違うと冗談かどうかの判断が難しくてな。
>>528 まあこれはあくまで文字列ではなく、バイト文字を使って表現できるワード文字だよなあ。
VC++だと'abcd'が通っちゃうな。 バイト並びはエンディアンの関係で逆になるけど。
PICとマックな奴は、N88日本語BASICで良し。 ぴゅー太でもファミリーベーシックでも
C++ならstrigsクラスあるだろ… というかデータ型とそれに伴う演算をユーザで定義できるんで却下。
std::string
まさか、アセンブラーだと文字列が扱えないとか言い出すのか?
アセンブラで文字列扱えるの? つか、AVRのアセンブラでデータ領域を定義する方法を教えてほしいんだけど
え?文字列命令ってあるの?
おまえは、8ビットの整数だけ扱ってろよ
>>535 アセンブラではできないが、他の高級・中級言語でできることなんて存在するの?
(面倒くさいとかは別にして)
そんなこと、あり得ないと思うんだが・・・
AVRfreaksが重くてindex以外見れないんだが俺だけ?
AVRWikiも見れねえ
542 :
774ワット発電中さん :2009/02/27(金) 21:39:51 ID:LHM+mScC
神風じゃ〜 神チップAVRのご加護じゃ〜
でもいっそ買収されたほうが個人へのユーザーサポートはよくなったかもしれないね。
買収されたらAVRのチップは終息と思われます
不況で何処も厳しいからなぁ…
不況がAVRを救った。
そもそもAVRの利益って少ないんじゃね? 元々メモリーやPLDメーカーだし。
今さらPICのアセンブラ書けと言われても、もう無理なのでこの判断は素直に嬉しい。
PICが1命令1クロックで動くようになって レジスタの指定にバンク切り替えが必要なくなれば AVRを捨ててもいいと思っている
牛刀だな・・・
PICPICってさー、PICの話は画像フォーマットスレに逝け
>>551 あと、bit0−bit7まで連続して8ビットあるポートがあることも重要。
何気にうれしい ガンバレAVR
>>557 これmega88とどう違うの?
16MHzで安いってだけですか?
たいていの用はTiny2313で足りるから、Megaシリーズって買ったことないなあ 2313は100円だから、30個まとめ買いしてある
ADがないのが残念なんだよな
逆にISPやるのに余計なこと考えなくていいからmegaにしちゃってる
563 :
774ワット発電中さん :2009/03/01(日) 01:38:07 ID:wXvKC6cW
ちょっと教えてください。 ホストとシリアル(非同期)で通信したいのですが、ピン数節約のため内蔵RC発振で 動かしたいのです。 このとき、最初にホストから特定のデータを送ることにより、発振周波数を補正して 安定的に通信できるようにするというテクニックがあったと思うのですが、 これを使ってる解説かコード例のwebページをご存知でしたら教えてください。 だいぶ前に見たんですが今ググっても見つけられなくて。。 PICだったかも?
>>557 ちょ、、え、ま、、、、、
mjoy大量製作の為にマルツポチッったばかりなのにorzorzorz
書き損じたけど、mega8ってmega88やmega88Pの廉価版なの?マジ話
mega8はmega88が出る前の品種じゃないの? mega8はディスコン候補だったような気がする。 と、調べずに書いてみる。
mega88だとI/O領域が拡張されていて、拡張されたI/O領域には通常の IN,OUT命令が使えず、メモリアクセス(LD,ST)でしか使えない(当然遅い) 悪いことに、mega8→mega88系で通常領域から拡張領域へmega8の時から あるI/Oまでごっそりと移動している。 特に$00〜$1FまではSBIS,CBI等が使えて便利だったのに PIC乃バンク切り替えもそうだけど、無理に拡した場合の弊害って所かな
gccでC言語でしかやらない俺には関係ないですね
>569 でしょうね、話題にもあまりあがらないし。 なんかのUSB関連のところでI/Oアクセスが遅くなって mega8の代わりにはmega88が使えないって読んだくらいかな。
>>570 ま、300円くらいならお小遣い稼ぎということでいいんじゃね?
LED点灯するだけの本とか、インストール手順見せるだけの雑誌記事とかもあるわけだし。
>>570 ネット上に溢れてるのに買うやつの気が知れん。
サポートしてくれるなら300円は安いかも知れんよ。 2chで聞くよりいいだろ
>>559 本家のmigration noteを見れば一発だよ。
ttp://www.atmel.com/dyn/products/app_notes.asp?family_id=607 のAVR094:Replacing ATmega8 by ATmega88
これによれば、
・Interrupt Vectors
・Bit and Register names and locations
・Oscillators and Start up Delay
・Brown Out Detection
・USART Control Register access
・Internal Voltage Reference
・Programming Interface
・Operational Voltage Ranges
が違うぞと・・・もちろん対応方法も出ている。
あと、物理的な改良点として
・Extended operating ranges as e.g.
[email protected] ,
[email protected] ,
[email protected] ・Lower Power Consumption
・Decreased EEPROM write time
・Prescaler on system clock
・On-Chip Debugging with debugWire
・Pin Change Interrupt
・Enhanced Watchdog Timer with Interrupt mode
・10 bit resolution on all ADC channels
・Timer/Counter0,2 extended with PWM and Compare units
・Master SPI mode in the USART
・General Purpose I/O Registers
・Output the system clock on I/O pin
だそうな。
何気にデータシート読んでて、タイマーにCTCモードなんてのがあるのを初めて知った 今までいつも割り込みがあるごとにカウンタ0にリセットしてたけど、これは便利
う〜・・。 tiny2313で並列動作させる為にタイマー触ってるんですが ISR(SIG_OVERFLOW0){ に飛んでくれない。ググっても出てこないし最悪だー
ISR(TIMER0_OVF_vect){ でやって味噌
WinAVRが最新版なら
>>580 だよな
いつからか忘れたけどSIG_***は使えなくなってる(***_vectに変わって、移行期間も終わった)
コンパイラがwarning吐いてるはずだけど(そのメッセージでググれば見つかるはず)、
warningだけでコンパイル自体は通るのがミソ。むろん割り込み先には飛ばないけど
Cだとよくwarningでるけど、放置しないでちゃんと読んでキャストとか修正した方が後々困らなくてすむと思ふ
うはぁう。皆さん有難う御座います。 #include <avr/io.h> #include <avr/interrupt.h> 〜略(wait関数)〜 ISR(TIMER0_OVF_vect){ sbi(PORTB,1); // 黄色LED wait2(100); cbi(PORTB,1); wait2(1000); } int main(void){ DDRB = 0xff; PORTB = 0x00; TCCR0A = 0b00000010; /* 標準ポート動作 + CTC */ TCCR0B = 0b00000101; /* タイマ0の分周比=1/1024 */ TIMSK = 0b00000010; /* タイマ0溢れ割り込み許可 */ sei(); while (1){ sbi(PORTB,0); // 赤LED wait2(100); cbi(PORTB,0); wait2(1000); } } なんですが、赤点滅のみになってます。きびちい
CTCモードを使うなら、 オーバーフロー割り込みじゃなくて、比較A(OCR0Aってレジスタだっけ?)の コンペアマッチ割り込みじゃね?
こんなんでどうかな #include <avr/io.h> #include <avr/interrupt.h> 〜略(wait関数)〜 ISR(TIMER0_COMPA_vect){ sbi(PORTB,1); // 黄色LED wait2(100); cbi(PORTB,1); wait2(1000); } int main(void){ DDRB = 0xff; PORTB = 0x00; TCCR0A = 0b00000010; /* 標準ポート動作 + CTC */ TCCR0B = 0b00000101; /* タイマ0の分周比=1/1024 */ OCR0A=250; //この値を1〜255の間でいじると黄色LEDが点滅する周期がかわると思う。 TIMSK = 0b00000010; /* タイマ0溢れ割り込み許可 */ sei(); while (1){ sbi(PORTB,0); // 赤LED wait2(100); cbi(PORTB,0); wait2(1000); } }
自分で書いてて思ったんですが根本的な使い方間違ってますねw 並列処理は諦めたほうがいいのかな〜・・
ぬわぁ〜〜。折角サンプル頂いたのにだめっぽいです(涙 #include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 1000000UL #define sbi(BYTE,BIT) BYTE|=_BV(BIT) // BYTEの指定BITに1をセット #define cbi(BYTE,BIT) BYTE&=~_BV(BIT) // BYTEの指定BITをクリア void waits(volatile long m){ while(m > 0){ m --; } } ISR(TIMER0_COMPA_vect){ sbi(PORTB,1); // 黄色LED waits(1000); cbi(PORTB,1); waits(30000); } int main(void){ DDRB = 0xff; PORTB = 0x00; TCCR0A = 0b00000010; /* 標準ポート動作 + CTC */ TCCR0B = 0b00000101; /* タイマ0の分周比=1/1024 */ OCR0A=250; //この値を1〜255の間でいじると黄色LEDが点滅する周期がかわると思う。 TIMSK = 0b00000010; /* タイマ0溢れ割り込み許可 */ sei(); while (1){ sbi(PORTB,0); // 赤LED waits(10000); cbi(PORTB,0); waits(30000); } } 赤点滅のみでした・・・
>>582 wait2()ってどんな関数?wait2(100)でどれだけ待つんだ?
割り込みの中に長時間waitなんて入れたらむちゃくちゃになるぞ。
やるならwait機能ごと割り込みに持たせて
char ISR_flag=0;
ISR(TIMER0_COMPA_vect){
ISR_flag++;
if (ISR_flag&1) sbi(PORTB,1); else cbi(PORTB,1); // 黄色LED
}
とか。
ところで、sbi(),cbi()ってどんな定義してるの?
標準ではとっくに廃止されてたと思っていたが。
>>587 #define sbi(BYTE,BIT) BYTE|=_BV(BIT) // BYTEの指定BITに1をセット
#define cbi(BYTE,BIT) BYTE&=~_BV(BIT) // BYTEの指定BITをクリア
で、sbiとcbiは定義しています。wait2は、巷に良く出ている
インラインアセンブラーの分でしたが、
>>586 のソースに変更しました。
>>588 まず、そのウェイトが割り込み頻度より長ければ、そもそも割り込みの意味をなさない。
なんだけど、黄色LEDがつかないと言うことは、そもそも割り込みがかかっていないことを匂わせる。
まずは、DDRBがちゃんと出力設定されているのか、ポートとLED接続ピンの関係は本当に正しいか、
配線は正しいか、LED逆につないでないかw、メインループで黄色LED点滅プログラム走らせたらちゃんと見えるか点検を。
それと、これクロックいくらで動いてる?
およそ250×1024クロックに一度の割り込みなので、10MHzで動かしていたりすれば1周期25.6msecで
点滅としては見づらいことになっているかもしれない。
それと、点灯時間も1000ループなので、おそらく数千クロック程度、こちらも10MHz駆動で1msec以下。
点灯として視認できていないだけじゃないのかなあ。
赤点滅の1/10の時間光ることになるはずだが、どう?
それと、
>>586 に間違い有り。
タイマー比較一致割り込み使っているのに、その割り込み許可をしていない(TIMSKはオーバーフロー割り込み許可のまま)
割り込みがかからないのはこれかも。
問題はこっちかな?
>>588 まあとにかく、割り込み内にループ入れるのはやめよう。
>>586 あ、クロック書いてあったな
#define F_CPU 1000000UL 1MHz駆動でいいですか?
ただ、このクロックはMakefile内に書いた方がいいかも。
ソース内に書くとしてもincludeより前がいいと思います。
その方がライブラリやインクルードファイルにもかかるので。
もう一つおせっかいを書くなら、間違いを減らすため、ビット名定義を有効に使おう。
明示的にゼロにするビットは、コメントに書くか、念を入れるなら(0<<bitname)で書くとか。
TCCR0A = (1<<WGM01); /* 標準ポート動作 + CTC、WGM01のみ1 */
TCCR0B = (0b101<<CS00); /* タイマ0の分周比=1/1024、WGM02=0 */
TIMSK = (1<<OCIE0A); /* タイマ0比較A割り込み許可 */
なんか皆さん本当に親身になってアドバイスして下さってありがとうございます。 言われた通りに色々とチャレンジしてみようとおもいます。 とにかく感謝感激です。さて頑張ります
もしかしてコンパイラの最適化でwaitが効いてないんじゃない?
あっでも赤は点滅してるのか
割り込み許可がちがうんじゃね?
(1<<ビット名定義)よりも _BV(ビット名定義)の方がスマートに見える
皆さん、ありがとうございます。とりあえず点滅しはじめました。 #define F_CPU 1000000UL #include <avr/io.h> #include <avr/interrupt.h> #define sbi(BYTE,BIT) BYTE|=_BV(BIT) // BYTEの指定BITに1をセット #define cbi(BYTE,BIT) BYTE&=~_BV(BIT) // BYTEの指定BITをクリア void waits(volatile long m){ while(m > 0){ m --; } } ISR(TIMER0_COMPA_vect){ PORTB ^= _BV(1); // 黄色LED } int main(void){ DDRB = 0xff; PORTB = 0x00; TCCR0A = (1<<WGM01); /* 標準ポート動作 + CTC、WGM01のみ1 */ TCCR0B = (0b101<<CS00); /* タイマ0の分周比=1/1024、WGM02=0 */ OCR0A = 250; TIMSK = (1<<OCIE0A); /* タイマ0比較A割り込み許可 */ sei(); while (1){ sbi(PORTB,0); // 赤LED waits(10000); cbi(PORTB,0); waits(30000); } } まだまだ勉強と実験は続いています。皆さんのアドバイスのおかげです。
C言語だとsbi cbiマクロの方が一瞬で判るし間違いもなくて良いイディオムだと思う。 ビット演算直接は新しい版でなぜか推薦されてるっぽいけど改悪じゃないかな。 定義した時アセンブラのヘッダと共有できないって理由なのかな?
599 :
774ワット発電中さん :2009/03/03(火) 20:55:26 ID:aZzzHHCF
■ おすすめ2ちゃんねる 開発中。。。 by FOX ★ このスレを見ている人はこんなスレも見ています。(ver 0.20) 【スバル】サンバーバン/ディアスワゴン【1BOX】28 [軽自動車]
>>598 たぶん、特殊な許可フラグとかの絡みでトラブルになるのを恐れたのでは
なんていったら|=とか&=も一緒か。
>>598 mega88や168世代になって、もとのアセンブラ命令のcbiやsbiではアクセス
できない拡張I/O領域が出てきたからそこら辺の配慮もあるのかも
その辺配慮しなくていいのがCの良さなんだけどな。 同じビット操作でもアドレスによってアトミックになったりならなかったりするのが嫌んな感じ。
おまえらの優しさに涙した 少数派は団結だよな
>>598 アセンブラのsbiやcbi命令との混同を避ける為では?
頭の中では理解していても、sbi()やcbi()ならアセンブラのsbiやcbiが使われる物と勘違いする場合もあるだろうし。
AVRってさ業務用とかに使われてんの? 趣味とかホビーだけ?
業務用にも使われてるよ。
少なくともここでは趣味だけだろうな。 業務に使っているような人がこんな所で情報収集してるとは思えん。
さーせん
>業務に使っているような人がこんな所で情報収集してるとは思えん。 どうしてそう思うのか・・・ プロは数人居るぞ
>>605 俺の使っているキーボード(Kinesis)は開腹したらAVRだった。
コンシューマでは使われているよね。
>>604 いっそ、インラインアセンブラでsbi/cbiマクロを作るといいかもな。
対象外レジスタだとエラーになってくれるし。
>>605 玄人指向の玄箱とか、相当のバッファローのNASには使われているな(メインではないが)。
制御系やゲームとかだと割り込み中ではフラグやカウンタ処理のみだけして、 メインループで疑似マルチするけどね。 高度な人とかだと多重割り込みをうまく使ったり再帰したりしてるけど。
613 :
774ワット発電中さん :2009/03/04(水) 12:05:50 ID:55/tiq3v
■ おすすめ2ちゃんねる 開発中。。。 by FOX ★ このスレを見ている人はこんなスレも見ています。(ver 0.20) 【MoE】-Master of Epic-E鯖隔離スレDay97 [ネットwatch] 【MoE】-Master of Epic-E鯖隔離スレDay96 [ネットwatch] WRT■リンクシス製品ユーザー集まれ-8■BEFSR [ハードウェア] ASUS Terminator … ターミネーター8 [自作PC] 【スバル】サンバーバン/ディアスワゴン【1BOX】28 [軽自動車]
>>612 フラグだけを使うなら割り込み自体要らないしね。
>>614 結構使うよ。非同期で複数の割り込みが発生する場合なんかに重宝してる。
>>615 うん、AtmelのUARTサンプルとかにも使っているしね。
>>605 KORGのnanoKey(MIDIキーボード)にmega32が使われているらしい
上で話題になってるWinAVRの割り込みベクタの指定方法、 ISR(TIMER0_COMPA_vect) こういうの。 これってプログラム中で割り込みベクタを別の用途に切り替える事が出来ないよね。 あとPORTDとかも。 1つのサブルーチンをPORTCとPORTDで使いたいとなると 同じプログラムを2つ入れるしか無いじゃん? こういう場合メモリマップ上のレジスタ直指定とかで ISR()もPORTxも使わないで書くしかないよね。 ついでに言うとsbi、cbiなんかも移植性を考えて使わない。 (1<<OCIE0A)とか、そもそも「何ビット目か」を示す変数だってのが間違っている。 C言語のファイルオープンとかだってモードなんかは単に「|」(or)するだけ。 俺の場合そういう事が多くて、 どうもこのWinAVRって仕様が御粗末に思えて仕方ない… みんなは何かスマートな技とか編み出して使ってるの?
>>618 そもそもプログラム領域のフラッシュって実行時書き換えできないきがする。
>>619 AVRの場合、割り込み中の関数呼び出しは若干どころじゃなく、
論外に片足突っ込むレベルだと思う。
ベクタを直接修正できない以上、switchやgcc拡張のラベル配列、
もしくはアセンブラでジャンプテーブルでも使うしかない。
622 :
618 :2009/03/06(金) 05:09:38 ID:pKyX372c
>>619 リンクありがとう。
結局、公式にもソコだけ標準スタイルを崩すしか無いって言ってる訳ですね。
それにしてもアレの「この工夫されたマクロ」とかは論外だよなぁ…
公式がああも質問側の意図が理解できてないのに泣き笑いした…
>>620 結局
>>619 や
>>621 の言うベクタ内で別んトコへ飛ぶべしと言う事ね。
それをスマートにやる技は何か有る?という話。
inline関数が使えるならswitch方式がマシっぽいかなぁ…
WinAVRってinline関数って使える?
(どのバージョンでも安全にという意味も含めて)
そもそも動的に何かを行うのが、静的に行う場合よりも オーバーヘッドが少ないなんてあんまりないんじゃないかと思うんだけど。 ループだって手で書き下した場合のほうが概ね速いコードを吐くし、 クリティカルなところは泥臭くなっても仕方ない。
>>619 というか、そもそもAVR程度のマイコンで割り込み内でできる処理なんてそんなにでかい処理無理なんだから、
#define TIMER0_COMP_PROC_A (0)
#define TIMER0_COMP_PROC_B (1)
#define TIMER0_COMP_PROC_C (2)
volatile char TIMER0_COMP_SELECT=TIMER0_COMP_PROC_A;
ISR(TIMER0_COMPA_vect)
{
if(TIMER0_COMP_SELECT==TIMER0_COMP_PROC_A)
{
/* PROC_A処理 */
}
else
if(TIMER0_COMP_SELECT==TIMER0_COMP_PROC_B)
{
/* PROC_B処理 */
}
else
if(TIMER0_COMP_SELECT==TIMER0_COMP_PROC_C)
{
/* PROC_C処理 */
}
}
なんて処理で充分なのではと思う。TIMER0_COMP_SELECTをメインで切り替えればOK。
割り込みベクタや関数ポインタすげ替えるのもいいけど、実際問題それで切り替える処理がいくつあるのか、
そのいくつかの処理は事前に分かっている処理じゃないのか?と思うので。
>>622 >それにしてもアレの「この工夫されたマクロ」とかは論外だよなぁ…
>公式がああも質問側の意図が理解できてないのに泣き笑いした…
訳文はIOポート名とありますので、それならマクロでも問題ないのですが、オリジナルを見たら、IOポート名とも定数とも書いてありませんね。
>How do I pass an IO port as a parameter to a function?
確かにこれだけだとIOポートアドレスが変数である可能性もありますから、マクロで解決する場合には引数がポートアドレスを表すマクロである場合限定だと注釈は要りそうです。
626 :
618 :2009/03/07(土) 00:04:20 ID:pKyX372c
返事書いてたら長文になったから捨てた。
失礼ですけど、気になったトコだけ…
>>625 そもそもPORTDがポインターだったら
質問も回答側の勘違いもする要素が無かったと思うんですよね。
「変数と同じ感覚でポートが使える」なんて仕様は作者の自己満足機能かと。
>>624 俺としては定数に名前付けるのも長い変数名も大嫌いなんですが…
define使って下記のように書くくらいなら
#define TIMER0_COMP_PROC_A (0)
#define TIMER0_COMP_PROC_B (1)
#define TIMER0_COMP_PROC_C (2)
enum使ったらば?
enum {
TIMER0_COMP_PROC_A=0,
TIMER0_COMP_PROC_B,
TIMER0_COMP_PROC_C
};
defineと違ってenumはint型なんで注意。
知ってたら御免。
>>618 >>619 は的確に答えてると思うんだが。FAQも普通だ。
俺にはあなたの意図がわからない。
BVも、コーディングが楽になるからやってるだけで、_BVマクロ通した後は
>単に「|」(or)するだけ。
じゃないのかね。
後、関数ポインタよりswitchの方が優れてる理由は何?スタック?
>>621 論外になるのは相当割り込み周期が短いときだけじゃない?
しかもそこまで短いときは関数呼び出しよりも割り込み自体の
オーバーヘッドの方がよっぽど効いてくるわな。
俺は普通に関数使うし、シミュレータで確認しても全然問題ないレベルだよ。
>>627 割り込み内から関数を呼び出すのが問題になるのは、時間よりもスタックの要求量じゃないかな。
実際、これやると割り込みルーチンのpush/pop量が半端じゃなくなる。
呼び出す関数にもよるし、RAMが多いAVRならこれもたいした問題じゃないけど。
>>626 3つくらいで、その後増える見込みがないなら、enumより列挙を選ぶなあ。
行数増えるし、あなたが書いているとおりintだし(使用する側で(char))
つづき あなたが書いているとおりintだし、たぶんchar変数と組み合わせても、 比較時点で型変換はいるのではないかな 使用する側で(char)を噛ませる手もあるけど、めんどい 可読性とか標準Cの流儀もいいけど、AVRのプログラムなんで、ある程度はサイズも きにしなければいけないと思うよ。8kRAMのmegaとかならあまり関係ないかもしれんけど。
まあ、AVRを使ってるならavr-gccに限定しても良いと思うから __attribute__((packed)) 移植性がなんちゃらとかいうなら、コンパイラの種類拾って #ifdef とかで、gccの時だけ有効にするとか
>>629 同意。
ハード要素をenumはあまりお勧め出来ない。
>>626 おそらく、あの手のFAQって実際のQ&Aと自作自演のw想定問答集が混ざっているんでしょうが、
大元のよくある質問ってのは、マクロ定義名を渡すだけで、マクロで済むような用途がほとんどなんだろうとは思う。
動的にPORTDをPORTBにしたいってのじゃなくて、ソース上で呼び出し元でPORTDをPORTBに
書き換えればいいような、関数もどきがしたいという用途。
たぶん、そのFAQの元になった問答ではちゃんと質問者の意図を読んでいたのだろうと思いますよ。
だが、そういうのはちゃんと書かないとわからねえよな。このFAQみてマクロでやって、
実際にはvariable=hogehoge;に展開されてるのを知らずに動かねぇぞ(゚Д゚)ゴルァなんて
やる人もいる気はする。エラーも出ないしねえ・・・汎用FAQにするにはちょっと問題がある。
>「変数と同じ感覚でポートが使える」なんて仕様は作者の自己満足機能かと。
それは読み過ぎでは?ただのCプリプロセサのマクロであって独自仕様でもなんでもないのだから。
ただ単に、「(PORTDマクロ定義を渡すだけなら)、マクロで展開させて最適化に任せるのがベターですよ」
といってるだけでしょう。はっきりと前提条件()内を書いてないからアレだけど。
昨日から千秋ゼミのページのavrspxライタを作ってた。 全くライタを持ってない状況からだったので、そこの下のCOMだけで書ける奴で 鶏卵問題を解決しようとしてハマったorz 最初にユニバーサル基板上で同回路を作りつつ書いたAVR(念のため2個作っておいた)が 原因ではまることに。 USBのHID認識だけは正常で、write&verifyがいくらやってもおかしい。 USBにするために最初の回路は破棄してしまっていたので(ブレッドボードは 使ってないのでそこからが問題ですけど)再度回路作る。 ICソケット上に立体配線版を作って書き直したらあっさり成功。 先人達の功績に感謝しつつ、これから何を作ろう。
今回の反省点を生かして新しいライターを作ればいいんじゃないでしょうか。 どんどんライターの完成度を高めて行って下さい。
ライターだけじゃなく、ぉぉぉぉおおおと思わせる面白いものも作ってください〜 俺も何つくろ?もう1年作ってないや。
Loto6用 ランダム数字発生器
手抜きじゃなく、まともなRNGを使うという縛り付きか?
いやゲイル理論搭載機 笑 なんか オカルト満載なきがしてしょうがないのだが 今週はえらい結果になった
エンジンの制御コンピューター製作中 車じゃなくてエコラン
四角い穴あけ大変だよね
ubuntu 8.10の標準のgcc-avr(4.3.0)はバグがあるので注意が必要。
>>628 割り込み内で関数コールすると入口/出口の push/pop が合計20個ぐらい増えるよね。
でもアセンブラで書いてた時代のソースを移植したりすると便利さに負けてついつい
やっちゃうw。
アセンブラなら関数ポインタによるコールでも
lds ZL,ptr_L
lds ZH,ptr_H
icall
でできるし、必要なレジスタだけ退避したり、割込み専用レジスタを決めて
push/pop 自体を排除できたりもしたよ。
gccならスタック退避させない関数も作れるから void __attribute__((naked)) subfunc(void) { ... } ISR(HOGEHOGE) { subfunc(); } て感じでソースは別関数だがオーバーヘッドはjmp/retの分だけに できるんじゃないかな?試してないけど。
tiny2313で適当に見積もってみた。
それぞれ比較や分岐とかのクロックは省略。
1) 割り込み中の関数呼び出し
無条件にr18-r31の12レジスタについて退避復帰が発生する。
レジスタ数 * PUSH * POP = 12 * 2 * 2 = 48clk
関数自体の呼び出し復帰に 3+4clk
呼び出し関数内のレジスタ退避等でもclkが掛かり、
毎回55clk以上掛かることになる。スタックも余分に使う。
ただし全関数でインライン展開が効く状況だと短くなる。
2) swtich
一定の条件数に達するとジャンプテーブルに切り替わる。
その際Zレジスタを使うのでr30-r31が余分な退避対象になり8clk
間接ジャンプに3clk
毎回11clk
3) ラベル配列
static void *table[] = {&&L1, &&L2, &&L3};
goto *table[state];などとする。
2)と同様にジャンプテーブルを使うコードになる。
ただの間接参照なのでswitchよりも若干短くなる。
同じく毎回11clk
4) 割り込み中の関数ポインタテーブル呼び出し
間接呼び出しでZレジスタを使う以外は1)と同じ。
インライン展開も効かないので効率は一番悪い。
そのぶんコードは見やすくなる。
毎回55clk以上
自分では割り込みだけわざわざアセンブラに直したりする。
>>647 naked指定はローカル変数や暗黙の一時変数を使う状況だと
やばいかもしれない。どうやばいのかはうまく説明できない。
出力リストの確認が必要。
↑正確にはYレジスタを除くr18-r27,r30-r31の12レジスタ
>648 どのソフト使ってADPCMの音楽ファイルつくった?
652 :
648 :2009/03/08(日) 10:55:52 ID:7RjW61SM
>>651 ADPCMは、Windowsのサウンドレコーダーで作りました
そこのページで公開されてるソフトは、エンコード中に落ちてしまいました
ADPCMならMP3のように統一フォーマットとでも思っているのでしょうかねぇ。
655 :
648 :2009/03/08(日) 11:44:29 ID:7RjW61SM
鳴りました!IMA ADPCMにしたら鳴りました どうもありがとうございました
最近アイディアが浮かばない俺に面白い電子工作を提案汁
>>656 ぱっと思いついたのは
>>648 とRTCを使って
現在時刻を読み上げる時計。
で、
>>648 のPWMってインチキだよね。
本当のPWMはアナログと三角波との比較で
PCMはある地点の値をCode化したものだから
n倍アップサンプルして各地点と仮想的な三角波との比較をするべきなんだと思う
>>658 >本当のPWMはアナログと三角波との比較で
それはPWMの実現方法の一つであって、
パルス幅変調するなら手段はなんでも文字通りPWMなんじゃないの?
>>658 それにラジオの時報で時刻合わせする機能を追加してくれ
そして自爆装置
>>656 キッチン電子はかりにマイコン付けて「こさじ少々」とか喋らせたい。
あの歪みゲージってどうにかなるもんなのだろうか?
>>648 のソース読もうと思ったんだけど、長すぎてワケワカメ
ファイルシステムの知識がないと読むのは無謀なのか
Cならまだ読めるんだけどなあ
どうにかなるってのは? 昔、共立でキットを買ったけど、今は売ってないみたい。 ストレンゲージだけなら手に入る。
>>662 はかりの方の出力部から信号盗んでしゃべる方式にすればストレンゲージは
自分では調達不要じゃないか?
電子工作だけ、だとワリとすぐネタ切れになって、ひたすらライターを作るハメにw もっと広い範囲の工作に電子を付加、だとアイデアも沢山でるよ もともと、こんなのやる人間はモノ作りすきだろ? メカとかと組み合わせるのも楽しいよ
ひたすらライターを作りたくなってきたよw ピックアップが死んでるDCが余ってたりするので、電源がそのまま色々使えそう。 3.3,5,12Vが使えるのでHVライタもターゲットに給電も可能そうだし。 フタをあけたらノンプレッシャーソケットというのがいいかも?
ギャングライターを作ってくれ
ついでにDVDが焼けるとか、。 AVRとPICを自動判別してどっちでもOKとか。
ライターは多いけどBootLoaderは少ないんだよね。 ファーム入りSDカードを挿すと勝手にVerUpするとか、 UARTを直接繋いで焼き込めるとかなにげに便利そう。
石焼ビビンバでも焼ければ最高なんですが
>>670 UARTとか、USBのブートローダは結構いろいろあるだろう。
SDカードも、難しいことを言わなければ簡単だと思う。
ATmega88+AVR STUDIO+WINAVR gccでA/Dやってるんですが電圧計が作れない。 LCDでADC0からの数値は表示されてるんですが・・・。 色々調べて 電圧=(AD変換値/1023)×5.0でやってもだめだし、 プルアップ無しや有りで試してるけど電圧に変換するのがさっぱり。 内蔵RC8MHzの分周期128で、基準電圧は内部AVCCやAREFでの5Vに。 3.15Vとか表示したいんですがどうしても出来ません・・・ Googleで調べたら皆さんきちんと表示されてる・・・。しかも電流まで。 12Vくらいまで計れる電圧計が作りたいんですが教えて頂けないでしょうか? 小数点すら出ず1週間以上気合いれたのですがギブアップです
>>673 すまんが、何ができていないのかが全然ワカラン。
固定小数点表示か?ADC自体か?できたけど結果がでたらめだってことか?
とりあえずどういう状態だから「できません」と言っているのかを書いてくれ。
AVR使いにエスパーはいない。たぶん。
AD変換値を10bitでやってるとすると ADの値は 0~1023 これを1024で割ると、必ず0になる(整数の場合)。 やるなら、 (AD値*5000) / 1024 [mV] とか (AD値/1024.0)*5.0 [V]
皆さんエキスパート&エスパーでございます m(_ _)m 3.58とかの電圧値をLCDに表示させようとした場合、 以下のソースのlcd_put_str()では無理ですよね? void lcd_put_4bit(char bitdata){ LCD_PORT &= ~(LCD_DATMASK << LCD_DATS); LCD_PORT |= (LCD_DATMASK & bitdata) << LCD_DATS; LCD_PORT ^= LCD_E; wait(10); LCD_PORT ^= LCD_E; } void lcd_put_ch(char ch){ lcd_put_4bit(ch >> 4); wait(10); lcd_put_4bit(LCD_DATMASK & ch); wait(10); } void lcd_put_str(char *str){ while(*str != 0){ lcd_put_ch(*str); str ++; } } 出来ていることは、ADCからの数値を取得しLCDに表示するところまで。 行いたい事は、12V程までの電圧を0.00V単位くらいの精度で LCDに表示させたいです。
一部じゃなくてソース全部さらしてくれ
長ったらしくて見苦しくないかな・・・迷惑かと思って一部にしたのですが
>>676 ADCのからの値は表示できてて、lcd_put_strもあるって事は、
数値をLCDに表示ができない、つーか文字列に変換できないって事かな
ADCを表示してるって事はitoa()をつかってると予想
まず内部的には電圧値は1000倍とかにして整数値であつかう方が楽、っていうかfloatは容量食いすぎるので却下
計算時に0にならないよう、計算順は
>>675 の指摘に注意
おなじくintがオーバーフローしないようにlongへのキャストも必要かも?(実際にコンパイルしてないので不明)
あとは文字列への変換時に小数点を入れてやる
int voltage = (int)( (((long)AD値) * 5000)/1023 ); //mVに変換、MAX500万超えるので計算時はlongでオーバーフロー防止
int upper = voltage / 1000; // 整数部
int lower = voltage % 1000; // 小数部
char buf[5]; // オーバーフローに注意
buf = itoa(upper);
lcd_put_str(buf);
lcd_put_str("."); // 小数点表示
buf = itoa(lower);
lcd_put_str(buf);
AD値の範囲によってはintじゃなくてuintやulongで、オーバーフローしないように注意
あくまで分かりやすいように書いたから、かなり無駄なコードになる&有効数字分の0が出ないけど
小さく、速くしたいなら0.1%くらいの誤差は無視して1023ではなく1024で、あとビット演算をうまく使うべし
そもそも1023までしか無いA/Dで12.00Vを0.00V単位では表示できません。 10.23Vにすると小数点を入れるだけで済みますよ。
>>680 int voltage = (int)( (((long)AD値) * 5000UL)/1023 );
せっかくならこうしたが良いかも。
まあ、どうせ同じコードを吐くと思うけど。
あと、直接12Vをマイコンに突っ込むことは無いと思うけど
分圧すれば当然計算式が変わる。
お返事送れてすいません。皆さんアドバイスありがとうございます。 いまから早速やってみます。
mega164とかXTAL1, XTAL2が共用ピンになっていないAVRって、 内蔵RCで動かすときに、XTAL1, XTAL2の処理はどうするのが推奨? オープンでいいのかなぁ・・・探し方が悪いのか、データシートに見当たらない。
685 :
673 :2009/03/10(火) 23:55:35 ID:54Wdo+1i
何とか出来たような出来てないような?
3端子レギュレーターで5V作ってるのに4.98〜5.00と変動があるので
毎回ソース若しくは半固定ボリュームで調整する必要があるのかな・・・。
あと何も接続していない状態だと0Vじゃなく揺らぐんですね
適当にアップローダーを探してアップしました。pass: 673
http://77c.org/d.php?f=nk6265.zip
686 :
673 :2009/03/11(水) 02:13:21 ID:pkih9t1d
ADC0とGND間に4.7kΩ入れ忘れてた・・。揺らぎは止りました。 しかし、基準電圧を確実に5.00Vにする方法って無いのでしょうか・・・。 安定化電源から三端子レギュレーターへ入れているわけですが、 きちんとパスコンや電解コンデンサー等はいれてあります。
そもそも、本当にその測定結果が正しいと言えるの?
688 :
673 :2009/03/11(水) 05:59:36 ID:pkih9t1d
>687 他のデジタルテスターで1次電池などを計測して比較してみました。 アドバイスのおかげで正確に出ていました
>>686 >きちんとパスコンや電解コンデンサー等はいれてあります。
データシートにあるような回路工夫はとってます?
最下位ビットまで信用するなら、あそこまでやらないとダメだと思うよ。
>>685 流れちゃったなあ・・もう見られないわ
>>684 XTAL1/2は反転増幅器の入出力らしいので、理屈の上ではXTAL1をプルアップかなにかしたほうがいいのだろうけど、
たぶん発信源としてXTALを選ばない時点で内部でプルアップか増幅器自体電源切っているかしてるのでは?
>>690 d。どうにもデータシート上での記述がみつからないんだよね。とりあえず、
オープンで動きはするけど、ちょっと不気味・・・
>>688 一次電池やデジタルテスタは電圧が変動するし誤差だらけでアテにならないぞ。
そもそもそこまで精度を求め始めるとA/D変換の誤差が(略
693 :
673 :2009/03/11(水) 14:05:38 ID:pkih9t1d
695 :
673 :2009/03/11(水) 14:56:43 ID:pkih9t1d
>>692 一応デジタルテスターのほかにオシロスコープでも比較はしてあります。
>>694 パンツの写真見せてって言われるくらい恥ずかしいな。
>>693 > upper = voltage / 1000; // 整数部
> lower = voltage % 1000; // 小数部
> itoa(upper, buf, 10);
> lcd_put_str(buf);
> lcd_put_str(".");
> itoa(lower, buf, 10);
このやり方だと、10.001を表示させると10.1になってしまったりすると思いますが・・・?
ゼロを補う工夫が要ります。
また、整数部と小数部にわけるのもいいけど、この場合は、mV単位のintで計算して、
それを固定小数点文字列に変換する関数、もしくはダイレクトにlcdに送る関数を作った方がいいと思う。
基準電圧を正確にしたいなら、AREFにツェナーダイオードとCRDの組み合わせで定電圧源を
供給するってのでどうでしょ。それか、内蔵定電圧源を使うとか。どうせ12Vを入力するので
分圧か何かするでしょうから。
測定リファレンスになる電圧源もこういうので作ったらより安定すると思う。
それと、電圧への変換だけど
>voltage = (int)( (((long)data) * ADC_STDV) / 1023 ); // mVに変換
ここは/1024でいいんじゃないかな。
出力1023は、Vin=Vrefではなく、Vin≧1023/1024*Vrefだと思う。
データシート上はADC=Vin*1024/Vrefになっているよ。よってvoltage=ADC*Vref/1024。
切り捨てで電圧値を表示するならそうするべきだと思う。
四捨五入するなら512で割って1足してから2で割ればいいか・・・そこまでする精度あるかどうかしらんけど。
自分でwait_usやwait_msを作らずとも util/delay.hを使えば良いんじゃなかろうか。 あと誤差がうんぬんっていうなら、A/D変換は loop_until_bit_is_setなんかで待たずに、 Sleep&割り込みでCPUをとめてみたら?
>>695 >パンツの写真見せてって言われるくらい恥ずかしいな。
せめてアナログ部GND面がデータシートのような状態になっているか+回路図。
699 :
673 :2009/03/11(水) 16:44:58 ID:pkih9t1d
皆さん、アドバイスありがとうございます。
まだまだ改良点がありそうですね(T_T
>>696 5.0Vの時に/1024だとなぜか5.0Vにならず、/1023だとだとキッチリ5Vに・・・。
LCDに直接送る関数ですかー。まずは基準電圧を正確にかな?
うぐぁ〜 頭がパニくってきました。
>>697 一度 delay.h でシンプルにやってみます。
697さんが言われた通り実験してみますね
>>698 ノイズ対策ですよね・・・。現在はたぶん怒られるくらいの状態・・・。
皆さんのアドバイスで改良を加えていきたいとおもいます。
本当にありがとうございます。
>>699 >5.0Vの時に/1024だとなぜか5.0Vにならず、/1023だとだとキッチリ5Vに・・・。
そもそもADCにVrefジャストの電圧を計測する能力はなく、
1023/1024*Vrefが、測れる最大電圧なんだと思います。
だからVrefが5VのADCを5Vの計測でチェックしても本当はだめじゃないかな。
>一度 delay.h でシンプルにやってみます。
delay.hの_delay_ms()と_delay_us()マクロは、かなり短いウェイトしか実現できませんので注意してください。
8MHz駆動だと、_delay_ms()は32.768msecまで、_delay_us()は98usecまでしか使えません。
また、このマクロの引数に変数を突っ込むと無駄にメモリ食いますので注意です。
登場場所が多いとそのたびにループルーチンを挿入されてしまいますので、
厳密さが要らないなら関数化した方がいいでしょう。
void delay_ms(unsigned int time) { while(t--) { _delay_ms(1); } }
delay_usの方は、ループや関数オーバーヘッドもバカにならないのですが、lcd用途ならこれでいいかと思います。
void delay_10us(void) { _delay_us(10); } /*8MHzなら関数オーバーヘッドで1usくらい狂う*/
誤差が出るのはあたりまえ
>>695 基盤見せるの恥ずかしいってのスゲーわかるw
コードも恥ずかしいけど、基盤は・・・
基板
706 :
705 :2009/03/11(水) 23:10:23 ID:7BFATNj3
リロードせずに書き込むのも恥ずかしい。
707 :
673 :2009/03/11(水) 23:31:39 ID:pkih9t1d
皆さん親切な人が多いですね(^^) 心強いです。
暇で寂しいんだよ 俺だけ?
709 :
673 :2009/03/12(木) 01:37:41 ID:wnHZEj+O
この板の人たちで会社作ったら凄いでしょうね
案外そうでもないかもしれないよ?w 好きと仕事は別の方がうまくいく事が多いし。 AVR-DoperってHVSPの12Vはセルフインバートで作ってたのね、回路図見て驚いた。 しかもかなり簡易かつ正確っぽいし。
HVSPはいらんけど、USB一本でデバッグ用のシリアルモニタと、 ISPが賄えるのはいいなぁ。AVR-Doper
>>746 まあそろばんはメモリだけって感じだな。
ALUとソフトウェアは人間が持っている。
746だと明後日ぐらいかなー
>>714 俺のそろばんは背中を掻けるし楽器にもなるぞ!
・・・・いいかげんにやめます
って誤爆な俺に温かいレスありがとうorz
HI-TECHがMicrochipの完全子会社になることで合意…双方のサイトで告知済み これでHI-TECHのコンパイラーがサポートするのは Microchipの製品だけへ ATMEL買収断念の後は、こう来たか…AVRはGCCで良かった
PICも16/32bitはGCCなんだけど。 さすがに8bitなPICはgccでは無理だったみたい。
ROMとRAMのアドレスぶった切りな構造だからさすがのGCCも面倒見れないよね。
719 :
716 :2009/03/12(木) 22:11:07 ID:mYuX5xEl
>>717 C18以降のコンパイラがGCC(C++抜き)なのも、下位Chip用のGCC移植断念も知ってる
AVRは、Microchipの「競合各社の開発環境を潰す」戦略に巻き込まれないで済む
という意味で書いた
俺の中ではMicrochipはすっかり腹黒会社です。
オールドタイプだからな。
AVR用の環境を作って成功すればMicrochipに買ってもらえるってことか・・・
公式の開発環境もEclipse用のプラグインもあるのに さらにどんな環境を作るつもりなんだ?
>>723 そりゃ、きっとなんだ・・
萌えなアレがあれこれアシストしてくれるんだよ。
「ご主人様、コードがダメすぎてメモリ内に収まりそうも無いですぅ。おとなしくアセンブラで書きやがれ!」みたいな。
>>723 シミュレータでIOレジスタが萌え擬人化されて一生懸命働いているAVRStudioは・・・・ちょっといいかもw
今後予想されるMicrochipの動きとしてはAVR互換チップの開発だな。
>>726 「あなたのために数えてあげてるんじゃないんだからね!」by TCNT0
hidspxできたので「よーしパパ、usbRS232つくるぞ〜」と頑張ったら、 もう一つライタになったorz ほとんど同じ回路だしねw
731 :
774ワット発電中さん :2009/03/13(金) 22:24:14 ID:aoODcHpy
Mega88でシステムクロックが8MHzなのでa/d変換クロックをck/64 にしているのですが、A/D変換が行えません。ちなみにck/2に設定 すると変換が行われます。なぜでしょうか? 8MHz/64=125KHzでちょうどいいと思うのですが・・・
待ち時間が短いんだろう
ちょっと位自分で調べようという気持ちがあってもバチはあたらないと 思うけどね
>>734 どこまで調べたかとか、どういう方法でADCしてるのか書かない時点でどっちもどっちでしょう。
>>731 というわけで、情報は小出しにせずにうざいと言われるくらい出さないと、スレが荒れるだけ。
ADCルーチンだけでもここに書いてみましょう。
ATmega164のPCINTなんだけどPCMSK3 = 0b00111100としてPD2〜PD5までの PCINTを許可した後、 PIND |= (_BV(PD6) | _BV(PD7) ) ; とPD6, PD7のトグルアクションをしたときPCINT3割り込みが 発生しちゃうのって何故なんだろ。ちなみに、この部分のコンパイル結果は in r24, 41-32 ori r24,lo8(-64) out 41-32,r24 になってる。 ここを PIND |= _BV(PD6) ; PIND |= _BV(PD7) ; と分けて書くと、予定通り割り込みはかからないんだけど・・・ (こういう風に書くと、コンパイル結果も sbi 41-32,6 sbi 41-32,7 になってる。当たり前の結果だけど)
>>736 トグル動作でどうしてPINを読み込んでる(|=)んだ?
1を書けば反転するんだから、読み込んだ値に1があったら勝手に反転するぞ
>>737 いや、PIND |= 0b11000000なわけだから、PD0〜PD5は影響を受けないはずではないの?
>>737 あぁ・・・すまん。その通りだわ・・・何勘違いしてたんだろorz
740 :
774ワット発電中さん :2009/03/15(日) 01:13:32 ID:jKKX1D79
簡単に購入できる一番安いAVRって秋月の2313なのかな? 8ピンで十分なんだけど50個くらい必要になったんだ。
ピンが多くてもいいなら2313でいいんじゃない?A/Dついてないけど。
AVR400: Low Cost A/D Converter
>>740 秋月ならtiny2313-20PU、18個以上 @90円 だね。
送料やクレジットカードの使いにくさを割り引いても
安いからいいか。
なんかほかにも買う物あるならDigiKeyで適当に見繕ったが安いかも。 種類も色々選べるし。
ふと思ったんだが、同種の大量のAVRに同じ内容を書き込みたいときってさ、読み出ししなければ重ねていっぺんにできないかな。 できる確証は無いけど、できない理由もいまいち思い付かなくて。
パラレルプログラミングならBUSYbitをORして出来ると思われる。 シリアルは何となく不安。
COMを使って1ビットで書き込む方式なら、何も見ないで一方通行で書くから 重ねても可能かもしれないが…根本的に間違ってる気がしなくもないw 安全に書く方が(本来)目的だとは思うけど、実験として数十個同時書き込み可能な 方法を考えてみるのも面白いかもね。 もしくはギャングライタとかw
748 :
740 :2009/03/15(日) 22:34:56 ID:jKKX1D79
やはり秋月で2313が手軽そうだね。 デジキーは手頃そうなのが見つからなかったよ。 そういえば、50個も書き込み作業が発生するのか。 ゼロプレッシャーソケット位は買った方が良いかもな。 教えてくれてありがとう。
>>747 そのあとのベリファイが結局個別になるから、
パラレルでもシリアルでも、ベリファイするなら一気にというのは無理になりそうだ。
>>748 制作物、ISPコネクタはつけないの
>>749 ブートにCRCチェック入れとくだけじゃ駄目かな?>ベリファイ
書き込み用電源利用して、書き込んだ後にリセットして特定ピンが立っていたらアウトみたいな。
>>750 なるほど、領域がもったいないけど、可能ですね。
ただそのCRCチェックとその出力領域が化けていれば困るんで、
特定ピンが立っていなければアウトとか、何か特定パターンでLEDでも点滅させる
(その装置がLED使うなら)がいいかな。正常起動通知を兼ねて。
でも、2313クラスなら、詰め込むプログラムがぎりぎりなら辛いかな・・・
752 :
478 :2009/03/16(月) 10:26:16 ID:2V6I5JoP
>>749 ISPはパターンだけ引いて実装はしない予定です。
755 :
754 :2009/03/16(月) 11:25:42 ID:6xt4jG6l
WinAVR-20090313がリリースされている
ttp://arduino.cc/en/Tutorial/AnalogInput このページの変数valはloop()の中のローカル変数でもよいのに
グローバルに宣言されています。
グルーバルで宣言した方がよいことがあるのでしょうか。
スタックの関係?メモリ消費量の関係?
ちなみにArduinoのコードは
int main(void)
{
init();
setup();
for (;;)
loop();
return 0;
}
こんなコードとがっちゃんこされて普通にgccでコンパイルされます。
>>757 対象がプログラム初心者だから、一箇所で宣言しているだけだと思う
>>757 他の関数をつくって拡張するとき、グローバルを使った方がやりやすそうな
タイプの変数だけどね。
>>760 そうだったんですか。ろくに調べずに失礼しました
Bluetoothのシリアルポートを使ってAVRに書き込めた人いる? 最近小型化が進んでるから数センチ角のモジュールを繋いで書き込む対象から電源もとれれば手軽になれば便利そうだが、無理だよねやっぱり。
自己書き換えにすれば何でもいける。 BluetoothでもJigBeeでも赤外線リモコンでも。
連休で時間ができたから
>>648 のやつ組んでみた
結構いい音で鳴るもんなんだな
まあ再生だけならMP3プレーヤがあるから
録音機能がつくと価値が出てくるかもしれない
必要に応じてそれぞれ決められた音声(肉声)をスピーカーから出すってなると、 SDカードに音声ファイル入れて、どのファイルがどの音声かの番号を覚えておいて 再生させる以外方法ってないですよね? 2MbitのEEPROM(23EE020)とかなら大量に在庫があるんだけど生かせれば・・・
>>766 ユーザーが音声の差し替えする必要がないなら、ファイルシステム使わなくてもいいんじゃない?
case1ではEEPROMの何番地から何バイトを再生とかでもいいと思う。
768 :
766 :2009/03/21(土) 11:54:18 ID:nqSoHRsm
>>767 なるほど。SDカードの変わりにEEPROMっていう感じですね。
ちょっとEEPROMのデータ調べてみます。(過去のものなので・・・)
アドバイスありがとうございます。
769 :
766 :2009/03/21(土) 11:56:45 ID:nqSoHRsm
PH29EE010の間違いでした。
>>768 一番安いmicroSDに直接ハンダ付けしてみるって手もある、もちろん使うときはファイルシステムなしで。
>>771 いやアダプタにではなく直接。
最近のmicroSDは安すぎだよね、数百円で512MBが買えるし500円出せば2GBとおつりがくるしさ。
最近はカードよりソケットの方が高いからな。
>>771 [ブレッドボード用SDCARDアダプタの試作]ってやつだよね
すっごい。これは思いつかなかった。
変換ソケットだけはどんどんあまっていくから作ってみよう
>>774 ああ、たしかにシリアルEEPROMを買ってくるよりmicroSDは安い。
しかもmicroSDの容量はAVRの64Kの中から見たら無尽蔵だ。
気温や湿度のデータロガーに使ったら2GB埋まるのに何日かかることやら。
>>776 1年分を記録させてグラフ化・・・
そして1年後、SDカードが壊れてたとか orz
>>774 へぇ、SDカードって100milピッチなのか・・・これはいいな。
L字ヘッドピンを使えば便利になるかな?
変換基板でええんちゃう? カード検出端子も出てるし。
>>778 いや100milではないんですよ。
でも微妙にずらすとギリギリ収まってくれる。
F特性なんてパスコンにも使いたくないな。せめてX7R。
誤爆
>>778 おー、L字のピンヘッダー使えばいいね、アッタマい〜
早速やってみようっと。
Tiny45が一度も書き込むことなく(直前のavrspx -rは反応した)お亡くなりになり 取り合えずヒューズリセットしてみたいんだが 手軽なリセット回路とか載ってるとこあったら教えてくれ
45ならぐぐれば見つかるだろ
>>789 好きにやればいいじゃね?
俺は共立のこのセットで使ってるけど。
BOXプラグ6P(直型) JS-1200-06 (-/) 55円
ケーブル圧接型ソケット6P FC-6P (-/) 55円
ありがとう。 フラットケーブルを持ってる場合はこっちの方が楽みたいですね。 5Pケーブルなら工具無しでも圧接できそうだし。
ATtiny85−20PU って8k使い切れないんですけど
自分は秋月で売ってるピンヘッダの2列のメスを切って削って使ってる、いままでミス無し。
796 :
774ワット発電中さん :2009/03/24(火) 23:27:34 ID:nqzC/zUX
ピンとピンを導通させるプログラムができてしまったんだが、そんなことあり得るのか?マイコンがおかしいのかと変えてやってみたがどれも同じ結果、テスター変えても同じ、導通してるのにマイコン壊れない・回路の動作に影響ない、電源切ると導通しなくなるという状況。
ソース晒して他人の環境で再現実験が確実かと・・・
それ以前に、電源入った回路内の導通なんか正しく測れるの?
799 :
774ワット発電中さん :2009/03/25(水) 00:22:48 ID:d1TOvis9
>>798 信じてくれないかもしれないが、晒す為の環境がない。
>>799 取り外しできるように、mega64サイズのはマイコン乗ってるだけの基板使ってるんだよ。マイコンのピンそれぞれをユニバーサル基板にさせるぐらいに延長させて。部活動でやってる事だから、下級生がマイコン殺したり回路ミスったりすることがよくあるからな。
800 :
774ワット発電中さん :2009/03/25(水) 00:24:05 ID:d1TOvis9
いや、だから、たとえマイコン単体でもそれは回路なんだよ。 電源入った状態じゃテスターでピン間の導通なんて正しく測れるとは限らないでしょ。 と言ってるつもりだったのだが、ご理解いただけなかったところを見ると素なのか・・・・・orz
そんな事がありうるのかどうかを聞きたいなら 「そんなこと」の詳細を書いてほしいね。 もし両方出力ポートで同じ向きになってるなら Vcc、あるいはGND経由で導通するかもしれないし、 電位差がある状態なら、抵抗測定モードで テスター繋いでも計れるはずないし。 マイコンをどうしたら、どんな状態になったのか。 なぜ導通してると判断したのか。 その辺を書いてよ。
導通テスターはリード棒に電圧が掛かってます。その電圧がゼロになると導通。 "ONしているトランジスタと電源" "ONしているFETとFET" でも導通します。
つーか、出力ピン設定でHighになったピン同士は当然「導通」してるんじゃないの? 両方ともFETでVccに接続状態ですよね?
はい、High-HighやLow-Lowだと電源経由で導通します。 High-Lowでもゼロ電圧以下になる場合は導通と判断されるでしょう。 又、入力ピンに導通テスターをあてると電源以上の+電圧やGND以下の−電圧が 掛かるので(インサーキットテスター以外は)マイコンを壊す可能性があります。
806 :
774ワット発電中さん :2009/03/25(水) 02:43:48 ID:d1TOvis9
>>801 その説明で理解しました。はい、ほとんど素なのは認めます。回路設計は自分じゃないですし。
>>802 状況はマイコンのVccピン及びGNDピンのみ、それぞれVcc、GNDに接続、導通ピンはどちらも出力設定で何も繋いでない状態でした。GNDにも繋いでません。導通テスターの結果で判断しました。
ねぇねぇ。プルアップ・プルダウンって 2k 〜 4.7kΩ が多いみたいですが、 自己放電の為にGNDに落とす時って0kΩ以外なら何でもいいのでしょうか?
E=IRでIが耐えられるならOK?
>>807 2K〜4.7Kって小さくねえ?
AVRだよね、47K〜100Kくらいでいい気がするけど。
配線の引き回し延長も考慮して決めろよ
811 :
774ワット発電中さん :2009/03/25(水) 10:37:49 ID:3yGXmrRB
AVR未経験者です。ATMEGA48のライターで使いやすいのを教えて。
>>811 人に教えてもらう時の話し方を・・(略
まずググれ。
>>808-809 なるほど。サイトによっては2kや4.7kになっているんですよね。
AVR内部に搭載のプルアップ抵抗値は、20kΩ〜100kΩと書いてますね。
もう少し調べてみます。
プルアップ/ダウン抵抗にあまり大きい抵抗を使うと波形が鈍って 立ち上がり/下がりが遅くなったりする、みたいなことをどこかで 見たんですが、合っていますでしょうか?
OD出力のことではないですかね。
未使用ピンに対するプルダウン/プルアップと、オープンドレインに使うのだと抵抗値も違ってくるね。 波形がなまって困るところなら、小さくするか、そもそもプルアップなんか使わない。 AVR板だから、プッシュスイッチのオープン防止なんかだろうと思って100Kでいいと言いますた。
>>807 入力容量の充放電だけ考えれば小さい分はそれでいいけど、
入力元のインピーダンスが高かったらあまり小さいとHi/Lowにならないぞ。消費電流も増えるし
あまり大きいと離れたスイッチとかに使うならノイズに弱くなる
多くの回路で無難な値が4.7kあたり、ってだけ。AVRの入力なら
>>809 くらいでもOK、ノイズ多そうなら小さくする、後は回路しだい
>>814 だいたいあってる。「あまり」が回路によって違うけど。
AVRの入力なら具体的に、・・・と思ったら入力容量載ってないよ。等価回路に記号だけ書いてある
TWIの方から推測すると10pF位?まあMHzオーダーの入力入れなければあまり気にしなくてもいいんじゃね
スイッチング用のFETをドライブする時とかはかなり重要になるけど
>>811 趣味の工作なら半田付け必要だけど、AVRDRAGONでない?
みんなはどんなライター使ってるんだろう。
ジッポーだろ、JK マルマンはパイポだ。
好きなライターは王雀孫です 茄子は臭すぎてだめでつ
チルチルミチルに決まっておろうが。
チルチルお兄ちゃん♪ チルミルってチルチルミチルの略なんかね
おや、マルマンってライター無かったかい?
「わたしはコレで会社を辞めました」のCMでパイポがあんまり売れて、 本業のライターの売れ行きに響いたので、そのCMの発案者がクビになった。 っていう都市伝説があった。
>>825 まぢすか?! 有りそうで怖いな。
JTの売れ行きにも響きそうですしねぇ<当時
ネタがなくてつまらんので、自分がAVRマイコンを使って作ったものを紹介していきましょう。 俺は、テレビリモコンで動く車を作ったよ。タミヤのギアボックスとか使って。 あと、温度計とか大麻ーとか
大麻取締法には気を付けてな。 自分は時計用の水晶発振子で時計を作ったり、タッチセンサとか既にあるものの模倣と味付け程度のレベル。 紛失したアンプのリモコンの代わりをどうにかできないかと考えてるが、どう考えても無理だよなぁw
かなりむずかしい
USBBLASTERマイコンでエミュレートした奴をAT90USB162に移植中 …ごめんまたライターが増えちゃう
おれはテレビに映るアナログ時計かな、 チャイム付きで。
mega8で、PSのネジコンを、デュアルショック2互換にするアダプタを作った。
>>831 秋月でカメラモジュール買って、目覚まし時計を映しとけ。
AVRはじめようとおもうが 秋月の買うとしたらATMEGA88Pあたりを買っとけば だいたい間違いないです?
何を作りたいかによる
>>836 自分がたいした事できないんで、
まずは簡単な温度センサとかをいじって
そのうちグラフィックLCDとかに波形を表示してみたりとかできたらいいね
くらいのイメージです、ハイ。
温度センサー使うなら、AD変換使うと思うんで、88Pでおkだと思う。 グラフィックLCDは88Pだと、ちと厳しいかも試練。
>>838 ちと厳しいすか。
将来的にやってみたいという感じですので
そのときにまたチョイスしてみようかな。
とりあえず88Pで遊んでみます
841 :
774ワット発電中さん :2009/03/31(火) 21:17:22 ID:9R9sHNv6
ハイ。
>>832 切実にうp希望
デュアルショック互換に出来ればXFPS経由で箱○でネジコンが使える…
>>840 温度センサーがアナログ出力なら、ADポートに繋げばいいだけなので、
グラフィック液晶に15本くらい取られても、88だったらなんとか。
他にスイッチとかいろいろつけるならピン数が足りないかも
>>840 GLCDの表示画像やフォントで容量食われるから、もしやるならmega128とかの容量と足が多いのをオススメ
俺は、ネジコンをGTFproにするのをつくった。
液晶はフレームバッファを違うマイコンでやらせるのも面白い。 間はSPIとかにしといてやって。
tiny261とかだと温度センサ内蔵なんだけどね・・・
秋月にないだろが
>>846 それはnegtusbが有るからいらないかな…
でもグランツーリスモはGTFは補正掛かるんだっけか?
>>850 俺も持ってるよ、アレ。
でも、某氏はGTFproに対応する気がないみたいだし、
自分で作ってみたかったんだよね。
>>852 ネジコンでよく出来るねw
ハンコンだとフィードバック遅くてシュルハンしてたらスピンするけど、ネジコンだとクイック過ぎてまっすぐ走れなそうな気がするwww
試しながら学ぶの一番最初の回路が動かない。だれか助けてください ISPで接続してのATtiny2313へのプログラム書き込みはちゃんと成功するのにLED点滅しない テスターでちゃんと回路できてることは確認した。LEDが壊れてるわけでもなかった なんでじゃああああ
>>853 そのあたりは調整してて、センター付近はだるいようになってます。
逆に俺は、ハンコンでは真っ直ぐ走れません。
ごめん違うtiny2313にしたら動きました
>>856 ちょっと興味ある。それって秋月で買った?
俺もレールで買ったやつのうち、一個だけ動作がおかしい
(出力がHに上がりきらない。まるで中途半端なプルアップを
しているオープンドレイン出力みたいな感じ)
ロット不良じゃあるまいな?
一個だけなら、静電気くらって出力が半死状態なんじゃね?
分かりました。ごめんなさいマイコンのせいではありませんでした。
最初はとりあえずすぐ打てるC言語の方のサンプルで試していたんです。
それで動かなかったので違う2313に交換したんですが、その交換する前に
アセンブラでコード打ち直していたんです。
そしてそれを消去にチェックを入れずに書き込んでいた。もちろん動かない
でも、新しい2313は空だから消去しなくても上手く書き込めてちゃんと動く。
そういうことでした。
そしてC言語のコードが一回目上手く動かなかったのはこれのせいでした。
ttp://mycomputer.cqpub.co.jp/avr02/ ----------------------------------引用----------------------------------
現時点での最新版 WinAVR-20080610では、 「Project Option」ウインドウの「Optimization」
の初期値が「-Os」となっています。
このままでは、テスト・プログラムのうち、空ループによる時間待ちを使用しているプログラムでは空
ループが最適化されてしまい時間待ちしなくなります。
そこで、空ループを使用するプログラムについては、この設定を最適化を行わない「-O0」に変更します。
--------------------------------------------------------------------------
もちろんこの時、消去やらベリファイやら色々試してたんですが、アセンブラに書き換えた後は
一度消去にチェック入れずに書き込んで動かず、その後すぐAVR外して新しい2313に交換しちゃってた。
それでAVR交換したから動いた。と勘違いしていました。
次のコード試そうとして今気づいた
俺も最初、最適化の関係でLED点滅しなくて2日も悩んだ・・・ 自分も試しながら学ぶAVR入門で勉強しましたよ。 あと、コンパイラのバージョンが最近のじゃないと、本に載ってる割り込みを 使ったプログラムが上手く動きませんので注意して下さい。 自分は2005年のバージョンを使ってたから割り込みの プログラムが動かなくて徹夜してしまった・・・
>>859 ソフトマイマーのときは
#define nop() __asm__ __volatile__ ("nop")
と定義しておいて
nop(); をループ内に書けば最適化しても大丈夫。
AVRの本を3冊確認したけどみんな ; や {} でループしているので
悪い見本を真似してしる気がします。
ちょろいICを制御しようとしてCで手持ちの90S2313youのプログラム書いたら フラッシュ125%だとよ。他の手持ちはmega88。はぁ、書き直すか。
>>860 最初のコードでこれはなかなかの罠ですよね。
これから始めようってところだから何がどうなってるのか予想もつかなかったし
WinAVRは最新のを使ってます。ありがとう
>>861 volatileで最適化を抑制できるんですね。volatileって初めて知りました。
for(n = 0; n < 100; n++) PINB; これで桶。asmは不要。
>>863 volatileは、割り込みでフラグを立てるときには必須になる。
while(1){
if ( flg==true ){
break;
}
}
このflg変数が割り込みで変化するような場合、この
if ( flg==true ){
break;
}
の部分は、コンパイラの最適化で削除されてしまう可能性がある。
こういう場合、flgの宣言は
volatile int flg;
という様にしておくと、最適化で削除されることはない。
>>864 へぇ〜、これ最適化で消えないのか。試してみたら-Osでもちゃんと残っていた。
for(n = 0; n < 100; n++) PINB;
8c: 96 b3 in r25, 0x16 ; 22
8e: 8f 5f subi r24, 0xFF ; 255
90: 84 36 cpi r24, 0x64 ; 100
92: e1 f7 brne .-8 ; 0x8c <main+0x20>
UDRみたいに読み込んだだけで動作するポートもあるからこうなっているのかな。
ループ待ちならRJMP PC+1の方がいいんじゃないか? 同じサイズで2倍待てるよ。
>>867 面倒だからねえ・・・一応インラインアセンブラでできるけど。
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("rjmp L_%=" "\n\t" "L_%=:" "\n\t");
でも、ループ自体が1周3クロックあるので、nop使用で1周4クロックがrjmpで1周5クロックになるだけ。2倍は待てない。
nop式でループ数が255を越える場合でも、318相当まで8bitループカウンタで対応できるようになるだけだからなあ。
そういう場合でも、2バイト犠牲にしてnopを複数使ってわかりやすい方がいいかなと思う。
もしくはカウンタを16bitにして。
>>868 一応 asm("rjmp .+2") でいけるみたい。
でもたしかにループ処理の分があるから2倍は無理だったね。
リンカマップからの連想でやってみたらいけたのだけど、このあたりの
構文のドキュメントってどこにあるのかな。gasのドキュメント?
>>869 おお、こんな方法があるのか。
基本的には入出力オペランドやラベルを展開してgasに渡しているのだから、gasのドキュメントが基本なんでしょうね。
お手軽にはコンパイル時出てくるlssやlstファイルのアセンブラの記述を試してみることかな?
>>866 のでも、 brne .-8ってのが出てきているな。
ソースを見ないでレスしてるから、外してたらスマンだけれど、 時間待ちループにどうして、_delay_us()や_delay_ms()を使わんの?
>>871 valatileの話題から派生したから。
>>871 ウェイトループ自身が面白いからかなあw
>>859 の件は、「以前は」_delay_XXマクロってちょっと制限がきつくて使いにくかったからだろうか。
以前は_delay_ms()とかは使える限界が短いのでだめだと俺も
思っていたけど、いつの間にか改良されているな。知らんかった。
F_CPUが16MHzで_delay_ms(1000)とやると、こんなコード吐く。
8a: 80 e1 ldi r24, 0x10 ; 16
8c: 97 e2 ldi r25, 0x27 ; 39
8e: 20 e9 ldi r18, 0x90 ; 144
90: 31 e0 ldi r19, 0x01 ; 1
92: f9 01 movw r30, r18
94: 31 97 sbiw r30, 0x01 ; 1
96: f1 f7 brne .-4 ; 0x94 <main+0x28>
98: 01 97 sbiw r24, 0x01 ; 1
9a: d9 f7 brne .-10 ; 0x92 <main+0x26>
内部ループが4クロック×0x0190-1=0x063Fクロック、
外部ループがおよそ0x063Fクロック×0x2710クロック=15990000(d)で、
16MHzで999.375msec。ちゃんと出せるようになってるな。
F_CPU変えてコンパイルしてみると、どうやら内部ループが0.1msecになるようになってるみたいだ。
故に限界は6553.5msecまで伸びている。
delay_us()の方は、16bitカウンタシングルループになっている。
16MHzなら4095usecまでOKになっているな。
単純に命令の実行時間とかを感覚的に理解しやすくするためじゃないの? 入門用書籍なんだし
>>871 _delay_us()
みたいにシビアなやつだと、中で何やっているのか気になるので
(CPUのクロックに依存する/しない とか)
それだったら自分で書いたほうがいいや。とかそういう気になるんだ。
>>876 そんなのコンパイル後のアセンブラソース読めばわかるじゃん
>>877 そんな手間かけるのがイヤなんだってばww
CPUのクロックには依存する(だろうと考えるのが常識)ので、うろ覚えの時は ビルド方法を調べないと〜とか面倒を感じることはあるな。そんなんだったら 自分で待ちたい程度カウントさせたほうが脳と指の負荷が軽い。自分で書くなら どんなマイコンでも同じ書き方だから指が思った瞬間に打ってる。
>>879 そんな手間かけるのがイヤなんだってばww
ウェイトにどんな方法をとるかなんてのは、単にプログラミング・スタイルでしかないな。
AVR StudioってCとアセンブラの同時表示出来なかったっけ?
見事なスレスト
まぁ、なに使うにしてもマニュアルを読むのは大切だね。 ところで、オーディオの光デジタルをAVRに入れて、R-2Rラダー抵抗でアナログにするってのいけるかな。 どっかで見たことある気がするんだけど…
SPDIFのDPLL作るのが20MHzでも微妙。 光パルスの最小幅は48KHz*128=6.144MHzで理論上13MHzでいけるけど、 USBと違って途切れなく受ける必要があるのが難点。 俺は諦めちゃった。
そっか。やっぱAVRだけでーなんてそう単純にはできないんだね。 お手軽に手作り気分を味わうなら専用のいいICがあるみたいだし。 とても参考になったよ、ありがとう。
>>889 AVRはお手軽〜高機能までカバーしてると思って愛用してますが、
お手軽のいいICってたとえばどういうのがありますか?
千石にあったやつで、データシート斜め読みだから合ってるかは微妙だけど、PCM1794ADBRってやつ。 俺はぶきっちょだから実装するのがアレだけど、SPDIFとUSBでいけるみたいでヘッドフォンを駆動できるって記憶してる。
894 :
774ワット発電中さん :2009/04/08(水) 18:10:27 ID:pw8fKZQK
AVR初心者です。
「試し・・AVR入門」本、AVRISP mk-II、ATtiny2313を購入し、勉強を始めたのですが、
プログラムの書込み途中でエラーになり困ってます。
AVRStudio Ver4.16 Build628、AVRISP mk-II、Win-XP(SP3)で使用しております。
AVRISPl mk-II上のLEDは緑色でOK、リセットピンはVccに10kΩでプルアップ(削除でも実施済)
Mainタブ:Device and Signature Bytes=ATtiny2313
Programming Mode and Target Settings=ISP Frequency 125.0 kHz
HW Settingsタブ:Voltages リードできている→Getting VTARGET.. 5.0V.. OK
ProgramタブのDevice−Erase Device を実施すると以下のメッセージで「ISP Mode Error」
ウィンドウが表示される。
------------------------------------------
Setting mode and device parameters.. OK!
Entering programming mode.. FAILED!
Leaving programming mode.. OK!
------------------------------------------
パスコン0.1uFあり。電源はUSBからの5.0Vと電池x3でも実施。AT90S2313でも実施。
回路を全て外し、tiny2313+パスコン+リセットプルアップのみでAVRISP mk-II接続で実施。
いずれの方法でも症状は変わりません。
過去のスレで同様の内容があるのですが、結果(解決策)が出ていません。
AVRマイコン総合スレ Part9
http://hagephone.dip.jp/test/read.cgi/denki/1192625746/ 解決策をご教示下さい。よろしくお願いします。
ISPのクロックスピードを低くしてみるとかは試しましたか?
>Programming Mode and Target Settings=ISP Frequency 125.0 kHz
既に試しているようですね。
見落としてました
>>895 は忘れてください
>>894 接続ケーブルとISPの配線の長さは大丈夫?
>>895 逆に速くしたほうがいい場合も。
いずれにせよ、スピードは速くしたり遅くしたりして試したほうがいい。
電源は、ちゃんとした安定化電源の5Vを入れたほうがいいと思うなぁ
AVRISP mk-IIはPCから見てUSB上のシリアルポートに見えているのかな? ポート番号はAVRStudioの指定してる番号と合ってるのかな?
案外PC側のシリアルポートの設定だったり? ケーブルとかハブとかも?
901 :
774ワット発電中さん :2009/04/08(水) 20:01:23 ID:pw8fKZQK
早速の返信ありがとうございます。
>>897 ブレッドボードを使用しているため、AVRISP mk-IIのコネクタから10cmほどの
ケーブルで接続しています。
短くないと障害になるのでしょうか?
>>898 初め設定を分からずに実施していたので、1MHzでやったと思います。
他の周波数もやってみます。
安定化電源は手元にないので、ちょっと難しいです。
>>899 Erase Device を実施するとLEDが点滅(一瞬赤)になるのでポートは
合っていると思います。
AVRStudioで指定しているポートはどのようにしてみればいいのでしょうか?
902 :
774ワット発電中さん :2009/04/08(水) 20:08:36 ID:pw8fKZQK
>>900 電圧の確認やAVRISP mk-IIのFirmware Upgradeなど正常に終了しております。
(Firmware Upgrade時はLED緑点滅)
よって、つなぎもできていると思ってますが・・・
これでは正しくつながっているとは言えないのでしょうか?
903 :
774ワット発電中さん :2009/04/08(水) 20:20:44 ID:pw8fKZQK
>>898 設定できる全ての周波数でやってみました。
8M→6.48kHzまでは今までの症状と同じですが、100Hz、51.1Hzでは
USBの接続が切り離され、再度USBを接続しなおして、つながるという
ような状態になりました。
100Hz、51.1Hzでは以下のメッセージでした。
Setting mode and device parameters.. OK!
Entering programming mode.. FAILED!
Leaving programming mode.. FAILED!
>>901 AVRStudioで指定しているポートはどのようにしてみればいいのでしょうか
メニューでTools->Program AVR->Connectで
ツールとポートが選択できるはず。
症状が間違えて外部クロック設定したときに似てるな
907 :
774ワット発電中さん :2009/04/08(水) 22:27:45 ID:pw8fKZQK
>>897 >>901 AVRISP mk-IIのコネクタからデバイスまでの接続が10cmほどあったのを
専用にユニバーサル基板で作成し、AVRISP mk-IIのコネクタからデバイスまで
の全て信号を2cm以内にしましたが、状態は変わりません。
何か解決に向けたアドバイスをいただければと思ってます。
よろしくお願いします。
>>907 ケーブルは50cmくらいあっても大丈夫だよ。
909 :
774ワット発電中さん :2009/04/08(水) 22:57:26 ID:pw8fKZQK
>>906 ご丁寧にありがとうございます。
ユニバーサル基板で配線しましたので、基板の部品面視です。
接続は以下の通りです。
●が1番ピン
デバイスはATtiny2313-20PU
┌──17
20───○○○───10
18───●○○───1
19──┘
パスコン0.1uF:20−GND(10)
プルアップ10k:20−1
電源 :20
GND:10
うっかりなにかの拍子で、あるいは中古を使っていて、ヒューズビットがファクトリデフォルトじゃなくなってたりしてね・・・
ヒューズビットがデフォルト状態かどうか、念のため確認してみるとか。
リロードしたら同じこと考えてる人がw たまに報告挙がってるよね。 何故かヒューズビットがデフォルトじゃなかったとかって。
913 :
774ワット発電中さん :2009/04/08(水) 23:22:47 ID:pw8fKZQK
>>910 >>911 デバイスは先日秋月で購入したので新品です。
ツールも含め初めてAVRを使っているので、まだヒューズビットの単語自身
を理解できていません。本は読んでいるのですが・・・
デバイス内に設定されているレジスタがあるようなものなのでしょうか?
もし、上記の憶測が当たっているとしたら、まだデバイスと通信できていない
状態では?と思ってます。
理由:メニューでTools->Program AVR->Connect後、USB選択してFusesタブを
選択するとエラーになります。
ヒューズビットが見れていない!?
手元にオシロもないので分かりませんが、リセットもうまくいってないような
気がします。
ISPの通信ができないとライタからはヒューズビットも読み込めないと思います。 けどここまで色々試してダメだとオシロで波形をみるとかしないと原因はわからないかもしれませんね。 もしくはダメ元で外部発振器をつなげてみるとかくらいでしょうか。
まさかのターゲットのマイコンに電源が供給されてないパターンかも
とりあえずなにかクロック入れてみたらいいんじゃね?
>>911 ISPに入れないみたいだから、パラレルライタでもないと確認しようもないな。
>>909 あってるね。AVRにライタ以外の電源はちゃんと供給して・・いるって書いてたね。
他の人が書いているけど、あとはクロックつなげる・入れるか、別のAVRチップに変えてみるか・・・
918 :
774ワット発電中さん :2009/04/09(木) 00:07:46 ID:bFk4iH1e
>>914 >>917 いろいろなアドバイスありがとうございます。
明日、会社で時間をとって(内緒で)オシロで波形を見てみようと思います。
今日のところはありがとうございました。
もう一度よ〜く配線を見直してみたら? 本人はそう繋いだつもりでも、実物はそうなっていなかったなんてことはよくある。 あるいは半田不良とかヨリ線の中の1本がヒゲのようにどこかにショートしてるのとか が見つかるかもしれないし。
オレもそう思う。 >909 のピンNo.は合っているので、落ち着いて配線確認してみる。 ブレッドボードの接触不良とか配線がずれてるとかあるので いっそISPの配線をはずしてやり直してみるとか。
できるだけEZUSBのようなキットを使わずUSB機器を作りたいんですが、ググっても 余り情報が出てきません。何かお勧めな本ありませんか?
一度ACアダプターや安定化電源から5V取って マイコンのみ(LED等全て外す)をISPケーブル繋げてやってみては?・・・ってもうしてるか・・・。 USBの場合、さし直したり、差し込む場所変えたり、再起動したりで 認識したりしたりするからね・・・。 リセットピンのプルアップ抵抗などすべて外してパスコンだけでやってみました?
ほとんど可能性ないような気もするけど、 リセットピンのプルアップ抵抗の値とかそれまわりの配線はどうだろう。 1pin-(ISP端子)-抵抗-5V それと、AT90S2313でやったときはクロック入れた?
924 :
774ワット発電中さん :2009/04/09(木) 08:18:02 ID:kTPh2ZCa
>>921 本じゃないがFT232RL BitBangModeでググれ
コードがいろいろ見つかる
2313の20ピン-10ピン間の電圧、1ピン-10ピン間の電圧はそれぞれどのぐらいになってる? あと、1ピン-10ピン間の電圧が書き込もうとしたときに0V近くまで落ちる?
俺管理者権限ないPCで書き込もうとしたらエラーで書き込めなかったことがある。確認してみたら? 結局管理者権限もらって作業してるが、皆は似た症状出たことある?
日本語のAVR-LibCが消えてる どうしたんだろう
かきかえもなか
930 :
774ワット発電中さん :2009/04/09(木) 23:36:03 ID:bFk4iH1e
>>894 その後の報告です。
結果としてAVRISP mk-IIの不良でした。
購入店で新品交換したもので接続したところエラー解消しました。
波形確認もしましたが、AVRISP mk-IIのコネクタまでは、ECHOBack(応答)
確認できたので、AVRISP mk-IIが怪しいということになりました。
(確認デバイスは、ATtiny2313、ATmega88P)
交換後、AVRStudio は4.13で最新、AVRISP mk-IIのFirmwareを購入時
Version:1.10のままで行いました。
最新は Version:1.12のようですが、Upgradeすると動かないということが
あると心配なので、1.10のまま使ってます。
FirmwareのDowngrade というのは可能なのでしょうか?
可能ならUpgradeして試したいところですが・・・
AVRISP mk-IIの初期不良だったのか、最新Firmwareにしたために起こった障害
だったのか分かりません。
いずれにしましてもAVRISP mk-IIを変えたことにより障害解消できました。
ありがとうございました。
がんばったな 乙
それはそれは。。。 おつ
AVRISPのファームとAVR Studioが抱いてるファームがずれてたら動かなかったことがある (AVRISPが古かった) それはMk2じゃなくて無印AVRISPだったかな・・・忘れた
後に伝説となる超高性能ライターを>894が作製するきっかけとなる事件であったことを、 この時は誰も知ることはなかった・・・
>>930 >ECHOBack(応答)確認できたので、AVRISP mk-IIが怪しいということになりました。
なるほど・・・・
最初に書き込んでみるターゲットは、信号線にLEDつないでみるといいかもしれないね。
書き込みを超スローにすると、内容まではワカランが信号の有無くらいは分かるぞ。
そもそも人間の体は12歳ぐらいですでに性行為が可能で20歳ぐらいがピークなんだが 社会的、精神的に見た場合まだ未成熟なために、18歳未満だと犯罪として扱われてしまう 逆に30歳過ぎは社会的にはまだ青年から中年にさしかかった程度なんだろうけど、 性的にはもはや老年の域に達していて、遺伝子の劣化、流産や難産、性欲の減少などが見られる そんなわけで俺は、セックスに関しては30過ぎたら老人だと思っている
すまん誤爆だ やっちまった・・・
AVなR指定とな!?
>>939 だれうま
で、tinyなやつとmegaな奴がいるわけだ。
maturedなdeviceもあるでよ
俺のブートローダーを流し込んでやるぜ、のスレはここでつか。
>930を見て不安になり、買っておいたAVR-ISPmkUを使ってみたら オレンジ点滅で動きましぇん。電源5Vなのに4.5Vと表示している。 アップグレードしても同じ。 AVR-ISP(無印)やでんし研のライターでは動くので調べていたら 本体内のISPコネクタが180°逆に差してあるのを発見。 フラットケーブルの圧接方向が左右で違うので差す側を間違えてるみたい。
今のフラッシュを吸い取る方法は知らんけどファイルでのダウングレードの手順 古いAVR Studioをインストール C:\Program Files\Atmel\AVR Tools\STK500\AVRISP-mkII.DAT を大事に取っておき、新しいAVR Studioの所へコピー。 手動ファーム更新を実行。これでFirm Ver. 0x010aが0x0105になったよ。
>フラットケーブルの圧接方向が左右で違うので差す側を間違えてるみたい。 ひでぇな、チェックせずに出荷するのか、流石は中国クオリティー
JTAGICEmk2のフレキシブルフラットケーブル(FCC)にはしょっちゅう泣かされた
間違えたFCCじゃなくてFFCだ
948 :
774ワット発電中さん :2009/04/11(土) 17:40:11 ID:QPlR4ZxW
>>946 >JTAGICEmk2
あと読みにくいから文字詰めないでくれ〜
カタカナにするとジェタガイスか・・・ありだな。
今までhexファイルのサイズ=マイコンに書き込むプログラムのサイズだと思ってた。 tiny2313に書き込むhexファイルのサイズがぎりぎり2kBに収まって、 もうこれ以上詰め込めないな、と思っていたけど調べたら実は プログラムのサイズは700バイト位しかなかった。 馬鹿すぎる
>>951 WinAVR使ってるなら、コンパイル時にプログラムサイズと使用%とかが出るぞ
MakeFileのバージョンにもよるけど
まあ、hexファイルの中身は情報つきのテキストなんだから ファイルサイズ 対 実体 がそんくらいの割合なのは推して知るべし
中身を見たことがなかったんじゃないかな
AVR初心者です。(マイコン初心者です。) AVRIPSmkUを買ってAVRに書き込みしようとしたのですが、 最初は緑色だったLEDが途中から赤とオレンジ?見たいな色に交互に点滅します。 しかも書き込みができません。 OSはVista AVRstudio4.14 Build 589 直し方を教えてください。
AVRIPSmkUて人気あるね。不良も多いね。
AVR-ISPmkUのLEDは、緑=電源正常, 赤=電源OFF, オレンジ点滅=リセット異常。 接触不良とか配線を確認してみたら
>>957 接触不良とか配線とかは問題ないです。
赤とオレンジが交互に点滅する前までLEDは緑でした。
基盤の故障はないと思います。
>957はISPコネクタ側のLEDのことだけど 表面にでてないUSB側のLEDは緑だよね?
USBのほうは緑です。 ISPのほうが赤とオレンジ交互に点滅します。
>>955 書き込もうとしているCPUの種類は書いてないし
結線図はないし、どんなプログラムをどの様にして
書き込もうとしているのかわからんし。
まぁ「AVR初心者です。(マイコン初心者です。)」って書けば
なんでも許してくれると思うその根性の直し方を教えてやれ
Red - Orange Blinking -- Upgrade mode ってなってますけど ファームウェアの更新中だったのではないでしょうか?
tools⇒AVRISPmkII upgrade
で元に戻りました。
皆さん本当にありがとうございます。
>>961 ごめんなさい。
今度からは注意します。
ありがとうございました。
AVRのリセットピンを無効にしてしまったんですが、 どうやったら解除できるんでしょうか
リセッター でグーグル先生に聞いてみる
AVRISPmkIIはリセッターかわりにできないんだっけ?
シリアルプログラミングにはリセット信号が有効であることが必須な気がします。
読み方は「エーブイアール」なの「アーヴェ」なの?
アーブル
アービャアー
アヴァー
Adult Video R18 か エヴァ
まぁググってあげたわけだが・・・ ・(開発者の名前から) Alf og Vegard's RISC ・Atmel's greater Vision/Versality/Value RISC という説があるらしい・・・が、定かではないみたいだ。
だれかSPIモニター作ってちょ
AVRはAVRなのさ
AVR is not PIC.
にせJTAG markUを使ってたけどついに動かなくなった。_| ̄|○
頑張って新たなライタをw
ゴールドライタンを呼ぶんだ
そろそろライタから旅立つ時
>>981 おお。AVRって結構な一大勢力だったんだな。
マインドシェアつーか、紙面シェアでずいぶんとPICが上のように錯覚してた。
売上比1:2だからランチェスターの法則で1:4の感覚ってことかな。
>>982 1個買ってみようかとおもったら
合衆国輸出管理令に基づき、お求めの製品を発注書に記入することはできません。
て。
だから、日本のdigikeyじゃ売ってないのか
合衆国輸出管理令とは、どんな基準で輸出禁止なんだろ。 わけわかめ
総連経由で渡ったxmegaがテポドン2号に使われていたからね。
xmega… 32MHzと内蔵SRAM32kは魅力だけど AWEXとかHi-Resとかあまり興味ないなぁ。 暗号機能は仕事で使う分には意味あるのだろうが。 DMAもMACとかUSBとかSSCとか積んでないし。 素直にメモリ空間が増えるAVR32かSAMに乗り換える人が増えるんじゃないか?
989 :
774ワット発電中さん :2009/04/16(木) 20:17:35 ID:nIPw7PxS
>987 それマG?
6ピンAVR出たね。 /www.atmel.com/dyn/resources/prod_documents/doc8127.pdf
>>986 - AES and DES Crypto Engine
これじゃないのか。
日本でも,暗号化のついた製品の輸出は規制かかるはず。
詳しくは↓輸出令第9項(7)暗号装置又はその部分品 を参照。
http://www.meti.go.jp/policy/anpo/kanri/shyourei-matrix/matrix9.htm 暗号装置であって、次のイからホまでのいずれかに該当するもの(中略)
イ デジタル方式の暗号処理技術(中略)
(一) 対称アルゴリズムを用いたものであって、アルゴリズムの
鍵の長さが56ビットを超えるもの
(二) 非対称アルゴリズムを用いたものであって、アルゴリズムの
安全性が次のいずれかの有する困難性に基づくもの
1 512ビットを超える整数の素因数分解
2 有限体上の乗法群における512ビットを超える離散対数の計算
3 2に規定するもの以外の群における112ビットを超える離散
対数の計算
…
とまぁ、いろいろある。
アメリカにも似たような輸出規制があってひっかかるんだろう
>>992 暗号が引っかかるんですね。
ありがとうございました。勉強になりました。
unsigned char x[32000]; これでコンパイル通るんだけどなんでATmega168でこんなに確保できるの? これって32kbyteだよね?168のデータシート見る限りじゃこんなにメモリないのに
リンク時にオーバーフローをハネるように設定してないからじゃね?
実際に領域を使わない限りは実行もできてしまうんでは? SPがオーバーフローしてもちゃんと元に戻ってくれば問題ないし。
ありがとう。確保するプログラムは書き込めてしまうけど、AVR上ではちゃんと 確保できてるわけではないのね。 for(int i=0;i<32000;i++)x[i]=0xff;いれてもエラーでないから確保できてるのかと思った オーバーフローをハネる設定ってデフォでONのこれですよね? 33000だとエラー出るんだけど、32000までだと出ない error: size of array 'x' is negative
それは16bit Intで、33000(0x80E8)が負になるって言ってんだから違うと思う てか、そんなエラー始めてみたな
マルツでかったよ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。