//(UNTERPROGRAMM INIT ANFANG)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #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; // Timer0 Initalisiert (letzten 3 Bits geben das Vorteiler verhältniss an) T0CON = 0b00010111; // Timer init INTCON2bits.TMR0IP = 1; // high priority T0CONbits.TMR0ON=0; INTCONbits.TMR0IE=1; INTCONbits.TMR0IF = 0; //setzt interuptflag von Timer0 zurück auf 0 RCONbits.IPEN = 1; //enable priority levels INTCONbits.GIEH = 1; //enable interrupts } //(UNTERPROGRAMM INIT ENDE)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //(UNTERPROGRAMM UART ANFANG)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #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 = 0b11110001; RCSTA = 0b11101111; /*BAUD */ SPBRG = (unsigned int) ((((10000000.0/19200.0)/4.0))-1.0); /*____________MAX8032 RECIVE____________*/ // __ (RE invertiert) RS485_SENDEN_RE = 1; RS485_SENDEN_DE = 0; } //(UNTERPROGRAMM UART ENDE)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #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[9]; /*____________Hauptprogramm_____________*/ void main (void) { pic_init (); init_uart (); x=PORTD; //PORTD mit der Variable x gleichsetzen for (;;) { LATDbits.LATD6=~1; //Kontroll LED (Quarz schwingt) if(LATBbits.LATB5==0) //Entscheidung 5V= senden (0V= nicht senden) { send_buf1 = 0b10100110; /*_________MAX3082 TRANSMITTING__________*/ RS485_SENDEN_RE = 0; RS485_SENDEN_DE = 1; /*___________Warte auf MAX3082___________*/ for(i=0;i < 1000; i++); /*___________Senden___________*/ for(i=0; i< 6; i++) { Nop();Nop();Nop(); while (!PIR1bits.TXIF); TXREG = send_buf1; } /*___________Senden ende___________*/ Nop();Nop();Nop(); while (!PIR1bits.TXIF); for(i=0; i< 2000; i++) { RS485_SENDEN_RE = 1; RS485_SENDEN_DE = 0; } /*______________RS-485 SEND______________*/ /* send_buf[0]=0x02; //START ROUTINE (STX) send_buf[1]=0x22; //Adresse des Master send_buf[2]=0x23; //Adresse des Slave send_buf[3]=0b00101011; //Bits Senden send_buf[4]=0b11010110; //Bits Senden send_buf[5]=0b00011101; //Bits Senden send_buf[6]=0b00000001; //Checksumme High-Byte send_buf[7]=0b00011110; //Checksumme Low-Byte send_buf[8]=0x0d; //END ROUTINE (ETX) */ /*_____________MAX RECIEVING_____________*/ RS485_SENDEN_RE = 1; RS485_SENDEN_DE = 0; } else { T0CONbits.TMR0ON=1; while(1) { //es passiert nichts } } } } //---------------------------------------------------------------------------- // High priority interrupt vector #pragma code InterruptVectorHigh=0x08 #pragma interrupt isr_high_priority void InterruptVectorHigh (void) { _asm goto isr_high_priority //jump to interrupt routine _endasm } //---------------------------------------------------------------------------- // High priority interrupt routine #pragma code void isr_high_priority(void) { if (INTCONbits.TMR0IF=1) { //check for TMR0 overflow INTCONbits.TMR0IF = 0; //clear interrupt flag LATDbits.LATD6=~LATDbits.LATD6; x = x<<1; } }