Source file: /~heha/basteln/Haus/Licht/LED-Dimmer/pwm.zip/pwm.S

#define __SFR_OFFSET 0
#include <avr/io.h>

/* Pinzuordnung ATtiny13
1	PB5	RESET	-
2	PB3		-
3	PB4	ADC2	Potenziometer Schleifer
4	GND	0V	0V
5	PB0	OC0A	PWM-Ausgang zum Gate des n-Kanal-MOSFETs
6	PB1	OC0B	PWM-Ausgang gleichphasig (parallel geschaltet)
7	PB2		- (GND)
8	Ucc		5V
*/
.section .fuse
	.byte	0x3A,0xFF	// kein CLKDIV8, EEPROM nicht löschen
.section .signature
	.byte	SIGNATURE_2,SIGNATURE_1,SIGNATURE_0

.text
	sbi	ACSR,7		// Analogvergleicher ausschalten
	ldi	r24,0x03	// PB0 + PB1 = Ausgang
	out	DDRB,r24
	ldi	r24,0x01	// Timer0 mit Vorteiler 1 starten
	out	TCCR0B,r24
	ldi	r24,0x02	// ADC2
	out	ADMUX,r24
	ldi	r24,0x84	// ADC-Teiler 16
	out	ADCSRA,r24
	ldi	r24,0x3F	// keine(!) digitalen Eingänge
	out	DIDR0,r24
// Hauptschleife, keine Interrupts (und kein Stack)
1:	ldi	r25,64		// viele Messwerte mitteln
	clr	r1		// Low-Teil
	clr	r24		// High-Teil
2:	sbi	ADCSRA,6	// Wandlung starten
3:	sbic	ADCSRA,6	// fertig?
	 rjmp	3b		// nein
	in	r0,ADCL
	add	r1,r0
	in	r0,ADCH
	adc	r24,r0
	dec	r25
	brne	2b
// Nach 64 A/D-Wandlungen nur den High-Teil verwenden
	cpi	r24,0xFD
	brcc	4f		// lückenlos HIGH
	subi	r24,3		// keine 3-Bit-Pause (fällt nicht auf)
	brcc	5f
	ldi	r24,0x00
	out	TCCR0A,r24	// PWM stoppen, LOW kommt raus
	rjmp	1b
4:	ldi	r24,0xFF
5:	in	r25,TCNT0
	cpi	r25,0xF0	// warten bis Zähler nicht in der Nähe des Endes
	brcc	5b
	out	OCR0A,r24
	out	OCR0B,r24
	ldi	r24,0xA3	// Schnelle PWM auf A und B
	out	TCCR0A,r24
	rjmp	1b
Detected encoding: UTF-80