I2C und Tiny

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • I2C und Tiny

      New

      "Fakt"

      habe mir eine Rutine geschrieben die einen Sensor über I2C ausliest, funktioniert auch gut.

      Nun der "Fakt",

      Zum "Programmschreiben" habe ich einen Mega 328 genommen, letztendlich soll aber ein Tiny4313 rein (verwendbare Platine ist vorhanden), nun aber stellt sich raus das der keine I2C mag, also mein kleines Programm da nicht läuft.

      Gibt es für solche Fälle einen Softwaretreiber der das nachbildet? (im Netz habe ich was gefunden aber da blicke ich nicht so richtig durch)

      Kurt


      .
    • New

      Michael wrote:

      Software TWI?
      Wenn du dein Programm geschrieben hast, dann hast du HW TWI benutzt?
      Dann weißt du doch, wie es geht.

      Mir ist, ehrlich gesagt, nicht klar ob ich hier die HW-Pins des Prozessors oder SW-gesetze Pins anspreche/benutze.

      -----------------------
      $regfile = "M328pdef.dat"
      $crystal = 16000000
      $baud = 9600
      $hwstack = 100
      $swstack = 100
      $framesize = 100

      Config Sda = Portc.4 ' I2C Data.
      Config Scl = Portc.5 ' I2C Clock.
      Config I2cdelay = 10 ' 10 ' Geschwindigkeit des I2C-Bus
      ---------------------
      Jedenfalls geht es damit.

      Und mit dem hier eben nicht.
      ----------------------
      $regfile = "Attiny4313.dat"
      $crystal = 4194304
      $baud = 57600
      $noramclear ' Variablen behalten

      Config Sda = Portb.2 ' I2C Data.
      Config Scl = Portb.3 ' I2C Clock.
      Config I2cdelay = 50 ' 10 ' Geschwindigkeit des I2C-Bus
      -----------------------

      Gelesen habe ich viel, aber es wird mir immer unklarer.
      Manche schreiben das es mit den Tinys nicht geht, andere schreiben es geht.

      Pluto25 schreibt:

      Der Tinny hat ein HW-Usi das macht auch I2C . Da müßte der Code angepasst werden. Andre Pins andere Lib.


      USI? ist das nur eine andere Bezeichnung/"Patent" für den i2c?

      Welche Lib wäre denn da notwendig?


      Kurt
    • New

      Ich glaube, wenn man noch nicht so die Erfahrung mit I2C hat,
      ist es besser die Software-I2C die Bascom schon mitliefert zu benutzen anstelle den USI zu konfigurieren.

      Für Soft-I2C wird keine extra Lib (für Master) eingebunden. Beispiel müsste es in der Bascom-Hilfe geben.

      Wissen sollte man auch, dass der I2C-Clock 100kHz hat. Modernere IC machen auch 400kHz Takt. Manche ICs können noch mehr. Da muss man im Datenblatt schauen. Der langsamste Baustein bestimmt die höchste Taktrate.

      Man kann aber auch erst mal mit 100kHz anfangen, das können alle Slaves, und wenn die Software läuft, den Takt auf 400kHz oder höher setzen. Gehts nicht mehr, ist der Takt zu hoch. Aber typischerweise sollte 400kHz noch gehen.

      Bei der Software-I2C muss man außerdem auch den Delay richtig einstellen. In der Bascom-Hilfe steht meines Wissens ein Hinweis, wie die Angabe Delay mit dem resultierenden Takt zusammen hängt. Das wird man dann per 3-Satz umrechnen müssen.

      Es ist außerdem wichtig zu wissen, mit welchem Takt der Controller läuft. Hierzu die Fuseeinstellung kontrollieren (Clock divided by 8). Davon hängt die Einstellung beim Delay ab.

      Bei Soft-SPI kann man sich jeden freien Pin für SDA und SCL aussuchen. Diese müssen dann in der Config SDA etc. angegeben werden. PullUps nicht vergessen (ca. 1k bis 4k7). Dann muss die Clockeinstellung folgen (Delay).

      In der Bascomhilfe steht unter "Config I2CDelay" folgendes:
      Display Spoiler

      For the I2C routines the clock rate is calculated depending on the used crystal. In order to make it work for all I2C devices the slow mode is used. When you have faster I2C devices you can specify a low value.

      By default a value of 5 is used. This will give a 200 kHZ clock.
      When you specify 10, 10 uS will be used resulting in a 100 KHz clock.



      Dort ist auch das Beispiel für Software-SPI zu finden.
      Kaum macht man es richtig - und schon geht's!
    • New

      Michael wrote:

      Das ist sicher nicht das ganze Programm, Ich vermisse z.B. i2cinit.
      Es geht nicht ist nicht hilfreich.
      Pullups hast du dran an deinem Board?
      Es sind 2k2 gegen die + vorhanden

      In der Version mit dem 328 ist kein I2cinit dabei, es geht mit und ohne.
      Allerdings ist da noch eine LC-Anzeige dran.
      Initialisiert mit:

      Config Lcd = 16 * 2
      Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portb.1 , Rs = Portb.0

      Ob die Pins beim 4313 überhaupt geschaltet werden weiss ich nicht nicht, da muss erst der Oszi dran damit ich es sehen kann.
      ich habe mir so beholfen das ich eine Softser eingerichtet habe und damit konnte ich sehen wieweit er überhaupt kommt.


      Enable Interrupts

      Open "COMD.2:1200,8,n,1" For Output As #1 'Soft ser zu Kontrollausgabe




      Ups, mir kommt da grad ein Verdacht.
      ------------------------
      ' Port's : PortA (3) PortB (8) PortD (7)
      ' PortA
      ' 5 PA.0 = XTAL 1
      ' 4 PA.1 = XTAL 2
      ' 1 PA.2 = /RESET dW

      ' PortB
      ' 12 PB.0 = Ain0 PCINT0
      ' 13 PB.1 = Ain1 PCINT1
      ' 14 PB.2 = OC0A PCINT2
      ' 15 PB.3 = OC1A PCINT3
      ' 16 PB.4 = OC1B PCINT4
      ' 17 PB.5 = MOSI DI SDA PCINT5
      ' 18 PB.6 = MISO DA PCINT6
      ' 19 PB.7 = UCSK SCK PCINT7

      ' PortD
      ' 2 PD.0 = RXD
      ' 3 PD.1 = TXD
      ' 6 PD.2 = CKOUT XCK INT0
      ' 7 PD.3 = INT1
      ' 8 PD.4 = T0
      ' 9 PD.5 = OC0B
      ' 11 PD.6 = ICP
      ' 20 VCC
      ' 10 GND
      --------------------------

      Kann es sein das ich die falschen Pins verwende?

      Beim 328 habe ich zufällig die Pins Analog4 und Analog5 erwische, diese sind auch mit:
      PC4 ADC4 SDA [A4] wie 16
      PC5 ADC5 SCL [A5] wie 17
      bezeichnet, und da läufts.

      Beim 4313 sind es die Pins die auch für den Proger verwendet werden!
      Muss ich ev. erst das Programm laden und dann den i2c über diese Pins benutzen?
      ' 17 PB.5 = MOSI DI SDA PCINT5 <<< SDA
      ' 18 PB.6 = MISO DA PCINT6
      ' 19 PB.7 = UCSK SCK PCINT7 <<< SCK

      Werds mal probieren, muss aber vorher erst den Lötkoben anwerfen.


      Kurt
    • New

      Kurt wrote:

      Beim 4313 sind es die Pins die auch für den Proger verwendet werden!
      Muss ich ev. erst das Programm laden und dann den i2c über diese Pins benutzen?
      ' 17 PB.5 = MOSI DI SDA PCINT5 <<< SDA
      ' 18 PB.6 = MISO DA PCINT6
      ' 19 PB.7 = UCSK SCK PCINT7 <<< SCK

      Werds mal probieren, muss aber vorher erst den Lötkoben anwerfen.


      Jetzt schauts schon wesentlich besser aus.
      Das Programm läuft durch, die Pins werden auch gesetzt und es kommt ein ERR = 0

      Der Rest ist nun Arbeit und schauen das die Daten richtig gelesen werden.

      Danke für die Hilfe

      Kurt
    • New

      Kurt wrote:

      Michael wrote:

      Das ist sicher nicht das ganze Programm, Ich vermisse z.B. i2cinit.
      Es geht nicht ist nicht hilfreich.
      Pullups hast du dran an deinem Board?
      Es sind 2k2 gegen die + vorhanden
      In der Version mit dem 328 ist kein I2cinit dabei, es geht mit und ohne.
      Allerdings ist da noch eine LC-Anzeige dran.
      Initialisiert mit:

      Config Lcd = 16 * 2
      Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portb.1 , Rs = Portb.0

      Ob die Pins beim 4313 überhaupt geschaltet werden weiss ich nicht nicht, da muss erst der Oszi dran damit ich es sehen kann.
      ich habe mir so beholfen das ich eine Softser eingerichtet habe und damit konnte ich sehen wieweit er überhaupt kommt.


      Enable Interrupts

      Open "COMD.2:1200,8,n,1" For Output As #1 'Soft ser zu Kontrollausgabe




      Ups, mir kommt da grad ein Verdacht.
      ------------------------
      ' Port's : PortA (3) PortB (8) PortD (7)
      ' PortA
      ' 5 PA.0 = XTAL 1
      ' 4 PA.1 = XTAL 2
      ' 1 PA.2 = /RESET dW

      ' PortB
      ' 12 PB.0 = Ain0 PCINT0
      ' 13 PB.1 = Ain1 PCINT1
      ' 14 PB.2 = OC0A PCINT2
      ' 15 PB.3 = OC1A PCINT3
      ' 16 PB.4 = OC1B PCINT4
      ' 17 PB.5 = MOSI DI SDA PCINT5
      ' 18 PB.6 = MISO DA PCINT6
      ' 19 PB.7 = UCSK SCK PCINT7

      ' PortD
      ' 2 PD.0 = RXD
      ' 3 PD.1 = TXD
      ' 6 PD.2 = CKOUT XCK INT0
      ' 7 PD.3 = INT1
      ' 8 PD.4 = T0
      ' 9 PD.5 = OC0B
      ' 11 PD.6 = ICP
      ' 20 VCC
      ' 10 GND
      --------------------------

      Kann es sein das ich die falschen Pins verwende?

      Beim 328 habe ich zufällig die Pins Analog4 und Analog5 erwische, diese sind auch mit:
      PC4 ADC4 SDA [A4] wie 16
      PC5 ADC5 SCL [A5] wie 17
      bezeichnet, und da läufts.

      Beim 4313 sind es die Pins die auch für den Proger verwendet werden!
      Muss ich ev. erst das Programm laden und dann den i2c über diese Pins benutzen?
      ' 17 PB.5 = MOSI DI SDA PCINT5 <<< SDA
      ' 18 PB.6 = MISO DA PCINT6
      ' 19 PB.7 = UCSK SCK PCINT7 <<< SCK

      Werds mal probieren, muss aber vorher erst den Lötkoben anwerfen.


      Kurt
      Habe ich berteits im Thread 7 beschrieben.
    • New

      @Kurt USI = Universelles Seriell Interface . Es ist hardwareseitig im chip verbaut und in der Lage verschiedene Serielle Datenübertragungen zu bewältigen. ( RS232,485,I2c(=TWI),One-Wire und nätürlich SPI) Da es so universell ist hat es andere Register als z.B. der Hardware I2C. Daher auch die andere lib.
      Da ist Bascom etwas "schwammig".
      Dein 328 funktionierte mit den HW-Pins ohne die Zeile "$lib "i2c_twi.lbx" was vermuten läßt das es die Software Lösung compiliert. Womit die Pins beliebig sein könnten. Keine Fehlermeldung bei Config I2Cdelay=10 bestätigt die Annahme. Es wird nur bei SW-I2c verwendent , Bei HW wäre es Config TWi=100000.
      Eigendlich hätte das mit dem Tiny funktionieren sollen. Um so erstaunlicher das es mit den anderen Pins geht (ohne andere Änderungen?)
      Ein "config usi = twimaster , mode = normal" oder "lib=i2c_usi.lib" würde die Hardware ansprechen.
      Das I2cinit gehört zum "guten Ton" ist aber nur dann wirklich nötig wenn die Pin Configuration (DDR/PORT) nicht stimmt wenn z.B. die Pins noch für was anderes benutzt werden.
    • New

      Pluto25 wrote:

      @Kurt USI = Universelles Seriell Interface . Es ist hardwareseitig im chip verbaut und in der Lage verschiedene Serielle Datenübertragungen zu bewältigen. ( RS232,485,I2c(=TWI),One-Wire und nätürlich SPI) Da es so universell ist hat es andere Register als z.B. der Hardware I2C. Daher auch die andere lib.
      Da ist Bascom etwas "schwammig".

      Kurze Rückmeldung.

      Inzwischen läuft die I2C sauber und gut, der Hinweis das es sich um ein "USI" handelt und die entsprechenden Pins zu benutzen sind hat mir sehr geholfen.
      Man liest das zwar so nebenbei in einer Beschreibung aber die Konsequenzen werden einem erst klar wenn man sich damit real befasst.

      Die "seriell" habe ich so gelöst das der Empfänger die HW-Schnittstelle benutzt, der Sender eine SW.
      Grund ist der das auf der gleichen Leitung auch noch ein Schalter erkannt werden muss.
      Den Pin kann ich zwischendurch auf Input schalten, den Schalter lesen, und dann wieder mit der Ser-Ausgabe weitermachen.

      Kurt

      .
    • New

      Den Schutzwiderstand am Schalter nicht vergessen. Sonst wird die Ausgangsstufe sehr belastet wenn jemand schaltet während er gerade spricht.
      PS Das Umschalten würde auch mit bei der HW-Lösung gehen. Was aber keinen spürbaren Unterschied macht da der Print Befehl immer erst zuende ausgeführt wird bevor es weitergeht.