forget adcl  

$ 24 const adcl  26 const adsc   27 const admux

var vch0   
{ ### Vorzeichenkorrektur nötig, wenn vch0 = 1
{ >>>
var vch1   
{ ### Vorzeichenkorrektur nötig, wenn vch1 = 1 
{ ### Verstärkungsgruppe für Kanal 0, Wert = gain (0, 1, 2)
{ ### Verstärkungsgruppe für Kanal 1, Wert = gain (0, 1, 2)
{ ### kan, Wert = 1, 3
{ >>>
var mux0   
{ ### Steuerwert für Kanal 0
{ >>>
var mux1   
{ ### Steuerwert für Kanal 1; beide Werte werden abwechselnd in $ 27 geschrieben
{ ### $24 (+25): Messwert  (adcl, adch)
{ ### $26 Kontroll- u. Statusregister (adsc); 
      Bit 7 enables ADC, Bit 6 startet Messung; Bit 0-2 wählen Vorteiler
{ ### $27 Steuerwort für Multiplexer (admux); (Vref, rechtsadj., Kanal/Verstärkung)
{ >>>


: par 1 = if dup 0 = if drop 10 else 1 = if 9 else b endif 
             endif 
             else dup 0 = if drop 1b else 1 = if d else f endif endif
          endif ret

{ ### berechnet aus kan und gain Parameter für MUX gemäß folgender Tabelle:

{ ###     kan  \  gain        0             1               2          

{ ###         1            16 = 10 *      9              11 =  b      U1 - U0
{ ###         3            27 = 1b       13 = d          15 =  f      U3 - U2
{ ### (*: Vorzeichenkorrektur nötig ) 


{ ### der steuerwert kann in mux0 bzw. mux1 gespeichert werden
{ ### Aufruf:  ( gain kan; muxpar) PAR
{ >>>

: vin swap 10 = if 1 swap wb else 0 swap wb endif 40 + ret

{ ### VIN belegt vch0 bzw. vch1 mit flag für Vorzeichenumkehr
{ ### vch0 = 0 , bzw.  vch1 = 0 wenn keine Änderung nötig
{ ### Aufruf:  [ mux, mux ] ( vch; => mux + 40 ) VIN; zu mux wird
{ ### das Steuerwort für $ 27 um 40 ergänzt
{ >>>

: adc_on  $ 86 adsc wb PAR dup vch0 vin admux wb ret

{ ### ADC_ON belegt Parameter für einkanalige Messung; diese wird erst mit Difin gestartet
{ ### Aufruf:   ( gain kan; - - ) ADC_ON
{ >>>

: adc_on2 
          PAR dup vch0 vin mux0 wb                  
          PAR dup vch1 vin mux1 wb
          $ 86 26 wb
          0 . mux0 rb . 1 . mux1 rb .
          ret



{ ### Aufruf:   ( gain1 kan1 gain0 kan0 ; - ) ADC_ON2

{ >>>

: difin $ 6 adsc bset adcl rd ret

{ ### startet Wandlung und liest Ergebnis (Zweierkomplement) aus
{ ### Aufruf:  difin ; => TOS: messwert/zwkp 

{ >>>




: norm $ rb 1 = if dup 200 > if 200 - not 1ff and 200 + else not 1ff and
              endif
              else  dup 200 > if 200 - else 200 + endif 
              endif ret

{ ### Aufruf: messwert/zwkp vch norm  =>  messwert skaliert auf [0,3ff]
{ ### wandelt Zweierkomplement um und skaliert; negative Werte von 0 bis 1ff

{ >>>


: difin2  mux0 rb admux wb  difin vch0 norm & . $ mux1 rb
          admux wb difin vch1 norm & . $ d emit ret

{ ### wählt Anschlüsse und Verstärkung für Kanal 0, startet Wandlung und legt
{ ### Ergebnis (Zweierkomplement) auf Stack und normalisiert es. Dann
{ ### wählt Anschlüsse und Verstärkung für Kanal 1, startet Wandlung und legt
{ ### Ergebnis (Zweierkomplement) darüber auf Stack. Dann Normalisierung
{ ### Aufruf:  difin2 ; => TOS: messwert0 messwert1
{ >>>

: adc_off $ 0 adsc wb ret



: test adc_on repeat difin vch0 norm & . $ d emit key? until drop adc_off ret


{ ###  Aufruf: ( gain kan ; - - ) test; kan: 1,3  gain: 0,1,2 auf dem Stack; 
{ ###  entspricht den Verstärkungen V = 1, 10, 200. 
{ ###  Zuerst wird das Vorzeichenflag, dann der Betrag des Messwerts
{ ###  ausgedruckt, 
{ ###  der im PC-Programm noch in Volt umgerechnet werden müsste unter 
{ ###  Berücksichtigung von Verstärkung V und Spannung an AREF = AVCC
{ ###  und gültiger Bitzahl.

{ >>>

: test2 adc_on2 repeat difin2 key? 
                until drop adc_off ret

{ ###  Aufruf: 
{ ###  Aufruf:  ( gain1 kan1 gain0 kan0 ; - ) test2; 
{ ###  jeweils kan: 1,3  gain: 0,1,2 ;
{ ###  zuerst wird das Vorzeichenflag von Kanal 1, dann der zugehörige Betrag
{ ###  des Messwerts ausgedruckt, 
{ ###  dann wird das Vorzeichenflag von Kanal 0, dann der zugehörige Betrag
{ ###  des Messwerts ausgedruckt.

{ ###  Für schnellere Messung kann norm zunächst weggelassen werden und
{ ###  nach Übertragung an PC im PC-Programm nachgeholt werden
{ ###  Beispiel in messen12y.txt