🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Atmel Studio

Atmel Studioは、マイクロチップ・テクノロジー社が製造しているマイコンであるAVRやSAMのプログラミングを容易にするための統合開発環境です。同社が無料で提供しており、以前はAVR Studioと呼ばれていました。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

1600閲覧

ATmel StudioをArduinoに変換したいです

jyojyo

総合スコア3

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Atmel Studio

Atmel Studioは、マイクロチップ・テクノロジー社が製造しているマイコンであるAVRやSAMのプログラミングを容易にするための統合開発環境です。同社が無料で提供しており、以前はAVR Studioと呼ばれていました。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2021/01/20 11:18

編集2021/01/20 11:29

前提・実現したいこと
ATmega328で自動手動の動作とsleep関数を割り込みで行うシステムを作っています。
そしてATmel StudioをArduinoに変換したときにエラーメッセージみたいなものが発生しました。
そしてできればATmega328で動いたソースコードが欲しいです
そしてATmel StudioをArduinoに変換したいです‼️

c

1#define F_CPU 8000000UL /* <util / delay.h>で使用されます。(8GHzを意味します) */ 2 3#include <avr/io.h> 4#include <util/delay.h> 5 6const uint8_t tempo = 100; /*記憶*/ 7 8 9uint8_t notes[2][50] = {}; /*音の速度*/ 10uint8_t level[2][50] = {{}};/*音の高さ*/ 11uint8_t beat[2][50] = {{}};/*ビート*/ 12uint8_t line[] = {0, 0, 1};/*行*/ 13 14void playTone(uint16_t tone, uint16_t duration) { 15 for (uint32_t i = 0; i < duration * 1000L; i += tone * 2 / 10) {/*duration=期間*/ 16 PORTC = 0x0000001; 17 for (uint16_t j = 0; j < tone / 10; j++) { 18 _delay_us(1); /*X ミリ Oマイクロ*/ 19 } 20 PORTC = 0x0000000; 21 for (uint16_t j = 0; j < tone / 10; j++) { 22 _delay_us(1); 23 } 24 } 25 26 return; 27} 28 29void playNote(uint8_t note, uint16_t level, uint16_t duration) { 30 uint8_t names[] = {'c', 'd', 'e', 'f', 'g', 'a', 'b'}; //ドレミファソラシ 31 uint16_t tones[] = { 19111, 17026, 15169 + 1, 14317, 12755, 11364, 10124}; 32 /* 33 / * 34 timeHigh =期間/ 2 = 1 /(2 * toneFrequency) 35 ここで、さまざまなトーンは次のように説明されています。 36 音符 頻度 期間 高い時間 37 do4 261.63 Hz 3830 1911.0958223445323548522722929328 (261->1915=1915.7088122605363984674329501916) 38 re4 293.66 Hz 3400 1702.6493223455697064632568276238 (294->1700=1700.6802721088435374149659863946) 39 mi4 329.63 Hz 3038 1516.8522282559233079513393805175 (329->1519=1519.7568389057750759878419452888) 40 fa4 349.23 Hz 2864 1431.7212152449674999284139392378 (349->1432=1432.6647564469914040114613180516) 41 so4 392 Hz 2550 1275=1275.5102040816326530612244897959 42 ra4 440 Hz 2272 1136=1136.3636363636363636363636363636 43 si4 493.88 Hz 2028 1012.3916740908722766663966955536 (493->1014=1014.1987829614604462474645030426) 44 do5 523.25 Hz 1912 955.566172957477305303392259914 (523->956=956.02294455066921606118546845124) 45 */ 46 /*音名に対応した音を再生します*/ 47 for (uint8_t i = 0; i < 7; i++) { 48 if (note == names[i]) { 49 uint8_t a = level - 4; 50 playTone(tones[i] / pow(2, a), duration); 51 } 52 } 53 54 return; 55} 56 57int main(void) 58{ 59 /* 60 DDRx:I / Oを設定します。0->入力、1->出力。入力時はプルアップする必要があります。cf.mega88A.pdf:14.2.3。 61 PORTx:書き込み専用 62 PINx:読み取り専用 63 */ 64 DDRC = 0b0000001; /* 出力:ブザー(PORTC0)*/ 65 DDRD = 0x00; /*入力:スィッチ(PINB5)*//* <iom328.h> #define PINB5 5*/ 66 DDRD = 0x7F; /* DDRB 出力ピン対応ビットはセット、入力ピン対応ビットはクリア */ 67 PORTD = 0xFF; /* 入力ピンに対応するビットに1を書き込み、内蔵プルアップ指定 */ 68 DDRB = 0x00; /* I/ o:key(PORT0-7)*/ 69 PORTB = 0xff; /* 入力時にプルアップする必要があります。*/ 70 bool a_mode = 0; /*0-手動、1-自動*/ 71 72 while (1) 73 { 74 /* TOBO ::アプリケーションコードを書いてください*/ 75 76main_loop: 77 if (bit_is_clear(PORTD, PORTD7)) /* スイッチが閉じると成立 */ 78 PORTB = PORTB & ~_BV(PB1); /* ここではPD0をクリアしてLED点灯 */ 79 if (a_mode) { //auto(PIND == 0b00100000) 80 DDRB = 0xff; //出力のみ 81 82 for (uint8_t i = 0; i < 3; i++) { /*行数*/ 83 for (uint8_t j = 0; ; j++) { 84 if (notes[line[i]][j] == ' ') { 85 for (uint16_t k = 0; k < beat[line[i]][j] * tempo; k++) { 86 _delay_ms(1); //rest(milli) 87 } 88 } 89 else if (notes[line[i]][j] == 'n') { /*(j <length [i])の場合、for {}は続行します。*/ 90 break; 91 } 92 else { 93 uint8_t k; 94 if (notes[line[i]][j] == 'c') { 95 if (level[line[i]][j] == 4) { 96 k = 0; 97 } 98 else { 99 k = 7; 100 } 101 } 102 else if (notes[line[i]][j] == 'a') { 103 k = 5; 104 } 105 else if (notes[line[i]][j] == 'b') { 106 k = 6; 107 } 108 else { 109 for (k = 0; k < 5; k++) { 110 if (notes[line[i]][j] == 'c' + k) { 111 break; 112 } 113 } 114 } 115 116 PORTD ^= _BV(k); 117 playNote(notes[line[i]][j], level[line[i]][j], beat[line[i]][j] * tempo); 118 PORTD ^= _BV(k); 119 }//if 120 if (!(PINB & _BV(5))) { //auto(PINB is 0x00) 121 a_mode = 0; 122 goto main_loop; 123 } 124 }//for 125 126 }//for 127 128 }//auto 129 else { /*手動(PIND == 0x00)*/ 130 DDRB = 0x00; /*入力のみ*/ 131 PORTB = 0xff; /*プルアップ*/ 132 switch (PINB) { 133 case 0b11111110: 134 do { 135 playNote('c', 4, 1 * tempo); 136 } while (PINB == 0b11111110); 137 break; 138 139 case 0b11111101: 140 do { 141 playNote('d', 4, 1 * tempo); 142 } while (PINB == 0b11111101); 143 break; 144 145 case 0b11111011: 146 do { 147 playNote('e', 4, 1 * tempo); 148 } while (PINB == 0b11111011); 149 break; 150 151 case 0b11110111: 152 do { 153 playNote('f', 4, 1 * tempo); 154 } while (PINB == 0b11110111); 155 break; 156 157 case 0b11101111: 158 do { 159 playNote('g', 4, 1 * tempo); 160 } while (PINB == 0b11101111); 161 break; 162 163 case 0b11011111: 164 do { 165 playNote('a', 4, 1 * tempo); 166 } while (PINB == 0b11011111); 167 break; 168 169 case 0b10111111: 170 do { 171 playNote('b', 4, 1 * tempo); 172 } while (PINB == 0b10111111); 173 break; 174 175 case 0b01111111: 176 do { 177 playNote('c', 5, 1 * tempo); 178 } while (PINB == 0b01111111); 179 break; 180 181 default: 182 break; 183 } 184 185 if (PINB & _BV(5)) { //manual(PINB is 0x20) 186 a_mode = 1; 187 } 188 189 }/*マニュアル*/ 190 191 }/*while*/ 192 193}

発生している問題・エラーメッセージ
エラーメッセージ
Warning: Board ATmega88_168P_328P:avr:atmega328p doesn't define a 'build.board' preference. Auto-set to: AVR_ATMEGA328P
Warning: Board ATmega88_168P_328P:avr:atmega88 doesn't define a 'build.board' preference. Auto-set to: AVR_ATMEGA88
Warning: Board ATmega88_168P_328P:avr:atmega168p doesn't define a 'build.board' preference. Auto-set to: AVR_ATMEGA168P
最大32256バイトのフラッシュメモリのうち、スケッチが3342バイト(10%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が224バイト(10%)を使っていて、ローカル変数で1824バイト使うことができます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/01/20 11:26

同内容の質問を繰り返さないでください。
guest

回答2

0

ベストアンサー

基本はmain関数のwhile(1)の前までをsetup関数に書き、while(1)の中をloop関数に書きます。
今回は
bool a_mode = 0; /0-手動、1-自動/
というのがあるので、これはloop関数にstaticを付けて移動させます。

後は8MHz駆動のATMEGA328のチップを選べばいいです。
入れてなければ、
https://synapse.kyoto/tips/bootloader_ATmega88/page001.html
とかで。

コンパイルまでは確認しましたけど、あなたの思った通りに動くかどうかは別問題です。
(スケッチの内容は全く見ていません。単にコピペしただけです)

Arduino

1 2const uint8_t tempo = 100; /*記憶*/ 3 4 5uint8_t notes[2][50] = {}; /*音の速度*/ 6uint8_t level[2][50] = {{}};/*音の高さ*/ 7uint8_t beat[2][50] = {{}};/*ビート*/ 8uint8_t line[] = {0, 0, 1};/*行*/ 9 10void playTone(uint16_t tone, uint16_t duration) { 11 for (uint32_t i = 0; i < duration * 1000L; i += tone * 2 / 10) {/*duration=期間*/ 12 PORTC = 0x0000001; 13 for (uint16_t j = 0; j < tone / 10; j++) { 14 _delay_us(1); /*X ミリ Oマイクロ*/ 15 } 16 PORTC = 0x0000000; 17 for (uint16_t j = 0; j < tone / 10; j++) { 18 _delay_us(1); 19 } 20 } 21 22 return; 23} 24 25void playNote(uint8_t note, uint16_t level, uint16_t duration) { 26 uint8_t names[] = {'c', 'd', 'e', 'f', 'g', 'a', 'b'}; //ドレミファソラシ 27 uint16_t tones[] = { 19111, 17026, 15169 + 1, 14317, 12755, 11364, 10124}; 28 /* 29 / * 30 timeHigh =期間/ 2 = 1 /(2 * toneFrequency) 31 ここで、さまざまなトーンは次のように説明されています。 32 音符 頻度 期間 高い時間 33 do4 261.63 Hz 3830 1911.0958223445323548522722929328 (261->1915=1915.7088122605363984674329501916) 34 re4 293.66 Hz 3400 1702.6493223455697064632568276238 (294->1700=1700.6802721088435374149659863946) 35 mi4 329.63 Hz 3038 1516.8522282559233079513393805175 (329->1519=1519.7568389057750759878419452888) 36 fa4 349.23 Hz 2864 1431.7212152449674999284139392378 (349->1432=1432.6647564469914040114613180516) 37 so4 392 Hz 2550 1275=1275.5102040816326530612244897959 38 ra4 440 Hz 2272 1136=1136.3636363636363636363636363636 39 si4 493.88 Hz 2028 1012.3916740908722766663966955536 (493->1014=1014.1987829614604462474645030426) 40 do5 523.25 Hz 1912 955.566172957477305303392259914 (523->956=956.02294455066921606118546845124) 41 */ 42 /*音名に対応した音を再生します*/ 43 for (uint8_t i = 0; i < 7; i++) { 44 if (note == names[i]) { 45 uint8_t a = level - 4; 46 playTone(tones[i] / pow(2, a), duration); 47 } 48 } 49 50 return; 51} 52 53void setup() { 54 55 DDRC = 0b0000001; /* 出力:ブザー(PORTC0)*/ 56 DDRD = 0x00; /*入力:スィッチ(PINB5)*//* <iom328.h> #define PINB5 5*/ 57 DDRD = 0x7F; /* DDRB 出力ピン対応ビットはセット、入力ピン対応ビットはクリア */ 58 PORTD = 0xFF; /* 入力ピンに対応するビットに1を書き込み、内蔵プルアップ指定 */ 59 DDRB = 0x00; /* I/ o:key(PORT0-7)*/ 60 PORTB = 0xff; /* 入力時にプルアップする必要があります。*/ 61} 62 63void loop() { 64 static bool a_mode = 0; /*0-手動、1-自動*/ 65main_loop: 66 if (bit_is_clear(PORTD, PORTD7)) /* スイッチが閉じると成立 */ 67 PORTB = PORTB & ~_BV(PB1); /* ここではPD0をクリアしてLED点灯 */ 68 if (a_mode) { //auto(PIND == 0b00100000) 69 DDRB = 0xff; //出力のみ 70 71 for (uint8_t i = 0; i < 3; i++) { /*行数*/ 72 for (uint8_t j = 0; ; j++) { 73 if (notes[line[i]][j] == ' ') { 74 for (uint16_t k = 0; k < beat[line[i]][j] * tempo; k++) { 75 _delay_ms(1); //rest(milli) 76 } 77 } 78 else if (notes[line[i]][j] == 'n') { /*(j <length [i])の場合、for {}は続行します。*/ 79 break; 80 } 81 else { 82 uint8_t k; 83 if (notes[line[i]][j] == 'c') { 84 if (level[line[i]][j] == 4) { 85 k = 0; 86 } 87 else { 88 k = 7; 89 } 90 } 91 else if (notes[line[i]][j] == 'a') { 92 k = 5; 93 } 94 else if (notes[line[i]][j] == 'b') { 95 k = 6; 96 } 97 else { 98 for (k = 0; k < 5; k++) { 99 if (notes[line[i]][j] == 'c' + k) { 100 break; 101 } 102 } 103 } 104 105 PORTD ^= _BV(k); 106 playNote(notes[line[i]][j], level[line[i]][j], beat[line[i]][j] * tempo); 107 PORTD ^= _BV(k); 108 }//if 109 if (!(PINB & _BV(5))) { //auto(PINB is 0x00) 110 a_mode = 0; 111 goto main_loop; 112 } 113 }//for 114 115 }//for 116 117 }//auto 118 else { /*手動(PIND == 0x00)*/ 119 DDRB = 0x00; /*入力のみ*/ 120 PORTB = 0xff; /*プルアップ*/ 121 switch (PINB) { 122 case 0b11111110: 123 do { 124 playNote('c', 4, 1 * tempo); 125 } while (PINB == 0b11111110); 126 break; 127 128 case 0b11111101: 129 do { 130 playNote('d', 4, 1 * tempo); 131 } while (PINB == 0b11111101); 132 break; 133 134 case 0b11111011: 135 do { 136 playNote('e', 4, 1 * tempo); 137 } while (PINB == 0b11111011); 138 break; 139 140 case 0b11110111: 141 do { 142 playNote('f', 4, 1 * tempo); 143 } while (PINB == 0b11110111); 144 break; 145 146 case 0b11101111: 147 do { 148 playNote('g', 4, 1 * tempo); 149 } while (PINB == 0b11101111); 150 break; 151 152 case 0b11011111: 153 do { 154 playNote('a', 4, 1 * tempo); 155 } while (PINB == 0b11011111); 156 break; 157 158 case 0b10111111: 159 do { 160 playNote('b', 4, 1 * tempo); 161 } while (PINB == 0b10111111); 162 break; 163 164 case 0b01111111: 165 do { 166 playNote('c', 5, 1 * tempo); 167 } while (PINB == 0b01111111); 168 break; 169 170 default: 171 break; 172 } 173 174 if (PINB & _BV(5)) { //manual(PINB is 0x20) 175 a_mode = 1; 176 } 177 178 }/*マニュアル*/ 179 180} 181 182

投稿2021/01/20 12:43

nac_tnk

総合スコア494

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jyojyo

2021/01/26 07:01

回答をありがとうございます AVRを動かしたい????の質問に回答していただければありがたいです よろしくお願いいたします????
guest

0

Arduinoで実装されている標準関数をすべてAtmelコンパイラ向けに移植しましょう。
そうすれば、Arduino向けのコードを走らせることができます

投稿2021/01/20 11:36

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jyojyo

2021/01/26 07:01

回答をありがとうございます AVRを動かしたい????の質問に回答していただければありがたいです よろしくお願いいたします????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問