Forum: Mikrocontroller und Digitale Elektronik Hilfe --> I2C Slave mit Bascom


von Michael L. (nightflyer88)


Angehängte Dateien:

Lesenswert?

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.

von Michael L. (nightflyer88)


Lesenswert?

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
Noch kein Account? Hier anmelden.