PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit I2C (Adressierung???)



Xeus
23.02.2005, 16:21
Hallo,
hab gerade ein board mit 2 atmega8, 1 PCF8583 und einem ATMEL 24C256 Eprom fertiggestellt. die 4 komponenten sollen über den i2c bus miteinander kommunizieren, wobei einer der atmega8s der master ist.
Wie schon gesagt, die hardware ist soweit fertig. Das große problem liegt in der software, ich hab keinen blassen schimmer, wie das mit der adressierung des PCF und dem eeprom funzt, und wie bring ich den einen atmega8 als slave und den anderen als master. hab von einem user dieses boards mal ein script bekommen für den PCF (siehe unten) aber irgendwie funktioniert das nicht. Vielleicht liegts ja an der adressierung. Wär echt nett wenn mir jemand helfen könnte meinen bus zum laufen zu breingen.


gruß
xeus

$baud = 2400
$regfile = "m8def.dat"
$crystal = 1000000


Config Sda = Portc.4
Config Scl = Portc.5

Dim I As Byte
Config Lcdpin = Pin , Db4 = Portb.7 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portb.6 , Rs = Portd.4 ' Natürlich so wie es wirklich angeschlossen ist (4-Bit-Modus)
Dim A As Byte
Config Lcd = 20 * 4


Dim Ura As Byte , Minu As Byte , Sek As Byte , Dan As Byte
Dim S As Byte , M As Byte , H As Byte , D As Byte , Weekdays As Byte
Dim Wm As Byte , Yd As Byte
Dim Wm1 As Byte

Declare Sub Gettime()

Do

Call Gettime

If Ura < 10 Then
Locate 1 , 12
Lcd "0"
Locate 1 , 13
Lcd Ura
Else
Locate 1 , 12
Lcd Ura
End If

If Minu < 10 Then
Locate 1 , 15
Lcd "0"
Locate 1 , 16
Lcd Minu
Else
Locate 1 , 15
Lcd Minu
End If


Loop

Sub Gettime()

I2cstart 'generate start
I2cwbyte 160 'write addres of PCF8583
I2cwbyte 2 'select second register
I2cstart 'generate repeated start
I2cwbyte 161 'write address for reading info
I2crbyte S , Ack 'read seconds
I2crbyte M , Ack 'read minutes
I2crbyte H , Nack 'read hours
' I2crbyte Yd , Ack 'read year and days
' I2crbyte Wm , Nack 'read weekday and month
I2cstop 'generate stop

Ura = Makedec(h)
Minu = Makedec(m)
Sek = Makedec(s)

End Sub

PicNick
23.02.2005, 16:33
Hab ich den I2Cinit übersehen ?

Xeus
23.02.2005, 16:44
oh ja der fehlt, werds gleich mal korigieren

albundy
23.02.2005, 17:56
Die Sub Gettime ist völlig in Ordnung. Hast du an die pullup Wiederstände für SDA und SCL gedacht ?

Xeus
23.02.2005, 21:47
ja, kann gerade nur nicht testen, ob es funktioniert. Nachdem ich die fuses verändert hab, kann ich auf den mc nicht ehr zugreifen. enteder ich hab misstgebaut, oder der programmer hat sich verabschiedet.

sobald ich den fehler behoben hab versuch ich es nochmal.

ps: hab 10 kohm pullups eingebaut.

nochWas:
Wie verhalt sich das eigentlich mit der hardWareseitigen adressierung des PCF und des eeproms? (A1 und A0)

PicNick
24.02.2005, 10:03
Jedes Gerät auf dem I2C Bus sollte einen eindeutige Adresse eingestellt haben. mfg

albundy
24.02.2005, 10:11
Hallo,
der 24LC256 hat 3 Adresspins, sind alle auf GND ist die Adresse 160.
Ist nur A0 auf +5V, ist die Adresse 162. Sind A0-A2 auf +5V, ist die Adresse 174. Somit lassen sich 8 IC's von diesem Typ auf dem selben I2C Bus betreiben.
Der PCF8583 hat nur A0. Ist A0 auf GND, ist die Adresse ebenfalls 160.
Bei A0 auf +5V, ist sie 162.
Um beide auf einem Bus zu betreiben, musst du jedem eine eigene Adresse geben.

Xeus
25.02.2005, 16:29
also die ansteuerung des pcf funzt. hab im datenblat nachgesehen und dort ist zu lesen, das er ein quarz braucht um richtig zu laufen, stimmt das?

albundy
26.02.2005, 16:00
also die ansteuerung des pcf funzt. hab im datenblat nachgesehen und dort ist zu lesen, das er ein quarz braucht um richtig zu laufen, stimmt das?
Nicht unbedingt, ein 50Hz Takt geht auch. Ich nehme an, man hat bei der Entwicklung daran gedacht, auch die Netzfrequenz als Takt nutzen zu können.

Xeus
27.02.2005, 22:01
Also wenn ich das etz richtig deute, dann braauche ich sehr woll einen externen takt. aber ist der trimm kondensator wirklich notwendig?vorallem zum kalibriern müsste ich mich mit der stoppuhr daneben hinstellen.

Ich hät noch eine klizekleine frage:
ich hab auf dem bus neben dem clockbaustein noch von atmel den 24c256, hast du vielleicht irgend ein kleines bascom prog, mit dem ich daten (kommen aus einem integer) in diesen baustein speichere. vielleicht noch was zum auslesen?? :cheesy:

wär echt nett,
xeus

albundy
28.02.2005, 14:58
Also wenn ich das etz richtig deute, dann braauche ich sehr woll einen externen takt
Etwas anderes habe ich auch gar nicht behauptet. Ich habe nur gesagt, dass es nicht unbedingt ein Quarz sein muss.


Dim Adress as Word, H as byte, L as Byte, Wert as Byte
H=High(Adress)
L=Adress

'schreibt einen Wert in den 24C256
I2cstart
I2cwbyte &B1010_0000 'Adresse des Eeprom
I2cwbyte H 'Speicherstelle im Eeprom als Word
I2cwbyte L 'da der Bereich von 0 - 7FFF geht
I2cwbyte Wert 'Wert schreiben
I2cstop

'liest einen Wert aus dem 24C256
I2cstart
I2cwbyte &B1010_0000 'Adresse des Eeprom
I2cwbyte H 'Speicherstelle wo der Wert steht
I2cwbyte L
I2cstart
I2cwbyte &B1010_0001 'Lese Kommando
I2crbyte Wert , Nack 'Wert auslesen
I2cstop


Ich hoffe es stimmt alles, den Code habe ich gerade aus dem Kopf erstellt, da ich im Moment das Datenblatt nicht hier habe.

Xeus
28.02.2005, 16:34
erstmal danke, für die hilfe.
Mein konkretes vorhaben:

Ich will zu ausbildungszwecken einen Datenlogger bauen, der mir den stromverbrauch einzelner geräte aufzeichnet. die Ausertung des stromverbrauchs, habe ich schon gelöst. ein elektronischer zähler gibt mir 1000 impulse pro kw über einen optokople aus. soweit so gut.
Nun will ich mir den verbrauch auf einem lcd anzeigen lassen. auch noch kein problem funzt schon wunderbar.

-desweiteren soll der wert über eine 7-seg angezeigt werden, funktioniert leider nur zum teil. kann derzeit leider nur einen einstelligen wert anzeigen lassen (springt bei zwei oder mehrstelligen werten nicht ins nächste digit.

- An das gerät sollen bis zu 6 kanäle verarbeitet werden. diese sollen seperat zu einer bestimmeten uhrzeit (z.b. 24 uhr) in das 24c265 abgespeichert werden, natürlich mit dem datum. diese daten will ich dan später mit hilfe eines delphi pogs in einer exeltab auswerten.

- Nach jeder Speicherung sollen die werte wieder auf null zurück gesetzt werden und das zähle von vorne beginnen.

So, jetzt glaub ich weist du alles darüber, mein größtes problem ist im entdefekt 'nur' die tägliche speicherung der werte zu einer bestimmten uhrzeit. und natürlich derren auslesung über das uart.

vielleicht kannst du mir ja weiterhalfen.

schon mal vielen dank für deine mühe

albundy
28.02.2005, 17:17
Lies das mal ...
https://www.roboternetz.de/phpBB2/viewtopic.php?t=6796

Xeus
28.02.2005, 17:53
Hab dein script von oben benutzt, und es in mein bestehendes prog eingebaut. Nur beim auslesen bekomme ich immer wieder den wert 255 zurück. kann das vielleicht daran liegen, dass ich den wert nur ls integer vorliegen hab???

Xeus
28.02.2005, 18:56
oh man mein mc hängt sich immer auf, sobald ich lesen oder schreiben will.