1 | volatile char TWI_zeichen;
|
2 | volatile char TWI_empfangen = ' ';
|
3 | volatile char TWI_status = 0;
|
4 | volatile int TWI_aktiv = 0;
|
5 |
|
6 | ISR(TWI_vect) /* Interrupt TWI _vect muss immer an den Namen im Datenblatt angehängt werden
|
7 | Leerzeichen werden durch _ ersetzt */
|
8 | {
|
9 | TWI_status = (TWSR & 0xF8);
|
10 | switch (TWSR & 0xF8) {
|
11 |
|
12 | //Empfangs Mode
|
13 |
|
14 | case 0x60: // Adresse empfangen und acknowledge gesendet
|
15 | TWI_aktiv = 1;
|
16 | //lcd_gotoxy(0,30);
|
17 | //lcd_writestringP(PSTR("SLA+W empfangen"));
|
18 | TWCR = (1<<TWINT) | (1<<TWEA)| (1<<TWEN)|(1<<TWIE) ; //Bisher hat TWEN gefehlt!
|
19 | break;
|
20 |
|
21 |
|
22 | case 0x70:
|
23 | lcd_gotoxy(0,0);
|
24 | lcd_writestringP(PSTR("70"));
|
25 | break;
|
26 |
|
27 | case 0x80: // Daten empfangen und acknowledge gesendet
|
28 | //lcd_gotoxy(0,40);
|
29 | //lcd_writestringP(PSTR("Daten empfangen"));
|
30 |
|
31 | TWI_empfangen = TWDR;
|
32 | TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWEA)|(1<<TWIE);
|
33 | break;
|
34 |
|
35 | case 0x88:
|
36 | lcd_gotoxy(0,0);
|
37 | lcd_writestringP(PSTR("88"));
|
38 | break;
|
39 |
|
40 | case 0x90:
|
41 | lcd_gotoxy(0,0);
|
42 | lcd_writestringP(PSTR("90"));
|
43 | break;
|
44 |
|
45 | case 0x98:
|
46 | lcd_gotoxy(0,0);
|
47 | lcd_writestringP(PSTR("98"));
|
48 | break;
|
49 |
|
50 | case 0xA0: // Stop empfangen warte auf neue Adressierung
|
51 | //lcd_gotoxy(0,60);
|
52 | //lcd_writestringP(PSTR("Stop empfangen"));
|
53 | TWCR = (1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(0<<TWSTO)|(0<<TWSTA)|(1<<TWIE);
|
54 | TWI_aktiv = 0;
|
55 | break;
|
56 |
|
57 | //Senden Mode
|
58 |
|
59 | case 0x08:
|
60 | //TWI_aktiv = 1;
|
61 | //lcd_gotoxy(0,40);
|
62 | //lcd_writestringP(PSTR(" "));
|
63 | TWDR = 0x06; //Adresse 3 _ write 0
|
64 | TWCR = (1<<TWINT) | (1<<TWEN)| (1<<TWIE);
|
65 | //lcd_gotoxy(0,40);
|
66 | //lcd_writestringP(PSTR("Start gesendet"));
|
67 |
|
68 | break;
|
69 |
|
70 | case 0x10:
|
71 | lcd_gotoxy(0,0);
|
72 | lcd_writestringP(PSTR("10"));
|
73 | TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWIE);
|
74 | break;
|
75 |
|
76 | case 0x38:
|
77 | lcd_gotoxy(0,20);
|
78 | lcd_writestringP(PSTR("Aribitration lost"));
|
79 | break;
|
80 |
|
81 | case 0x68:
|
82 | lcd_gotoxy(0,20);
|
83 | lcd_writestringP(PSTR("Aribitration lost"));
|
84 | break;
|
85 |
|
86 | case 0x78:
|
87 | lcd_gotoxy(0,20);
|
88 | lcd_writestringP(PSTR("Aribitration lost"));
|
89 | break;
|
90 |
|
91 | case 0xB0:
|
92 | lcd_gotoxy(0,20);
|
93 | lcd_writestringP(PSTR("Aribitration lost"));
|
94 | break;
|
95 |
|
96 |
|
97 | //Slave auf Adresse geantwortet
|
98 |
|
99 | case 0x18:
|
100 | //debug("Slave auf Adresse geantwortet");
|
101 |
|
102 | //debug("Daten an Slave senden");
|
103 | TWDR = TWI_zeichen;
|
104 | TWCR = (1<<TWINT) | (1<<TWEN)| (1<<TWIE);
|
105 | break;
|
106 |
|
107 | case 0x20:
|
108 | lcd_gotoxy(0,0);
|
109 | lcd_writestringP(PSTR("20"));
|
110 | TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWIE);
|
111 | break;
|
112 |
|
113 | //Daten von Slave akzeptiert
|
114 | case 0x28:
|
115 | //debug("Daten von Slave akzeptiert");
|
116 | TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)|(0<<TWSTA)|(1<<TWIE);
|
117 | //Stop gesendet
|
118 | _delay_ms(40);//Abwarten bis Stop gesendet
|
119 | TWCR = (1<<TWEA) |(0<<TWSTO); //Busfreigabe
|
120 | TWAR = 0b00000011; //Adresse setzten
|
121 | TWSR = (0 << TWPS1) | (0 << TWPS0);
|
122 | TWCR = (1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);
|
123 | TWI_aktiv = 0;
|
124 | break;
|
125 |
|
126 | case 0x30:
|
127 | lcd_gotoxy(0,0);
|
128 | lcd_writestringP(PSTR("30"));
|
129 | TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWIE)|(1<<TWSTA);
|
130 | break;
|
131 |
|
132 | }
|
133 | }
|