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