; ; ********************************************** ; * 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 fuer ATtiny13 .LIST ; ; Debug-Einstellungen ; .equ debug = 0 ; debug an: 1, aus: 0 ; ; ============================================ ; H A R D W A R E I N F O R M A T I O N E N ; ============================================ ; ; ________ ; 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 U 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 ; Infrarot-Eingang ; ; ================================================ ; P R O G R A M M A B L A U F ; ================================================ ; ; Timer0 arbeitet mit Teiler durch 64 (18.750 Hz) ; Alle 13,653 ms tritt ein Ueberlauf auf und ; - beendet evtl. laufende IR-Signalanalyse ; - erhoeht Timeout-Zaehler, wenn Relais aktiv ist ; ; ; ================================================ ; K O N S T A N T E N Z U M E I N S T E L L E N ; ================================================ ; ; (keine) ; ; ======================================================= ; 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 = 1200000 ; Prozessortakt ; ; ============================================ ; R E G I S T E R D E F I N I T I O N E N ; ============================================ ; ; R0 frei fuer LPM ; Frei: R1..R10 .def rPot = R11 ; Status digitales Potentiometer .def rPotV = R12 ; Potentiometerwert .def rTO1 = R13 ; Time-Out-Zaehler, Byte 1 .def rTO2 = R14 ; Time-Out-Zaehler, Byte 2 .def rSreg = R15 ; Register fuer SREG .def rmp = R16 ; Vielzweckregister .def rimp = R17 ; Vielzweckregister Interrupts .def rFlg = R18 ; Flaggenregister .equ bIrAktiv = 0 ; IR-Analyse gestartet .equ bIrAdrOk = 1 ; IR-Adresse erkannt .equ bIrCmdOk = 2 ; Command erkannt .equ bIrBreak = 3 ; Abbruch wegen Fehler .def rTO3 = R19 ; Time-Out-Zaehler, Byte 3 .def rTc = R20 ; Timer-Stand .def rIrC = R21 ; Register fuer den IR-Cmd-Code .def rIrCL = R22 ; Register fuer den letzten IR-Cmd-Code ; frei: R22..R29 ; verwendet: Z fuer LPM ; ; ============================================ ; S R A M D E F I N I T I O N E N ; ============================================ ; ; ; ============================================== ; 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 rjmp PcInt ; PcInt0 Vektor rjmp Tc0Int ; Tc0Ovf-Int Vektor reti ; EERDY-Int Vektor reti ; AnaComp-Int Vektor reti ; TC0COMPA-Int Vektor reti ; TC0COMPB-Int Vektor reti ; WDT-Int Vektor reti ; ADC-Int Vektor ; ; ========================================== ; I N T E R R U P T S E R V I C E ; ========================================== ; ; Pin Change interrupt am IR-Eingang ; liest Timer-Stand ein, setzt Timer auf Null, setzt T-Flagge PcInt: sbic PINB,pbIrIn ; Eingang = 0? reti ; Eingang =1, ignoriere Flanke in rTc,TCNT0 ; lese timer ldi rimp,1<= kleiner Wert brcs IrAktivBreak1 ; nein, Break setzen lpm R0,Z+ ; groesseren Wert lesen cp rmp,R0 ; vergleichen brcs Loop ; Wert ist ok IrAktivBreak2: ; zu lang .if debug == 1 subi ZL,Low(2*IrAdrTab) lsr ZL mov rmp,ZL rcall LedN ldi rmp,4 ; vier Mal blinken 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 ; drei Mal blinken rjmp IrAktivBreakN .endif IrAktivBreak3: ldi rmp,3 IrAktivBreakN: sbr rFlg,1<