2017-01-16 55 views
2

我使用了以下內容:簡單的中斷程序陷阱/凍結CPU(USART/PIC18F/MICROCHIP/XC8)

  • PIC18F4550,
  • xc8編譯器,
  • MPLAB個IDE V3.20,
  • 發送器和接收器模塊(在沒有任何中斷和工作的情況下用主程序測試)。
  • LED的連接到RD0,RD1和RD2(1 =亮)
  • 按鈕連接到RB0,RB1和RB2(0 =按鈕被按下)//在這一點並不重要

顯然,這段代碼中的所有內容都可以正常工作,但是中斷"void interrupt SerialComm(void)"
(我已經制作了一個程序,沒有中斷並且指示燈亮起)。

主要甚至沒有加載;我已經把"PORTD = 0x0F",
(主程序的第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將點亮,bit1和bit 2也一樣,所以0x0F所有3都將點亮,但是如果主程序完全啓動,則0x0F將會在while循環中被0x01非常快速地覆蓋,所以RD0中的指示燈將亮起,其餘的指示燈熄滅,但是沒有任何指示燈亮起,所以我假定它是我創建的中斷函數。 //我認爲是什麼東西是陷入我創建的中斷函數的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'有點可變,所以你可以這樣設置它? –