【发布时间】:2016-12-07 11:24:38
【问题描述】:
我在尝试在 Proteus 模拟上实现的 uart 通信方面需要帮助。我使用的是 PIC18f4520,我想在虚拟终端上显示微控制器计算的值。
Here a snap of my design on Proteus
现在,这就是我的 UART 代码的样子:
#define _XTAL_FREQ 20000000
#define _BAUDRATE 9600
void Configuration_ISR(void) {
IPR1bits.TMR1IP = 1; // TMR1 Overflow Interrupt Priority - High
PIE1bits.TMR1IE = 1; // TMR1 Overflow Interrupt Enable
PIR1bits.TMR1IF = 0; // TMR1 Overflow Interrupt Flag
// 0 = TMR1 register did not overflow
// 1 = TMR1 register overflowed (must be cleared in software)
RCONbits.IPEN = 1; // Interrupt Priority High level
INTCONbits.PEIE = 1; // Enables all low-priority peripheral interrupts
//INTCONbits.GIE = 1; // Enables all high-priority interrupts
}
void Configuration_UART(void) {
TRISCbits.TRISC6 = 0;
TRISCbits.TRISC7 = 1;
SPBRG = ((_XTAL_FREQ/16)/_BAUDRATE)-1;
//RCSTA REG
RCSTAbits.SPEN = 1; // enable serial port pins
RCSTAbits.RX9 = 0;
//TXSTA REG
TXSTAbits.BRGH = 1; // fast baudrate
TXSTAbits.SYNC = 0; // asynchronous
TXSTAbits.TX9 = 0; // 8-bit transmission
TXSTAbits.TXEN = 1; // enble transmitter
}
void WriteByte_UART(unsigned char ch) {
while(!PIR1bits.TXIF); // Wait for TXIF flag Set which indicates
// TXREG register is empty
TXREG = ch; // Transmitt data to UART
}
void WriteString_UART(char *data) {
while(*data){
WriteByte_UART(*data++);
}
}
unsigned char ReceiveByte_UART(void) {
if(RCSTAbits.OERR) {
RCSTAbits.CREN = 0;
RCSTAbits.CREN = 1;
}
while(!PIR1bits.RCIF); //Wait for a byte
return RCREG;
}
在主循环中:
while(1) {
WriteByte_UART('a'); // This works. I can see the As in the terminal
WriteString_UART("Hello World !"); //Nothing displayed :(
}//end while(1)
我已经为 WriteString_UART 尝试了不同的解决方案,但到目前为止都没有奏效。
我不想使用 printf,因为它会通过添加延迟来影响我对 PIC 进行的其他操作。 所以我真的想让它与 WriteString_UART 一起工作。 最后,我想在终端上显示“错误率是:[a value]%”之类的东西。
感谢您的帮助,如果有不清楚的地方请告诉我。
【问题讨论】:
-
PIR1bits声明在哪里? -
它在另一个函数中。我现在将编辑帖子。
-
在我的程序中,我使用了一个高 ISR。在例程中,我在两个 PIC 正在交换的两个值之间进行比较(使用 SPI)。我想做的是在终端上显示比较结果:)
-
PIR1bits 的类型是什么?给我看声明,而不是定义。
-
TXREG传输到UART后会自动清空吗?
标签: embedded microcontroller uart pic18