#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-8 | 0
|