; ; ********************************************** ; * Infrared controlled switchbox * ; * for ATtiny13, internal clock 1.2 MHz, V1 * ; * (C)2010 by http://www.avr-asm-tutorial.net * ; ********************************************** ; .NOLIST .INCLUDE "tn13def.inc" ; Headerdatei for ATtiny13 .LIST ; ; Debug preset ; .equ debug = 0 ; debug on: 1, off: 0 ; ; ============================================ ; H A R D W A R E I N F O R M A T I O N S ; ============================================ ; ; ________ ; 1 / |8 ; RESET O--|RES VCC|--O VCC ; | AT | ; DR-CS O--|PB3 PB2|--O Relais/SCK ; | tiny | ; DR-SCK O--|PB4 PB1|--O LED/IN/DR-SI/MISO ; | 13 | ; GND O--|GND PB0|--O IR-IN/MOSI ; 4|__________|5 ; ; ============================================ ; P O R T S A N D P I N S ; ============================================ ; .equ pbRelO = PORTB2 ; Relais output pin .equ pbLedO = PORTB1 ; LED output port .equ pbLedD = DDB1 ; LED output direction port .equ pbCsO = PORTB3 ; DR-CS digital resistor CS .equ pbSckO = PORTB4 ; DR-SCK digital resistor SCK .equ pbSiO = PORTB1 ; DR-SI digital resistor SI .equ pbIrIn = PINB0 ; Infrared-Input ; ; ================================================ ; P R O G R A M F L O W ; ================================================ ; ; Timer0 works with the prescaler at 64 (18.750 Hz) ; Every 13,653 ms an overflow occurs and ; - stops eventually running IR-Signal analysis ; - increases the Timeout-counter, if the relais isd active ; ; ; ================================================ ; C O N S T A N T S T O C H A N G E ; ================================================ ; ; (none) ; ; ======================================================= ; F I X E D + D E R I V E D C O N S T A N T S ; ======================================================= ; .equ clock = 1200000 ; processor clock ; ; ============================================ ; R E G I S T E R D E F I N I T I O N S ; ============================================ ; ; R0 free for LPM ; Free: R1..R10 .def rPot = R11 ; Status digital pot .def rPotV = R12 ; Pot value .def rTO1 = R13 ; Time-Out-Coumnter, Byte 1 .def rTO2 = R14 ; Time-Out-Counter, Byte 2 .def rSreg = R15 ; Register for SREG .def rmp = R16 ; Multi purpose register .def rimp = R17 ; Multi purpose register interrupts .def rFlg = R18 ; Flag register .equ bIrAktiv = 0 ; IR-Analysis start .equ bIrAdrOk = 1 ; IR-Adress recognised .equ bIrCmdOk = 2 ; Command recognised .equ bIrBreak = 3 ; Abort due to error .def rTO3 = R19 ; Time-Out-Counter, Byte 3 .def rTc = R20 ; Timer value .def rIrC = R21 ; Register for IR-Cmd-Code .def rIrCL = R22 ; Register for the last recognised IR-Cmd-Code ; frei: R22..R29 ; used for LPM ; ; ============================================ ; S R A M D E F I N I T I O N S ; ============================================ ; ; (none) ; ; ============================================== ; R E S E T A N D I N T V E C T O R S ; ============================================== ; .CSEG .ORG $0000 rjmp Main ; Reset-Vector reti ; Int0 Vector rjmp PcInt ; PcInt0 Vector rjmp Tc0Int ; Tc0Ovf-Int Vector reti ; EERDY-Int Vector reti ; AnaComp-Int Vector reti ; TC0COMPA-Int Vector reti ; TC0COMPB-Int Vector reti ; WDT-Int Vector reti ; ADC-Int Vector ; ; ========================================== ; I N T E R R U P T S E R V I C E ; ========================================== ; ; Pin Change interrupt on IR input ; reads timer, clears timer, sets T-flag PcInt: sbic PINB,pbIrIn ; Input = 0? reti ; Input =1, ignore low-to-high transitions in rTc,TCNT0 ; read timer ldi rimp,1<= lower value brcs IrAktivBreak1 ; no, set break lpm R0,Z+ ; read higher value cp rmp,R0 ; compare brcs Loop ; value is fine IrAktivBreak2: ; too long .if debug == 1 subi ZL,Low(2*IrAdrTab) lsr ZL mov rmp,ZL rcall LedN ldi rmp,4 ; blink four times rjmp IrAktivBreakN .endif IrAktivBreak1: .if debug == 1 push rmp subi ZL,Low(2*IrAdrTab) lsr ZL mov rmp,ZL rcall LedN mov rmp,R0 rcall LedHex pop rmp rcall LedHex ldi rmp,3 ; blink three times rjmp IrAktivBreakN .endif IrAktivBreak3: ldi rmp,3 IrAktivBreakN: sbr rFlg,1<