1 | //iic.c:////////////////////////////////////////////////
|
2 | /******************************************************/
|
3 | void init_iic(void){
|
4 | TWSR = 0; //Prescaler
|
5 | TWBR = (F_CPU / 100000UL - 16) / 2; // 100kHz
|
6 | }
|
7 | /******************************************************/
|
8 | int start_iic(unsigned char address){
|
9 | /* Returnwerte:
|
10 | * 0 -> Startbedinung erfolgreich gesendet
|
11 | * 1 -> Probleme beim sender der Start-Bedinung
|
12 | * 2 -> Probleme beim senden der Addresse
|
13 | * bzw. kein Device mit der angegebenen Addresse
|
14 | */
|
15 | //Senden der START Bedingung
|
16 | TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
|
17 | //Warten bis TWI Bedingung gesendet wurde
|
18 | while(!(TWCR & (1<<TWINT)));
|
19 | //TWI Status berprfen
|
20 | if((TWSR & 0xF8) != TW_START) return 1;
|
21 | //Adresse des anzusprechenden Devices senden
|
22 | TWDR = address;
|
23 | TWCR = (1<<TWINT) | (1<<TWEN);
|
24 | //Warten bis TWI Bedingung gesendet wurde
|
25 | while(!(TWCR & (1<<TWINT)));
|
26 | //TWI Status überprüfen
|
27 | if((TWSR & 0xF8) != TW_MT_SLA_ACK) return 2;
|
28 | return 0;
|
29 | }
|
30 | /******************************************************/
|
31 | void write_iic(U8 data){
|
32 | TWDR = data;
|
33 | TWCR = (1<<TWINT) | (1<<TWEN);
|
34 | //Warten bis TWI Bedingung gesendet wurde
|
35 | while(!(TWCR & (1<<TWINT)));
|
36 | }
|
37 | /******************************************************/
|
38 | void stop_iic(void){
|
39 | TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
|
40 | }
|
41 |
|
42 | //rtc.c:////////////////////////////////////////////////
|
43 |
|
44 | #define RTC_WR 0xA2 // Schreibadresse PCF8563
|
45 | #define BIN2BCD(b) (((b)%10) | (((b)/10)<<4))
|
46 | /******************************************************/
|
47 | void write_time_rtc(void){
|
48 | start_iic(RTC_WR);
|
49 | write_iic(0x02);
|
50 | write_iic(BIN2BCD(gtime.sec));
|
51 | write_iic(BIN2BCD(gtime.min));
|
52 | write_iic(BIN2BCD(gtime.hour));
|
53 | stop_iic();
|
54 | }
|