2015-03-05 5 views
0

Я хочу подключить два стартовых комплекта PIC18F (с PIC18F46J50), используя RS232. Поскольку USART1 уже подключен к считывателю карт (интегрирован), мне нужно использовать USART2 (мне нужно переназначить RX2/TX2 на контакты RP19/RP20-RD2/RD3).Подключение двух комплектов стартеров PIC18F с использованием USART2

я уже нашел демо-код для ОТПРАВКИ:

#define _XTAL_FREQ 8000000 //The speed of your internal(or)external oscillator 
#include <p18cxxx.h> 
#include <usart.h> 
int i = 0; 

// CONFIG1L 
#pragma config WDTEN = OFF   // Watchdog Timer (Disabled - Controlled by SWDTEN bit) 
#pragma config PLLDIV =3   // PLL Prescaler Selection bits - Divide by 3 (12 MHz oscillator input) 
#pragma config STVREN = ON   // Stack Overflow/Underflow Reset (Enabled) 
#pragma config XINST = OFF   // Extended instruction set disabled 

// CONFIG1H 
#pragma config CPUDIV = OSC1  // CPU System Clock Postscaler (No CPU system clock divide) 
#pragma config CP0 = OFF   // Code Protect (Program memory is not code-protected) 

// CONFIG2L 
#pragma config OSC = HSPLL   //HS oscillator, PLL enabled, HSPLL used by USB 
#pragma config T1DIG = ON   // T1OSCEN Enforcement (Secondary Oscillator clock source may be selected) 
#pragma config LPT1OSC = OFF  // Low-Power Timer1 Oscillator (High-power operation) 
#pragma config FCMEN = OFF   //Fail-Safe Clock Monitor disabled 
#pragma config IESO = OFF   //Two-Speed Start-up disabled 

// CONFIG2H 
#pragma config WDTPS = 32768  // Watchdog Postscaler (1:32768) 

// CONFIG3L 
#pragma config DSWDTOSC = INTOSCREF // DSWDT Clock Select (DSWDT uses INTRC) 
#pragma config RTCOSC = T1OSCREF // RTCC Clock Select (RTCC uses T1OSC/T1CKI) 
#pragma config DSBOREN = OFF  // Zero-Power BOR disabled in Deep Sleep 
#pragma config DSWDTEN = OFF  // Deep Sleep Watchdog Timer (Disabled) 
#pragma config DSWDTPS = 8192  //1:8,192 (8.5 seconds) 

// CONFIG3H 
#pragma config IOL1WAY =OFF   //IOLOCK bit can be set and cleared 
#pragma config MSSP7B_EN = MSK7  // MSSP address masking (7 Bit address masking mode) 

// CONFIG4L 
#pragma config WPFP = PAGE_1  // Write/Erase Protect Page Start/End Location (Write Protect Program Flash Page 0) 
#pragma config WPEND = PAGE_0  //Start protection at page 0 
#pragma config WPCFG = OFF   //Write/Erase last page protect Disabled 

// CONFIG4H 
#pragma config WPDIS = OFF    //WPFP[5:0], WPEND, and WPCFG bits ignored 

#define USE_AND_MASKS 

unsigned char Txdata[] = "MICROCHIP_USART"; 
void Delay1Second(void); 

void main (void) 
{ 
    unsigned char spbrg=0,baudconfig=0,i=0; 

    // REMAPE ID PORT 

    PPSCON = 0x00;    // unlock peripheral Pin select register 
    RPOR19 = 0x05;    // assign USART2 TX to RP19/RD2 
    RPINR16 = 0x14;    // assign USART2 RX to RP20/RD3 
    PPSCON = 0x01;    // lock peripheral Pin select register 

    TRISDbits.TRISD2 = 0;  // TX2 output 
    TRISDbits.TRISD3 = 1;  // RX2 input 
//------USART Setup ---- 

    Close2USART(); //turn off usart if was previously on 

    spbrg = 51; 

    Open2USART(USART_TX_INT_OFF & 
       USART_RX_INT_OFF & 
       USART_ASYNCH_MODE & 
       USART_EIGHT_BIT & 
       USART_CONT_RX & 
       USART_BRGH_HIGH, spbrg); 

    baudconfig = BAUD_8_BIT_RATE & BAUD_AUTO_OFF; 
    baud2USART (baudconfig); 

    PORTB = 0x03; 

while(1){ 

//------USART Transmission ---- 
    while(Busy2USART());    //Check if Usart is busy or not 
    puts2USART((char *)Txdata);    //transmit the string 
    Delay1Second(); 
    Close2USART(); 
}       
} 

void Delay1Second() 
{ 
    for(i=0;i<100;i++) 
    { 
     __delay_ms(10); 
    } 
} 

Я соединил две доски с помощью двух проводов (на D2 и D3 булавки), и я хочу, чтобы отправить строку из совет1 в комитетом2. Я думаю, мне нужно использовать прерывания для чтения, но я не нашел никакого демо-кода. Кроме того, я не знаю, поддерживаются ли контакты конфигурации. Может ли кто-нибудь показать мне, как получить отправленный текст на борт № 2?

ответ

0

Я предполагаю, что вы правильно выполнили проводку.

Вам не нужны прерывания для приема. Это может быть полезно, но это не требуется. Чтобы получить свою строку, вам просто нужно:

gets2USART(str, 10); 

Если ваша строка содержит 10 символов (включая нулевой ограничитель).

Если вы хотите получить строку произвольной длины, вы можете написать свой собственный gets2USART для чтения до нулевого терминатора. Это на самом деле довольно просто, вот исходный код gets2USART, чтобы помочь вам:

void gets2USART(char *buffer, unsigned char len) 
{ 
    char i; // Length counter 
    unsigned char data; 

    for(i=0;i<len;i++) // Only retrieve len characters 
    { 
    while(!DataRdy2USART());// Wait for data to be received 

    data = getc2USART(); // Get a character from the USART 
         // and save in the string 
    *buffer = data; 
    buffer++;    // Increment the string pointer 
    } 
} 

Кроме того, здесь есть исходный код puts2USART:

void puts2USART(char *data) 
{ 
    do 
    { // Transmit a byte 
    while(Busy2USART()); 
    putc2USART(*data); 
    } while(*data++); 
} 

Вы можете увидеть, что там уже есть while(Busy2USART()); , поэтому вам не нужно добавлять их. Это логично, потому что UART байт мудрый, поэтому он занят, когда отправляет байт, и функция должна проверять каждый байт.

Кроме того, вы закрываете UART после использования, но на самом деле цикл для повторной отправки. Поскольку вы только что закрыли UART, это не сработает.