2017-01-16 8 views
2

シンプルな割り込みプログラムトラップ/ CPUをフリーズ(USART/PIC18F /マイクロチップ/ XC8)私は、次の使用しています

  • PIC18F4550を、
  • xc8コンパイラ、
  • MPLAB X IDEがV3.20、
  • トランスミッタとレシーバモジュール(メインプログラムを使用してテストされていますが、中断や動作はありません)。
  • のLED(1 =点灯)
  • ボタン//この時点では重要ではない
RB0、RB1及びRB2(0 =ボタンが押下された)に接続RD0、RD1及びRD2に接続されています

どうやらこのコードのすべてがうまく動作しますが、割り込みがあります。"void interrupt SerialComm(void)"
(割り込みなしでプログラムを作成し、点灯しました)

メインはロードさえしません。私は"PORTD = 0x0F"
(メインプログラムの3行目)を入れました。

LEDが点灯している場合は、少なくともメインプログラムの3行目が機能していることを意味します。
(少なくともその行まで、しかしledはしませんでした)

最初に無効にしなければならないレジスタはありますか?
また、ほとんどのチュートリアルに従っていますが、私が見逃したことがありますか? #pragmaで多くのプログラムを見たことがありますが、XC8コンパイラを使用しているときに必要なのか分かりません。

/* 
* File: transmit.c 
* Author: steve 
* 
* Created on September 25, 2016, 12:36 AM 
*/ 
#define _XTAL_FREQ 48000000 

#include <xc.h> 
#include <pic18f4550.h> 
void DelayMs(int x); 
char ButtonsChecker(); 
char ButtonsCheckValue = 0; //returned value 
char data_received = 0; 


void main(void) { 
    TRISB = 0x0F; 
    TRISD = 0b00000000; 

    TRISCbits.TRISC2 = 0; //TXD Power 
    TRISCbits.TRISC6 = 0; //RC6 
    TRISCbits.TRISC7 = 1; //RC7 
    PORTCbits.RC2 = 1; 

    RCSTA = 0x90; 
    TXSTA = 0x20; 
    SPBRG = 77; 

    RCREG = 0; 
    RCIF = 0; 


    PORTDbits.RD0 = 1; 
    PORTDbits.RD1 = 1; 
    PORTDbits.RD2 = 1; 

    RCIE = 1; 
    TXIE = 0; 

    PEIE = 1; 
    GIE = 1; 

    while (1) { 

     while (ButtonsChecker()) { 

      TXREG = ButtonsChecker(); 
     } 


     //while (!TRMT); // waiting for a whole data frame to be ready for a transmission 
     //TXREG = PORTB; 

     //while (!RCIF); // waiting for a whole data frame to be received 
     //PORTD = RCREG; 

    } 
} 

void DelayMs(int x) { 
    while (x > 0) { 
     __delay_ms(1); 
     x--; 
    } 
} 

char ButtonsChecker() { 
    if (PORTBbits.RB0 == 0) { 
     ButtonsCheckValue = 1; 
    } else if (PORTBbits.RB1 == 0) { 
     ButtonsCheckValue = 2; 
    } else if (PORTBbits.RB2 == 0) { 
     ButtonsCheckValue = 4; 
    }//else if (PORTBbits.RB3 == 0) { 
     // ButtonsCheckValue = 8;} 
    else ButtonsCheckValue = 0; 

    return (ButtonsCheckValue); 
} 


void interrupt ReceiveData() { 
    if (RCIF == 1) { 
     RCIF = 0; 
     ~PORTDbits.RD1; 
    } 
} 
+0

割り込みベクタテーブルに割り込みを登録しましたか? – Lundin

+0

最初にPORTD = 0x0Fを行いますが、突然後でPORTD = 0x01で上書きされます。 PORTD.0(lsbビット)に接続されているものは何ですか?そのピンに電圧があるかどうかを確認してください(おそらくそうしているので、メインがwhile()に入ります)。 – linuxfan

+0

@linuxfan 実際には、ビット0 = 1の場合は3つのピンがLEDに接続され、LEDの1つが点灯し、ビット1とビット2が同じように0x0Fがすべて点灯しますが、メインプログラムが完全に起動する場合、 whileループの0x01で本当に高速にオーバーライドされるので、RD0のLEDが点灯し、残りはオフになりますが、何も点灯しないので、私が作成した割り込み関数であると仮定しています。 //私は何かが私が作成した割り込み機能にCPUをトラップされていますが、私は –

答えて

0

すべてがO.Kに見えます。ただし、TX割り込みとRC割り込みを有効にしていない点が異なります。 だからUSARTの開始時に追加します。

PIE1bits.RCIE = 1; 
PIE1bits.TXIE = 1; 

開始セクションの終わりにも追加:

INTCONbits.GIE = 1; 

...グローバル割り込みを有効にします。

+0

omgありがとう、私はそれを忘れていたとは思えない、私は実際に古いテンプレートを再利用していましたが、実際に私の以前のバージョンはTXIEビットを無効にして割り込みの受信部分をテストするだけでした。私はもう一度tommorowを試してみるだろう –

+0

"RCIE"ビットが有効になっていても動作していないことを確認した以前のバージョンのコードを実際に更新しました –

+0

Amm? 'RCREG'レジスタは読み込み専用でなければなりません。そして 'RCIE'はちょっと変わっていますので、そのように設定できますか? –

関連する問題