我正在使用以下内容:
- pic18f4550,
- xc8 编译器,
- mplab x ide v3.20,
- 发射器和接收器模块(使用主程序进行测试,没有任何中断和工作)。
- LED 连接到 RD0、RD1 和 RD2(1 = 亮起)
- 连接到 RB0、RB1 和 RB2 的按钮(0 = 按钮被按下)//此时无关紧要
显然此代码中的所有内容都工作正常,但有中断 "void interrupt SerialComm(void)"
(我做了一个不中断的程序,led灯亮了)。
主甚至没有加载;我已经把 "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;
}
}
最佳答案
一切看起来都很好。除了你没有启用 TX 和 RC 中断。 所以在 USART 启动时添加:
PIE1bits.RCIE = 1;
PIE1bits.TXIE = 1;
在启动部分的末尾还添加:
INTCONbits.GIE = 1;
...启用全局中断。
关于c - 简单中断程序陷阱/卡住cpu(USART/PIC18F/MICROCHIP/XC8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41675576/