budo's Web
Hier findet ihr einiges zu meinen Hobbies

I2c-to-ADC-bridge

Inspiriert durch die Verwendung des I2C-to-1-wire-bridge beim Sensor Ersatz der Wetterstation habe ich mich entschlossen eine I2C-to-ADC-bridge zu bauen, mit der man analoge Sensoren, wie z.B. Lichtsensoren (LDR oder Fotodioden), über den I2C Bus an längere Leitungen hängen kann. Geplant war eine Schaltung basierend auf einem ATtiny 45/85 und die Verwendung dessen ADC Kanäle als Alternative zu einem I2C-ADC Baustein. Bei der Suche nach Information zur ATtiny I2C Library stellte ich dann fest, dass es genau dies schon gibt (TinyWireSlave Library mit Beispiel I2C_analog von Rambo). Im nachfolgenden beschränke ich mich somit auf die Erläuterung des Zusammenspiels zwischen einem I2C-Master und einem I2C-Slave am Beispiel der Slave Software von Rambo.

Das Beispielprogramm von Rambo für den I2C Slave (ATtiny) beinhaltet Interrupt-Routinen für requestEvent und receiveEvent und das Hauptprogramm (loop). Der Zugriff vom Master erfolgt über das Lesen und Schreiben von 4 Registern, 0 = Statusregister, 1 = Average-Register, 2 = LSB Register und 3 = MSB Register. Der ADC Vorgang wird über das Schreiben der Registernummer und eines "conversion start flags" ins Status-Register gestartet. Der ADC Vorgang ist beendet, wenn im Statusregister nur noch die Registernummer steht. Ein ADC Vorgang dauert bei einem ATtiny85 bei 8 MHz maximal 3.2 µs. Die Variablen, die dem Datenaustausch zwischen Interruptroutinen und Hauptprogramm dienen, sind als VOLATILE deklariert. Die Interruptroutinen setzen nur Flags, der ADC-Vorgang erfolgt im zeitunabhängigen Hauptprogramm.

ATtiny 45/85 Pinbelegung

Für eine Arduino-Programmierung ist die Arduino-Pinbezeichnung der digital und der analogen Inputs/Outputs, und die Definition der Mehrfachbelegung der einzelnen Pins erforderlich. Die wesentlichen Bezeichnungen / Funktionen kann man der nachfolgenden Skizze entnehmen.

pin

Das heißt für unseren Aufbau:

- A0 ist wegen RST nicht verfügbar, oder der Baustein ist nur noch mit HV Programmer programmierbar.
- A1 ist wegen I2C-SCL nicht verfügbar

Stromlaufplan

str

I2C-to-ADC-bridge

Bilder existieren keine, da ein fester Aufbau nicht erfolgte. Ein I2C-ADC Baustein bietet eine höhere Auflösung bei noch kleinerem Formfaktor.

Software

Bei der Software des Masters, der den Slave mit I2C-to-ADC-bridge steuert, ist zu berücksichtigen, dass vor dem Lesen oder Schreiben das entsprechende Register gesetzt wird und dass der Slave automatisch die Registernummer weiterzählt. D.h., es kann ein oder mehrere aufeinander folgende Register gelesen oder geschrieben werden, wobei das Schreiben des Average-Registers nach dem Schreiben des Status-Registers, das den ADC-Vorgang auslöst, keinen Sinn macht.

Nachfolgendes Zeitdiagramm, mit einem busPirate aufgezeichnet und mit OpenLogicSniffer Software dargestellt, zeigt den typischen Ablauf. Die zugehörigen Sequenzen sind
begin(adr) - write(Registernummer) - write (Statusregister) - end
begin - write(Registernummer) -end - requestfrom(adr, 4x) - read - read - read - read.

la

I2C-to-ADC-bridge Ansteuerung, busPirate/OpenLogicSniffer Diagramm. OpenLogicSniffer Lizenz GNU GENERAL PUBLIC

Die obigen Sequenzen werden im Slave wie folgt bearbeitet:
- receiveEvent löst in Abhängigkeit der Registernummer und des internen Status einen ADC-Vorgang aus.
- loop führt den ADC-Vorgang für den entsprechenden Kanal aus und schreibt das Ergebnis in die entsprechende Register.
- requestEvent sendet den Inhalt eines Registers zurück.

Auf ein delay zwischen den Sequenzen zum Starten des ADC und des Auslesens des ADC bezüglich der ADC-Konvertierungszeit (min. 1.6 µs) wurde verzichtet (1 Takt bei 100 kHz = 10 µs, bei 400 kHz = 2.5 µs).

Nach Oben