/************************************************************************************************* kiso_j.c Tiny2313基礎実験機用プログラム 2011.05.10 im mcu=tiny2313 5V 9.22MHzセラミック fuse設定=-fL11001111 -fH11011111 -fx00000001 UART 19200bps FT232RLまたはcp2102変換のTDとRDを使用 LED portB0:7 ***************************************************************************************************/ #define F_CPU 9220000UL // #include <avr/io.h> #include <string.h> // strcpy()用 #include <util/delay.h> #include <avr/pgmspace.h> #include <avr/interrupt.h> /* プロトタイプ宣言 */ void string_out (char *msg_string); // UART送信 /* グローバル変数定義 */ volatile uint8_t rflg; //uart受信フラグ volatile uint8_t rdat; //受信データ volatile char recbuf[30]; // volatile uint8_t rec_i; // rec_index /* 受信割込ルーチン */ ISR(USART_RX_vect){ /* データを読み出すとクリアされる rdat:char変数 */ recbuf[rec_i]=UDR; if((recbuf[rec_i]=='\0')||(recbuf[rec_i]==0x0d)||(recbuf[rec_i]==0x0a)){ recbuf[rec_i]='\0'; rflg=1; rec_i=0; cli(); } else{ rec_i++; } } /* ////////////////// メインルーチン ////////////////////////////////////////////////////////////////////// */ int main (void) { uint8_t menu_n=0; // プログラムメニュー用 uint8_t i; char s[20]; char msg[30]; DDRB=0xff; PORTB=0x00; // LEDポート /* USART設定 */ UBRRH=0; UBRRL=29; /* 19200bps */ // UCSRA=(1<<U2X); /* 有効にすると U2X=1 */ UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE); /* 送受信許可、受信割込許可*/ UCSRC=(3<<UCSZ0); /* 8ビット 1ストップビット ノンパリティ*/ sei(); strcpy_P(msg,PSTR("-- menu --")); string_out(msg); strcpy_P(msg,PSTR("1 プログラム1")); string_out(msg); strcpy_P(msg,PSTR("2 プログラム2 ")); string_out(msg); while(rflg==0){ if(rflg==1){break;} } rflg=0; strcpy(s,recbuf); menu_n=s[0]-0x30; string_out(""); string_out(s); while(1){ // 全体ループ処理開始 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ if(menu_n==1){ // menu 1 111111111111111111111111111111111111111111111111 while(1){ PORTB=0x55; _delay_ms(1000); PORTB=0xaa; _delay_ms(1000); } } // menu 1 終わり 111111111111111111111111111111111111111111111111 if(menu_n==2){ // menu 2 2222222222222222222222222222222222222222222222 while(1){ PORTB=0xff; _delay_ms(1000); PORTB=0x00; _delay_ms(1000); } } // menu 2 終わり 2222222222222222222222222222222222222222222222 } // 全体ループ処理終わり +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ } /* ////////////////// メインルーチンの終わり ///////////////////////////////////// */ /* ************************ 文字列送信ルーチン ***************************************************** */ void string_out (char *msg_string){ /* "*"で受けると、呼び出し側の配列の番地を受け取る */ uint8_t i; i=0; while (msg_string[i] !='\0'){ while ( !(UCSRA & _BV(UDRE)) ); //送信バッファの空きを待って UDR = msg_string[i]; //送信データをセットします i++; _delay_ms(6); } while(!(UCSRA & _BV(UDRE))); UDR = 0x0d; _delay_ms(6); /* 送信バッファの空きを待ってデータをセット CRLF送信*/ while(!(UCSRA & _BV(UDRE))); UDR = 0x0a; _delay_ms(6); /* 送信バッファの空きを待ってデータをセット */ }------------------------------------------------------------------------------
グローバル定数を置くと(2バイト単位で)SRAMを消費します。 定数に値を代入するとコンパイルエラーとなります。 定数は #define (例 #define teisuu 20 )を使う方が良いでしょう。 |