Source file: /~heha/basteln/Konsumgüter/Kram/2021/fz.zip/swallow.S

/* Kann man einen Funktionsgenerator mit ATmega/ATtiny bauen,
  der auch höhere (Rechteck-)Frequenzen _genau_ ausgibt?
Das ist nur mit Zähler im CTC-Modus und umschaltenden Endwert möglich.

Beispielsweise:
Quarzfrequenz 16 MHz, gewünschte Frequenz 3 MHz (hinreichend glatt!)

Dazu muss bspw. Timer1 im CTC-Modus laufen, wobei der Endwert TOP
zwischen 4 und 5 wechselt und der OCR-Wert für die Rechteckausgabe
ungefähr auf der Hälfte steht.
/Wann/ zwischen 4 und 5 gewechselt wird erfolgt mit einer Bresenham-Routine,
sinnfälligerweise beim Compare-Interrupt:

R3:R2 = Akku des Bresenham-Algorithmus
R5:R4 = Additionswert für Bresenham ("Low-Teil")
R7:R6 = Endwert Timer1 ohne Inkrement ("High-Teil-1")
R10:R9:R8 = frei für ISR
*/
isr:				;4
	in	r10,SREG
	clr	r9
	clr	r8		;3 (2)
	add	r2,r4
	adc	r3,r5
	adc	r8,r6
	adc	r9,r7		;4 (2)
	out	ICR1H,r9
	out	ICR1L,r8
	out	SREG,r10	;3 (2)
	reti			;4
/*
Wie man sieht braucht der Interrupt 18 Takte. 3 MHz sind utopisch.
Bei 8 Bit Verarbeitungsbreite sind's immer noch 14 Takte.
Wohlgemerkt, ohne JMP aus der Vektortabelle. Sondern _in_ der Vektortabelle.
Daher ist der Einsatz eines ATtiny mit 20-MHz-Quarz naheliegend,
um wenigstens 1 MHz ohne Bauchschmerzen erreichen zu können.
Klar, es gibt Frequenzsythese-Chips mit DDS und Sinusausgang,
die die Arbeit abnehmen.
Einen durchstimmbaren Tongenerator (DDS, Sinus, bis 120 kHz)
hatte ich bereits für GF22 mit ATtiny realisiert.
*/
Detected encoding: UTF-80