Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C-Slave mit einem AVR programmieren
BlueNature
23.03.2005, 15:52
Hallo!
Es geht um die Programmierung eines AVR's der Reihe M8. Es gibt eine Library um einen AVR als I2C-Slave zu benutzen. Normal ist ja nur I2C-Master üblich. Das eigentliche Problem besteht darin das diese Library zum einen extrem Rechenzeit frisst was aber nicht so wild ist. zum andern geht es nur auf INT0 und T0 des AVR's. Die beiden Hardware-Interrupts (INT0 und INT1) sowie die beiden PWM-Out und alle drei Timer sind voll ausgelastet. Gibt es irgend eine Möglichkeit den AVR in seinem Hardware-I2C so zu verbiegen das er auf den TWI-Pins (I2C-Pins PortD.4 und PortD.5) auch einen Slave nachbilden kann? Wenn jemand einen Tip hat oder eine Methode kennt wäre ich sehr dankbar wenn er diesen posten würde.
Grüße Wolfgang
klar geht das, wie das mit TWI-Slave unter Bascom (programmierst du damit?) geht, also obs da spezielle Funktionen gibt, weiß ich nicht, aber du kannst die Register ja seperat beschreiben oder Assembler verwenden
wie das programmiert werden muss, steht im Datenblatt oder in verschiedenen Threads hier im Forum, in "Fragen zu TWI"(oder so ähnlich) hab ich mal Code dazu gepostet, ist zwar in C, aber leicht in Assembler o.ä. übertragbar
BlueNature
23.03.2005, 19:50
Das mit TWI-Slave ist mir klar. Darum werde ich nicht direkt herumkommen. Mit Registern direkt schreiben habe ich auch kein Problem. Das geht mit BASCOM ohne Probleme. Im Forum habe ich jetzt nochmal gesucht und auch mal alle deine Themen dazu gelesen. Das was eigentlich mein Problem ist ist aber da nirgends geschrieben worden. Im Vektor-Bereich des AVR gibt es ja einen Vektor als Interruptvektor der mir bei TWI auslöst. Diesen zu verwenden schweigt sich allerdings BASCOM auch in der Hilfe etwas aus.
Zum I2C-Protokoll kann ich nur einfach sagen das der I2CRecive nicht geeignet sein wird um ein Slave zu realisieren. Das sit meiner Ansicht nach ein voller MAster-I2C-Befehl. Also wird zuerst die Adresse gesendet auf der dan ein Slave antworten soll. D.h. wenn ich das so machen würde hätte ich zum einen zwei Master am Bus was sicher nicht gut ist und zum andern habe ich das Problem das mir der Slave im Moment in dem er angesprochen wird plötzlich seine Adresse mitteilen will. Also ist es ein Master-Befehl wie er z.B. zur Abfrage eines Kompasswerts von einem CMPS03 verwendet werden kann. Bin nun irgendwie total verwirrt und seh gar keine Lösungsmöglichkeit mehr für einen I2C-Slave.
Grüße Wolfgang
Nachtrag:
Ich habe mir nun einmal das Datenblatt von ATMEL geladen "ATMEGA8 und ATMEGA8L" und ab Seite 159 bis Seite 187 ist die genaue Beschreibung der internen Register. Dort wird auf Seite 159 ausdrücklich eine Slace-Unterstützung mit einem hardwareseitignen Adressvergleich angegeben. Die CPU-Clock muß nur ca. 16 mal höher sein wie die Baud/Clockrate auf dem I2C-Bus. Also bei 100kHz wären dies minimal 1,6MHz was selbst mit dem Standard 3,68MHz-Quarz zu schaffen ist.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.