PIC18F8722串行通信采用4D系统uLCD-70-DT

时间:2017-05-06 14:45:45

标签: microchip usart

我正在开发一个使用4D Systems gen4 uLCD-70dt和PIC18F8722来控制机器的项目。这两个设备使用一对MAX232串行驱动器链接。

我之前曾使用PIC18F4520对这种设置进行了包围,并且在串行通信方面没有任何问题。现在,当PIC向显示器发送轮询请求时,显示器响应,但PIC不接收数据。 代码ID非常简单(用于测试),我使用示波器在PIC引脚上检查数据流(RX abd TX),信号看起来很好。 (电压和波特率检查)

我确实使用了为我在网上找到的18F4520而制作的GenieSerial.h,并将其改编为18f8722。 (这里可能出错)

我猜测我的配置位或EUSART设置位有错误,但我找不到它。

任何帮助都是apreciated

主要代码:

   /*
   * File:   trial1.c
   * Author: Steve
   *
   * Created on May 2, 2017, 3:06 PM
   */

// PIC18F8722 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1H
#pragma config OSC = HS         // Oscillator Selection bits (External RC       oscillator, CLKO function on RA6)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Two-Speed Start-up disabled)

// CONFIG2L
#pragma config PWRT = OFF       // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = SBORDIS  // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
#pragma config BORV = 3         // Brown-out Voltage bits (Minimum setting)

// CONFIG2H
#pragma config WDT = OFF        // Watchdog Timer (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)

// CONFIG3L
#pragma config MODE = MC        // Processor Data Memory Mode Select bits (Microcontroller mode)
#pragma config ADDRBW = ADDR20BIT// Address Bus Width Select bits (20-bit Address Bus)
#pragma config DATABW = DATA16BIT// Data Bus Width Select bit (16-bit External Bus mode)
#pragma config WAIT = OFF       // External Bus Data Wait Enable bit (Wait selections are unavailable for table reads and table writes)

 // CONFIG3H
#pragma config CCP2MX = PORTC   // CCP2 MUX bit (ECCP2 input/output is multiplexed with RC1)
#pragma config ECCPMX = PORTE   // ECCP MUX bit (ECCP1/3 (P1B/P1C/P3B/P3C) are multiplexed onto RE6, RE5, RE4 and RE3 respectively)
#pragma config LPT1OSC = OFF    // Low-Power Timer1 Oscillator Enable bit (Timer1 configured for higher power operation)
#pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled; RG5 input pin disabled)

// CONFIG4L
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = ON         // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled)
#pragma config BBSIZ = BB2K     // Boot Block Size Select bits (1K word (2 Kbytes) Boot Block size)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))

// CONFIG5L
#pragma config CP0 = OFF        // Code Protection bit Block 0 (Block 0 (000800, 001000 or 002000-003FFFh) not code-protected)
#pragma config CP1 = OFF        // Code Protection bit Block 1 (Block 1 (004000-007FFFh) not code-protected)
#pragma config CP2 = OFF        // Code Protection bit Block 2 (Block 2 (008000-00BFFFh) not code-protected)
#pragma config CP3 = OFF        // Code Protection bit Block 3 (Block 3 (00C000-00FFFFh) not code-protected)
#pragma config CP4 = OFF        // Code Protection bit Block 4 (Block 4 (010000-013FFFh) not code-protected)
#pragma config CP5 = OFF        // Code Protection bit Block 5 (Block 5 (014000-017FFFh) not code-protected)
#pragma config CP6 = OFF        // Code Protection bit Block 6 (Block 6 (01BFFF-018000h) not code-protected)
#pragma config CP7 = OFF        // Code Protection bit Block 7 (Block 7 (01C000-01FFFFh) not code-protected)

// CONFIG5H
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot Block (000000-0007FFh) not code-protected)
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code-protected)

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

// CONFIG6H
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot Block (000000-007FFF, 000FFF or 001FFFh) not write-protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)

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

// CONFIG7H
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot Block (000000-007FFF, 000FFF or 001FFFh) 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.

#include <xc.h>
#include "GenieSerial.h"
#define _XTAL_FREQ 20000000


// MAIN PROGRAM LOOP

void main()
{
    unsigned char incoming=37;

    usart();

    while(1)
    {


        incoming = genieread(0x04,0x00);        //read slider 0
        __delay_ms(104);
        geniewrite_coolgauge(0x00, incoming);    //send data back to display here
         __delay_ms(104);

    }
}`

和GenieSerial.h:

#define READ                    0x00
#define WRITE                   0x01


//objects

#define DIPSWITCH               0x00
#define KNOB                    0x01
#define ROCKERSW                0x02
#define ROTARYSW                0x03
#define SLIDER                  0x04
#define TRACKBAR                0x05
#define BUTTON                  0x06
#define ANGULAR_METER           0x07
#define COOL_GAUGE              0x08
#define CUSTOM_DIGITS           0x09
#define FORM                    0x0A
#define GAUGE                   0x0B
#define IMAGE                   0X0C
#define KEYBOARD                0X0D
#define LED                     0X0E
#define LED_DIGITS              0X0F
#define METER                   0X10
#define STRINGS                 0X11
#define THERMOMETER             0X12
#define USER_LED                0X13
#define VIDEO                   0X14
#define STATIC_TEXT             0X15
#define SOUND                   0X16
#define TIMER                   0X17
#define CONTRAST                0x04
#define PLAY                    0X00
#define STOP                    0x04
#define ON                      0X01
#define OFF                     0x00
#define VIDEOPLAY               0X01
#define VIDEOSTOP               0X00

void usart(void)
{
    INTCONbits.GIE=1;   //enable global interrupts
    INTCONbits.PEIE=1;  //enable peripheral interrupts
    TRISCbits.TRISC7=1; //Make UART RX pin input
    TRISCbits.TRISC6=0; //Make UART TX pin output
    SPBRGH  = 0x00    ;     //9600bps 20MHz Osc
    SPBRG   = 31;

    RCSTA1bits.CREN=1;   //1 = Enables receiver
    RCSTA1bits.SPEN=1;   //1 = Serial port enabled (configures RX/DT and TX/CK pins as serial port pins)
    BAUDCON1bits.BRG16=0;//0 = 8-bit Baud Rate Generator ? SPBRGH and SPBRG
    BAUDCON1bits.ABDEN=0;

    TXSTA1bits.SYNC=0;  //0 = Asynchronous mode
    TXSTA1bits.BRGH=0;  //0 = low speed
    TXSTA1bits.SENDB = 0;
    BAUDCON1bits.WUE =0;
    PIE1bits.TXIE = 1;
    PIE1bits.RC1IE =1;

}

    ///////////////////////////////////////////

unsigned char receive(void)
{
    unsigned char data;
    if(RCSTAbits.FERR==1 && RCSTAbits.OERR==1 )
    {
        while(PIR1bits.RCIF == 1)
        {
          RCSTAbits.CREN =0;    //Overrun error (can be cleared by clearing bit CREN)
          data = RCREG;
          RCSTAbits.CREN =1;
        }
    }
    else
    {
       while(PIR1bits.RCIF == 1)
        {
            RCSTAbits.CREN =0;    //Overrun error (can be cleared by clearing bit CREN)
            data = RCREG;
            RCSTAbits.CREN =1;
        }
    }
    return data;
}

void send(void)
{
    TXSTAbits.TXEN=0;
        while(TXSTAbits.TRMT == 0)
        {
                TXSTAbits.TXEN=1;    // enable transmission
                while(TXSTAbits.TRMT == 0 ) // wait here till transmit complete
                {
                }
        }
    TXSTAbits.TXEN=0;
}

   ///////////////////////////////////////////////

void sendbyte(unsigned char data)
{
    TXREG = data;
    TXSTAbits.TXEN=0;
        while(TXSTAbits.TRMT == 0)
        {
                TXSTAbits.TXEN=1;    // enable transmission
                while(TXSTAbits.TRMT == 0 ) // wait here till transmit complete
                {
                }
        }
    TXSTAbits.TXEN=0;
}



void sendarray(unsigned char value, unsigned char value2, unsigned char value3,unsigned char value4,unsigned int value5)
{
       TXREG = value;
       send();
       TXREG = value2;
       send();
       TXREG = value3;
       send();
       TXREG = value4;
       send();
       TXREG = value5;
       send();
       TXREG = (value ^ value2 ^ value3 ^ value4 ^ value5);
       send();
}

void geniewrite_coolgauge(unsigned char index, unsigned char value)                 // write cool gauge object with a value of 0-255
{
       TXREG = WRITE;       send();
       TXREG = COOL_GAUGE;  send();
       TXREG = index;       send();
       TXREG = 0x00;        send();
       TXREG = value;       send();
       TXREG = (WRITE ^ COOL_GAUGE ^ index ^ 0x00 ^ value); send();
}
void geniewrite_gauge(unsigned char index, unsigned char value)
{
       TXREG = WRITE;       send();
       TXREG = GAUGE;       send();
       TXREG = index;       send();
       TXREG = 0x00;        send();
       TXREG = value;       send();
       TXREG = (WRITE ^ GAUGE ^ index ^ 0x00 ^ value);      send();
}
void geniewrite_slider(unsigned char index, unsigned char value)
{
       TXREG = WRITE;       send();
       TXREG = SLIDER;      send();
       TXREG = index;       send();
       TXREG = 0x00;        send();
       TXREG = value;       send();
       TXREG = (WRITE ^ SLIDER ^ index ^ 0x00 ^ value);     send();
}
void geniewrite_meter(unsigned char index, unsigned char value)
{
       TXREG = WRITE;       send();
       TXREG = METER;       send();
       TXREG = index;       send();
       TXREG = 0x00;        send();
       TXREG = value;       send();
       TXREG = (WRITE ^ METER ^ index ^ 0x00 ^ value);      send();
}
void geniewrite_winbutton(unsigned char index, unsigned char value)
{
       TXREG = WRITE;       send();
       TXREG = BUTTON;      send();
       TXREG = index;       send();
       TXREG = 0x00;        send();
       TXREG = value;       send();
       TXREG = (WRITE ^ BUTTON ^ index ^ 0x00 ^ value);     send();
}

void geniewrite_dipswitch(unsigned char index, unsigned char value)
{
       TXREG = WRITE;       send();
       TXREG = DIPSWITCH;   send();
       TXREG = index;       send();
       TXREG = 0x00;        send();
       TXREG = value;       send();
       TXREG = (WRITE ^ DIPSWITCH ^ index ^ 0x00 ^ value);     send();
}
void geniewrite_knob(unsigned char index, unsigned char value)
{
           TXREG = WRITE;       send();
           TXREG = KNOB;        send();
           TXREG = index;       send();
           TXREG = 0x00;        send();
           TXREG = value;       send();
           TXREG = (WRITE ^ KNOB ^ index ^ 0x00 ^ value);       send();
}
void geniewrite_rockerswitch(unsigned char index, unsigned char value)
{
           TXREG = WRITE;       send();
           TXREG =ROCKERSW;     send();
           TXREG = index;       send();
           TXREG = 0x00;        send();
           TXREG = value;       send();
           TXREG = (WRITE ^ ROCKERSW ^ index ^ 0x00 ^ value);   send();
}
void geniewrite_rotaryswitch(unsigned char index, unsigned char value)
 {
           TXREG = WRITE;       send();
           TXREG = ROTARYSW;    send();
           TXREG = index;       send();
           TXREG = 0x00;        send();
           TXREG = value;       send();
           TXREG = (WRITE ^ ROTARYSW ^ index ^ 0x00 ^ value);       send();
}
void geniewrite_trackbar(unsigned char index, unsigned char value)
{
           TXREG = WRITE;       send();
           TXREG = TRACKBAR;        send();
           TXREG = index;       send();
           TXREG = 0x00;        send();
           TXREG = value;       send();
           TXREG = (WRITE ^ TRACKBAR ^ index ^ 0x00 ^ value);       send();
}
void geniewrite_keyboard(unsigned char index, unsigned char value)
{
           TXREG = WRITE;       send();
           TXREG = KEYBOARD;    send();
           TXREG = index;       send();
           TXREG = 0x00;        send();
           TXREG = value;       send();
           TXREG = (WRITE ^ KEYBOARD ^ index ^ 0x00 ^ value);       send();
}
void geniewrite_angularmeter(unsigned char index, unsigned char value)
{
           TXREG = WRITE;           send();
           TXREG = ANGULAR_METER;   send();
           TXREG = index;           send();
           TXREG = 0x00;            send();
           TXREG = value;           send();
           TXREG = (WRITE ^ ANGULAR_METER ^ index ^ 0x00 ^ value);       send();
}
void geniewrite_thermometer(unsigned char index, unsigned char value)
{
           TXREG = WRITE;       send();
           TXREG = THERMOMETER; send();
           TXREG = index;       send();
           TXREG = 0x00;        send();
           TXREG = value;       send();
           TXREG = (WRITE ^ THERMOMETER ^ index ^ 0x00 ^ value);       send();
}
void geniewrite_LED(unsigned char index, unsigned char value)
{
           TXREG = WRITE;       send();
           TXREG = LED;         send();
           TXREG = index;       send();
           TXREG = 0x00;        send();
           TXREG = value;       send();
           TXREG = (WRITE ^ LED ^ index ^ 0x00 ^ value);       send();
}
void geniewrite_userLED(unsigned char index, unsigned char value)
{
           TXREG = WRITE;       send();
           TXREG = USER_LED;    send();
           TXREG = index;       send();
           TXREG = 0x00;        send();
           TXREG = value;       send();
           TXREG = (WRITE ^ USER_LED ^ index ^ 0x00 ^ value);       send();
}
void geniewrite_LEDdigits(unsigned char index, unsigned char value)
{
           TXREG = WRITE;       send();
           TXREG = LED_DIGITS;  send();
           TXREG = index;       send();
           TXREG = 0x00;        send();
           TXREG = value;       send();
           TXREG = (WRITE ^ LED_DIGITS ^ index ^ 0x00 ^ value);       send();
}
void geniewrite_customdigits(unsigned char index, unsigned char value)
{
           TXREG = WRITE;       send();
           TXREG = CUSTOM_DIGITS;        send();
           TXREG = index;       send();
           TXREG = 0x00;        send();
           TXREG = value;       send();
           TXREG = (WRITE ^CUSTOM_DIGITS ^ index ^ 0x00 ^ value);       send();
}
void geniewrite_string(unsigned char index, unsigned char value)
{
           TXREG = WRITE;       send();
           TXREG = STRINGS;     send();
           TXREG = index;       send();
           TXREG = 0x00;        send();
           TXREG = value;       send();
           TXREG = (WRITE ^ STRINGS ^ index ^ 0x00 ^ value);       send();
}
void geniewrite_form(unsigned char index)
{
           TXREG = WRITE;       send();
           TXREG = FORM;        send();
           TXREG = index;       send();
           TXREG = 0x00;        send();
           TXREG = 0x00;        send();
           TXREG = (WRITE ^ FORM ^ index ^ 0x00 ^ 0x00);       send();
}
void geniewrite_videoGIF(unsigned char index, unsigned char value)
{
           TXREG = WRITE;       send();
           TXREG = VIDEO;       send();
           TXREG = index;       send();
           TXREG = 0x00;        send();
           TXREG = value;       send();
           TXREG = (WRITE ^ VIDEO ^ index ^ 0x00 ^ value);       send();
}
void geniewrite_timer(unsigned char index, unsigned char value)
{
           TXREG = WRITE;       send();
           TXREG = TIMER;       send();
           TXREG = index;       send();
           TXREG = 0x00;        send();
           TXREG = value;       send();
           TXREG = (WRITE ^TIMER  ^ index ^ 0x00 ^ value);       send();
}
void geniewrite_sound(unsigned char index, unsigned char value)
{
           TXREG = WRITE;       send();
           TXREG = SOUND;       send();
           TXREG = index;       send();
           TXREG = 0x00;        send();
           TXREG = value;       send();
           TXREG = (WRITE ^ TIMER  ^ index ^ 0x00 ^ value);       send();
}
void geniewrite(unsigned char value, unsigned char value2)
{
           TXREG = WRITE;       send();
           TXREG = value;       send();
           TXREG = value2;      send();
           TXREG = (WRITE ^ CONTRAST ^ value);       send();
}

unsigned char genieread(unsigned char object, unsigned char index)
{
    unsigned char data, data1, data2, data3, data4, data5;    
    TXREG = READ;               send();
    TXREG = object;             send();
    TXREG = index;              send();
    TXREG = (READ ^ object ^ index); send();

    data = receive();
    data1 = receive();
    data2 = receive();
    data3 = receive();
    data4 = receive();
    data5 = receive();
    return data4;
}

0 个答案:

没有答案