STM8 10-Bit Wandler ADC1


Die Konfigurations-Register

Alle bisher besprochenen ADC1 Register befinden sich in einem fortlaufenden Adressbereich und sind wie alle STM8 Register in einem einheitlichen Speicher-Adressraum („memory mapped“) untergebracht.

Die im Bild links angegebenen Adressen sind dem Datenblatt des STM8S105 entnommen und können gegebenenfalls bei anderen Varianten unterschiedlich sein.

Die High-Byte Register ADC1_AWSRH und ADC1_AWCRH sind in Varianten ohne AIN8 und AIN9 Analogeingängen nicht verfügbar, da in diesem Fall die entsprechenden Low-Byte Register für die verbleibenden 8 Analog-Eingänge ausreichen. In diesen Registern steht jedes Bit entsprechend für einen Kanal.

Im ADC2 Block der in manchen STM8 Typen als zusätzlicher ADC implementiert wurde ist der „Analog Watchdog“ nicht vorhanden, d. h. auch die entsprechenden Watchdog Register sind nicht relevant.

Die Funktion des Wandlers wird durch die Konfigurations Register ADC_CR1, ADC_CR2, ADC_CR3 und ADC_CSR definiert.

 

Das ADC Control Status Register (ADC_CSR)

Wie bereits besprochen beinhaltet das ADC_CSR die Bits zur Auswahl des Messkanals.

ADC_CSR Register - ADC Control Status Register                                                                        (0x00.5400h im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_CSR EOC AWD EOCIE AWDIE CH[3] CH[2] CH[1] CH[0]

CH[3..0] – Channel Selection Bits

Die CH[3..0] Bits ermöglichen die Auswahl des Analogeingangs (siehe auch " Messkanal Auswahl" ). Der binäre 4 Bit Wert (0x"K"b) adressiert den analogen Eingang AIN_"K" .

AWDIE – Interrupt Enable Analog Watchdog

AWDIE ist die Interrupt Freigabe für den AWD Event falls dieses Bit auf „1“ gesetzt wird, anderfalls wird der Interrupt nicht ausgeführt.

EOCIE – Interrupt Freigabe „End of Conversion“-Event

Das Setzen des EOC Flags löst einen Interrupt aus wenn EOCIE gesetzt ist. EOCIE auf „0“ maskiert den Interrupt.

AWD – Analog Watchdog Flag

Dieses Bit wird gesetzt wenn die Analog Watchdog Funktion ein entsprechendes Ereignis erkennt.

EOC – End Of Conversion

Das EOC bit wurde bereits mehrfach besprochen und signalisiert das Ende einer A/D-Wandlung bzw in den Continuous Modi das Ende einer Wandlersequenz.

Das ADC Configuration Register 1 (ADC_CR1)

Das Register ADC_CR1 für den ADC1 beinhalten einen 3 Bit Wert in den Bits[6..4] des 8 Bit Registers, der einen der möglichen 8 Ausgänge des Vorteilers als Taktquelle auswählt.

ADC_CR1 Register - ADC Configuration Register 1                                                                           (0x00.5401h im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_CR1 reserved SPSEL[2] SPSEL[1] SPSEL[0] reserved reserved CONT ADON

SPSEL[2..0] – Prescaler Selection

Der Wert in diesen 3 Bits selektiert den Takt für den ADC1 Wandler nach der oben stehenden Tabelle.

CONT – Continuos Conversion

Ist das CONT Bit auf „0“ gesetzt so arbeitet der ADC in „Einzelmodus“, d.h. jeder Umsetzungsvorgang muß einzeln gestartet werden.

Ist das Bit = „1“ so arbeitet der ADC im „Continuous Modus“, also mit laufenden Umsetzungen.

ADON – ADC Wandler ON/OFF

Ist ADON = „0“ so befindet sich der Wandler im „Power Down“ und führt keine Umsetzungen durch. Erst mit dem Setzen des ADON Bits („1“) wird der ADC aktiviert, führt aber erst eine Wandlung durch wenn das ADON erneut gesetzt wird.

Wichtig: Das ADON Bit muß separat gesetzt werden ohne ein weiteres Bit des Registers zu ändern da in diesem Fall keine Aktivierung bzw. kein Start erfolgt. Damit wird ein versehentliches Starten des Wandlers vermieden.

Das ADC Configuration Register 2 (ADC_CR2)

Die externe Steuerung des Wandlers, der Scan-Modus und die Ausrichtung der Daten im Datenregister werden im ADC_CR2 festgelegt.

ADC_CR2 Register - ADC Configuration Register 2                                                                  (0x00.5402h im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_CR2 reserved EXTTRIG EXTSEL[1] EXTSEL[0] ALIGN reserved SCAN reserved

EXTTRIG – External Trigger Select

Wird das EXTTRIG Bit gesetzt so ist der ADC_ETR Pin aktiviert und eine A/D-Wandlung kann durch ein entsprechendes Hardware-Signal ausgelöst werden. Der entsprechende Pin muß allerdings als Eingang konfiguriert werden.

Wichtig: Um das EXTTRIG Bit zu setzen verwendet man vorzugsweise eine „BSET“ Befehl um fehlerhafte Aktivierung beim gleichzeitigen Ändern mehrerer Bits zu vermeiden.

EXTSEL[1..0] – External Event Selection

Diese beiden Bits ermöglichen die Auswahl eines Hardware-Signals zum Auslösen einer A/D-Umsetzung. Von den vier Möglichkeiten sind aktuell nur zwei implementiert. Daher muß das Bit EXTSEL[1] immer den Wert „0“ haben.

Externe Trigger Einstellung
EXTSEL[1..0] Wert Trigger Quelle Signal Pin
00 TIM1 TIM1_TRGO internes Signal
01 Extern Externe Hardware ADC_ETR
10 reserviert
11 reserviert

ALIGN – Data Alignment

Der Wert im ALIGN Bit legt die Ausrichtung der 10 Bit Daten in den beiden 8 Bit ADC Datenregister ADC_DRL und ADC_DRH fest, wobei zwischen „linksbündiger“ und „rechtsbündiger“ Ausrichtung gewählt werden kann.

Durch die Auswahl der Ausrichtung wird auch die Zugriffssequenz auf die beiden Register geändert. Es muß immer das Register zuerst gelesen werden das die kompletten 8 Daten Bits enthält. Dies ist speziell im Zusammenhang mit der Verwendung von STM8-Befehlen zu beachten die einen „Word“-Zugriff verwenden, da bei einem solchen Zugriff die Reihenfolge festgelegt ist.

SCAN – Scan Mode Enable

Per Software kann über das SCAN Bit der Betriebsmodus des ADC eingestellt werden der eine einstellbare Anzahl von Analog-Eingängen automatisch nacheinander abfragt und in Digitalwerte umwandelt.

Das ADC Configuration Register 3 (ADC_CR3)

Das ADC_CR3 Register beinhaltet nur zwei Bits von Belang, das Control-Bit DBUF für die Verwendung des Datenpuffers und das Flag OVR das eine Überschreiben von Daten im Puffer signalisiert.

ADC_CR3 Register - ADC Configuration Register 3                                                                    (0x00.5403h im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_CR3 DBUF OVR reserved reserved reserved reserved reserved reserved

OVR – Overrun Error Flag

Das OVRFlag wird von der Hardware gesetzt („1“) wenn ein Datum im Datenpuffer überschrieben wird, bevor dieses gelesen wurde.

DBUF – Data Buffer Enable

Per Software kann das Bit DBUF gesetzt werden um die Benutzung des Datenpuffers im Continuous Mode zu aktivieren.

Die Daten Register

Die nachfolgenden Register stellen die vom ADC ermittelten Werte für die Software zur Verfügung.

Die beiden Datenregister (ADC_DRH, ADC_DRL)

Der Wert der vom ADC ermittelten Daten wird über das ADC_DRH,ADC_DRL Registerpaar bereitgestellt und kann per Software nur gelesen werden.

ADC_DRH Register - ADC Data Register "High"                                                                            (0x00.5404h im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_DRH DR[15] DR[14] DR[13] DR[12] DR[11] DR[10] DR[9] DR[8]

ADC_DRL Register - ADC Data Register "Low"                                                                           (0x00.5405h im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_DRL DR[7] DR[6] DR[5] DR[4] DR[3] DR[2] DR[1] DR[0]

Wie unter „4.3 Das ADC Configuration Register 2 (ADC_CR2)“ beschrieben, werden die 10-Bit Werte in dem Registerpaar ( ADC_DRH/ADC_DRL) entweder linksbündig oder rechtsbündig durch das ALIGN Bit justiert.

Mit der ausgewählten Ausrichtung der Daten in den beiden Registern ändert sich auch die jeweilige Auslesesequenz. Bei linksbündiger Ausrichtung muß das MSB (höherwertige Byte) zuerst gelesen werden während bei rechtsbündiger Ausrichtung das LSB (niedigwertigere Byte) zuerst gelesen werden muß oder zur Vereinfachung, das vollständig mit Datenbits gefüllte Byte wird zuerst gelesen.

Die Schmitt Trigger Disable Register

Die Analog-Eingänge (AINi) des ADC sind über die normalen Input/Output Zellen (GPIO) mit dem Analog Multiplexer verbunden. Da die GPIO-Zellen weitere digitale Funktionen besitzen kann es wie im Falle der Eingangs-Schmitt-Trigger zu einer unnötigen Stromaufnahme der I/O-Zellen kommen, auch wenn diese Funktionalität nicht gebraucht wird. Daher wurden für das Abschalten der Schmitt-Trigger eigene Register implementiert.

Schmitt Trigger Disable Register (ADC_TDRH, ADC_TDRL)

Der Reset-Wert dieser Register ist 0x00h, damit sind alle Schmitt-Trigger nach einem Reset aktiv.

ADC_TDRH Register - ADC Schmitt Trigger Disable Register "High"                                  (0x00.5406h im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_TDRH TD[15] TD[14] TD[13] TD[12] TD[11] TD[10] TD[9] TD[8]

ADC_TDRL Register - ADC Schmitt Trigger Disable Register "Low"                                       (0x00.5407h im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_TDRL TD[7] TD[6] TD[5] TD[4] TD[3] TD[2] TD[1] TD[0]

 

Der Index der TD[i]Bits bezieht sich auf den jeweiligen Analogeingang. Es ist darauf zu achten dass diese in unterschiedlichen STM8 Varianten auch unterschiedlichen GPIOs zugeordnet sind. Die effektive Zuordnung ist dem jeweiligen Datenblatt zu entnehmen.

Durch das Setzen („1“) des jeweiligen Bits wird der Schmitt-Trigger der GPIO-Zelle die mit dem entsprechenden AIN“i“ (I/O Pin) verbunden ist, deaktiviert.

Achtung:

Mit einem deaktivierten Schmitt Trigger wird auch der „digitale“ Eingang dieses Port-Bits deaktiviert, da der Schmitt-Trigger das Signal nicht mehr weiterleitet ! Dies ist auch der Fall wenn der jeweilige GPIO-Pin nicht als Analog Eingang genutzt wird!

Die Analog Watchdog Register

Die in Kapitel „4. Die „Analoge“ Watchdog Funktion“ beschriebene Funktionalität wird durch die nachfolgenden Register gesteuert.

Das High Threshold Registerpaar (ADC_HTRH, ADC_HTRL)

Der in diese Register geladene Wert HT[9..0], stellt den oberen Schwellwert für die ADC Messwerte dar, ab dem ein AWD Event erzeugt wird.

ADC_HTRH Register - ADC High Treshold Register "High"                                                   (0x00.5408h im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_HTRH HT[9] HT[8] HT[7] HT[6] HT[5] HT[4] HT[3] HT[2]

ADC_HTRL Register - ADC High Threshold Register "Low"                                                 (0x00.5409h im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_HTRL 0 0 0 0 0 0 HT[1] HT[0]

Zu beachten: Die höherwertigeren 8 Bit des Wertes stehen im ADC_HTRHRegister und die beiden niedrigwertigen Bit stehen im ADC_HTRL Register !

Beide Register werden per Software geschrieben bzw. gelesen und haben nach einem Reset den Wert 0xFFh (für ADC_HTRH) und 0x03h (für ADC_HTRL), also den höchsten bzw. niedrigsten möglichen Wert.

Das Low Threshold Registerpaar (ADC_LTRH, ADC_LTRL)

Der in diese Register geladene Wert LT[9..0], stellt den unteren Schwellwert für die ADC Messwerte dar, ab dem ein AWD Event erzeugt wird.

ADC_LTRH Register - ADC Low Treshold Register "High"                                                     (0x00.540Ah im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_LTRH LT[9] LT[8] LT[7] LT[6] LT[5] LT[4] LT[3] LT[2]

ADC_LTRL Register - ADC Low Threshold Register "Low"                                                   (0x00.540Bh im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_LTRL 0 0 0 0 0 0 LT[1] LT[0]

Zu beachten: Die höherwertigeren 8 Bit des Wertes stehen im ADC_LTRH Register und die beiden niedrigwertigen Bit stehen im ADC_LTRL Register !

Beide Register werden per Software geschrieben bzw. gelesen und haben nach einem Reset den Wert 0x00h (für ADC_LTRH und ADC_LTRL), also den niedrigsten möglichen Wert.

Das Analog Watchdog Status Registerpaar (ADC_AWSRH, ADC_AWSRL)

Die AWS[i] Bits in den beiden Registern werden durch die Watchdog Hardware gesetzt wenn einer der beiden Schwellwerte in einem der Messkanäle [i] überschritten wird.

ADC_AWSRH Register - ADC Analog Watchdog Status Register "High"                           (0x00.540Ch im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_AWSRH "0" "0" "0" "0" "0" "0" AWS[9] AWS[8]

ADC_AWSRL Register - ADC Analog Watchdog Status Register "Low"                              (0x00.540Dh im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_AWSRL AWS[7] AWS[6] AWS[5] AWS[4] AWS[3] AWS[2] AWS[1] AWS[0]

Der Index „i“ the Status Bits entspricht jeweils dem Analogkanal der den AWS Event auslöst.

Für STM8 Varianten die nur maximal 8 Analogeingänge haben ist das Register ADC_AWSRH nicht relevant aber das Register ist vorhanden und darf in diesem Fall nicht beschrieben werden. Aber auch bei Varianten mit Analogkanälen AIN8 und AIN9 dürfen die höchstwertigen Bits[7..2] nicht verändert werden und müssen auf „0“ bleiben.

Das Analog Watchdog Control Registerpaar (ADC_AWCRH, ADC_AWCRL)

Äquivalent zu den “Status Register Bits” gibt es jeweils ein “Control Register Bit” das als Maske für dieses Register fungiert.

ADC_AWCRH Register - ADC Analog Watchdog Control Register "High"                (0x00.540Eh im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_AWCRH "0" "0" "0" "0" "0" "0" AWEN[9] AWEN[8]

ADC_AWCRL Register - ADC Analog Watchdog Control Register "Low"                             (0x00.540Fh im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_AWCRL AWEN[7] AWEN[6] AWEN[5] AWEN[4] AWEN[3] AWEN[2] AWEN[1] AWEN[0]

Die beiden Maskenregister ADC_AWCRH und ADC_AWCRL werden per Software konfiguriert und dienen dazu die entsprechenden Status Bits (Kanäle) in den ADC_AWSRH und ADC_AWSRL zu maskieren.

Nach einem Reset sind alle Kanäle maskiert und kein AWS[i]Bit wird bei einem eventuellen AWS Ereigniss gesetzt.

Auch in diesem ADC_AWCRH Register sollten die Bits[7..2] immer deaktiviert („0“) bleiben bzw. bei STM8 Varianten mit 8 bzw. weniger Analogeingängen ist das Register ohne Funktion und muß komplett im Reset-Zustand gehalten werden (0x00h).

Die Datenpuffer Register (ADC_DBiRH , ADC_DBiRL)

Für den „Buffered Continuous“ und die „SCAN“ Modi wird mehr als ein Registerpaar benötigt da automatisch mehrere Wert erfasst werden. Diese Messreihen werden im Datenpuffer gespeichert der aus bis zu 10 Registerpaaren aufgebaut ist.

ADC_DBiRH Register - ADC Data Buffer Register "High"                                     (0x00.53E0h + "i"*2  -  im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_DBiRH DBi[15] DBi[14] DBi[13] DBi[12] DBi[11] DBi[10] DBi[9] DBi[8]

ADC_DRL Register - ADC Data Buffer Register "Low"                                                  (0x00.53E1h + "i"*2 -  im STM8S)
Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADC_DBiRL DBi[7] DBi[6] DBi[5] DBi[4] DBi[3] DBi[2] DBi[1] DBi[0]

Der Datenpuffer besitzt einen eigenen Adressbereich der nicht an die ADC Register Adressen anschließt. Die Adressen im Bild links beziehen sich auf den STM8S105 können aber gegebenen Falls bei anderen Typen unterschiedlich sein.

Im ADC2 Block der in manchen STM8 Typen als zweiter ADC implementiert wurde ist der Datenbuffer nicht vorhanden.

Die beiden Registerpaare ADC1_DB8Rx und ADC1_DB9Rx sind nicht in allen STM8 Produkten implementiert, manche Typen besitzen nur die Registerpaare von ADC1_DB0Rx bis ADC1_DB7Rx.

Für das Lesen der Registerpaare gelten die gleichen Regeln wie für die ADC1_DRH / ADC1_DRL Register. Je nach dem eingestellten ALIGN Bit muß jeweils das Register zuerst gelesen werden das die kompletten 8 Datenbits enthält. Siehe dazu auch „ 4.3 Das ADC Configuration Register 2 (ADC_CR2)“ .

Alle Bits in den Datepuffer Registern sind nur lesbar aber nicht beschreibbar.

Da der ADC in den SCAN Modi die einzelnen Kanäle beginnend vom Kanal 0 (AIN0) bis zum maximal zu verarbeitenden Kanal der im ADC_CSR Register in den CH[3..0] Bits eingestellt wird, umsetzt, ist es sinnvoll die Registerpaare im Datenpuffer auch in dieser Reihenfolge auszulesen um einen Überlauf in den Continuous Modis zu vermeiden.

 

Copyright Notiz

Dieses Dokument sowie dessen Inhalt, insbesondere Texte, Fotografien und Grafiken, unterliegt dem Copyright (© 2017) und sind nur mit einer schriftlicher Zustimmung des Autors, Dipl.Ing.(FH) Franz Henkel zur vollständigen oder auszugsweisen Weiterverwendung  in Form  einer gedruckten oder elektronischen Kopie oder Replikation bzw. einer vollständigen oder auszugsweisen Bereitstellung des Inhalts in schriftlicher oder elektronischer Form, zu verwenden.