; ; *********************************** ; * Ledlicht mit einem ATtiny13 * ; * (C)2012 by avr-asm-tutorial.net * ; *********************************** ; .nolist .include "tn13def.inc" .list ; ; ******************* ; H A R D W A R E ; ******************* ; ; ____________ ; / | ; RES o--| |--o VCC ; | AT | ; S3 o--| |--o S2/SCK ; | tiny | ; S4 o--| |--o OUT/MISO ; | 13 | ; GND o--| |--o S1/MOSI ; |_____________| ; ; Eingangs-Portbits Schalter .equ bS1In = 0 .equ bS2In = 2 .equ bS3In = 3 .equ bS4In = 4 ; ; Ausgangs-Portbit LED-Ansteuerung .equ bOut = 1 ; ; *************************************************** ; W I E D I E S O F T W A R E A R B E I T E T ; *************************************************** ; ; Prozessor: ; Arbeitet mit 1.2 MHz Default Takt ; Default R/C-Oszillator geteilt durch 8 ; Default Fuse-Einstellungen ; Timer 0: ; Arbeitet als Fast PWM mit TOP=15 ; Systemtakt durch 256 geteilt ; f(PWM) = 293 Hz ; OC0B steuert PWM-Verhaeltnis (0 .. 15) ; OCR0B wird gesetzt aus dem unteren Nibble der Tabellenbytes ; Setzt OC0B-Ausgang bei Zyklusbeginn ; Loescht Ausgang bei Compare Match ; OC0A setzt TOP und loest Interrupts aus ; Timing der Zyklen: ; Oberes Nibble der Tabellenbytes setzt Anzahl PWM-Zyklen (Dauer) ; (16 bis 256) ; Resultiert in Zeiten zwischen 0,055 und 0,88 Sekunden Dauer ; Eingangsschalter: ; S1: wenn gesetzt halbiert die Helligkeit (PWM / 2) ; S2: wenn gesetzt ver-16-facht die Geschwindigkeit (Zyklusdauer / 16) ; S3, S4: waehlt Programm aus ; 00: LEDs an und aus 10 mal ; 01: Modulierter Anstieg und Abfall der Helligkeit ; 02: Linearer Anstieg und Abfall der Helligkeit ; 03: Nacheinander Programme 02, 01 und 00 ; ; ******************* ; R E G I S T E R ; ******************* ; ; Frei: R0..R14 .def rSreg = R15 ; zum Sichern und Wiederherstellen des SREG bei Interrupts .def rmp = R16 ; Vielzweckregister ausserhalb Interrupts .def rimp = R17 ; Vielzweckregister innerhalb Interrupts .def rCnt = R18 ; Zaehlregister fuer PWM-Zyklen .def rC3 = R19 ; Zaehler fuer Programmauswahl in Modus 03 ; Frei: R20 .. R29 ; Benutzt: ZH:ZL als Zeiger auf Flashtabelle ; ; ********************************************* ; R E S E T U N D I N T - V E K T O R E N ; ********************************************* ; rjmp main ; Reset Vektor reti ; INT0 reti ; PCINT0 rjmp Tc0Int ; TIM0_OVF reti ; EE_RDY reti ; ANA_COMP reti ; TIM0_COMPA reti ; TIM0_COMPB reti ; WDT reti ; ADC ; ; Interruptvektor TIM0_OVF ; Tc0Int: in rSreg,SREG ; sichere SREG dec rCnt ; naechster PWM-Zyklus brne Tc0IntRet ; wenn nicht Null mache weiter lpm rCnt,Z+ ; lese naechstes Tabellenbyte und erhoehe Zeiger mov rimp,rCnt ; kopiere Byte nach rimp andi rimp,0x0F ; maskiere oberes Nibble sbis PINB,bS1In ; halbe Intensitaet? lsr rimp ; halber PWM-Zyklus out OCR0B,rimp ; schreibe in PWM Compare andi rCnt,0xF0 ; maskiere unteres Nibble sbis PINB,bS2In ; 16-fach schneller? swap rCnt ; 16 mal schneller Tc0Int1: lpm rimp,Z ; lese naechsten Tabellenwert tst rimp ; Null? brne Tc0IntRet ; nicht Null, mach weiter so out SREG,rSreg ; stelle SREG wieder her set ; setze T-Flagge reti ; Ruuckkehr vom Interrupt Tc0IntRet: out SREG,rSreg ; stelle SREG wieder her reti ; Rueckkehr vom Interrupt ; ; *************************************** ; H A U P T P R O G R A M M S T A R T ; *************************************** ; Main: ; Initiiere Stapel ldi rmp,LOW(RAMEND) ; RAMEND in SPL out SPL,rmp ; Initiiere Ports ldi rmp,1<