PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATmega8 und PCF8574 :)



Henning12
20.07.2008, 12:49
Moin,

hm gleich mein erster post ist eine Frage. Ist vieleicht nicht die feine englische Art, aber das hol ich wieder auf :)

Ich probiere gerade an dem ATmega8 einen PCF8574 laufen zu lassen. Dazu habe ich mit diversen Quellen folgendes hinbekommen.
Nur leider kommt da nichts an beim PCF8574 an. Habe mal mit einem Oszilloskop den i2c bus angeschaut. Da geht nichts drüber. Also vermute ich mal auf einen Softwarefehler.

seht ihr den Bock hier im Quellcode ? Würde mich über ein paar Tips sehr freuen.

lg Henning

#include<util/delay.h>


int sendByte(unsigned char datenbyte, unsigned char adresse)
{
DDRC &= !((1<<DD4)|(1<<DD5));
PORTC = (1<<DD4)|(1<<DD5);

TWCR = ((1<<TWINT)|(1<<TWSTA)|(1<<TWEN)); //TWI aktivieren und Start auslösen
while(!(TWCR & (1<<TWINT))); // warten auf Start


TWDR = adresse & (0x40); // Adresse und Schreibbit ins Datenregister
TWCR = ((1<<TWINT)|(1<<TWEN)); // senden ...
while(!(TWCR & (1<<TWINT)));


TWDR=datenbyte; // Byte ins Datenregister
TWCR = ((1<<TWINT)|(1<<TWEN)); // senden ...
while(!(TWCR& (1<<TWINT)));


TWCR = ((1<<TWINT)|(1<<TWSTO)|(1<<TWEN)); // Stop
return 1;
}



void main (void)
{
unsigned char i;
i=0x01;
while(1)
{
if(i==0x80) i=0x01;
else i<<=1;

_delay_ms(150);

sendByte(i,0);
}
}

Andun
20.07.2008, 15:23
Moin

Kanns sein, dass du einfach keine Adresse für den I2C Baustein angegeben hast? Im Code von dir hast du als 2. Parameter für SendByte ne 0. Da muss eigentlich die Adresse für den I2C Baustein rein.

Die musst du dem Datenblatt entnehmen.

mfg

Andun

linux_80
20.07.2008, 15:40
Hallo,

die Adresse wird so nicht korrekt berechnet:
TWDR = adresse & (0x40);
da sollte ein ODER dazwischen.

Dann würde ich TWI erst initialisieren, damit die Slaves Zeit haben eine Startsequenz als solche zu erkennen. Denn wenn man beim aktivieren gleich ein Start sendet, könnte es sein das es kein Slave mitbekommt.

Nach dem warten bis TWINT wieder gesetzt ist, könnte man das Statusregister TWSR auslesen, um zu sehen was überhaupt passiert ist, ob der Slave sich gemeldet hat usw.