Zwei AVR über TWI verbinden

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Zwei AVR über TWI verbinden

      Angeregt durch das Thema 2 Atmegas über serielle ganz einfach habe ich mal eine erste einfache Variante mit TWI gebastelt.
      Die "Kauf-LIB" für den Slave braucht man aber dafür, sie kostet nicht die Welt und lohnt sich, wie man sieht.

      Der TWI Master


      BASCOM-Quellcode

      1. 'I2C Master
      2. 'Test von I2C/TWI mit ATMega8
      3. $regfile = "m8def.dat"
      4. $crystal = 8000000
      5. $hwstack = 64
      6. $swstack = 64
      7. $framesize = 64
      8. $lib "i2c_twi.lbx" ' we do not use software emulated I2C but the TWI
      9. Config Scl = Portc.5 ' we need to provide the SCL pin name
      10. Config Sda = Portc.4 ' we need to provide the SDA pin name
      11. Config Twi = 100000
      12. Dim Befehl As Byte , Wert As Byte
      13. I2cinit ' we need to set the pins in the proper state
      14. 'Twbr = 12 'bit rate register
      15. 'Twsr = 0 'pre scaler bits
      16. Do
      17. 'Begrüßung
      18. Befehl = 0
      19. Wert = 0
      20. Gosub Sende_twi_daten
      21. Wait 2
      22. 'Befehl 1 mit Wert 0
      23. Befehl = 1
      24. Wert = 0
      25. Gosub Sende_twi_daten
      26. Wait 2
      27. Befehl = 1
      28. Wert = 1
      29. Gosub Sende_twi_daten
      30. Wait 2
      31. Befehl = 1
      32. Wert = 2
      33. Gosub Sende_twi_daten
      34. Wait 2
      35. 'Display löschen
      36. Befehl = 2
      37. Wert = 0
      38. Gosub Sende_twi_daten
      39. Wait 5
      40. Loop
      41. End
      42. Sende_twi_daten:
      43. I2cstart
      44. I2cwbyte &H70 ' slave address write
      45. I2cwbyte Befehl '&B10101010 ' write command
      46. I2cwbyte Wert
      47. I2cstop
      48. Return
      49. 'Ende
      Alles anzeigen

      und der TWI Slave

      BASCOM-Quellcode

      1. 'I2C Slave
      2. 'Test von I2C/TWI mit ATMega8
      3. $regfile = "m8def.dat"
      4. $crystal = 8000000
      5. $hwstack = 64
      6. $swstack = 64
      7. $framesize = 64
      8. $lib "i2c_twi-slave.lbx" 'Für Hardware TWI
      9. Config Twislave = &H70 , Btr = 2 , Bitrate = 100000
      10. Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.2 , Rs = Portd.3
      11. Config Lcd = 16 * 2
      12. Enable Interrupts
      13. Dim Befehl As Byte , Wert As Byte
      14. Cursor Off
      15. Cls
      16. Do
      17. Loop
      18. End
      19. Twi_stop_rstart_received:
      20. Return
      21. Twi_addressed_goread:
      22. Return
      23. Twi_addressed_gowrite:
      24. Return
      25. Twi_gotdata:
      26. Select Case Twi_btw
      27. Case 1 : Befehl = Twi
      28. Case 2 : Wert = Twi
      29. End Select
      30. Select Case Befehl
      31. Case 0 :
      32. 'Begrüßung
      33. Locate 1 , 1
      34. Lcd " I2C Slave Test "
      35. Locate 2 , 1
      36. Lcd " Bascomforum.de "
      37. Case 1 :
      38. 'Befehl 1 mit drei Werten
      39. Locate 1 , 1
      40. Lcd "Befehl " ; Befehl ; " "
      41. Select Case Wert
      42. Case 0 :
      43. Locate 2 , 1
      44. Lcd "Wert " ; Wert ; " "
      45. Case 1 :
      46. Locate 2 , 1
      47. Lcd "Wert " ; Wert ; " "
      48. Case 2 :
      49. Locate 2 , 1
      50. Lcd "Wert " ; Wert ; " "
      51. End Select
      52. Case 2 : Cls
      53. End Select
      54. Return
      55. Twi_master_needs_byte:
      56. Return
      57. Twi_master_need_nomore_byte:
      58. Return
      59. 'Ende
      Alles anzeigen

      Und hier noch das Video

      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Hallo,

      ist eine Möglichkeit aber gleich zwei Fragen.
      Wie kommst Du auf die Slave - Adresse H70?
      Diese ist doch für Expanter PCF8574 reserviert.

      Warum benötige ich diese LIB?
      $lib "i2c_twi-slave.lbx"
      Der Slave kann doch mit $lib "i2c_twi.lib" und I2crbyte lesen.

      Hatte diese Variante auch schon mal im Bussystem testen wollen. Bin aber an der Adresse der µC gescheitert. Ist ja für langsame Datenübertragung und kurze Entfernung eine Alternative. a_42_02cc30b2 a_42_02cc30b2

      Gruß
    • fredred schrieb:

      Wie kommst Du auf die Slave - Adresse H70?
      Die Adresse ist frei wählbar. Wenn du also schon einen anderen Slave mit dieser Adresse hast musst du eine andere für den AVR nehmen.

      fredred schrieb:

      Der Slave kann doch mit $lib "i2c_twi.lib" und I2crbyte lesen.
      Das muss ich mir heute Abend mal anschauen, wenn ich wieder an meinem Rechner bin :)
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Michael schrieb:

      nein, das kann nur der Master.
      Komisch wo bekommt er die Anzeigen her. Nahm immer an, dass in einem Bussystem der Master nur bestimmt, welcher Slave sich äußern darf und die anderen müssen schweigen.

      djmsc schrieb:

      Die Adresse ist frei wählbar. Wenn du also schon einen anderen Slave mit dieser Adresse hast musst du eine andere für den AVR nehmen.

      Fragen beantwortet.
      Hatte diese „Config Twislave = &H70 , Btr = 2 , Bitrate = 100000” übersehen.

      Twislave ist Bytes für slave address. Diese Variable seht in der Lib "i2c_twi-slave.lbx".
      Also bei ein Bussystem mit mehreren Teilnehmern bitte darauf hinweisen das diese Adresse nicht schon belegt ist.
      Kann natürlich sein diese Lbx ist falsch bezeichnet(I2C) passt nicht mehr so richtig da Lbx nur die festgelegte Adresse akzeptiert. Dann kann man wohl nicht mehr von einem Bussystem sprechen. Schau mal in Lib was Sache ist.

      Mit deiner Idee hast Du mich aber auf die Sprünge geholfen wie ich in der Standart "i2c_twi.lib" auch virtuelle Adressen (muss ja keine Chipaddresse sein) auf den Bus knallen kann.
      Meine Vision als letzte Busabfrage schreibe ich die virtuelle Adressen in Register Cbr R17 und schiebe diese mit Cpi zum Master usw.

      Gruß

      PS. Interessenhalber. Von wem ist die $lib "i2c_twi-slave.lbx"
    • fredred schrieb:

      Komisch wo bekommt er die Anzeigen her. Nahm immer an, dass in einem Bussystem der Master nur bestimmt, welcher Slave sich äußern darf und die anderen müssen schweigen.
      I2C ist ein Bus, bei dem nur der Master agiert, der Slave führt keine Kommandos aus, sondern reagiert mit einem Interrupt, wenn ein Byte da ist (ähnlich Uart)
      Der Master (und nur der) gibt Adressen und Takt vor, nur er kann Schreib oder Lesebefehle ausführen.

      fredred schrieb:

      Also bei ein Bussystem mit mehreren Teilnehmern bitte darauf hinweisen das diese Adresse nicht schon belegt ist
      Der Adressraum bei I2C ist sehr beschränkt, du kannst davon ausgehen, dass jede Adresse bereits belegt ist.
      Im Code war auch nichts von anderen Slaves zu sehen, dass man hier einen Konflikt befürchten muss.
      Vielleicht können wir das im Hauptforum weiter besprechen, das hier ist ja eigentlich der Bereich für Codeschnipsel ;)


      fredred schrieb:

      PS. Interessenhalber. Von wem ist die $lib "i2c_twi-slave.lbx"
      Von MCS selbst, das ist eine kostenpflichtige Bascom-Erweiterung.
    • Na hatte ich doch geschrieben, dass der Master der Chef ist und sagt welcher Slave was machen darf(Befehle) aber Slave kann lesen oder schreiben.........
      Wenn eine alternative zu Uart ,wie hier gezeigt ist, sollte doch erlaubt sein darüber zu diskutieren.

      Michael schrieb:

      Der Adressraum bei I2C ist sehr beschränkt, du kannst davon ausgehen, dass jede Adresse bereits belegt ist.

      Das bei Bascom der Adressraum (Standart) auf 128 begrenzt ist, ist mir auch bekannt. Kann mir aber nicht vorstellen das diese für uns Anwender nicht ausreichend sind.
      Kann dir aber auch eine Lösung liefern mit X mehr Adressen.


      Michael schrieb:

      Im Code war auch nichts von anderen Slaves zu sehen, dass man hier einen Konflikt befürchten muss.
      Richtig.

      Michael schrieb:

      Vielleicht können wir das im Hauptforum weiter besprechen, das hier ist ja eigentlich der Bereich für Codeschnipsel

      Für mich war es ein alternativer Lösungsvorschlag der im Ansatz völlig okay ist.
      Wenn TO es wünscht „ich soll hier zum Thema das Maul halten“ dann soll er es bitte vermitteln.
      Aber vielleicht findest Du ein Regelverstoß und kannst mich aussperren. a_41_9c830c38
    • fredred schrieb:

      Für mich war es ein alternativer Lösungsvorschlag der im Ansatz völlig okay ist.
      Wenn TO es wünscht „ich soll hier zum Thema das Maul halten“ dann soll er es bitte vermitteln.
      Aber vielleicht findest Du ein Regelverstoß und kannst mich aussperren. a_41_9c830c38
      Och, habt Euch doch wieder lieb trinkende-smileys-200
      Heisenberg bei einer Radarkontrolle:
      Polizist: "Wissen Sie, wie schnell Sie waren?"
      Heisenberg: "Nein. Aber ich weiß genau, wo ich jetzt bin!"

    • Hallo djmsc,

      dein Hinweis Kontroller mit HW TWI zu verbinden ist Goldstaub für mich.
      Hatte es bis Dato immer mitUart oder/und SPI eine Verbindung realisiert.
      Seit gestern läuft ein Test fehlerfrei.
      Master ein Mega 6884p und 2 Mega 8L als Slave am Bus.
      Master mit $lib "i2c_twi.lib" und die Slave mit direktem setzen der TWI- Register.

      Beispiel für ini:
      Slaveadresse setzen MC1Twar = &H80
      Slaveadresse setzen MC2Twar = &H90
      TWI aktivieren und ACK einschalten Twcr = &B01000100
      usw.
      Hoffe sehr kurze Info passt noch zum Thema.

      Nebensächliche Info:
      Da ich hier im Bascom- Forum leider immer wieder Rüffel bekomme.
      „Passt nicht“, „erst denken dann schreiben“, „gute Rechtschreibung u. Grammatik ist ein muss für Kommentare“, „ deine lockere u. witzige Schreibweise passt nicht ins Forum“ ach und was nicht alles.
      Fühle mich hier von einzelne „Superstars“ einfach gemoppt.

      Trotz Alter und schon etwas senil ist/wahr es mein Lieblings Forum auf diesem Gebiet.(bewusst "–" in Namen gesetzt)

      Naja

      If Du Alt And Krank Then
      Print “mach dich in die Kiste und belästige uns nicht”
      Else
      Print „ Maul halten reicht erst mal“
      End IF

      Mit freundlichen Grüßen
      Der witzige aber auch zynische Baubudenrülps
      Fredred
      Mach ich selber :thumbdown: :thumbdown: könnt noch ein übleren anhängen.