atan09
28.10.2009, 21:54
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):
// 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
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):
// 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