PIC16F84A → PIC16F628Aの場合 @ Q: 16F84Aで動作していプログラムを16F628Aに変更したところ動作しなくなりました。 --------------------------------------------------------------------------- A: 添付いただいたソースをコンパイルしてみました。 16F628Aでコンパイルしました #include <16f628a.h> #fuses HS, NOWDT //INTRC_IO,NOWDT,NOMCLR,NOBROWNOUT #use delay(CLOCK = 20000000) #use rs232 (baud=2400,xmit=PIN_A1,rcv=PIN_A0) それで生成されたリストファイルの最後にコンフィグレーション ヒューズの設定があるのですが以下のようになっていました Word 1: 3FEA HS NOWDT NOPUT NOPROTECT BROWNOUT MCLR LVP NOCPD ここで問題なのは LVP が有効となっていることです。 LVP(低電圧プログラミング)の詳細はデータシートを参照いただきたいのですが、 簡単に言うとRB4ピンを使ってプログラミング可能なモードです。 この機能は16F84にはありません。 よって#fuses にNOLVPを追加して下さい。 また、#fuses オプションは他にも84と相違があると思いますので18F628a.h の #fuses オプションをご確認下さい。 A PIC16F628A(X'tal 10MHz)を使用しての基板を作成し、動作確認を行っております。 動作としましてはRS232Cの信号を受信した際に割り込み処理としてLEDを点灯するプログラムを 作成致しました。 しかしRS232C の信号を受信しているにも関わらずLED は点灯しません。 ------------------------------------------------------------------ A: 下記受信割込みルーチン内に受信バッファをリードする必要があります 受信バッファをリードしないと割込みフラグがクリアされません (これはPIC16Fデバイスの仕様です) あと、割込みのマスク・許可は自動的に行われますので不要です。 #INT_RDA void USART_rxhdl(void) { // disable_interrupts(INT_RDA); // 受信 Int Disable output_high(PIN_A1); // 点灯 delay_ms(1); // enable_interrupts(INT_RDA); } B Q: シリアル受信の割り込み状態をアナライザの波形にて確認したところシリアル通信の立ち下がり エッジで割り込み処理が発生しており、正常な割り込み受信が出来ていない状況です。 ------------------------------------------------------------------------------ A: ソースファイルを拝見しました。 #use rs232(BAUD=4800, RCV=PIN_B1) のように受信ポートしか定義されていませんが、これでは不完全です (シリアルポートの初期化が行われていないようです) #use rs232(baud=4800,xmit=PIN_B2,rcv=PIN_B1) のように送信ポート も設定してください。 このように定義することで、SPENビットは1にセットされます あと、 if ((PIC_PIR1 & BIT5) != 0){ dsp[rxcnt % 3].bt = PIC_RCREG; rxcnt++; } ではなく、 dsp[rxcnt % 3].bt = getc(); rxcnt ++; のようにif文を使わないで組み込み関数を御使用ください。 (組み込み関数でPIR1 の bit5はチェックします)