//init _uart: //______________________________________________________ #include #include "pic_init.h" /*_______________define_________________*/ #define RS485_SENDEN_RE LATDbits.LATD0 #define RS485_SENDEN_DE LATDbits.LATD1 void init_uart (void) { /*________BAUDRATE programmieren________*/ BAUDCON = 0b11000000; TXSTA = 0b11101001; RCSTA = 0b11100111; /*BAUD */ SPBRG = (unsigned int) ((((10000000.0/19200.0)/4.0))-1.0); /*____________MAX8032 RECIVE____________*/ // __ (RE invertiert) RS485_SENDEN_RE = 0; RS485_SENDEN_DE = 0; } //pic_init: //________________________________________________________ #include #include "pic_init.h" void pic_init (void) { // festlegen der Ports A-E ob Ein oder Ausgang TRISA = 0x00; TRISB = 0x01; TRISC = 0xc0; TRISD = 0x00; TRISE = 0x00; // RS-485 senden // Anfangsstatus der Ports C und D (~0x00 heißt, dass alle Ports am Pic high sind.) LATC = ~0x00; LATD = ~0x00; T0CON = 0b00000101; // 0------- Timer0 On/Off Control bit // -0------ Timer0 is configured as a 16-bit timer/counter // --0----- Internal instruction cycle clock (CLKO) // ---0---- Increment on low-to-high transition on T0CKI pin // ----0--- TImer0 prescaler is NOT assigned. Timer0 clock input bypasses prescaler. // -----111 1:256 Prescale value // Timer0 Initalisiert (letzten 3 Bits geben das Vorteiler verhältniss an) T1CON = 0b11111000; // 1------- Timer1 is configured as a 16-bit timer/counter // -1------ Timer1 clock from Timer1 oscillator // --11---- Prescale value (1:8) // ----1--- Timer1 Oscillator Enable bit // -----0-- Timer1 External Clock Input Synchronization Select bit // ------0- Internal clock (FOSC/4) // -------0 Stops Timer1 (1 Starts Timer1) // Timer0 Initalisiert (letzten 3 Bits geben das Vorteiler verhältniss an) // Timer init INTCON2bits.TMR0IP = 1; // high priority INTCONbits.TMR0IE = 1; //Timer0 interrupt enable INTCONbits.TMR0IF = 0; //setzt interuptflag von Timer0 zurück auf 0 PIE1bits.TMR1IE = 1; //Timer1 interrupt enable PIR1bits.TMR1IF = 0; //setzt interuptflag von Timer1 zurück auf 0 RCONbits.IPEN = 1; //enable priority levels INTCONbits.GIEH = 1; //enable interrupts } //Main Slave: //_______________________________________________________________ #include #include "pic_init.h" /*_____________Bootloader______________*/ #pragma config OSC = HSPLL #pragma config FCMEN = OFF #pragma config IESO = OFF #pragma config PWRT = ON #pragma config WDT = OFF, WDTPS = 128 #pragma config CCP2MX = PORTC, PBADEN = OFF, LPT1OSC =OFF, MCLRE = OFF #pragma config STVREN = ON, LVP = OFF, XINST = OFF, DEBUG = OFF #pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF #pragma config CPB = OFF, CPD = OFF #pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF #pragma config WRTC = ON, WRTB = OFF, WRTD = OFF #pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF #pragma config EBTRB = OFF /*___________Bootloader ende____________*/ /*_______________define_________________*/ #define RS485_SENDEN_RE LATDbits.LATD0 #define RS485_SENDEN_DE LATDbits.LATD1 /*______________Prototypen______________*/ void isr_high_priority(void); void init_uart(void); /*_______Initalisierung Variablen_______*/ int i; int x; int buf_a; /*____________Hauptprogramm_____________*/ void main (void) { pic_init (); init_uart (); RS485_SENDEN_RE = 0; RS485_SENDEN_DE = 0; for (;;) // In dieser Schleife hält sich das Programm { buf_a = RCREG; // Wert aus RCREG in buf_a schreiben while (PIR1bits.RCIF==0); // Warten bis RCREG leer if(buf_a = 'k') { LATDbits.LATD6=~0; //LATD6 LED grün (an) } else { LATDbits.LATD6=~1; //LATD6 LED grün (aus) } INTCONbits.TMR0IF = 0; //setzt interuptflag von Timer0 zurück auf 0 TMR0H = 0x00; //setzt Timer0 auf 0 TMR0L = 0x00; //setzt Timer0 auf 0 T0CONbits.TMR0ON=1; //startet Timer0 while(INTCONbits.TMR0IF==0);//Wartet auf IF von Timer0 T0CONbits.TMR0ON=0; //stoppt Timer0 } } //MASTER (Initalisierung ist gleich!!!) //Main Master: //______________________________________________________________________ #include #include "pic_init.h" /*_____________Bootloader______________*/ #pragma config OSC = HSPLL #pragma config FCMEN = OFF #pragma config IESO = OFF #pragma config PWRT = ON #pragma config WDT = OFF, WDTPS = 128 #pragma config CCP2MX = PORTC, PBADEN = OFF, LPT1OSC =OFF, MCLRE = OFF #pragma config STVREN = ON, LVP = OFF, XINST = OFF, DEBUG = OFF #pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF #pragma config CPB = OFF, CPD = OFF #pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF #pragma config WRTC = ON, WRTB = OFF, WRTD = OFF #pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF #pragma config EBTRB = OFF /*___________Bootloader ende____________*/ /*_______________define_________________*/ #define RS485_SENDEN_RE LATDbits.LATD0 #define RS485_SENDEN_DE LATDbits.LATD1 volatile int send_buf1; /*______________Prototypen______________*/ void isr_high_priority(void); void init_uart(void); /*_______Initalisierung Variablen_______*/ int i; int x; unsigned int send_buf[2]; /*____________Hauptprogramm_____________*/ void main (void) { pic_init (); init_uart (); LATDbits.LATD6=~0; //PORTD mit der Variable x gleichsetzen RS485_SENDEN_RE = 1; RS485_SENDEN_DE = 1; for (;;) { /*______________RS-485 SEND______________*/ // send_buf[0]=0x02; //START ROUTINE (STX) // send_buf[1]=0b00011000; //Bits Senden // send_buf[2]=0b00100100; //Bits Senden // send_buf[3]=0b00011000; //Bits Senden // send_buf[4]=0b00000000; //Checksumme High-Byte // send_buf[5]=0b00001000; //Checksumme Low-Byte // send_buf[6]=0x0d; //END ROUTINE (ETX) /*_________MAX3082 TRANSMITTING__________*/ //RS485_SENDEN_RE = 0; //RS485_SENDEN_DE = 1; /*___________Warte auf MAX3082___________*/ //for(i=0;i < 1000; i++); /*___________Senden___________*/ i=0; for(i=0;i<=0;i++) { PIR1bits.TXIF=0; TXREG = 'k'; // xxxxxxxx- Send Bits // --------x parity bit //TXREG = send_buf[i]; while (PIR1bits.TXIF==0); } INTCONbits.TMR0IF = 0; //setzt interuptflag von Timer0 zurück auf 0 TMR0H = 0x00; //setzt Timer0 auf 0 TMR0L = 0x00; //setzt Timer0 auf 0 T0CONbits.TMR0ON=1; while(INTCONbits.TMR0IF==0); T0CONbits.TMR0ON=0; /*___________Senden ende___________*/ /*_____________MAX RECIEVING_____________*/ /* Nop();Nop();Nop(); while (!PIR1bits.TXIF); for(i=0; i< 2000; i++) { RS485_SENDEN_RE = 1; RS485_SENDEN_DE = 0; } */ } }