STM8 10-Bit Wandler ADC1


ADC Interrupt Verarbeitung

Der Analog-Digital-Wandler ADC1 kann durch zwei mögliche Ereignisse einen Interrupt auslösen:

EOC – Ende der A/D Wandlung

AWD – Überschreitung der Grenzwerte

Die entsprechenden Interrupt Freigabe Bits, EOCIE und AWDIE befinden sich im Register ADC_CSR. Beide Interrupts verzweigen auf den Interrupt Vektor irq22 und müssen danach hinsichtlich des auslösenden Ereignisses abgefragt werden.

Das EOC Flag im ADC_CSR signalisiert ein Ende des Wandlervorgangs während das AWD Flag im gleichen Register das Auslösen des Analog Watchdogs in mindestens einem Messkanal definiert.

Im Analog Watchdog Fall kann danach über die ADC_AWSRL (und gegebenenfalls auch ADC_AWSRH) Register der Messkanal ausgelesen werden der den Interrupt verursacht hat. Da bei der Verwendung mehrerer Messkanäle auch mehrere Grenzwertüberschreitungen gleichzeitig vorkommen können sind in den AWD Status Registern ADC_AWSRx eventuell auch mehrere Bits gleichzeitig gesetzt. Es ist dann Aufgabe der Anwendung zu entscheiden wie die auslösenden Kanäle behandelt werden sollen.

Der A/D-Wandler kann alternativ auch ohne Interrupt betrieben werden da die Anzahl der nötigen ADC-Takt Zyklen (14) bekannt ist. Es ist daher möglich den Wandler zu starten (über ADON) und danach eine entsprechende Anzahl von Zyklen mit dem Auslesen zu warten. Dabei kann das Einfügen einer Subroutine die eine gänzlich andere Funktion ausführt die Effektivität gegenüber einem Delay verbessern.

Der EOC Interrupt

Der „End of Conversion“ Interrupt wird in allen ADC-Modi ausgelöst wenn das EOCIE Bit gesetzt ist und das EOC Flag von der Hardware gesetzt wurde. Der Interrupt wird erzeugt wenn:

        Im Single Mode der ausgewählte Messkanal digitalisiert wurde.

        Im Continuous Modus eine A/D-Wandlung abgeschlossen wurde, der ADC aber weiterläuft.

        Im Continuous Buffered Modus wenn der Datenpuffer mit 8 (10) Messwerten gefüllt ist.

        Im SCAN Modus wenn der Datenpuffer mit allen zu messenden Kanälen gefüllt wurde.

        Im Continuous SCAN Modus wenn eine Mess-Sequenz aller Messkanäle in den Datenpuffer gespeichert wurde.

Der AWD Interrupt

Der Analog-Watchdog-Interrupt kann in allen ADC-Modi ausgelöst werden wenn das AWDIE Bit gesetzt wurde und der in Frage kommende Kanal „i“ nicht durch das entsprechende AWEN[i] Bit maskiert wird. Ein von der Watchdog Hardware gesetzes AWS[i] Bit wird bei freigegebenen Messkanal dann den Interrupt auslösen.

Jeder über die AWS[i] Bits freigegebene Analogkanal wird auf die Über- bzw. Unterschreitung der Analog Watchdog Schwelle in den ADC_HTRH/ADC_HTRL bzw. ADC_LTRH/ADC_LTRL Registern hin überprüft und bei der Erkennung einer Grenzwertüberschreitung behandelt. Dabei wird sowohl das korrespondierende AWS[i] Bit für den auslösenden Kanal im ADC_AWSRL (oder gegebenenfalls im ADC_AWSRH) Register gesetzt als auch das AWD Flag im ADC_CSR Register.

Die Interrupt Vektor Tabelle

Die Tabelle zeigt den ADC1 EOC-Interrupt als irq22, welcher allerdings auch für den AWD-Interrupt benutzt wird

;~~~~~~~~~

					; INTERRUPT Vektoren

					;~~~~~~~~~~#13;


					segment 'vectit'

					dc.l {$82000000+main}			; reset

					dc.l {$82000000+NonHandledInterrupt}	; trap

					dc.l {$82000000+NonHandledInterrupt}	; irq0 TLI

					dc.l {$82000000+NonHandledInterrupt}	; irq1 AWU

					dc.l {$82000000+NonHandledInterrupt}	; irq2 CLK

					dc.l {$82000000+NonHandledInterrupt}	; irq3 Port A

					dc.l {$82000000+NonHandledInterrupt}	; irq4 Port B

					dc.l {$82000000+NonHandledInterrupt}	; irq5 Port C

					dc.l {$82000000+NonHandledInterrupt}	; irq6 Port D

					dc.l {$82000000+NonHandledInterrupt}	; irq7 Port E

					dc.l {$82000000+NonHandledInterrupt}	; irq8 CAN RX

					dc.l {$82000000+NonHandledInterrupt}	; irq9 CAN TX

					dc.l {$82000000+NonHandledInterrupt}	; irq10 SPI

					dc.l {$82000000+NonHandledInterrupt}	; irq11 TIM1 update   (generate 100 ms)

					dc.l {$82000000+NonHandledInterrupt}	; irq12 TIM1 CapComp

					dc.l {$82000000+NonHandledInterrupt}	; irq13 TIM2 update

					dc.l {$82000000+NonHandledInterrupt}	; irq14 TIM2 CapComp

					dc.l {$82000000+NonHandledInterrupt}	; irq15 TIM3 update

					dc.l {$82000000+NonHandledInterrupt}	; irq16 TIM3 CapComp

					dc.l {$82000000+NonHandledInterrupt}	; irq17 UART2 TX

					dc.l {$82000000+NonHandledInterrupt}	; irq18 UART2 RX

					dc.l {$82000000+NonHandledInterrupt}	; irq19 I2C

					dc.l {$82000000+NonHandledInterrupt}	; irq20 LIN-UART TX

					dc.l {$82000000+NonHandledInterrupt}	; irq21 LIN-UART RX 

					dc.l {$82000000+ADC1Interrupt}			; irq22 ADC end of conversion

					dc.l {$82000000+NonHandledInterrupt}	; irq23 TIM4 update

					dc.l {$82000000+NonHandledInterrupt}	; irq24 Flash

					dc.l {$82000000+NonHandledInterrupt}	; irq25 TIM5 update

					dc.l {$82000000+NonHandledInterrupt}	; irq26 TIM5 CapComp

					dc.l {$82000000+NonHandledInterrupt}	; irq27 SPI2

					dc.l {$82000000+NonHandledInterrupt}	; irq28 ADC2

					dc.l {$82000000+NonHandledInterrupt}	; irq29 Port G & K

 

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.