void I2C_INI () { SSPEN = 1; SSPM3 = 1; SSPM2 = 0; SSPM1 = 0; SSPM0 = 0; SSPCON2 = 0; SMP = 0; CKE = 0; SSPADD = 10; } void I2C_IDLE () { while (SSPSTAT.2 == 1); while ((SSPCON2 & 0x1F) > 0); } void I2C_FERTIG () { while (SSPIF == 0); SSPIF = 0; } void I2C_BUS_START () // Start - Bit { SEN = 1; while (SEN); } void I2C_BUS_START_rep () // { RSEN = 1; while (RSEN == 1); } void I2C_BUS_STOPP () // Stopp - Bit { I2C_IDLE (); PEN = 1; while (PEN == 1); } void I2C_ACK () { ACKDT = 0; ACKEN = 1; I2C_FERTIG (); } void I2C_NACK () { ACKDT = 1; ACKEN = 1; I2C_FERTIG (); } void I2C_W (char x) // Daten schreiben { SSPIF = 0; SSPBUF = x; while (SSPIF == 0); } void I2C_R () // Daten lesen { RCEN = 1; // PIC soll den Takt erzeugen while (RCEN); ACKEN = 1; while (ACKEN); I2Cempfang = SSPBUF; } void RTC_INI () { I2C_BUS_START (); I2C_W (0xA0); // zum lesen adressieren I2C_W (0x00); // Adresse im pcf 8583 I2C_W (0x80); // 0 in das register schreiben I2C_BUS_STOPP (); I2C_BUS_START (); I2C_W (0xA0); // zum lesen adressieren I2C_W (0x02); // Adresse im pcf 8583 I2C_W (0x00); // 0 in das register schreiben I2C_BUS_STOPP (); I2C_BUS_START (); I2C_W (0xA0); // zum lesen adressieren I2C_W (0x00); // Adresse im pcf 8583 I2C_W (0x00); // 0 in das register schreiben I2C_BUS_STOPP (); } void RTC_auslesen () { I2C_BUS_START (); I2C_W (0xA0); // Adresspointer auf die auszu- I2C_W (0x02); // lesende adresse stellen I2C_BUS_START_rep (); I2C_W (0xA1); // zum lesen adressieren I2C_R (); // Daten vom bus einlesen I2C_NACK (); sek = I2Cempfang; I2C_BUS_STOPP (); } //************************************************* void sek_umrechnen () { if (sek.0 == 1) { ze6 = '1'; } if (sek.1 == 1) { ze6 = '2'; } if (sek.0 && sek.1 == 1) { ze6 = '3'; } if (sek.3 == 1) { ze6 = '4'; } if (sek.3 && sek.0 == 1) { ze6 = '5'; } if (sek.3 && sek.1 == 1) { ze6 = '6'; } if (sek.3 && sek.0 && sek.1 == 1) { ze6 = '7'; } if (sek.4 == 1) { ze6 = '8'; } if (sek.4 && sek.0 == 1) { ze6 = '9'; } if (sek.0 && sek.1 && sek.2 && sek.3 && sek.4 == 0) { ze6 = '0'; } } void main () { PIC_INI (); I2C_INI (); RTC_INI (); while (1) { RTC_AUSLESEN (); sek_umrechnen (); LDC_AUSGABE (); } }