; ; ********************************************** ; * IR-Fernsteuerung mit ATtiny45 * ; * Version 2 ohne Timer-Interrupts * ; * (C)2010 by http://www.avr-asm-tutorial.net * ; ********************************************** ; ; Include-Datei fuer den AVR ATtiny45 .NOLIST .INCLUDE "tn45def.inc" ; Headerdatei fuer ATTINY45 .LIST ; ; ============================================ ; D E B U G - O P T I O N E N ; ============================================ ; ; debug = 0: kein Debug ; debug = 1: schalte Taste 1 ein .equ debug = 0 .if debug == 1 .equ debugkey = 10 ; 0..9: key, 10:key=star, 11:key=nmbr .endif ; ; ============================================ ; H A R D W A R E I N F O R M A T I O N E N ; ============================================ ; ; Quarzoszillator 2,457600 MHz fuer Prozessortakt ; ADC1 fuer Tasteninput ; PB0 fuer IR-LED-Ansteuerung ; _________ ; 1 / |8 ; Reset o--| |--o Vcc ; | AT | ; Xtal1 o--| |--o ADC1 ; | tiny | ; Xtal2 o--| |--o PB1 - Red LED ; | 45 | ; GND o--| |--o PB0 - IR-LED ; |__________| ; ; ; ; ============================================ ; P O R T S U N D P I N S ; ============================================ ; .equ pLedO = PORTB ; IR-LED .equ pbLedO = PORTB0 .equ pLedD = DDRB .equ pbLedD = DDB0 .equ pRedD = DDRB ; rote LED .equ pRedO = PORTB .equ pbRedD = DDB1 .equ pbRedO = PORTB1 ; ; ======================================================= ; F E S T E + A B G E L E I T E T E K O N S T A N T E N ; ======================================================= ; .equ clock = 2457600 ; Taktfrequenz in Hz .equ cLedFreq = 38400 ; Modulationsfrequenz der LED .equ cPause = (10000*250000)/clock ; delay ; ; ============================================ ; R E G I S T E R D E F I N I T I O N E N ; ============================================ ; ; R0 frei .def rHL = R1 ; Speicher fuer High-Dauer .def rHH = R2 .def rLL = R3 ; Speicher fuer Low-Dauer .def rLH = R4 .def rRpt = R5 ; Speicher fuer Repeat ; frei: R5..R15 .def rmp = R16 ; Vielzweckregister ausserhalb Ints .def rimp = R17 ; Vielzweckregister innerhalb Ints .def rAdc = R18 ; ADC Ergebnisregister .def rLastKey = R19 ; letzte gedruckte Taste .def rKeyCnt = R20 ; Zaehler fuer Tastendruck .def rCS = R21 ; Kurzzaehler ; frei R22..R23 .def rCL = R24 ; 16-Bit-Zaehler, LSB .def rCH = R25 ; dto., MSB ; X verwendet fuer High-Pulse ; Y verwendet fuer Low-Pulse ; Z ; ; ============================================ ; S R A M D E F I N I T I O N E N ; ============================================ ; .DSEG .ORG 0X0060 ; ; ============================================== ; R E S E T U N D I N T V E K T O R E N ; ============================================== ; .CSEG .ORG $0000 rjmp Main ; Reset-Vektor reti ; Int0 Vektor reti ; PcInt0 Vektor reti ; TC1CompA Int Vektor reti ; TC1Ovf Int Vektor reti ; TC0Ovf Int Vektor reti ; EE RDY Int Vektor reti ; ANA COMP Int Vektor rjmp AdcInt ; ADC Int Vektor reti ; TC1CompB Int Vektor reti ; TC0CompA Int Vektor reti ; TC0CompB Int Vektor reti ; WDT Int Vektor reti ; USIStart Int Vektor reti ; USIOvrflw Int Vektor ; ; ========================================== ; I N T E R R U P T S E R V I C E ; ========================================== ; AdcInt: in rAdc,ADCH ; lese ADC-Ergebnis sbi ADCSRA,ADSC ; start conversion set ; set T flag reti ; ; ============================================ ; H A U P T P R O G R A M M I N I T ; ============================================ ; Main: ; Initiiere Stapel ldi rmp,HIGH(RAMEND) ; Initiiere MSB Stapel out SPH,rmp ldi rmp, LOW(RAMEND) ; Initiiere LSB Stapel out SPL,rmp ; Init Port B sbi pLedD,pbLedD ; IR-LED Richtung Port B sbi pRedD,pbRedD ; rote LED rcall Wait ; Init ADC .if debug == 1 ; simuliere Taste 1 ldi ZH,HIGH(2*DbgKeyCode+debugkey) ldi ZL,LOW(2*DbgKeyCode+debugkey) lpm rAdc,Z ; Taste in Adc-Result laden set ; Flagge setzen rjmp DebugLbl DbgKeyCode: ; 0,1,2,3,4,5,6,7,8,9,Star,Nmbr .db 84,62,161,235,45,137,221,32,110,206,18,185 .else ldi rmp,(1< 6630 µs ; 6: 0: Nur low cycles ; 1: High+Low cycles ; 5..0: Repeat counter, 0..63 ; 0 = Ende .equ bDbl = 7 .equ nDbl = 1<