gpt4 book ai didi

embedded - 在 PIC18 上写入 UART

转载 作者:行者123 更新时间:2023-12-02 19:26:46 24 4
gpt4 key购买 nike

我需要有关我试图在 Proteus 模拟上实现的 uart 通信的帮助。我使用 PIC18f4520,我想在虚拟终端上显示微 Controller 计算出的值。

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]%”的内容。

感谢您的帮助,如果有不清楚的地方请告诉我。

最佳答案

在您的 WriteByte_UART() 函数中,尝试轮询 TRMT 位。特别是,改变:

while(!PIR1bits.TXIF);

while(!TXSTA1bits.TRMT);

我不知道这是否是您的特定问题,但由于加载 TXREG 时 TXIF 没有立即清除,因此存在竞争条件。另一种选择是尝试:

...
Nop();
while(!PIR1bits.TXIF);
...

根据评论进行编辑

该问题是由于 PIC18 使用两种不同的基于数据存储器和程序存储器的指针类型造成的。尝试将声明更改为 void WriteString_UART(const rom char * data) 并看看会发生什么。您还需要将 WriteByte_UART() 声明更改为 void WriteByte_UART(const unsigned char ch)

关于embedded - 在 PIC18 上写入 UART,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38714798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com