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

SW入力のプログラムについて

このQ&Aのポイント
  • プログラミング初心者の疑問点
  • 緑色のヶ所をなぜ「VolUpSw=1;」としているのか?
  • タイマー割り込みによるSW入力のプログラムの詳細

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

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

コンパイラがちゃんとCの規格に沿っていれば、静的領域の変数は実行時に暗黙的に0初期化されます。 どちらかというと、多重割込みを許した場合に連続で割込みが入ってきてもちゃんと動作する、というのを意図しているような気がしますねぇ。

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

その他の回答 (3)

  • R32C
  • ベストアンサー率39% (115/290)
回答No.4

あんまりこのコードを追うのもどうかと思う。 たぶん、volumeが、出力データだと思うけど、結局 0にしかならない し、正しく制御されているように思えない。 また、多重割込みを利用するにしても、volumeは一時的に -8されてから、0に戻すというヘンテコな処理をしていますね。 多重割込みを許すなら、 if (Volume < 8 ) Volume = 0; else Volume -=8; と書かないと突然変な値をとる場合があって問題です。 なので、このコードを書いた人のスキルを疑ってみてもよいと 思います。 まぁそういう悪い例の問題を出されたのかもしれませんが。

全文を見る
すると、全ての回答が全文表示されます。
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

処理自体がタイマー割り込み内ということは、コンペアマッチ辺りで定期的にスイッチ状態を見ていると思っていいですね? まず、スイッチが押されていない状態ではVolUpSwは0です(一番外のelse)。 で、押されると中の最初のifで++VolUpSwが行われ、1になります。 更に次のifで20以上になっていたらボリュームを上げてカウンタクリア、としていますね。 押しっぱなしにしているとVolUpSwの値が上がっていき、カウンタクリア処理が走らなかった場合は最終的にオーバーフローしますが、そうなった場合には255に戻すという処理が入っています。 #但し、普通は通りえない場所のはずです このコードに意図があるとすれば「スイッチを押している間は、VolUpSWは0にならない」という事でしょう。

ron_nast
質問者

お礼

ご回答ありがとうございます。 ご指摘頂いたヶ所も少し気になっていたのですが、 (1)VolUpSwがオーバーフローした場合、255に戻す→VolUpSwは20に達するとクリアされるので、オーバーフローすることはないのでは? (2)VolUpSwが20以上の場合→VolUpSwが20の場合では? (1)、(2)ともに電源投入時のVolUpSw(変数宣言時に特に値を定めていません)の不定値に対応していると解釈していたのですが、正しいでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • pyonmae
  • ベストアンサー率64% (40/62)
回答No.1

こんにちは。 もちろん、他人の作ったプログラムなんですよね? はっきり言って、作った人のみぞ知る、といった所ですが・・・。 カンですが、VolUpSw変数も、キーが押されているフラグとして、どこかで使われているのではないでしょうか。 または、オートリピートの時間調整の結果かも知れませんね。(それだったら20の方を変えるか・・・?) 何にしても、コメントを書くか、せめて定数をdefine定義するとかして欲しいですね・・・。

ron_nast
質問者

お礼

ご回答ありがとうございます。 ※記載し忘れたのですが、『Volume=0x00で最大音量、Volume=0xFFで最小音量』になります。 ・コメント→ありません。 ・define定義→ volatile uchar SwitchFlag; volatile uchar Volume; volatile uchar VolUpSw; ・VolUpSw変数→他で使用されている形跡はありません。 特別な意図は無さそうですね。

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

関連するQ&A

  • 基本的なプログラム

    基本的なプログラム 学校の教科書に載っている問題がわかりません。 是非教えて下さい。 Cによる基本的な条件分岐(if,else if文)のプログラムです。 西暦年(4けたの整数)を入力し、その年がうるう年かどうかを判断するプログラムを作りなさい。 4で割り切れるときはうるう年であるが、100で割り切れるときはうるう年ではない。 しかし、400で割り切れればうるう年である。 ・・・とゆう問題文です。 #include<stdio.h> int main(void) { int x; printf("西暦を入力して下さい¥n"); scanf("%d",&x); if(x%4==0) printf("うるう年である¥n"); else if(x%400==0) printf("うるう年である¥n"); else if(x%100!==0) printf("うるう年でない¥n"); else printf("うるう年でない¥n"); return 0; } ・・・とりあえず自分で考えてみたのですがどうでしょうか; 間違ってると思いますが頑張って考えました・・・;; 4けたの整数ってゆうのはどう書けばいいんでしょうか? 実際にこのプログラムは動くのでしょうか? もっと省略して書くことができるのでしょうか?  等、色々わからないことばかりです。 プログラミングの授業自体に苦手意識を持っているので得意ではありません。 間違いなど指摘していただけたらと思います!! よろしくお願いします!

  • C言語でLEDを点灯させるプログラムです

    C言語を使ってLEDを点灯させるプログラムです。 以下のプログラムを変更して、Aポートの入力(下位4ビット) と、Cポートの入力(下位4ビット)を加算した値をBポートに出力しなさい 。 という問題なのですが、加算した値を出力するにはどうプログラムを記述すればいいか 分かりません。教えてください。 また、加算するというのは、たとえばどういうふうにしろ ということなのか、教えてください。 #include<18F452/h> #device HIGH_INTS=TRUE #priority ext,rb #fuses NOOSCSEN,HS,BORV45,NOBROWNOUT,PUT #fuses WDT128,NOWDT #fuses NODEBUG,NOLVP,NOSTVREN #fuses NOPROTECT,NOCPD,NOCPB #fuses NOWRT,NOWRTD,NOWRTB,NOWRTC,NOEBTR,NOEBTRB #use delay (CLOCK=20000000) #use fast_io(A) #use fast_io(B) #use fast_io(C) #use fast_io(D) #use fast_io(E) #byte port_a=0xf80 #byte port_b=0xf81 #byte port_c=0xf82 #byte port_d=0xf83 #byte port_e=0xf84 int i=0,j=0; void main() { if(input(PIN_b4)){output_high(PIN_d4);} else{output_low(PIN_d4);} if(input(PIN_b5)){output_high(PIN_d5);} else{output_low(PIN_d5);} if(input(PIN_b6)){output_high(PIN_d6);} else{output_low(PIN_d6);} if(input(PIN_b7)){output_high(PIN_d7);} else{output_low(PIN_d7);} while(1) { output_c(0b10101010); } }

  • C++、10個の数のmin&maxを求めるプログラム

    C++でのプログラミングに関しての質問です。 ユーザーから与えられる10個の数のminとmax、averageを求めるプログラムを作らなければいけないのですが、if/elseで出す以外に方法はありますか? if/elseを使うとなると、かなりたくさん繰り返さなければいけないと思うので、もしもっと単純に求められるものがあれば、と思っています。 よろしくお願いします。

  • マイコンH8-3664 走行カー C言語プログラム改良

    SW0がONで3秒間前進して停止 SW0がOFFの後、再度ONで3秒間前進して停止  するプログラムです! これを、 3秒間前進後、3秒右旋回(右モーターのみ回転)後、3秒間前進、3秒右旋回を繰り返し、元の位置に戻るというプログラムに改良せよ!というのですが? /**************************************************************/ #include <stdio.h> #include <sysio.h> /*タイマーA*/ #define TMA (*((volatile unsigned char *)0xFFA6) /*割り込み*/ #define IENR1 (*((volatile unsigned char *)0xFFF4)) #define IRR1 (*((volatile unsigned char *)0xFFF6)) #define PDR8 (*((volatile unsigned char *)0xFFDB)) #define PCR8 (*((volatile unsigned char *)0xFFEB)) long count = 0; long x = 0; void interrupt timer( ) { IRR1 &= ~0x40 ; if( count == 300 ) { x = 1 ; count = 0 ; } else { count++; } } void main( ) { unsigned char a; TMA = 0x03 ; IENR1 |= 0x40 ; PCR8 = 0x0f ; while(1){ a = PDR8 >> 4 ; if( x == 0 && a == 0x0e ) { PDR8 = 0x0a ; _ei( ) ; } else if( x == 1 ) [ PDR8 = 0x00; _di( ) : if (( PDR8 >> 4) == 0x0f) { x = 0 ; } } } } /**************************************************************/ 尚、SW はプルアップされている!

  • H8 3664Fのプログラム

    タクトスイッチのチャタリングを回避し、奇数回めのONで LEDの交互点灯を(タイマを使って) やろうとしていますが、なかなかうまくいきません。 入門者でお恥ずかしいですが、下記コードの誤りをご指摘頂けませんでしょうか? 宜しくお願い致します。 以下、コード。 #include <3664.h> //プロトタイプ宣言 void main(void); int SW_Read(void); // 入力SWの状態読み込み 関数 void wait(int); // nミリ秒待つウエイト 関数 void wait1ms(void); // 1ミリ秒待つウエイト 関数 void IOinit(void); // I/O の初期化 関数 void main(void) { if (SW_Read()==1) { IO.PDR8.BIT.B0 = 1; // ポート8のビット0を出力ON IO.PDR8.BIT.B1 = 0; // ポート8のビット1を出力OFF DI; // 割り込み禁止 TA.TMA.BYTE = 0x0A; // タイマーA、低速発信・0.25sec設定(タイマーのカウント開始) IRR1.BIT.IRRTA = 0; // タイマーA 検知フラグをゼロクリア IENR1.BIT.IENTA =1; // 割り込み許可 EI; // 割り込み許可 } else { } while(1) { } } /////////////////// I/Oの初期化 void IOinit(void) { IO.PCR8 = 0x03; // ポートコントロールレジスタ: ポート8のビット0・1を出力に設定 // その他のビットは入力に設定 IO.PDR8.BIT.B0 = 0; // ポート8のビット0を出力OFF IO.PDR8.BIT.B1 = 0; // ポート8のビット1を出力OFF IO.PCR1 = 0x00; // ポートコントロールレジスタ: ポート1を全ビット0とし、入力に設定 } /////////////////// タイマーA関数 void int_timera (void) // タイマーA関数 { IO.PDR8.BIT.B0 = ~IO.PDR8.BIT.B0; // ポート8のビット0を反転して出力(赤)LED用 IO.PDR8.BIT.B1 = ~IO.PDR8.BIT.B1; // ポート8のビット1を反転して出力(緑)LED用 IRR1.BIT.IRRTA = 0; // タイマーA検知フラグをゼロクリア } /////////////////// スイッチの状態読み込み int SW_Read(void) { int sw1; //スイッチ状態読み込み1回目 int sw2; //スイッチ状態読み込み2回目 int val; //スイッチの状態判定値の入力値 int memval; //入力信号の全回の値 int numcnt; //奇数偶数判定ループ用カウンタ while(1) //モニタリング { sw1 = IO.PDR1.BIT.B7; // スイッチの状態読み込み1回目 wait(10); // 10mS待つ sw2 = IO.PDR1.BIT.B7; // スイッチの状態読み込み2回目 memval=val; //現行のスイッチ状態判定値をメモリに入れ替える if(sw1==1 & sw2==1) // スイッチ読み込み1回目と2回目共にONだったら { //スイッチ状態判定を<押した>と見なして、 val=1; } else { val=0; } if(memval==0 & val==1) //パルスの前後状態を比較し、新規に立ち上がりONであれば、 { numcnt=++numcnt; if(numcnt%2!=0) //ループカウンタが奇数だったら { return(1); // 1を返す } else { } } else { } } } //////////////////// nミリ秒待つウェイト関数 void wait(int time) { int i; // ループカウンタ for(i = 0 ; i < time ; i++) // time回数分ループ wait1ms(); // 1ミリ秒のウェイト関数を呼び出す } //////////////////// 1ミリ秒待つウェイト関数 void wait1ms(void) { int i; // ループカウンタ for(i = 0 ; i < 2662 ; i++); // 1ミリ秒の間ループする } 以上、宜しくお願い申し上げます。

  • VBSで二次関数

    VBScriptを使って二次関数の最大、最小を求めるプログラミングをしたいのですがどうすればよいでしょう?a,b,cとx1,x2(xの範囲)を入力して求める、つまりIF...THEN...ELSE...END IF を使うということです 急いでいるのでよろしくお願いします。

  • プログラミング<暗号入力プログラム>について

    はじめまして。よろしくお願いします。 現在、大学でプログラミングを習っているhayato2192といいます。 この間、ファイルを開くプログラムというのを習ったのですが、 そのプログラムを利用して何かほかのプログラムが作りたいなぁと思い、 暗号入力するとファイルが開く というプログラムをつくったのですが、 コンパイルはできても一向にファイルが開けないので、 コードをどうかえればいいか、というのを教えてください。 よろしくお願いします。 ちなみに、暗号は文字列が良いです。 コードは以下です ******************************** #include <stdio.h> int main(void) { FILE*fp; char i; int c; printf("START PROGRAM * FP\n"); printf("YOU SHOULD INPUT COAD\n"); scanf(" %s", i); if(i == "fileopen"); { if((fp = fopen("\\PROGRAM\\0123456789100.txt", "r")) == NULL) { printf("YOU CAN'T OPEN"); return 1; } while((c = fgetc(fp)) != EOF) { printf(" %c", c); } } else { printf("YOU CAN'T OPEN"); return 2; } fclose(fp); return 0; } ******************************** オープンするファイルはそんな結滞なもんじゃありません。 よろしくお願いします ただのテキストファイルです。

  • 外部プログラムを実行してそのプログラム中のキー入力を自動で行うにはどうしたらいいか?

    現在C++でプログラミングを組んでいるものです。 外部プログラムを実行させ、外部プログラム実行中に求められるキー入力を自動で行えないかと考察しているのですがわかりません。。。 外部プログラムといっているのは、現在C++で書いていて その中でsystemコマンドを使い他のexeを実行しているので。 求められるキー入力はDOS窓の画面で ------------------------------------ 上記の設定でよろしいでしょうか?> y ------------------------------------ 上記の『y』の箇所のみで『y』+Enterでその後の処理が走り出すというもので、毎回聞かれる『y』の入力を自動化したいのですが 何か方法は無いものでしょうか?? exeファイルしかなく修正もできないのでなんとか自動的に入力まで含められないかと考えてます。 みなさんどうぞよろしくお願いします。

  • Ardinoについて…

    C言語プログラミングについて…以下の文でスイッチ「RedSwitch(赤スイッチ)」が押された回数だけ後で光るというプログラミングを「switch case」文で作ったものがある。この「switch case」文を「if」文、もしくは「if else」に変換して同じプログラミングを作りなさいという課題が出て、うまくスイッチの押した回数が読み込めません。となたか解説お願いします。 void sw_check(void) { switch(SW_RedSwitch) { case 0: if ( digitalRead(2)==SW_ON ) { SW_RedSwitch=1; } break; case 1: if ( digitalRead(2)==SW_OFF ) { SW_RedSwitch=2; } break; } } void blink(void)

  • 3048fマイコンでのA/D変換について

    マイコン初心者ですが今3048fマイコンを使ってA/D変換をしようとしているんですが、うまくいかないので教えて頂きたいです。 プログラムは下の通りです。 #include <3048.h> /* メイン関数 *****************************************/ void main(void){ int ad_data; P1.DDR = 0xff; /*port1出力に設定 表示LED */ P4.DDR = 0x00; /*port4入力に設定 操作用sw1~4 */ P4.PCR.BYTE = 0xff; /*port4プルアップon */ AD.ADCSR.BYTE = 0x33; /* SCAN MODE / CH0~3  */ while(AD.ADCSR.BIT.ADF == 0){} /* 4CH分の変換終了を待つ */ while(1){ if(P4.DR.BIT.B4 == 0){ /* sw1の時 */ ad_data = AD.ADDRA>>8; } else if(P4.DR.BIT.B5 == 0){ /* sw2の時 */ ad_data = AD.ADDRB>>8; } else if(P4.DR.BIT.B6 == 0){ /* sw3の時 */ ad_data = AD.ADDRC>>8; } else if(P4.DR.BIT.B7 == 0){ /* sw4の時 */ ad_data = AD.ADDRD>>8; } P1.DR.BYTE = ad_data & 0xFF; /*上位8bit分だけ表示させる */ } } このように4チャンネル分の0~5vのアナログ信号をスキャンモードでA/D変換し、それぞれ対応したスイッチを押すことによって現在どのくらいの電圧が来ているかLEDに2進数で表示させようとしています。しかしsw1とsw2、sw3とsw4がそれぞれ同じ値を表示しています。例えば、sw1を押したらADDRAの値が表示されますが、sw2を押しても同じADDRAの値が表示されます。またsw3とsw4も同じでどちらを押してもADDRCの値が表示されます。 4チャンネル分を同時にA/D変換することは元々出来ないのでしょうか?いろいろ調べてはいますが理由が分かりせん・・・ADDRA=ADDRB、でADDRC=ADDRDなのでしょうか?分かりにくいとは思いますが教えて頂けると幸いです。よろしくお願いいたします。