• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ATTiny2313のプログラミングについて)

ATTiny2313のプログラミングについて

このQ&Aのポイント
  • AVRマイコン初心者のためのATTiny2313のプログラミング方法
  • ドレミファ……と音が出るピアノを作るためのATTiny2313プログラミングの方法
  • ATTiny2313で「シド(高音)」のプログラムを追加する際のハードウェアの制約について

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ただ単に、プログラムが大きくなりすぎてメモリに入りきらないということです。 機種設定が適切なら、もう少しメモリの大きなものを使うしかないですね。 あと、この部分を見ただけの状態からは、たとえば、こんなコードにすれば、 ちょっとはプログラムサイズが減るかもしれません。 (ただし、このコードには、ひとつ致命的な欠陥があります) int oto = 0; while(1) { switch(~PINB) case 0x01: oto = dl; break; case 0x02: oto = re; break; case 0x04: oto = mi; break; case 0x08: oto = fa; break; case 0x10: oto = so; break; case 0x20: oto = ra; break; case 0x40: oto = si; break; case 0x80: oto = dH; break; } if (oto != 0) { PORTD = 0b0100000; delay_us(oto); PORTD = 0b0000000; delay_us(oto); } } もしくは音階のデータを dl とか re とかに入れるのではなく、 int oto[] = {ドの数値, レの数値……}; と定義すれば、 while(1) { int i; int mask = 0x01; for(i = 0; i < 8; i++, mask <<= 1) { if ((~PINB) & maks) { PORTD = 0b0100000; delay_us(oto[i]); PORTD = 0b0000000; delay_us(oto[i]); break; } } } とか、 あと、このコードの brek を取っ払うと、もしかしたら、和音も ある程度「それっぽく」聞こえるかもしれません。

flugel0000
質問者

お礼

なるほど。単純にメモリが足らなかったんですね。 とある動画で同じ機能のものをATTiny2313で作られてたんで、考えもしませんで した。 どうすればプログラムを軽くするかとかまだあまりよく分かってないので、今は素直に容量の大きいマイコンを買い直します。 プログラムのアドバイスも含め、ありがとうございました!参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • avrstudioというソフトを使ってAVRの ATtiny2313と

    avrstudioというソフトを使ってAVRの ATtiny2313というマイコンを動かせるようプログラムの勉強をしているのですが・・・最初からつまずいています・・・どなたか教えていただけないでしょうか winavrでC言語を使ってしようと思うのですが avrstudio上で"~A"というように(ここでも→のようになるのでわかりやすいように~としてます・・。googleの検索窓だと半角英数の時にキーボードの”ほ”の横のボタンをシフトと一緒に押すとできるのですが・・)打ちたいのですがキーボードで打つと~Aとなってしまいます・・ それと、ソースがなかなか読めないです・・ tiny2313のPA1とPA0にスイッチがついてます ポートbの0、1,2,3、にはLEDがつながっています while(1){ x=PINA; x=(~A &0b00000011); PORTB = x; } /*xはunsigned charで*/ これはどういう意味なのでしょうか・・while(1)だから無限ループでどうやらボタンを押すと反転??してLEDが永遠につくというものらしいですがボタンの動作をどう読んでいるのかいまいちわかりません>< どなたかお願いします

  • ATtiny2313でプログラミングしてコンパイルしてできるアセンブラを編集できる?

    アトメルのマイコン ATtiny2313でC言語プログラミングをして、コンパイルした際にlssファイルという、C言語プログラムをどうやってアセンブラコードになおしたかを確認できるファイルが出力されるのですが、この中に書かれているアセンブラコードを編集して再コンパイルすればこのコードの編集がHEX実行ファイルに反映されるのでしょうか?

  • アトメルマイコンATtiny2313でエミュレータとマイコンの通信が正常にできない。

    アトメル社製のマイコンATtiny2313を実装した基板をアトメルのICEエミュレータ”AVRATJTAGICE_MKII”を接続してコンパイルしたプログラムをダウンロード使用としているのですが、マイコンことの正常な通信を確認するために”Read Signature”を実行してみたら、 WARNING : Signature does not match selected device! と表示されます。 上に表示されるヘクサの値が 0x1E, 0x91 0xFF この値が”Read Signature”を実行する度にころころ別の値に変化してしまいました。 また、Fuses設定でもマイコンの内部オシレータを自分の設定した値に設定することもできません。 この場合、どのように対処したら良いのでしょうか。 ご存じの方いらっしゃいましたらご教授よろしくお願いいたします。

  • IAR社のAVRマイコン用の無償版コンパイラ

    最近、AVRマイコンを使用し始めたのですが、 訳あってIAR社のコンパイラを使用しようと考えています。 試しに、IAR社のAVRマイコン用の無償版コンパイラを ダウンロードしました。 コンパイルすると、実行形式ファイルが、3個生成されました。 test.hex(おそらく本体), test_data.hex, test_eeprom.hexです。 ISPを使用してダウンロードしようとしたのですが、 ファイルを3つもダウロードできないようです。 試しにtest.hexをダウンロードしましたが、 動作しませんでした。 何か、実行形式ファイルの出力設定などがあるのでしょうか? また、簡単なサンプルプログラムなどお持ちの方いらっしゃらないでしょうか? マイコンは、Atmega128です。 ご存知の方がいらっしゃいましたら、ご教授お願い致します。

  • Win10 Avr Build エラー

    Win10 AvrStudio4.19 で ASM は Build Run Enter で 正常ですが GCC を Build Run Enter とすると " AVRStudio MFC Application は動作を停止しました。{プログラムの終了}" と表示が でる HEX ファイルは一応できているがシミレーションに移れない。アプリは AvrStudio4.19 をインストール してから-toolchain-3.4.1 を インストール してあります。Web で ビルドエラーで検索すると 結果はStudio4をインストしtoolchain-3.4.1 をインストすれば GCC を 正常にコンパイルできました。の内容で 終わっているもの ばかりです。AVRStudio MFC Application は動作を停止しました。ここの異常を修復する方法はないでしょうか。 試した GCC ファイル 下記 //**TI2313 #include <avr/io.h> int main() { DDRD = 0b00000001; while(1) { PORTD = 0b00000001; } return 0; }

  • Atmel Studioのhexとelfの違い。

    Atmel Studio6.2でATmega88pマイコンのプログラムを行っています。プログラムをビルドした場合、elfファイルとhexファイルの2つDebugフォルダの中に作成されますが、Device Programmerで書き込みする際はどちらのファイルを書き込めば良いのかご教示頂きますよう、お願い致します。

  • H8/3052 ディップスイッチについて

    こんにちは。 今研究で秋月書店のH8/3052のマイコンを使っています。 LED,LCD,タクトスイッチを動作確認のためのC言語のプログラムはできましたが、ディップスイッチのC言語がうまくかけないため動作確認できません。 ディップスイッチによってLEDかLCDなどを動作させるC言語のプログラムの情報がありましたら教えていただけませんか?

  • AVRマイコンでのアップダウンカウンターについて

    以下のプログラムはポートDの6番にタクトスイッチを付けてカウントアップさせるプログラムですが、 ポートDの5番にもう1つタクトスイッチを付けてカウントダウンさせたいのですがどのようにプログラムを 追加したら良いでしょうか? 変更前 #include <avr/io.h> int main( void ) { volatile uint16_t i; uint8_t cnt,s0,s1; cnt=0x0;    /* カウント値の初期値=0 */ s1=0b01000000; /* 最初は押されていない状態をセット */ DDRB=0xff; /* PortBをすべて出力に設定する PortDはデフォルトで入力設定 */ PORTD=0b01000000; /* 入力設定になっているポートにHを書くとプルアップされる */ for (;;) { /* 無限ループ */ PORTB=cnt; /* カウント値ををPortBに出力 */ s0=s1; /* 前回のデータを保存して */ s1=(PIND & 0b01000000); /* ポートBと01000000のandをとるとB6の0/1だけがs1に代入される */ if(s0>s1){ /* 前回=64(off) 今回=0(on)のときswが押されたと判断 */ cnt++; /* カウントをインクリメント */ } } } よろしくお願いします。

  • PIC・AVRのC言語の初心者無向け勉強・参考本

    まずカテゴリーがコンピュータのC C++になっていますが、PIC・AVRもこのカテゴリーで良いのか分からなかったので、間違いでしたらご指摘下さい。 PIC・AVRのC言語の初心者無向け勉強・参考本・シンプルなフリーコンパイラをご紹介頂きたく思います。 現在PICは、ほとんどがPIC Basic Proでプログラミングしています。 あとは、フリーで公開されているアセンブラ(ASM)をNotepadで自分の仕様に修正してコンパイルしています。 しかし、PIC24Fシリーズ以降はPIC Basic Proは対応しておらず、フリーで公開されているプログラムのほとんどがC言語です。 一様、PIC24Fシリーズが出た頃にHI-TECH C CompilerとPIC-Cで試しにコンパイルできるかやって見たのですが、多分設定の段階でミスってしまい再インストールやバージョンを変えても、上手くコンパイルできません。 その後、放置していたので今現在は試用期間切れになってしまっています。 AVRの方は(Arduinoが周辺キットが豊富みたいですが・・・)、 一様ライティング機器としてAVRISP mk2を購入しAVR Studio 6.1をインストールしてありますが、PICマイコン同様C言語は初心者で、自分でプログラムを書くことが出来ません。 また、PICとの使い勝手の違いからハード・ソフトの準備は出来ているものの、現状は宝の持ち腐れに近い状態です。 フリーで公開されているHEXファイルを書き込む程度にしか使ってません、多少の使用環境の違いの修正も、AVRの方も上手くいきません。 勉強不足・学力不足と言わざるを得ません。 長々と前置きを書いてしまいましたが本題です。 PICとAVR各々に特化したC言語の初心者向けの本を色々教えて下さい。 書店でC言語の本を探すとWindows用がほとんどで、「C言語ではじめるPICマイコン」みたいなタイトルの本を立ち読みしても、いまいちピンときません。 (AVR・Arduinoも同様です。) また、ソフトの方は出来る限りフリーソフトでシンプルで、HI-TECH C Compiler・PIC-C・AVR Studioみたいな開発環境向けソフトでなく、インストール後はドラッグ&ドロップするだけで、C言語ファイル(AVRの方はASMファイル用も)をコンパイルできる物を教えて下さい。 ※ 開発環境の機能の無い物ってのは都合良すぎるでしょうか?? 何卒ご教授のほど宜しくお願い致します。 m(_ _)m ※※※※※※※※※※※※ テスト用・実用的プリント基板の作製は、それなりの物を取り揃えておりますので、ご心配なさらずに・・・・ でも、こんな基板があると動作確認などに重宝しますと言った情報は大歓迎です。 (市販品・自作可能なプリント基板情報などなど)     

  • H8/3052F 同士の簡単な通信についての問題

    秋月製マイコンボード(マザーボードも秋月製です)、H8/3052F(以下H8)につきまして質問があります。 なお開発環境にはベストテクノロジーのGDLを使用し、C言語にてプログラムを行ってます。 現在、2枚のH8を連動させて動かすことを試みています。 目的としましてはH8を物理量の計測に使用しています。 私のとった手法は、以下の通りです。 1、H8の、ある汎用ポート同士を1本の信号線で繋ぐ 2、片方のH8(仮にH8(A)とします)のマザーボード付属のタクトスイッチを押す。これを合図にH8(A)は計測を開始し、それと同時にH8(A)の汎用ポートから信号が出力される。 3、もう片方のH8(仮にH8(B)とします)はH8(A)からの出力があるまで待機し、出力を検知すると計測を開始する。 プログラムの内容としましては、以下のようにしました。 ※H8(A)の入力検知用のタクトスイッチは、ポート4のビット4についています。また信号の出力はポート1のビット0です。 ※H8(B)の入力検知用のポートはポート4のビット0です。 ※両ボードともに同一の安定化電源から電源を取っているので、グランドは共有できていると思います。 <H8(A)側のmainプログラム> /*ポート定義****/ P4.DDR = 0; /*ポート4のタクトスイッチを入力に設定。押すと0、何もなしで1*/ P4.PCR.BYTE = 0xff; /*ポート4を全ビットプルアップ。*/ P1.DDR = 0xff; /*P1を出力に設定*/ /*****************/ /*スイッチ入力待機部分*********/ while(P4.DR.BIT.B4); /*タクトスイッチが押されるまで、待機*/ P1.DR.BIT.B0 = 1; /*P1のビット0から5V信号を出力、別のH8(B)に信号を送る*/ /******************************/ (~以下、計測プログラム部へ) <H8(B)側のmainプログラム> /*ポート定義****/ P4.DDR = 0; /*P4端子を入力に設定。信号入力で0、何もなしで1*/ P4.PCR.BYTE = 0xff; /*ポート4を全ビットプルアップ。*/ /*****************/ /*スイッチ入力待機部分*********/ while(P4.DR.BIT.B0); /*P4のビット0にH8(A)からの信号入力があるまで、待機*/ /******************************/ (~以下、計測プログラム部へ) 以上のようなプログラムを組みました。 H8(A)側は正しく駆動し、タクトスイッチを押すと、計測を開始するとともに5Vの信号が出力できています。 問題はH8(B)側で、H8(B)のボードの電源を入れた直後から、H8(A)の信号を待たずに計測を開始してしまいます。 最初はH8(B)のポート4ビット0の初期値に0が入っており,いきなりwhile文を抜けてしまうのかと思いました. そこで,H8(A)からの信号線を外しますと、ずっと計測待機状態に入るのでプログラム的には一応回っているようです。 (私の認識では,ハードウェアマニュアルによればポート4の初期値は全ビット0ですが,MOSプルアップをすることにより,全ビット1に反転する(?)と考えています) 次に,H8(A)側から予期せぬ信号が入力されているのかと思い,テスターで電圧を測ってみました. しかし,タクトスイッチ入力前は0Vで,入力後は5Vが出力されており,見かけ上は問題がなさそうでした. なぜ、H8(B)は電源を入れたとたんに駆動を開始してしまうのでしょうか? もしお分かりになる方がいらしたら、ご教授願います。