PIC18F67k40 UART接收器部分正常工作但发送器部分不能正常工作?

时间:2018-06-29 11:36:25

标签: c embedded pic uart pic18

器件PIC18F67k40 UART接收器部分工作正常,但发送器部分不工作?   UART接收器部分正常工作。谁能建议我在下面的代码中我做错了什么。     设备速度为16Mhz,波特率为115200    器件PIC18F67k40 UART接收器部分工作正常,但发送器部分不工作?   UART接收器部分正常工作。谁能建议我在下面的代码中我做错了什么。     设备速度为16Mhz,波特率为115200

#include <xc.h>
#include <p18f67k40.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// PIC18F67K40 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1L
#pragma config FEXTOSC = HS    // External Oscillator mode Selection bits (Oscillator not enabled)
#pragma config RSTOSC = HFINTOSC_64MHZ// Power-up default value for COSC bits (HFINTOSC with HFFRQ = 64 MHz and CDIV = 1:1)

// CONFIG1H
#pragma config CLKOUTEN = OFF   // Clock Out Enable bit (CLKOUT function is disabled)
#pragma config CSWEN = ON       // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)

// CONFIG2L
#pragma config MCLRE = EXTMCLR  // Master Clear Enable bit (If LVP = 0, MCLR pin is MCLR; If LVP = 1, RG5 pin function is MCLR )
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (Power up timer disabled)
#pragma config LPBOREN = OFF    // Low-power BOR enable bit (ULPBOR disabled)
#pragma config BOREN = SBORDIS  // Brown-out Reset Enable bits (Brown-out Reset enabled , SBOREN bit is ignored)

// CONFIG2H
#pragma config BORV = VBOR_2P45 // Brown Out Reset Voltage selection bits (Brown-out Reset Voltage (VBOR) set to 2.45V)
#pragma config ZCD = OFF        // ZCD Disable bit (ZCD disabled. ZCD can be enabled by setting the ZCDSEN bit of ZCDCON)
#pragma config PPS1WAY = ON     // PPSLOCK bit One-Way Set Enable bit (PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle)
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config DEBUG = OFF      // Debugger Enable bit (Background debugger disabled)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Extended Instruction Set and Indexed Addressing Mode disabled)

// CONFIG3L
#pragma config WDTCPS = WDTCPS_31// WDT Period Select bits (Divider ratio 1:65536; software control of WDTPS)
#pragma config WDTE = OFF       // WDT operating mode (WDT Disabled)

// CONFIG3H
#pragma config WDTCWS = WDTCWS_7// WDT Window Select bits (window always open (100%); software control; keyed access not required)
#pragma config WDTCCS = SC      // WDT input clock selector (Software Control)

// CONFIG4L
#pragma config WRT0 = OFF       // Write Protection Block 0 (Block 0 (000800-003FFFh) not write-protected)
#pragma config WRT1 = OFF       // Write Protection Block 1 (Block 1 (004000-007FFFh) not write-protected)
#pragma config WRT2 = OFF       // Write Protection Block 2 (Block 2 (008000-00BFFFh) not write-protected)
#pragma config WRT3 = OFF       // Write Protection Block 3 (Block 3 (00C000-00FFFFh) not write-protected)
#pragma config WRT4 = OFF       // Write Protection Block 3 (Block 4 (010000-013FFFh) not write-protected)
#pragma config WRT5 = OFF       // Write Protection Block 3 (Block 5 (014000-017FFFh) not write-protected)
#pragma config WRT6 = OFF       // Write Protection Block 3 (Block 6 (018000-01BFFFh) not write-protected)
#pragma config WRT7 = OFF       // Write Protection Block 3 (Block 7 (01C000-01FFFFh) not write-protected)

// CONFIG4H
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-30000Bh) not write-protected)
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot Block (000000-0007FFh) not write-protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
#pragma config SCANE = ON       // Scanner Enable bit (Scanner module is available for use, SCANMD bit can control the module)
#pragma config LVP = ON         // Low Voltage Programming Enable bit (Low voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored)

// CONFIG5L
#pragma config CP = OFF         // UserNVM Program Memory Code Protection bit (UserNVM code protection disabled)
#pragma config CPD = OFF        // DataNVM Memory Code Protection bit (DataNVM code protection disabled)

// CONFIG5H

// CONFIG6L
#pragma config EBTR0 = OFF      // Table Read Protection Block 0 (Block 0 (000800-003FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF      // Table Read Protection Block 1 (Block 1 (004000-007FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF      // Table Read Protection Block 2 (Block 2 (008000-00BFFFh) not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF      // Table Read Protection Block 3 (Block 3 (00C000-00FFFFh) not protected from table reads executed in other blocks)
#pragma config EBTR4 = OFF      // Table Read Protection Block 4 (Block 4 (010000-013FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR5 = OFF      // Table Read Protection Block 5 (Block 5 (014000-017FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR6 = OFF      // Table Read Protection Block 6 (Block 6 (018000-01BFFFh) not protected from table reads executed in other blocks)
#pragma config EBTR7 = OFF      // Table Read Protection Block 7 (Block 7 (01C000-01FFFFh) not protected from table reads executed in other blocks)

// CONFIG6H
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot Block (000000-0007FFh) not protected from table reads executed in other blocks)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.


#define  _XTAL_FREQ 16000000 //16Mhz
#define  LED2       RC2      //LED2
char string_rx1[100],uart_rx1=0,string_rx2[100],uart_rx2=0,str2=0;

        void System_Init() // System_Init
        {
            OSCFRQ=0b00000101; //16Mhz
            TRISC2=0;//LED2 Pin-33 Output
            INTCONbits.GIE=1;
            INTCONbits.PEIE=1;
            INTCONbits.IPEN=1;

        }

        void UART_2_Init()//UART_2_Init()
        {   
            TRISGbits.TRISG1=1;           // TX2 Pin-4
            TRISGbits.TRISG2=1;           // RX2 Pin-5
            RX2PPS=0b00110010;
            TX2PPS=0b00110001;
            RC2IE=1;

            SP2BRG=34;           // Baud Rate 115200
            BAUD2CON = 0x08;     // ABDOVF no_overflow; SCKP Non-Inverted; BRG16 16bit_generator; WUE disabled; ABDEN disabled;

          //TX2STA  Register 
            TX2STAbits.CSRC=0;   // Asynchronous mode:Don?t care bit-7
            TX2STAbits.TX9=1;    // 8-bit transmission bit-6
            TX2STAbits.TXEN=0;   // Transmit is Disabled bit-5
            TX2STAbits.TXEN=1;   // Transmit is enabled bit-5
            TX2STAbits.SYNC=0;   // Asynchronous mode bit-4
            TX2STAbits.SENDB=1;  // Sync Break transmission disabled or completed bit-3
            TX2STAbits.BRGH=1;   // High Baud Rate Select bit bit-2
            TX2STAbits.TRMT=1;   // Transmit Shift Register Status bit bit-1
            TX2STAbits.TX9D=1;   // Ninth bit of Transmit Data bit-0

           //RX2STA  Register
            RC2STAbits.SPEN=1;   // Serial Port Enable bit bit-7
            RC2STAbits.RX9=0;    // 8-bit reception bit-6
            RC2STAbits.SREN=0;   // Single Receive Enable bit Asynchronous mode:Don?t care bit-5
            RC2STAbits.CREN=1;   // Continuous Receive Enable bit bit-4
            RC2STAbits.ADDEN=0;  // bit-3

            ANSELGbits.ANSELG1=0; //
            ANSELGbits.ANSELG2=0;//
            RC2IP = 1;//
            TX2IP = 1;//

        } 
        void UART_2_Tx(unsigned char z[]) //UART_2_Tx
        {
        unsigned int uart_tx2=0;
        while(z[uart_tx2]!='\0')
        {
            while(!TX2IF);
            TX2REG=z[uart_tx2];
            uart_tx2++;
        }
        }
        void  UART_Tx2(const char *buffer) // UART2 Transmmitr
        {
            unsigned int size = strlen(buffer);
            while( size)
            {
                while(TX2IF==0);           // wait while TX buffer full
                TX2REG = *buffer;          // send single character to transmit buffer

                buffer++;                   // transmit next character on following loop
                size--;                     // loop until all characters sent (when size = 0)
            }
            while( !TX2STAbits.TRMT);        // wait for last transmission to finish
        } 

        void UART_2_Rx()//UART_2_Rx
        {
            string_rx2[uart_rx2]=RC2REG;
            uart_rx2++;
        }
        void interrupt ISR(void) //interrupt ISR
        {
             if(RC2IF && RC2IE)  // Through Application UART_2
                {   
                      UART_2_Rx();
                      if(RC2STAbits.OERR){RC2STAbits.CREN=0;RC2STAbits.CREN=1;}  
                      str2=1;
                }
        }

        void main(void) // main 
        {
            System_Init();
            UART_2_Init();

            UART_2_Tx("HELLO\r\n"); //1st transmitter logic
            UART_Tx2("HELLO\r\n"); //2nd transmitter logic
            LED2=0;
            while(1)
            {
                if(string_rx2[0]=='1'){LED2=1;__delay_ms(10);string_rx2[0]='\0';uart_rx2=0;}
                if(string_rx2[0]=='0'){LED2=0;__delay_ms(10);string_rx2[0]='\0';uart_rx2=0;}
                if(str2){str2=0;__delay_ms(20);uart_rx2=0;}

            }
        }

1 个答案:

答案 0 :(得分:1)

TX引脚应为输出。因此使用:

TRISGbits.TRISG1=0;           // TX2 Pin-4

请记住PPS寄存器。 RG1不是接收器的默认值。

RG1PPS = 0x14        //for UART Nr.5

请查看数据表中的第17节。