; Interrupt- Routine für Adc, wenn Umwandlung fertig, wird Interrupt ausgelöst ; Neue Umwandlung wird mit Setzen des bits ADSC gestartet ; 10bit- Wert, wird durch Ror in 8bit- Wert gewandelt ; Aktueller Wert in AdcValL, letzter Wert in LastVolVal bzw LastModVal ; es wird abwechselnd Kanal4 und Kanal5 gewandelt, Abfrage über Mux AdcServ: cli in save_sreg, SREG push TempA nop ; Adc- Converter Interrupt Service Routine in AdcValL, ADCL ; Adc Low- byte holen in AdcValH, ADCH ; Adc High- byte holen ror AdcValH ; Auflösung 10bit ror AdcValL ; bit1 und 0 von AdcValH ror AdcValH ; in AdcValL schieben, bit0 und 1 ror AdcValL ; von AdcValL wegschmeißen clc ; nur Werte von ;ror AdcValL ; 0- 127 für Dynamik cpi AdcValL, 0x7f ; Potis sollen max 0x7F liefern brlo AdcServe1 ; größere Werte nicht zulassen ldi AdcValL, 0x7f AdcServe1: in TempA, ADMUX ; Adc- Kanal aus Mux- Register holen cpi TempA, AdcVol ; AdcVol = Volume breq AdcVolChange AdcModChange: ldi TempA, AdcVol ; nächste Wandlung Volume- Kanal, Mux- Register out ADMUX, TempA cp AdcValL, LastModVal ; Modulationsrad, Änderung erfolgt ? breq NoChange mov LastModVal, AdcValL ; Modwert aktualisieren ldi TempA, AdcMod ; mov AdcSema, TempA ; für AdcChange, Wandlung AdcMod erfolgt rjmp NoChange AdcVolChange: ldi TempA, AdcMod ; nächste Wandlung Mod- Kanal, Mux- Register out ADMUX, TempA cp AdcValL, LastVolVal ; Value changed since last conversion ? breq NoChange mov LastVolVal, AdcValL ; Volumewert aktualisieren ldi TempA, AdcVol mov AdcSema, TempA ; für AdcChange, Wandlung AdcVol erfolgt NoChange: mov LastVolVal, AdcValL ; update last value sbi ADCSR, ADSC ; start conversion pop TempA out SREG, save_sreg sei reti