Мне нужна помощь с коммуникацией uart, которую я пытаюсь реализовать в своей симуляции Proteus. Я использую PIC18f4520 и хочу отображать на виртуальном терминале значения, рассчитанные микроконтроллером.
Вот снимок моего дизайна на 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. В конце я хотел бы иметь что-то вроде «Уровень ошибок: [значение]%» на терминале.
Спасибо за помощь, и, пожалуйста, скажите мне, если что-то неясно.
PIR1bits
? - person Daniel Margosian   schedule 02.08.2016TXREG
автоматически после передачи наUART
? - person Daniel Margosian   schedule 03.08.2016TXREG
сохраняет последнее значение в памяти после завершения передачи вUART
. Но если я добавлю строку, в которой специально сбрасываюTXREG
, то она снова пуста. - person Daymov   schedule 04.08.2016TXREG
и очищаете ее, вы все еще видите ту же проблему? - person Daniel Margosian   schedule 04.08.2016