Hallo Zusammen
Ich arbeite momentan an einem Datenlogger mit i2c. Alle Sensoren und
Eeprom hängen am i2c Bus. Der Datenlogger (Master) liest die Messwerte
von den Sensoren (Slave) und legt diese anschliessend im eeprom ab.
Jeder Sensor besteht aus der Sensorik und einem Attiny85 der die
Kommunikation mit dem i2c-Bus bereitstellt. Ich benutze die
Hardwareschnittstelle vom Attiny85, und programmiere diese manuel in
Bascom, ohne LIB oder irgendwelchen kostenpflichtigen Zusatzmodule.
Das Problem ist nun folgendes:
Nach dem lesen eines Slaves, kann ich keinen weiteren auslesen, der Bus
wird irgendwie nicht korrekt freigegeben.
Lese ich aber nur einen Slave aus, speichere die Daten im eeprom, lese
den nächsten Slave, speichere die Daten wieder, funktionierts
einwandfrei. Nur braucht diese Methode zu viel zeit. Ich will zuerst
alle Sensoren auslesen, und dann eine Pagewrite ins eeprom machen.
ich denke der Fehler liegt beim Slave, das der STOP oder NACK befehl
nicht richtig erkannt wird. Bin mir nicht sicher ob das genau richtig
ist wie im Datenblatt.
Code vom Master:
Adres = &H28
I2cstart
I2cwbyte Adres 'sende Slave Adresse
I2cwbyte &HE1 'Befehl Messwert lesen
I2cstart
Incr Adres
I2cwbyte Adres
I2crbyte H_adr , Ack 'lese Wert
I2crbyte L_adr , Nack
I2cstop
Waitms 10
Der Code vom Slave im Anhang, hier ein Ausschnitt:
MESSWERT SENDEN:
Select Case Data_register
Case &HE1 'Messwert
Lsb = Temperatur
Shift Temperatur , Right , 8
Msb = Temperatur
Usisr = &B11101110
Usidr = &B1
Bitwait Usisr.6 , Set
Usisr = &B11100000
Usidr = Msb
Bitwait Usisr.6 , Set
Portb.0 = 1
Usisr = &B11101110
Usidr = &B1
Bitwait Usisr.6 , Set
Usisr = &B11100000
Usidr = Lsb
Bitwait Usisr.6 , Set
Portb.0 = 1
End Select
STOP:
Config Portb.0 = Input
Bitwait Usisr.5 , Set
Usisr = &B11100000
'Startbit reset, Counteroverflow reset, Stopbit reset
Ich hoffe, dass mir da jemand weiter helfen kann. Der Code wäre eine
gute alternative zur kostenpflichtigen lib von Bascom.
oder ist in der START-Kondition etwas falsch ? im Datenblatt ist die Beschreibung auf seite 116. der Code: Enable Interrupts 'Interrupts einschalten Enable Usi_start On Usi_start I2c_slave 'Bei Startbit gehe zu i2c_slave Do 'Hauptprogramm Loop I2c_slave: Usisr = &B11000000 'Startbit reset, counteroverflow reset Bitwait Usisr.6 , Set 'Warten bis Slaveadresse empfangen If Usidr = Slave_adress Then 'Slave Adresse IO . . . Ich kann immer nur den ersten Slave ansprechen. Den zweiten geht einfach nicht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.