1 | #include <util/twi.h>
|
2 |
|
3 | #ifndef scl_frequency
|
4 | #error SCL_Frequency nicht definiert!
|
5 | #endif
|
6 |
|
7 | void i2c_start()
|
8 | {
|
9 | TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
|
10 | while (!(TWCR & (1<<TWINT)));
|
11 |
|
12 | if ((TWSR & 0xF8) != TW_START)
|
13 | {
|
14 | //Fehler beim übermitteln des Startbits
|
15 | }
|
16 | }
|
17 |
|
18 | void i2c_send_adr(unsigned char sla_w)
|
19 | {
|
20 | //Senden der Adresse
|
21 | TWDR = sla_w; // slave_write Adresse ins TwoWireDataRegister laden
|
22 | TWCR = (1<<TWINT) | (1<<TWEN); // TWINT setzen und somit senden
|
23 | while(!(TWCR & (1<<TWINT))); // warten bis Übermittlung abgeschlossen
|
24 |
|
25 | if((TWSR & 0xF8) != TW_MT_SLA_ACK) // Überprüfen ob initialwert (0xF8) ungleich Prüffolge
|
26 | {
|
27 | //Fehler beim Ansprechen des Slaves
|
28 | }
|
29 | }
|
30 |
|
31 | void i2c_send_data(unsigned char data)
|
32 | {
|
33 | //Senden von Daten
|
34 | TWDR = data;
|
35 | TWCR = (1<<TWINT) | (1<<TWEN);
|
36 | while(!(TWCR & (1<<TWINT)));
|
37 |
|
38 | if ((TWSR & 0xF8) != TW_MT_DATA_ACK)
|
39 | {
|
40 | //Fehler beim senden der Daten
|
41 | }
|
42 | }
|
43 |
|
44 | void i2c_send_instruction()
|
45 | {
|
46 | //Senden des Instruction Bytes
|
47 | TWDR = 0x00; //schreiben des Controllbytes jedes mal aufs Neue
|
48 | TWCR = (1<<TWINT) | (1<<TWEN);
|
49 | while(!(TWCR & (1<<TWINT)));
|
50 |
|
51 | if ((TWSR & 0xF8) != TW_MT_DATA_ACK)
|
52 | {
|
53 | //Fehler beim senden der Daten
|
54 | }
|
55 | }
|
56 |
|
57 | void i2c_send_control()
|
58 | {
|
59 | //Senden des Controllbytes
|
60 |
|
61 | /*C0 = 0 static mode, i.e. continuous display of digits 1 and 2
|
62 | C0 = 1 dynamic mode, i.e. alternating display of digit 1 + 3 and 2 + 4
|
63 | C1 = 0/1 digits 1 + 3 are blanked/not blanked
|
64 | C2 = 0/1 digits 2 + 4 are blanked/not blanked
|
65 | C3 = 1 all segment outputs are switched-on for segment test(1)
|
66 | C4 = 1 adds 3 mA to segment output current
|
67 | C5 = 1 adds 6 mA to segment output current
|
68 | C6 = 1 adds 12 mA to segment output current*/
|
69 |
|
70 | TWDR = 0b01111111;
|
71 | TWCR = (1<<TWINT) | (1<<TWEN);
|
72 | while(!(TWCR & (1<<TWINT)));
|
73 |
|
74 | if ((TWSR & 0xF8) != TW_MT_DATA_ACK)
|
75 | {
|
76 | //Fehler beim senden der Daten
|
77 | }
|
78 | }
|
79 |
|
80 | void i2c_send_stop()
|
81 | {
|
82 | //Senden der Stopbedingung
|
83 | TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
|
84 | }
|