我正在开发一个使用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;
}