Master •void I2CINIT() { //SSPSTAT SMP = 0; //Slew Rate Control CKE = 0; //SMBus Select D_A = 0; //Data{Adress bit SSPSTATbits.P = 0; //Stop SSPSTATbits.S = 0; //Start R_W = 0; //Slave mode 1 = Read/ 0 = Write, Master mode Transmit 1 = in/ 0= not in Progress UA = 0; //Update Adress 10-bit Slave mode BF = 0; //Buffer Full //SSPCON1 WCOL = 0; //Write collision detect SSPOV = 0; //Receive overflow indicator SSPEN = 1; //Synchronus serial port enable CKP = 0; //SCK release control SSPM3 = 1; //Synchronous serial port mode SSPM2 = 0; //Synchronous serial port mode SSPM1 = 0; //Synchronous serial port mode SSPM0 = 0; //Synchronous serial port mode //SSPCON2 GCEN = 0; //General call enable (Slave mode only) ACKSTAT = 0; //Acknowledge Status ACKDT = 0; //Acknowledge Data bit ACKEN = 0; //Acknowledge Data bit (Master Recieve mode only) RCEN = 0; //Receive enable bit (Master mode only) PEN = 0; //Stop Condition for SDA and SCL RSEN = 0; //Repeated Start Condition for SDA and SCL SEN = 0; //Start Condition for SDA and SCL //SSPADD SSPADD = 0x19; //100kHz } Init(void) { //OSCCON IDLEN = 0; //Idle enable bit IRCF2 = 1; //Internal Oscillator Frequency IRCF1 = 1; //8 MHz IRCF0 = 1; // OSTS = 0; // IOFS = 0; // SCS1 = 1; //System Clock Select bits SCS0 = 0; // I2CINIT(); //ADCON1 VCFG1 = 0; //Voltage Reference VREFL VCFG0 = 0; //Voltage Reference VREFH PCFG3 = 1; //AD Port PCFG2 = 1; //Configuration PCFG1 = 1; //Bits PCFG0 = 1; //alle digital /*INTERUPT*********************************************************************/ //INTCON GIE = 1; //Global Interrupts PEIE = 1; //Peripheral Interrupts TMR0IE = 0; //Timer0 Interrupt Enable INT0IE = 1; //External Interrupt on RB0/INT0 Enable RBIE = 0; //RBPort Interrupt Enable TMR0IF = 0; //Timer0 Interrupt FLAG INT0IF = 0; //External Interrupt FLAG RB0/INT0 RBIF = 0; //RBPort Interrupt FLAG //INTCON2 RBPU = 1; INTEDG0 = 0; //ext Interrupt0 Edge Select INTEDG1 = 0; //ext Interrupt1 Edge Select INTEDG2 = 0; //ext Interrupt2 Edge Select TMR0IP = 1; //Timer0 Overflow Interrupt Priority RBIP = 0; //PB Port Change Interrupt Priority //INTCON3 INT2IP = 0; //ext Interrupt 2 Priority INT1IP = 0; //ext Interrupt 1 Priority INT2IE = 0; //ext Interrupt 2 enable bit INT1IE = 0; //ext Interrupt 1 enable bit INT2IF = 0; //ext Interrupt 2 flag INT1IF = 0; //ext Interrupt 1 flag //RCON IPEN = 1; //Interrupt Priority Enable bit //PIRx, PIEx, IPRx ADIF = 0; //AD Converter Interrupt Flag ADIE = 0; //AD Converter Interrupt Enable ADIP = 0; //AD Converter Interrupt Priority RCIF = 0; //USART Receive Interrupt Flag RCIE = 0; //USART Receive Interrupt Enable RCIP = 0; //USART Receive Interrupt Priority TXIF = 0; //USART Transmit Interrupt Flag TXIE = 0; //USART Transmit Interrupt Enable TXIP = 0; //USART Transmit Interrupt Priority SSPIF = 0; //MSSP Interrupt Flag SSPIE = 0; //TEST //MSSP Interrupt Enable SSPIP = 0; //MSSP Interrupt Priority CCP1IF = 0; //CCP1 Interrupt Flag CCP1IE = 0; //CCP1 Interrupt Enable CCP1IP = 0; //CCP1 Interrupt Priority TMR2IF = 0; //TMR2 to PR2 Match Interrupt Flag TMR2IE = 0; //TMR2 to PR2 Match Interrupt Enable TMR2IP = 0; //TMR2 to PR2 Match Interrupt Priority TMR1IF = 0; //TMR1 Overflow Interrupt Flag TMR1IE = 0; //TMR1 Overflow Interrupt Enable TMR1IP = 0; //TMR1 Overflow Interrupt Priority OSCFIF = 0; //Osc Fail Interrupt Flag OSCFIE = 0; //Osc Fail Interrupt Enable OSCFIP = 0; //Osc Fail Interrupt Priority CMIF = 0; //Comparator Interrupt Flag CMIE = 0; //Comparator Interrupt Enable CMIP = 0; //Comparator Interrupt Priority EEIF = 0; //EEPROM Flash Write Interrupt Flag EEIE = 0; //EEPROM Flash Write Interrupt Enable EEIP = 0; //EEPROM Flash Write Interrupt Priority BCLIF = 0; //Bus Collision Interrupt Flag BCLIE = 0; //Bus Collision Interrupt Enable BCLIP = 0; //Bus Collision Interrupt Priority LVDIF = 0; //Low Voltage Interrupt Flag LVDIE = 0; //Low Voltage Interrupt Enable LVDIP = 0; //Low Voltage Interrupt Priority TMR3IF = 0; //TMR3 Overflow Interrupt Flag TMR3IE = 0; //TMR3 Overflow Interrupt Enable TMR3IP = 0; //TMR3 Overflow Interrupt Priority CCP2IF = 0; //CCPx Interrupt Flag CCP2IE = 0; //CCPx Interrupt Enable CCP2IP = 0; //CCPx Interrupt Priority //T0CON Timer0 TMR0ON = 0; //Timer STOP T08BIT = 1; //8 BIT MODE T0CS = 0; //Prescaler clock from FCPU T0SE = 0; //Source Edge Select bit PSA = 0; //Timer Clock Source from Prescaler T0PS0 = 1; //--Prescaler T0PS1 = 1; //--divide by T0PS2 = 1; //--256 => ~1s is 32 cycles TMR0ON = 1; //Timer START //Inputs und Outputs TRISA0 = 0; //TH In TRISA1 = 0; //Relais 1 TRISA2 = 0; //Keys MUX4 TRISA3 = 0; //Keys MUX3 TRISA4 = 0; //Relais 3 TRISA5 = 0; //LED5 TRISA6 = 0; //LED1 TRISA7 = 0; //Relais 2 TRISB0 = 1; //Zero crossing detection TRISB1 = 1; //ComKeys 1 - Input TRISB2 = 1; //ComKeys 2 - Input TRISB3 = 0; //LED4 TRISB4 = 0; //Keys MUX1 TRISB5 = 1; //Signal Sensor - Input TRISB6 = 0; //LED3 TRISB7 = 0; //LED2 TRISC0 = 0; //Keys MUX2 TRISC1 = 0; //Relais 5 TRISC2 = 0; //Relais 4 TRISC3 = 1; //SCL TRISC4 = 1; //SDA TRISC5 = 1; //JP1 - Input TRISC6 = 0; //LED6, TXD TRISC7 = 0; //RXD fRELAIS(10,0); //Alle Relaises AUS fKEYSMUX(10,1); //ALLE Taster AUS fLED(10,0); //ALLE LEDs AUS if (dSENSOR == 1) { vSENSOR = 0; } else { vSENSOR = 1; } vNORMALBETRIEB = 1; } void fI2CSEND2SLAVE(char vADRESSE, char vMODUL , char vZIFFER1 ,char vZIFFER2,char vZIFFER3,char vZIFFER4) { while (( SSPCON2 & 0x1F ) || (SSPSTATbits.RW) ); SEN = 1; //Initialisiere Start bedingung SDA -und SCLLine while (!SSPIF); SSPIF = 0; //Rücksetzen des SSP Interrupt Flag SSPBUF = vADRESSE; //Adresse wird in BUFFER geschrieben while (!SSPIF || SSPSTATbits.RW ); SSPIF = 0; //Rücksetzen des SSP Interrupt Flag SSPBUF = vMODUL; //Modul wird in BUFFER geschrieben while (!SSPIF || SSPSTATbits.RW ); SSPIF = 0; //Rücksetzen des SSP Interrupt Flag SSPBUF = vZIFFER1; //Ziffer/Buchstabe wird in BUFFER geschrieben while (!SSPIF || SSPSTATbits.RW ); SSPIF = 0; //Rücksetzen des SSP Interrupt Flag SSPBUF = vZIFFER2; //Ziffer/Buchstabe wird in BUFFER geschrieben while (!SSPIF || SSPSTATbits.RW ); SSPIF = 0; //Rücksetzen des SSP Interrupt Flag SSPBUF = vZIFFER3; //Ziffer/Buchstabe wird in BUFFER geschrieben while (!SSPIF || SSPSTATbits.RW ); SSPIF = 0; //Rücksetzen des SSP Interrupt Flag SSPBUF = vZIFFER4; //Ziffer/Buchstabe wird in BUFFER geschrieben while (!SSPIF || SSPSTATbits.RW ); SSPIF = 0; //Rücksetzen des SSP Interrupt Flag PEN = 1; //Initialisiere Stopbedingung auf SDA- und SCLLine while ( !SSPIF ); SSPIF = 0; //Rücksetzen des SSP Interrupt Flag } void fI2CRECIVEFROMSLAVES(char vADRESSE) { // if(WCOL) // { // PEN = 1; // SEN = 0; // SSPIF = 0; // BCLIF = 0; // WCOL = 0; // } while (( SSPCON2 & 0x1F ) || (SSPSTATbits.RW) ); SEN = 1; while(SEN); SSPBUF = vADRESSE; while(BF) if(vADRESSE == 0x91) { while (( SSPCON2 & 0x1F ) || (SSPSTATbits.RW) ); RCEN = 1; while (!BF); vRECDATEN1[0] = SSPBUF; while (( SSPCON2 & 0x1F ) || (SSPSTATbits.RW) ); ACKDT = 0; ACKEN = 1; while (ACKEN); ACKDT = 0; } while (( SSPCON2 & 0x1F ) || (SSPSTATbits.RW) ); RCEN = 1; while (!BF); vRECDATEN1[1] = SSPBUF; while (( SSPCON2 & 0x1F ) || (SSPSTATbits.RW) ); ACKDT = 1; ACKEN = 1; while (ACKEN); ACKDT = 0; PEN = 1; while (PEN); } void interrupt ISR(void) { if (INT0IF) //Nullpunktschleife /Start der Interrupt ISR { vNPTMR++; //Nullpunkttimer vTAKTTMR++; //Takttimer für Floatingbetrieb fals Taste 1/2 gedrückt alle 0,5 Sekunden +-5 oder +-1 Minute Inc/Dec if (vNBTMR == 0) { vNBTMR = 125; //Timer für Normalbetrieb 2 Stunden + 5 Minuten für Umwälzung } if (vNPTMR == 100) //Ist 1 sec vorbei { // vI2CTEBLOCK[0] = 0; //Zurücksetzen der "Antidisplayflimmerzeit" (ERRORCODE Temperatur) vI2CFLBLOCK[0] = 0; //Zurücksetzen der "Antidisplayflimmerzeit" (Floatingbetrieb) vTEMPERTMR++; //Timer für Temperaturerhaltung alle 5 Sekunden Messwertermittlung vNPTMR = 0; //dann vNPTMR nullsetzen vNPSEC++; vNBTMR--; vEKTMR--; vFLOATTMR--; // if(vFLOATTMR <= 10) // { // vFLOATTMR--; // } vINTENTMR--; if (vNPSEC == 60) //60 Sekunden sind vorbei -> 1 Minute (Minutentimer) { vNPSEC = 0; //Zurücksetzen des Minutentimers } if(vTEMPERTMR == 25) //-zurücksetzen des Temperaturtimers nach 25 Sekunden, Einleitung eines neuen Messvorgangs { vTEMPERTMR = 0; } } vKEYTIMER++; //Timer für Tasterentprellung vSENSORTIMER++; //Timer für Sensorentprellung vLEDDELAY++; //Timer für LEDs INT0IF = 0; //Beenden der Nullpunktschleife / Intterrupt ISR } } void main(void) { Init(); while (1) { dLED1 = WCOL; dLED2 = BCLIF; dLED3 = IDLEN; fI2CSEND2SLAVE(0x02,0x02,vS,vT+1,vB+1,vY+1); fI2CRECIVEFROMSLAVES(0x03); if(vRECDATEN1[1]==0x02 ) { dLED4 = 1; } else dLED4 = 0; } } SLAVE •Init(void) { //OSCCON IDLEN = 0; //Idle enable bit IRCF2 = 1; //Internal Oscillator Frequency IRCF1 = 1; //8 MHz IRCF0 = 1; // OSTS = 0; // IOFS = 0; // SCS1 = 1; //System Clock Select bits SCS0 = 0; // /*I2CINIT**********************************************************************/ //SSPSTAT SMP = 0; //Slew Rate Control CKE = 0; //SMBus Select D_A = 0; //Data{Adress bit SSPSTATbits.P = 0; //Stop SSPSTATbits.S = 0; //Start R_W = 0; //Slave mode 1 = Read/ 0 = Write, Master mode Transmit 1 = in/ 0= not in Progress UA = 0; //Update Adress 10-bit Slave mode BF = 0; //Buffer Full //SSPCON1 WCOL = 0; //Write collision detect SSPOV = 0; //Receive overflow indicator SSPEN = 1; //Synchronus serial port enable CKP = 1; //SCK release control SSPM3 = 0; //Synchronous serial port mode SSPM2 = 1; //Synchronous serial port mode SSPM1 = 1; //Synchronous serial port mode SSPM0 = 0; //Synchronous serial port mode //SSPCON2 GCEN = 0; //General call enable (Slave mode only) ACKSTAT = 0; //Acknowledge Status ACKDT = 0; //Acknowledge Data bit ACKEN = 0; //Acknowledge Data bit (Master Recieve mode only) RCEN = 0; //Receive enable bit (Master mode only) PEN = 0; //Stop Condition for SDA and SCL RSEN = 0; //Repeated Start Condition for SDA and SCL SEN = 0; //Start Condition for SDA and SCL //SSPADD SSPADD = 0x02; //ADDRESSE SLAVE /******************************************************************************/ //ADCON1 VCFG1 = 0; //Voltage Reference VREFL VCFG0 = 0; //Voltage Reference VREFH PCFG3 = 1; //AD Port PCFG2 = 1; //Configuration PCFG1 = 1; //Bits PCFG0 = 1; //alle digital /*INTERUPT*****************************************************************/ //INTCON GIE = 1; //Global Interrupts PEIE = 1; //Peripheral Interrupts TMR0IE = 1; //Timer0 Interrupt Enable INT0IE = 0; //External Interrupt on RB0/INT0 Enable RBIE = 0; //RBPort Interrupt Enable TMR0IF = 0; //Timer0 Interrupt FLAG INT0IF = 0; //External Interrupt FLAG RB0/INT0 RBIF = 0; //RBPort Interrupt FLAG //INTCON2 INTEDG0 = 1; //ext Interrupt0 Edge Select INTEDG1 = 0; //ext Interrupt1 Edge Select INTEDG2 = 0; //ext Interrupt2 Edge Select TMR0IP = 0; //Timer0 Overflow Interrupt Priority RBIP = 0; //PB Port Change Interrupt Priority //INTCON3 INT2IP = 0; //ext Interrupt 2 Priority INT1IP = 0; //ext Interrupt 1 Priority INT2IE = 0; //ext Interrupt 2 enable bit INT1IE = 0; //ext Interrupt 1 enable bit INT2IF = 0; //ext Interrupt 2 flag INT1IF = 0; //ext Interrupt 1 flag //RCON IPEN = 1; //Interrupt Priority Enable bit //PIRx, PIEx, IPRx ADIF = 0; //AD Converter Interrupt Flag ADIE = 0; //AD Converter Interrupt Enable ADIP = 0; //AD Converter Interrupt Priority RCIF = 0; //USART Receive Interrupt Flag RCIE = 0; //USART Receive Interrupt Enable RCIP = 0; //USART Receive Interrupt Priority TXIF = 0; //USART Transmit Interrupt Flag TXIE = 0; //USART Transmit Interrupt Enable TXIP = 0; //USART Transmit Interrupt Priority SSPIF = 0; //MSSP Interrupt Flag SSPIE = 0; //TEST //MSSP Interrupt Enable SSPIP = 0; //MSSP Interrupt Priority CCP1IF = 0; //CCP1 Interrupt Flag CCP1IE = 0; //CCP1 Interrupt Enable CCP1IP = 0; //CCP1 Interrupt Priority TMR2IF = 0; //TMR2 to PR2 Match Interrupt Flag TMR2IE = 0; //TMR2 to PR2 Match Interrupt Enable TMR2IP = 0; //TMR2 to PR2 Match Interrupt Priority TMR1IF = 0; //TMR1 Overflow Interrupt Flag TMR1IE = 0; //TMR1 Overflow Interrupt Enable TMR1IP = 0; //TMR1 Overflow Interrupt Priority OSCFIF = 0; //Osc Fail Interrupt Flag OSCFIE = 0; //Osc Fail Interrupt Enable OSCFIP = 0; //Osc Fail Interrupt Priority CMIF = 0; //Comparator Interrupt Flag CMIE = 0; //Comparator Interrupt Enable CMIP = 0; //Comparator Interrupt Priority EEIF = 0; //EEPROM Flash Write Interrupt Flag EEIE = 0; //EEPROM Flash Write Interrupt Enable EEIP = 0; //EEPROM Flash Write Interrupt Priority BCLIF = 0; //Bus Collision Interrupt Flag BCLIE = 1; //Bus Collision Interrupt Enable BCLIP = 0; //Bus Collision Interrupt Priority LVDIF = 0; //Low Voltage Interrupt Flag LVDIE = 0; //Low Voltage Interrupt Enable LVDIP = 0; //Low Voltage Interrupt Priority TMR3IF = 0; //TMR3 Overflow Interrupt Flag TMR3IE = 0; //TMR3 Overflow Interrupt Enable TMR3IP = 0; //TMR3 Overflow Interrupt Priority CCP2IF = 0; //CCPx Interrupt Flag CCP2IE = 0; //CCPx Interrupt Enable CCP2IP = 0; //CCPx Interrupt Priority //T0CON Timer0 TMR0ON = 0; //Timer STOP T08BIT = 1; //8 BIT MODE T0CS = 0; //Prescaler clock from FCPU T0SE = 0; //Source Edge Select bit PSA = 0; //Timer Clock Source from Prescaler T0PS0 = 1; //--Prescaler T0PS1 = 1; //--divide by T0PS2 = 0; //--128 => ~1s is 16 cycles TMR0ON = 1; //Timer START //Inputs und Outputs TRISA0 = 0; //ComK Digit 2 TRISA1 = 0; //ComK Digit 3 TRISA2 = 0; //ComK Digit 4 TRISA3 = 0; //ComK Digit 1 TRISA4 = 0; //ComK Punkte TRISA5 = 1; //nicht verbunden!!! TRISA6 = 1; //nicht verbunden!!! TRISA7 = 1; //nicht verbunden!!! TRISB0 = 0; //Digit Punkt TRISB1 = 0; //Digit G TRISB2 = 0; //Digit F TRISB3 = 0; //Digit E TRISB4 = 0; //Digit D TRISB5 = 0; //Digit C, Gradpunkt TRISB6 = 0; //Digit B, Doppelpunkt unten TRISB7 = 0; //Digit A, Doppelpunkt oben TRISC0 = 1; //Taste 1 Eingang TRISC1 = 1; //Taste 2 Eingang TRISC2 = 1; //Taste 3 Eingang TRISC3 = 1; //SCL Eingang TRISC4 = 1; //SDA Eingang TRISC5 = 1; //SJ3 Eingang gebrückt = 0 TRISC6 = 1; //SJ4 Eingang gebrückt = 0 TRISC7 = 1; //SJ5 Eingang gebrückt = 0 PORTA = 0; PORTB = 0; vCLEAR = SSPBUF; SSPOV = 0; } void fI2CDATENSENDEN() { if ( SSPSTATbits.S == 1 && R_W == 1 && DA == 0) { CKP = 0; SSPBUF = vBACK2MASTER; vBACK2MASTER = 0; CKP = 1; while (!SSPIF); SSPIF = 0; } if ( SSPSTATbits.S == 1 && DA == 1 && BF == 0 && CKP == 1) { CKP = 1; vCLEAR = SSPBUF; } } void fI2CDATENEMPFANG() { unsigned char vCLEAR = 0x00; if ( SSPSTATbits.S == 1 && RW == 0 && DA == 0 && BF == 1) { vCLEAR = SSPBUF; while (!SSPIF); SSPIF = 0; if (SSPOV) { vCLEAR = SSPBUF; SSPOV = 0; } } if ( SSPSTATbits.S == 1 && RW == 0 && DA == 1 && BF == 1 ) { int i=0; for (i=0; i <= 4;i++ ) { vUEBERGABE[i] = SSPBUF; // CKP = 1; while (!SSPIF); SSPIF = 0; if (SSPOV) { vCLEAR = SSPBUF; SSPOV = 0; } } } } void interrupt ISR(void) { if (TMR0IF ) { vTMR0F++; vMILISEKUNDEN++; fI2CDATENEMPFANG(); vTMR0++; fI2CDATENEMPFANG(); vKEYTIMER++; fI2CDATENEMPFANG(); vTASTENTIMER++; if(vTMR0 == 9) { vTMR0 = 0; PORTB = 0; } if(vTMR0F == 11) { vTMR0F = 0; PORTB = 0; } if(vMILISEKUNDEN == 500) // ~ 1 SEKUNDE { vMILISEKUNDEN = 0; vSEKUNDEN++; vANZEIGETIMER++; vERRORTMR++; } if(vSEKUNDEN == 60) { vSEKUNDEN = 0; vMINUTEN++; } if(vMINUTEN == 60) { vMINUTEN = 0; vSTUNDEN++; } fI2CDATENEMPFANG(); TMR0IF = 0; } } void main(void) { Init(); while(1) { //VARIABLENUEBERGABE an Module vMODUL = vUEBERGABE[0]; vZIFFER[0] = vUEBERGABE[1]; vZIFFER[1] = vUEBERGABE[2]; vZIFFER[2] = vUEBERGABE[3]; vZIFFER[3] = vUEBERGABE[4]; } }