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  | }
  |