次に示すコードで、
①USART通信
②A/D変換 のプログラムを実施しています。
①の動作から②の動作
②の動作から①の動作 へ切り替えた際(スイッチによる切替)、切替+USART通信でデータを受信しないとモードを切り替えることができません。
今のプログラムだと、モード(①、②)を切り替えた際、PC側(USART通信の相手)からデータを送ってあげないと、モードが切り替わりません。
なにがいけないのでしょうか。
while(1){
mode = PORTD & 0x70;
switch(mode){
case 0x50:
manual_mode(); //USART通信
break;
case 0x40:
auto_mode();
break;
default:
alarm_clock();
break;
}
}
//①の動作
int manual_mode(void)
{
getsUSART(cmnd,8);
R= getData(&cmnd[0])*100/255;
G= getData(&cmnd[2])*100/255;
B= getData(&cmnd[4])*100/255;
lcd_cmd(0x80); //1行目へ移動
lcd_printf(RGB);
lcd_cmd(0xC0); //2行目へ移動
sprintf(&str[0],(const far rom char *)"%3d%% %3d%% %3d%%",R,G,B);
lcd_printf(&str[0]);
delay_ms(100);
}
//②の動作
int auto_mode(void)
{
SetChanADC(ADC_CH0); //チャンネルを切り替える場合
ConvertADC();
while( BusyADC()); //AD変換が終わるまで待つ
ADR = ReadADC(); //AD変換値読込み
SetChanADC(ADC_CH1); //チャンネルを切り替える場合
ConvertADC();
while( BusyADC()); //AD変換が終わるまで待つ
ADG = ReadADC(); //AD変換値読込み
SetChanADC(ADC_CH2); //チャンネルを切り替える場合
ConvertADC();
while( BusyADC()); //AD変換が終わるまで待つ
ADB = ReadADC(); //AD変換値読込み
vR = (double)ADreadR / 10.13; //exchange 10bit for %
vG = (double)ADreadG / 10.13; //exchange 10bit for %
vB = (double)ADreadB / 10.13; //exchange 10bit for %
lcd_cmd(0x80); //1行目へ移動
lcd_printf(RGB);
lcd_cmd(0xC0); //2行目へ移動
sprintf(&str[0],(const far rom char *)"%3d%% %3d%% %3d%%",vR,vG,vB);
lcd_printf(&str[0]); //vR vG vB表示
delay_ms(100); //0.1秒待ち
}