


/*************************************************************************************************
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 )を使う方が良いでしょう。 |