1 | // Port B: Ausgabe der Empfangsdaten
|
2 | // Port C: PC1 = SDA -> Stift 15 PC0=SCL -> Stift 14 PCF8574A
|
3 | // PORT D: Eingabe der Sendedaten
|
4 | #include <avr/io.h> // Deklarationen
|
5 | #define TAKT 3686400UL // Systemtakt 3.6864 MHz
|
6 | #define AUSAD 0x70 // Adresse Ausgabeeinheit PCF8574A
|
7 | #define EINAD 0x71 // Adresse Eingabeeinheit PCF8574A
|
8 | #define FAKTOR 44 // Teilerfaktor für 10 kHz Bustakt
|
9 | #define TEILER 1 // Vorteiler TWPS = 1
|
10 | void init(unsigned char faktor, unsigned char teiler) // TWI initialisieren
|
11 | {
|
12 | TWBR = faktor; // Bitrate
|
13 | TWSR = teiler; // Vorteiler
|
14 | }
|
15 | void send(unsigned char adres, unsigned char daten) // Zeichen senden
|
16 | {
|
17 | TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // Startbedingung
|
18 | loop_until_bit_is_set(TWCR, TWINT); // warte bis fertig
|
19 | TWDR = adres; // Adresse
|
20 | TWCR = (1 << TWINT) | (1 << TWEN); // senden
|
21 | loop_until_bit_is_set(TWCR, TWINT); // warte bis fertig
|
22 | TWDR = daten; // Daten
|
23 | TWCR = (1 << TWINT) | (1 << TWEN); // senden
|
24 | loop_until_bit_is_set(TWCR, TWINT); // warte bis fertig
|
25 | TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN); // Stoppbedingung
|
26 | }
|
27 | unsigned char empf(unsigned char adres) // Zeichen empfangen
|
28 | {
|
29 | unsigned char daten; // Hilfsvariable
|
30 | TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // Startbedingung
|
31 | loop_until_bit_is_set(TWCR, TWINT); // warte bis fertig
|
32 | TWDR = adres; // Adresse
|
33 | TWCR = (1 << TWINT) | (1 << TWEN); // senden
|
34 | loop_until_bit_is_set(TWCR, TWINT); // warte bis fertig
|
35 | TWCR = (1 << TWINT) | (1 << TWEN); // Empfang starten
|
36 | loop_until_bit_is_set(TWCR, TWINT); // warte bis fertig
|
37 | daten = TWDR; // Daten abholen
|
38 | TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN); // ACK-Impuls senden
|
39 | loop_until_bit_is_set(TWCR, TWINT); // warte bis fertig
|
40 | TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN); // Stoppbedingung
|
41 | return daten;
|
42 | }
|
43 | void main (void) // Hauptfunktion
|
44 | {
|
45 | unsigned char awert, ewert; // Zwischenwerte für Test
|
46 | DDRB = 0xff; // Port B gibt Testdaten aus
|
47 | init(FAKTOR, TEILER); // TWI Bustakt Initialisierung
|
48 | while (1) // Arbeitsschleife
|
49 | {
|
50 | awert = PIND; // Testwerte vom Port D eingeben
|
51 | send(AUSAD, ~awert); // Komplement senden
|
52 | ewert = empf(EINAD); // Empfangsdaten
|
53 | PORTB = ewert; // auf Port B ausgeben
|
54 | } // Ende while
|
55 | } // Ende main
|