H8マイコンでスイッチが押された場合にLEDが点灯するプログラムを作成しましたが、フローチャートがわかりません。

このQ&Aのポイント
  • H8マイコンでスイッチが押された場合にLEDが点灯するプログラムを作成しましたが、フローチャートがどのようになるのかがわかりません。
  • プログラムの要点を把握するためにフローチャートが必要です。組み込みシステムにおいては、フローチャートはプログラムの概要を図示する重要なツールです。
  • プログラムを書く前にフローチャートを作成することで、プログラムの処理の流れを視覚的に把握することができます。フローチャートを作成することで、誤りや不具合を事前に発見しやすくなります。
回答を見る
  • ベストアンサー

フローチャートについて

H8マイコンでスイッチS1(PORT4-4)が押された場合は、LED1(PORT5-0)、スイッチS2(PORT4-5)が押された場合は、LED2(PORT5-1)、スイッチS3(PORT4-6)が押された場合は、LED3(PORT5-2)、スイッチS4(PORT4-7)が押された場合は、LED4(PORT5-3)が、それぞれ点灯するようなプログラムをつくりました。 #define P4DDR (* (volatile unsigned char *) 0xfffc5) #define P4DR (* (volatile unsigned char *) 0xfffc7) #define P4PCR (* (volatile unsigned char *) 0xfffda) #define P5DDR (* (volatile unsigned char *) 0xfffc8) #define P5DR (* (volatile unsigned char *) 0xfffca) int main(void) { unsigned char sw,ssw; P4DDR = 0x00; /* P4全ビットを入力に設定 */ P4PCR = 0xff; /* P4 MOSプルアップをONにする */ P5DDR = 0xff; /* P5全ビットを出力に設定 */ while (1) { sw = ~P4DR; /* 入力を反転 */ ssw = sw >> 4; /* swを4ビット右にシフトしたものをsswに代入 */ P5DR = ssw; /* sswをP5に出力 */ } return 0; } というプログラムを作ったのですが、フローチャートがどのようになるのかがわからないです。またプログラムが間違っていたら教えてください。

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

  • ベストアンサー
  • peeea
  • ベストアンサー率57% (31/54)
回答No.1

プログラムを自分で考えて作ったならフローチャートはわかるのではないですか? 本やネットに載っていたか授業で作ったかでしょうか >P4DDR = 0x00; /* P4全ビットを入力に設定 */ >P4PCR = 0xff; /* P4 MOSプルアップをONにする */ >P5DDR = 0xff; /* P5全ビットを出力に設定 */ ↑はコメント通り、入出力の設定です。 プルアップ入力のため、スイッチを押した場合にゼロが入力されます。 >while (1) { ↑無限ループです。マイコン等の組込みシステムでは必須です。 ここまではご承知の通りですよね ご質問の内容は下記の部分だと思います >sw = ~P4DR; /* 入力を反転 */ ↑プルアップ入力になっているため、入力された値を反転します。 S1,S3,S4 の3つのスイッチが押された場合は4ビット目、 6ビット目、7ビット目がゼロになり以下の例のようになります。 (例)0010xxxx → 1101yyyy >ssw = sw >> 4; /* swを4ビット右にシフトしたものをsswに代入 */ ↑コメント通りです。ビットシフトはこんな感じです。 (例)1101yyyy → yyyy1101 >P5DR = ssw; /* sswをP5に出力 */ ↑コメント通りです。 PORT5の0,2,3ビットに1を出力します。よって、LED1,3,4が光ります。 >} 以上を繰り返します。 フローチャートとしては 1.入出力設定(while(1)までを順番に) 2.入力読込み・反転(Port5の4~7) 3.入力値をシフト(4~7ビットを0~3ビットに表示) 4.出力 5.2~4を繰り返す となり、これを教科書どおりに絵にするだけです。 わからない部分があれば補足に書いて下さい。

関連するQ&A

  • Aki-h8/3052マイコンについて

    今Aki-h8/3052マイコンを勉強しているのですが、初心者のためうまくいかず質問をしました。知識がないと思われるような質問をしてしまいますが、よろしくお願いします。 次のようなプログラムを書き込んで、LEDを点滅させたいのですが点滅しません。原因がわからないので、教えていただける方がいたらよろしくお願いします。 #define P5DDR (*(volatile unsigned char*)0xffffc8) #define P5DR (*(volatile unsigned char*)0xffffca) void wait (long loop){ while(loop--); } int main(void){ P5DDR = 0xff; while(1){ P5DR = 0xff; wait(200000); P5DR = 0; wait(200000); } } ポートBを使用した場合うまくいくのですが、ポート5を使用するとうまくいきません。 コンパイラにはGDLを、書き込みにはH8Write Turboを使用しています。

  • H8マイコン C言語でのプログラミング *((volatile unsigned char *)ってなんですか??

    現在、ある参考書に載っている、マイコンを用いてマザーボード上のLEDを点滅させるCのプログラムを勉強のために見ています。 その中に、 #define P5DDR (*(volatile unsigned char *)0xfffc8) という一行があるんですが、この中の*(volatile unsigned char *)という表現を見たことがなくて困っております。これは簡単に言うと、 #define P5DDR *0xfffc8 と、『P5DDRを0xfffc8のポインタで置き換える』と言い換えていいのでしょうか??

  • H8S/2552Fにおけるプログラミング

    現在イエローソフト社のH8S/2552F USB-IF CPUボードを用いて,I/Oポートから32bitトルグスイッチの状態を出力しようとしています。それらのデータをシフトしつつ外部SRAMに送り、さらに32bitのデータとしてPCに取り込みたいと考えているのですが、その方法がわかりません。 以下に現状のプログラムを載せさせて頂きました。(間違いがあるのは十分承知です…) どなたか教えて下さい。よろしくお願い致します。 #define PORT4 (*((volatile unsigned char *)0xFFFFB3)) #define PORT9 (*((volatile unsigned char *)0xFFFFB8)) #define PORTH (*((volatile unsigned char *)0xFFFA14)) #define PORTJ (*((volatile unsigned char *)0xFFFA15)) unsigned long in_switch(void) {     return (PORTJ <<24);     return (PORTH <<16);     return (PORT9 <<8 );     return (PORTJ | PORTH | PORT9 | PORT4) ; } void main() {    puts("トグルスイッチテストプログラム");    while (1) {          unsigned long data;          printf("リターンキーで現在のスイッチ状態を表示します。");          fgetc(stdin); //リターンキー入力待ち          data = in_switch();//スイッチの状態を入力          printf("現在のスイッチ状態=%d(H'%02X)\n", data, data); //スイッチ状態表示 } }

  • 共用体のアドレスを取得したい

    SH7047のプログラムです。 何をしたいのかと言うと、P_PORTD.PDDRL.BIT.PD4DR等を関数の中で変化させたいのです。 うまく行かない理由はおそらく「P_PORTD.PDDRL.BIT.PD4DRのアドレスは渡すことが出来ない」だとおもいます。 まぁそれも当然な話だと思うのですが、どうにかならないでしょうか? 個人的には「unsigned short* port」→「bit* port」の様に出来れば理想的なのですが。 何か良い方法を教えてください。よろしくお願いします。 #define P_PORTD (*(volatile struct st_portd *)0xFFFF83A2)/* PORTD Address */ struct st_portd { /* struct PORTD */ union { /* PDDRL */ unsigned short WORD; /* Word Access */ struct { /* Bit Access */ unsigned short :7; /* */ unsigned short PD8DR:1; /* PD8DR */ unsigned short PD7DR:1; /* PD7DR */ unsigned short PD6DR:1; /* PD6DR */ unsigned short PD5DR:1; /* PD5DR */ unsigned short PD4DR:1; /* PD4DR */ unsigned short PD3DR:1; /* PD3DR */ unsigned short PD2DR:1; /* PD2DR */ unsigned short PD1DR:1; /* PD1DR */ unsigned short PD0DR:1; /* PD0DR */ } BIT; /* */ } PDDRL; /* */ }; /* */ void main(void) { output(&P_PORTD.PDDRL.BIT.PD4DR,0xff); output(&P_PORTD.PDDRL.BIT.PD5DR,0xff); output(&P_PORTE.PEDRL.BIT.PE12DR,0xff); } void output(unsigned short* port,int data) { P_PORTE.PEIORL.WORD = 0x3fff; P_PORTE.PEDRL.WORD = data & 0xff; *port = 1; *port = 0; P_PORTE.PEIORL.WORD = 0x3f00; }

  • H8-3048 LED点灯プログラムについて

    初歩的な質問で申し訳ございません。 H8-3048でスイッチ入力によってLEDを点灯させたいのですが、 スイッチの押されたタイミングによって LEDの点灯状況が変化してしまいます。 何故でしょうか?回路側の問題?ご助言お待ちしています。 参考までに下にLED点灯ソースコードを示します。 #include <3048f.h> #define led P1.DR.BYTE /*P1.DR.BYTEをledに割り当て*/ #define sw1 PA.DR.BIT.B2 #define sw2 PA.DR.BIT.B3 void initport(void) /*入出力端子設定*/ { P1.DDR = 0xff; PA.DDR = 0x00; } int main( void ){ initport(); led = 0x00; /*初期値設定*/ while(1){ if( sw1 == 1 ){ /*sw1が押された時LED点灯*/ led = 0xff;} else if( sw2 == 1 ){ /*sw2が押された時LED消灯*/ led = 0x00;} else{ led;} /*それ以外はLEDの状態保持*/ } }

  • H8SX/1655のアドレスエラー

    HEWのプログラミングで、割り込みの勉強をしているんですが なかなかうまくいきません・・・ 割り込みを使わないで、実験回路のLEDをスイッチを押すことで つけることはできました。 が、割り込みを使うとアドレスエラーとなり実行できません。。。 割り込みのプログラムはこんな感じです。 // vector 66 External trap IRQ2 __interrupt(vect=66) void INT_IRQ2(void){ led_out[0] = 0x00; //LEDを消す if(P1.PORT.BIT.B0 == 0) //スイッチが押されたら { led_out[0] = led[0]; //押されている間、点灯する } P2.DR.BYTE = led_out[0]; } mainプログラムは、 #include "iodefine.h" #include <machine.h> const unsigned char led[8] = { //0 1 2 3 4 5 6 7 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 }; unsigned char led_out[8]; void main(void) { P2.DDR = 0xff;//ledを出力に設定 P1.DDR = 0x00;//全部入力に設定 INT_IRQ2(); set_imask_ccr(0); while(1) { } } 割り込みの設定がわるいのでしょうか? スイッチは、P1に接続してLEDはP2に接続しています・・・

  • マイコン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 はプルアップされている!

  • secが・・確認お願いできませんか?

    秒数が出ないのですがどこが違うのでしょうか? #define TCNT0 (*(volatile unsigned int *)0xffff68) #define GRA0 (*(volatile unsigned int *)0xffff6a) #define GRB0 (*(volatile unsigned int *)0xffff6c) #define TCR0 (*(volatile unsigned char *)0xffff64) #define TIOR0 (*(volatile unsigned char *)0xffff65) #define TIER0 (*(volatile unsigned char *)0xffff66) #define TSR0 (*(volatile unsigned char *)0xffff67) #define TSTR (*(volatile unsigned char *)0xffff60) #define ITU_CLOCK8 3 #define ITU_CLEAR_GRA 32 #define ITU_IE_IMFA 1 #define DI asm( "orc.b #0xc0,ccr" ) #define EI asm( "andc.b #0x3f,ccr" ) void start_itu0(); void int_imia0(void) __attribute__ ((interrupt_handler)); int cnt = 0, sec = 0, min = 0, hour = 0; char str[] = "timer 00:00:00"; int main(void) { lcd_init(); lcd_puts(str); start_itu0(); EI; for(;;) { if (cnt >=100) { cnt = 0; sec++; if (sec >=60) { sec = 0; min++; if (min >= 60) { min = 0; hour++; if (hour >= 24) hour = 0; } str[6] = '0' + hour /10; str[7] = '0' + hour %10; str[9] = '0' + min /10; str[10] = '0' + min %10; str[12] = '0' + sec /10; str[13] = '0' + sec %10; lcd_home(); lcd_puts(str); } } } return 0; }

  • Micom Car Rally に向けて製作をしているのですがI/Oレジスタ定義が理解できません。

    /************************************************************************/ /* H8/3048F-ONE 内蔵周辺機能 初期化 */ /************************************************************************/ void init( void ) { /* I/Oポートの入出力設定 */ PADDR = 0x5e; /* EEP-ROM,エンコーダ */ h8_3048.h /****************************************************************************/ /* H8/3048F-ONE用内蔵周辺機能のI/Oレジスタ定義 Ver1.03 */ /* 2006.04 マイコンカーラリー実行委員会 */ /****************************************************************************/ #define PADDR (*(volatile unsigned char*)0xfffd1) #define PADR (*(volatile unsigned char*)0xfffd3) (*(volatile unsigned char*)0xfffd1)はどういう意味なのでしょうか? PADRがなんなのかも分かりません。 どなたか、どうかご教授お願いします。

  • 8個のビットを1バイトとして扱う方法

    1バイトをビット扱いする方法は、 union un_p1dr { unsigned char one_byte ; struct { unsigned char b7:1 ; unsigned char b6:1 ; unsigned char b5:1 ; unsigned char b4:1 ; unsigned char b3:1 ; unsigned char b2:1 ; unsigned char b1:1 ; unsigned char b0:1 ; } bit ; } ; #define pt_da_p1dr (*(volatile union un_p1dr *)0xffffd0) と宣言すれば、pt_da_p1dr.bit.b7 = 1 ;の様にビット扱いが出来ます。 この反対を行える宣言方法は、あるでしょうか? つまり、任意の1ビットを8ビット集め、プログラムでバイトにてアクセスしたいのですが・・・・ ARMなどは、ビットの扱いが容易に可能です。しかし、CPUの周辺関係事情より、バイトでのアクセスが 可能なように、ハード割り当てが出来ません。 従って、現在は、プログラムにて、ビットを集め、バイトにして、アクセスしています。 なにか良い宣言方法があれば、ご伝授していただけないでしょうか? 宜しくお願いいたします。

専門家に質問してみよう