Verständnisfrage: ATtiny != 85 und DS3232 (wire.h)

Hallo an alle,

um sicher zu gehen, dass ich wirklich nichts übersehen habe; ist es richtig, dass es keine richtige Wire Lib für die ATtiny Familie gibt? Ich sehe immer nur, dass es irgendwie möglich ist mit den ATtiny85 (TinyWire). Gerne würde ich nämlich einen ATtiny2313 mit einer DS3232 sprechen lassen, aber als ich meinen Code von einem Uno auf den 2313 kompilieren lassen wollte, haut mir der Kompiler immer die eingebunde Wire.h Bibliothek um die Ohren, so dass ich mich auf die Suche begeben habe. ...leider ohne eine Lösung für mein Problem zu finden. Ich bin auch verwundert, da der 2313 ja SDA und SCL Pins besitzt.

Könnt ihr mich bitte etwas aufklären?

Danke schon einmal!

Dann hast du vermutlich nicht ins Datenblatt des Attinys geschaut. Bin mir bei dem 2313 nicht sicher, aber alle mir bekannten ATtiny (einschließlich 841) haben keinen TWI Master. Und somit geht das auch nicht mit Hardware I2C.

Die ATtinys haben eine USI Schnittelle (Univeral Serial Interface) die man wahlweise als I2C oder SPI verwenden kann.

Softwareseitig gibt TinyWireM for Master und TinyWireS für Slaves:

Die Libraries muss man dann entsprechend anpassen. Entweder man erstellt sich eine komplett andere Version für den ATtiny oder man macht es per Compile-Schalter umschaltbar, oder man erkennt automatisch ob ein ATtiny vorhanden ist und verwendet dann gleich TinyWireM

Wenn Du bis zum WE Geduld hast, probiere ich das mit ATtiny 4313 (=2313 mit mehr Speicher) und DS3231 aus.

danke für die schnellen Antworten. Geduld habe ich bis zum WE. Werde bis dahin auch mal probieren, ob ich es irgendwie "hinbiegen" kann. Melde mich auf jeden Fall dann nochmal.

Stop. Die meiste Arbeit ist schon gemacht! Man muss nur die richtige Library verwenden: https://github.com/JChristensen/DS3232RTC

Die ist schon für die kleineren Tinys vorbereitet. Siehe DS3232RTC.cpp:

#if defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)

Da fügt man noch den ATtiny2313 ein und gut ist :)

Benötigt aber noch die Time Library!

perfekt, nach dem Hinzufügen kann ich nun kompilieren, aber leider nicht testen, da ich Probleme habe mit dem Visual Micro Tool für Visual Studio den Sketch zu uploaden. Mit dem Arduino Uno kann ich diverse Beispiel-Sketche uploaden, aber VS meldet immer: Uploading to I/O board using 'Arduino as ISP' Error during upload using programmer avrdude: ERROR: address 0x0810 out of range at line 129 of C:\Users\chris\AppData\Local\V.Micro\Arduino\Builds\BinrUhr\attiny2313at1/BinrUhr.hex avrdude: read from file 'C:\Users\chris\AppData\Local\V.Micro\Arduino\Builds\BinrUhr\attiny2313at1/BinrUhr.hex' failed

The uploader returned an error

In Zeile 129 steh: :100800008083DF91CF911F910F9108958AE690E048 ... kann ich nicht wirklich viel damit anfangen. Ich könnte zu Not den Code ins die Arduino IDE hacken, aber das Arbeiten mit VS macht da schon mehr Spaß.

Habt ihr zufällig ähnliche Problem schon einmal gehabt bzw lösen können?

Kann es sein dass du nicht genug Speicher hast? Da ist der 2313 etwas schwach. Nur 2kB Flash

da muss ich heute Abend noch einmal genauer nachschauen, ob ich da was optimieren kann. 97% vom Flash werden benutzt, wird mir angegeben. Also noch 3% Luft?! schon hart an der Grenze (=dünne Luft)? Dachte aber, dass man aber ohne Probleme an die 99% gehen könnte...

address 0x0810 out of range

Dagegen kann man nichts sagen, 2kB ist nun mal nur der Bereich (0 .. 0x7FF)

In Zeile 129 steh: :100800008083DF91CF911F910F9108958AE690E048

Das beschreibt 16 Byte ( hex 10) , die ab Adresse 0800 zu laden sein sollen...

Fragt sich, woher die Berechnung der 97% kommt ? Und wie die IDE das schafft ...

Du könntest versuchen auf alle Libs außer TinyWireM zu verzichten und die RTC per Hand auszulesen. Das spart wahrscheinlich ein paar Bytes.

ok, ihr hattet Recht. Der Sketch ist zu groß. ...leider auch für einen 4313 : Minimum Memory Usage: 255 bytes (100% of a 256 byte maximum) Das ist natürlich ärgerlich...

Und zwar habe ich die DCF77 und DS3232RTC eingebunden, die den Speicher zum platzen bringen.

Dann muss ich doch wohl auf einen Mega umsteigen.

Danke trotzdem für eure Hilfe!

Versuchsaufbau: Ein ATtiny4313 steuert ein LCD an, damit dort die Zeit angezeigt werden kann. Dieser ATtiny4313 erhält die Daten zeichenweise als I2C-Slave. (Zur Frage in #0: SDA und SCL machen also Sinn!)

Auf einem ATtiny85 als I2C-Master läuft ein Programm, das die Uhrzeit von einem DS3231-Platinchen mittels I2C holt und an den ATtiny4313 weiterschickt, damit dieser die Uhrzeit auf dem LCD darstellt.

Dieser Versuchsaufbau funktioniert :)

Aber der Sketch passt nicht auf einen ATtiny2313 (Ausgabe IDE 1.5.8):

Der Sketch verwendet 3.422 Bytes (41%) des Programmspeicherplatzes. Das Maximum sind 8.192 Bytes. Globale Variablen verwenden 123 Bytes (24%) des dynamischen Speichers, 389 Bytes für lokale Variablen verbleiben. Das Maximum sind 512 Bytes.

Desweiteren ist es mir bisher nicht gelungen, einen zweiten ATtiny4313 als Master zu verwenden. Dieses Problem habe ich dann erstmal zurückgestellt und durch Verwendung des ATtiny umgangen.

Ich hoffe, diese Angaben helfen Dir irgendwie.

d.h. du hast die RTC an PB0 und PB2 gehängt? PB0 ist ja auch der Interrupt PIN?! Ich bin jetzt noch am überlegen, ob es ginge einen ATtiny85 für mein Projekt zu verwenden. Da habe ich noch keine Erfahrung: ich müsste eine RTC, ein DFC77 Empfänger und noch ein Shiftregister 74HC595 dranhängen. Irgendwo habe ich mal gelesen, dass man auch den RST Pin als digitalen Ausgang nehmen kann. Der DCF77 Bibliothek baut auf den Interrupt aus, an dem auch die RTC dann hängen würde.

Was meint ihr, wäre das machbar?

PS: Ist schon amüsant, dass so ein kleiner 85 den großen 4313 was vormacht -> Minimum Memory Usage: 252 bytes (49% of a 512 byte maximum) bei dem 85er

Du musst Flash und RAM unterscheiden. Das sind zwei verschiedene Dinge.

syntec: d.h. du hast die RTC an PB0 und PB2 gehängt?

Stimmt, PB0=SDA und PB2=SCL.

syntec: ... ein Shiftregister 74HC595 ...

Ginge auch MCP23017 (I2C mit 16 I/Os)? Geht die DCF77 Bibliothek auch mit externem Interrupt? Kenne ich mich leider nicht mit aus. Oder einen 4313 als I2C-Slave mit DCF77 Bibliothek. Oder eben doch einen Mini, Micro oder wie die heißen ...

ich werde es mit eine Mega328 machen. Den Platz und die paar Cents habe ich zum Glück noch da.

Danke!

I2C ist und bleibt nur Slave Mode. Soll heißen, er kann das ganze nur in Software lösen. Zum Schieberegister, entweder das 595 oder aber ein MCP23S17. SPI in Software sollte deutlich weniger auftragen.

Der 2313/4313 arbeitet auch als USI/I2C Master sowie ich das sehe. Der 2313 ist in TinyWireM explizit unterstützt und Master Mode wird auch im Datenblatt erwähnt.

Es ist der 841 der der nur als I2C Slave arbeitet