; ; ********************************************** ; * Measure signal durations for IR receivers * ; * Version 1 as of October 2010 * ; * (C)2010 by http://www.avr-asm-tutorial.net * ; ********************************************** ; ; Included header file for target AVR type .NOLIST .INCLUDE "m8def.inc" ; Header for ATMEGA8 .LIST ; ; ============================================ ; D E B E U G G I N G I N F O R M A T I O N ; ============================================ ; .equ debug = 0 ; enable debugging infos over PORTB ; ; ============================================ ; H A R D W A R E I N F O R M A T I O N ; ============================================ ; ; Receive and send over the RS232 interface ; PD0 is RXD input (Pin 2) ; PD1 is TXD output (Pin 3) ; ; Time measurement over INT0 ; PD2 is input for the time measurements (Pin 4) ; ; Output signal ; 1 second duration on PD3 (Pin 5) ; ; ============================================ ; P O R T S A N D P I N S ; ============================================ ; ; External interrupt measure pulse durations .equ pExt0I = PIND .equ pbExt0I = PIND2 ; TxD and RxD in UART communication .equ pTxdD = DDRD .equ pbTxdD = DDD1 .equ pRxdD = DDRD .equ pbRxdD = DDD0 ; Time signal 1 s .equ pOutD = DDRD .equ pbOutD = DDD3 .equ pOutP = PORTD .equ pbOutP = PORTD3 ; ; ============================================ ; C O N S T A N T S T O C H A N G E ; ============================================ ; .equ cClock = 9830400 ; Xtal clock @ 9.8304 MHz .equ cBaud = 38400 ; Baudrate for RS232 TX and RX ; ; ============================================ ; F I X + D E R I V E D C O N S T A N T S ; ============================================ ; .equ cBaudDiv = cClock / 16 / cBaud - 1 ; Baudrate generator .equ c10us = cClock / 100000 - 1 ; time bases .equ c100us = cClock / 10000 - 1 .equ c1ms = cClock / 1000 - 1 .equ c10ms = cClock / 100 / 8 - 1 .equ cSec = cClock / 256 / 256 ; ; ============================================ ; R E G I S T E R D E F I N I T I O N S ; ============================================ ; ; R0 used for lpm operations .def rRes0 = R1 ; result bytes transfer from ext int .def rRes1 = R2 .def rRes2 = R3 .def rD0 = R4 ; decimal subtractor bytes .def rD1 = R5 .def rD2 = R6 .def rV0 = R7 ; binary to decimal conversion .def rV1 = R8 .def rV2 = R9 ; free: R10 .def rRBInL = R11 ; result buffer in pointer .def rRBInH = R12 .def rRBOutL= R13 ; result buffer out pointer .def rRBOutH= R14 .def rSreg = R15 ; save/restore SREG inside ints .def rmp = R16 ; Multipurpose register outside ints .def rimp = R17 ; Multipurpose register inside ints .def rFlag = R18 ; Flag register .equ bMode0 = 0 ; Mode bit 0 .equ bMode1 = 1 ; Mode bit 1 .equ bMOn = 2 ; Measuring on .equ bXfer = 3 ; transfer of result ready .equ bTxData = 4 ; transmit data results .equ bTxBusy = 5 ; RS232 TX is busy .equ bRxLine = 6 ; RS232 end of line ; free: R19..R21 .def rSec = R22 ; Counter for second pulse .def rCnt2 = R23 ; counter byte 2 .def rCnt0 = R24 ; counter byte 0 .def rCnt1 = R25 ; counter byte 1 ; used: X as buffer pointer for RS232 transmit ; used: Y pointer outside int ; used: Z pointer outside int (inside int: restored) ; ; ============================================ ; S R A M D E F I N I T I O N S ; ============================================ ; .DSEG .ORG 0x0060 ; Start of SRAM ; sRxBPtr: ; RS232 RX buffer pointer .byte 2 sRxBSta: ; RS232 RX buffer start .byte 8 sRxBEnd: ; RS232 RX buffer end ; sTxBSta: ; RS232 TX buffer start .byte 11 sTxBEnd: ; RS232 TX buffer end ; sRBSta: ; Result buffer .equ nResults = (RAMEND-sRBSta-20) / 3 ; number of packs .byte 3*nResults sRBEnd: ; ; Format: Label: .BYTE N ; reserve N Bytes from Label: ; ; ============================================ ; 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 rjmp Int0Isr ; INT0 External Interrupt Request 0 reti ; INT1 External Interrupt Request 1 reti ; TIMER2 COMP Timer/Counter2 Compare Match reti ; TIMER2 OVF Timer/Counter2 Overflow rjmp Tc1C ; TIMER1 CAPT Timer/Counter1 Capture Event reti ; TIMER1 COMPA Timer/Counter1 Compare Match A reti ; TIMER1 COMPB Timer/Counter1 Compare Match B reti ; TIMER1 OVF Timer/Counter1 Overflow rjmp Tc0Isr ; TIMER0 OVF Timer/Counter0 Overflow reti ; SPI, STC Serial Transfer Complete rjmp IntRx ; USART, RXC USART, Rx Complete rjmp IntDre ; USART, UDRE USART Data Register Empty rjmp IntTxC ; USART, TXC USART, Tx Complete reti ; ADC ADC Conversion Complete reti ; EE_RDY EEPROM Ready reti ; ANA_COMP Analog Comparator reti ; TWI Two-wire Serial Interface reti ; SPM_RDY Store Program Memory Ready ; ; ============================================ ; I N T E R R U P T S E R V I C E S ; ============================================ ; ; Int0 service routine, low/high transition Int0Isr: in rSreg,SREG ; save SREG sbis pExt0I,pbExt0I ; if input is low sbr rCnt2,0x40 ; set High-bit sbrc rFlag,bXfer ; transfer bit clear sbr rCnt2,0xC0 ; set X error sbr rFlag,1<' rjmp sendrmp ; ; Send character in rmp over UART ; SendRmp: sbis UCSRA,UDRE ; wait until buffer clear rjmp SendRmp out UDR,rmp ; send char in rmp ret ; Menue Text sendmenuetext: ;.db 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55 ;.db 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55 ;.db 0x00,0x00 ;.db " ",0x00 .db 0x0C, 0x0D,0x0A,0x0D,0x0A,"Measuring device for pulse length",0x0D,0x0A .db "------- (C)2010 by DG4FAC ------- ",0x0D,0x0A .db "? = this menue",0x0D,0x0A .db "0 = switch measurement off",0x0D,0x0A .db "1 = switch measurement on ",0x0D,0x0A .db "a = time base = 10 us ",0x0D,0x0A .db "b = time base = 100 us",0x0D,0x0A .db "c = time base = 1 ms",0x0D,0x0A .db "d = time base = 10 ms",0x00 ; ; End of source code ;