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.