Hallo!
Zuerst mal die Hardware: microsps mit atmega32 und microsps 12/4 I/OModul mit 2 pcf5874p I2C expander
Problem:Meine Intention ist es den IC2 anzusprechen, da an diesem 4 Relais und 4 LEDs hängen. (pcf8574p)
Ich will alle LEDs zum leuchten bringen (fürs erste).
Leider funktioniert dies nicht so, wie ich es mir vorstelle.
Ich habe herausgefunden, dass der A0-Eingang an +5 V liegt, wie wirkt dies dann auf die Slaveadresse aus(IC2-Baustein)? Und A0 an 0 V (vom IC1). (und einen Schalter mit A1 und A2)
die Grundadresse ist ja bekanntlicherweise laut datasheet 0x40...
Hier mein Quellcode (zusammengeschnipselt aus diversen Büchern):
Code:// ATmega32 TWI-Schnittstelle PCF8574P //Ziel: alle LEDs an RE sollen leuchten // Port C: PC1 = SDA -> Stift 15 PC0=SCL -> Stift 14 PCF8574P #include <avr/io.h> // Deklarationen #define TAKT 3686400UL // Systemtakt 3.6864 MHz #define AUSAD 68 // Adresse Ausgabeeinheit PCF8574P(Grundadresse 0x40+A0) #define FAKTOR 44 // Teilerfaktor für 10 kHz Bustakt #define TEILER 1 // Vorteiler TWPS = 1 void init(unsigned char faktor, unsigned char teiler) // TWI initialisieren { TWBR = faktor; // Bitrate TWSR = teiler; // Vorteiler } void send(unsigned char adres, unsigned char daten) // Zeichen senden { TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // Startbedingung loop_until_bit_is_set(TWCR, TWINT); // warte bis fertig TWDR = adres; // Adresse TWCR = (1 << TWINT) | (1 << TWEN); // senden loop_until_bit_is_set(TWCR, TWINT); // warte bis fertig TWDR = daten; // Daten TWCR = (1 << TWINT) | (1 << TWEN); // senden loop_until_bit_is_set(TWCR, TWINT); // warte bis fertig TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN); // Stoppbedingung } unsigned char empf(unsigned char adres) // Zeichen empfangen { unsigned char daten; // Hilfsvariable TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // Startbedingung loop_until_bit_is_set(TWCR, TWINT); // warte bis fertig TWDR = adres; // Adresse TWCR = (1 << TWINT) | (1 << TWEN); // senden loop_until_bit_is_set(TWCR, TWINT); // warte bis fertig TWCR = (1 << TWINT) | (1 << TWEN); // Empfang starten loop_until_bit_is_set(TWCR, TWINT); // warte bis fertig daten = TWDR; // Daten abholen TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN); // ACK-Impuls senden loop_until_bit_is_set(TWCR, TWINT); // warte bis fertig TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN); // Stoppbedingung return daten; } void main (void) // Hauptfunktion { unsigned char awert; // Zwischenwert für Test init(FAKTOR, TEILER); // TWI Bustakt Initialisierung while (1) // Arbeitsschleife { awert = 0xff; send(AUSAD, ~awert); // Komplement senden da Buslogik invers ist } // Ende while } // Ende main
PS freu mich über jede Hilfe und bedanke mich im Voraus, da ich neu in dem Bereich bin....
Gruß
atan09







Zitieren

Lesezeichen