我正在使用4D系統gen4 uLCD-70dt和PIC18F8722來控制機器。這兩個器件使用一對MAX232串行驅動器進行鏈接。帶4D系統的PIC18F8722串行通信uLCD-70-DT
我以前使用PIC18F4520對此設置進行了麪包布,並且沒有串行通信問題。現在,當PIC向顯示器發送輪詢請求時,顯示器響應,但是PIC沒有收到數據。 代碼ID非常簡單(用於測試),我使用示波器在PIC引腳上檢查了數據流,均爲RX abd TX,信號看起來很好。 (電壓和波特率檢查)
我確實使用了GenieSerial.h,該GenieSerial.h是爲我在網上找到的18F4520而修改的,並且適用於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;
}
如果將pic的串行端口連接到rs232到usb適配器會發生什麼情況?終端客戶端是否顯示預期的數據?當你發送圖片數據時,它會收到嗎? – imqqmi