Hilfe --> I2C Slave mit Bascom

OP #3037284
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.
Angehängte Dateien:
OP #3037587
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.