IsrInfoSeg MACRO ;******************************************************************************** ; Interrupt Service Routine ;******************************************************************************** ; Updated 19 November 1999 - Nick Kelsey ; * Fixed fault in IrdaTxData and UartTxData where the stop bit was one ; interrupt cycle too long. ; Updated 6 December 1999 - Nick Kelsey ; * Added RTS/CTS defines for debug UART. ;******************************************************************************** ENDM IsrDataSeg MACRO ;******************************************************************************** ; Interrupt Service Routine ;******************************************************************************** org $10 IsrBank = $10 IsrTime50MHz = -108 ;50Mhz * 2.17us = 108.5 IsrTime = IsrTime50MHz ;Constant = MHz * 2.17us ;**** Isr **** IsrMReg ds 1 IsrIntFlags ds 1 ;**** IsrStatus **** (Global varible providing an interface to the Isr) TimerOverflow = IsrStatus.0 IrdaTxStart = IsrStatus.1 IrdaTxEmpty = IsrStatus.2 ;1 = finished sending byte IrdaRxAvail = IsrStatus.3 ;1 = received byte available to be read UartTxStart = IsrStatus.4 UartTxEmpty = IsrStatus.5 UartRxAvail = IsrStatus.6 ;1 = received byte available to be read DebugSend = UartTxStart ;**** Irda & Uart Status **** IrdaUartStatus ds 1 IrdaRxPulse = IrdaUartStatus.0 IrdaRxMode = IrdaUartStatus.1 ;1 = currently receiving a byte, 0 = idle IrdaTxMode = IrdaUartStatus.2 ;1 = currently transmitting a byte, 0 = idle UartRxMode = IrdaUartStatus.3 ;1 = currently receiving a byte, 0 = idle UartTxMode = IrdaUartStatus.4 ;1 = currently transmitting a byte, 0 = idle ;**** Irda **** IrdaTxPin = rb.7 ;Output - Idle Low IrdaRxPin = rb.6 ;Input - Idle High IrdaRxInt = 6 ;Interrupt = bit 6 Irda9600 = 48 ;+0.47% Irda19200 = 24 ;+0.47% Irda38400 = 12 ;+0.47% Irda57600 = 8 ;+0.47% Irda115200 = 4 ;+0.47% IrdaSpeed ds 1 IrdaData ds 1 IrdaRxBits ds 1 IrdaBitCount ds 1 IrdaDivide ds 1 ;**** Uart **** UartTxPin = rb.2 ;Output - Idle High UartRxPin = rb.0 ;Input - Idle High UartRtsPin = rb.1 ;Output UartCtsPin = rb.3 ;Input Uart9600 = 48 ;+0.47% Uart19200 = 24 ;+0.47% Uart38400 = 12 ;+0.47% Uart57600 = 8 ;+0.47% Uart115200 = 4 ;+0.47% UartSpeed = Uart115200 UartTxData = DebugData ;Global Variable UartTxBits ds 1 UartTxBitCount ds 1 UartTxDivide ds 1 UartRxData ds 1 UartRxBits ds 1 UartRxBitCount ds 1 UartRxDivide ds 1 org $30 TimerBank = $30 ;Shared with Framing layer Random ds 1 ;Increments every timer interrupt (108 cycles @ 50MHz) Timer1 ds 1 ;Resetable, Increments every timer interrupt (108 cycles @ 50MHz) Timer2 ds 1 ;Resetable, Increments every Timer1 overflow (27648 cycles @ 50MHz) Timer3 ds 1 ;Resetable, Increments every Timer2 overflow (7077888 cycles @ 50MHz) ;******************************************************************************** ENDM IsrCodeSeg MACRO ;******************************************************************************** ; Interrupt Service Routine ;******************************************************************************** GlobalIsr ;Interrupt = Timer bank TimerBank inc Random ;1 Random increment (Note: The main code is synchronous with RTCC and so RTCC is not a random number) inc Timer1 ;1 Timer: increment snz ;1/2 Timer: overflow ? inc Timer2 ;1 Timer: Yes => increment snz ;1/2 Timer: overflow ? inc Timer3 ;1 Timer: Yes => increment snz ;1/2 Timer: overflow ? setb TimerOverflow ;1 Timer: Yes => set flag (Timer = 7 cycles) bank IsrBank ;1 mov IsrMReg, m ;2 Backup M register mov m, #WKPND ;1 Set mode to examine port b interrupt flags mov w, #0 ;1 Clear W mov !rb, w ;1 Swap contents of W and WKPEN_B (interrupt flags are cleared) mov IsrIntFlags, w ;1 Store cause of interrupt IrdaIsr ; Irda -> IrdaRet: Idle = 6 cycles, Tx = 9/19/23 cycles, Rx = 12/21/27 cycles, RxStart = 18 cycles snb IrdaTxMode ;1/2 Irda Tx ? jmp IrdaTxDataIsr ;3 Yes => IrdaTxDataIsr snb IrdaTxStart ;1/2 Irda Tx ? jmp IrdaTxStartIsr ;3 Yes => IrdaTxStartIsr snb IrdaRxMode ;1/2 Irda Rx ? jmp IrdaRxDataIsr ;3 Yes => IrdaRxDataIsr snb IsrIntFlags.IrdaRxInt ;1/2 Falling edge of Rx pin indicating start bit ? jmp IrdaRxStartIsr ;3 Yes => IrdaRxStartIsr IrdaRet ; Irda -> IrdaRet: Idle = 6 cycles, Tx = 9/19/23 cycles, Rx = 12/21/27 cycles, RxStart = 18 cycles UartTxIsr snb UartTxMode ;1/2 Transmitting ? jmp UartTxDataIsr ;3 Yes => UartTxDataIsr snb UartTxStart ;1/2 Start transmit ? jmp UartTxStartIsr ;3 Yes => UartTxStartIsr UartTxRet UartRxIsr snb UartRxMode ;1/2 Receiving ? jmp UartRxDataIsr ;3 Yes => UartRxDataIsr sb UartRxPin ;1/2 Start bit ? (start bit = 0) jmp UartRxStartIsr ;3 Yes => UartRxStartIsr UartRxRet mov m, IsrMReg ;2 Restore M register mov w, #IsrTime ;1 Interrupt in 108 @ 50Mhz cycles retiw ;3 Total Isr Time = x cycles IrdaTxDataIsr ; Time = 5/13/16/20 cycles clrb IrdaTxPin ;1 return to idle decsz IrdaDivide ;1/2 jmp IrdaRet ;3 Isr Time = +5 cycles from IrdaTxIsr decsz IrdaBitCount ;1/2 Sent all bits? jmp :Bit ;3 No => output next bit :End snb IrdaTxStart ;1/2 Yes => complete, Another byte to transmit? jmp IrdaTxStartIsr ;3 Yes => IrdaTxStartIsr clrb IrdaTxMode ;1 Finished setb IrdaTxEmpty ;1 Flag to indicate that the transmission is complete clrb ledTX ;1 Turn off TX LED (indication LED not actual IR emitter) jmp IrdaRet ;3 Isr Time = +19 cycles from IrdaTxIsr :Bit sb IrdaData.0 ;1/2 Output next bit setb IrdaTxPin ;1 Output next bit stc ;1 Stop bit (idle = 1) rr IrdaData ;1 mov IrdaDivide, IrdaSpeed ;2 Apply baud rate jmp IrdaRet ;3 Isr Time = +16 cycles from IrdaTxIsr IrdaTxStartIsr clrb IrdaTxStart ;1 Clear start mode setb ledTX ;1 Turn on TX LED (indication LED not actual IR emitter) setb IrdaTxPin ;1 Output start pulse (note position of this instruction is such that it matches the setb of the TxDataIsr) mov IrdaDivide, IrdaSpeed ;2 Apply baud rate mov IrdaBitCount, #10 ;2 Bit count = 8 data + 1 stop + 1 for stop bit to complete setb IrdaTxMode ;1 Enter Tx mode jmp IrdaRet ;3 Isr Time = +n cycles IrdaRxDataIsr ; Time = 4/13/19 cycles snb IsrIntFlags.IrdaRxInt ;1/2 Was a pulse received ? setb IrdaRxPulse ;1 Yes => Flag pulse decsz IrdaDivide ;1/2 jmp IrdaRet ;3 Isr Time = +4 cycles from IrdaRxIsr clc ;1 Determine bit sb IrdaRxPulse ;1/2 Determine bit stc ;1 Determine bit rr IrdaRxBits ;1 Record bit clrb IrdaRxPulse ;1 Reset pulse flag mov IrdaDivide, IrdaSpeed ;2 Apply baud rate decsz IrdaBitCount ;1/2 jmp IrdaRet ;3 Isr Time = +13 cycles from IrdaRxIsr mov IrdaData, IrdaRxBits ;2 Copy bits into IrdaData clrb IrdaRxMode ;1 Finished setb IrdaRxAvail ;1 clrb ledRX ;1 Turn off RX LED (indication LED not actual IR emitter) jmp IrdaRet ;3 Isr Time = +19 cycles from IrdaRxIsr IrdaRxStartIsr ; Time = 10 cycles setb ledRX ;1 Turn on RX LED (indication LED not actual IR emitter) clc ;1 mov w, >>IrdaSpeed ;1 W = IrdaSpeed / 2 mov IrdaDivide, w ;1 IrdaDivide = IrdaSpeed * 0.5 mov IrdaBitCount, #9 ;2 Bit count = 9 (1/2 start, 8 data, ignore stop) setb IrdaRxMode ;1 Enter rx mode jmp IrdaRet ;3 Isr Time = +10 cycles from IrdaRxStartIsr UartTxDataIsr ; Time = 4/11/17 cycles decsz UartTxDivide ;1/2 jmp UartTxRet ;3 Isr Time = +n cycles from UartTxIsr decsz UartTxBitCount ;1/2 Sent all bits? jmp :Bit ;3 No => output next bit :End snb UartTxStart ;1/2 Yes => complete, Another byte to transmit? jmp UartTxStartIsr ;3 Yes => UartTxStartIsr clrb UartTxMode ;1 No => Complete setb UartTxEmpty ;1 Flag to indicate that the transmission is complete jmp UartTxRet ;3 Complete :Bit movb UartTxPin, UartTxBits.0 ;4 Output next bit stc ;1 Stop bit (idle = 1) rr UartTxBits ;1 mov UartTxDivide, #UartSpeed ;2 Apply UartSpeed jmp UartTxRet ;3 Isr Time = +n cycles from UartTxIsr UartTxStartIsr clrb UartTxPin ;1 Output start bit mov UartTxBits, UartTxData ;2 Load data for transmission mov UartTxDivide, #UartSpeed ;2 Apply UartSpeed mov UartTxBitCount, #10 ;2 Bit count = 8 data + 1 stop + 1 for stop bit to complete clrb UartTxStart ;1 Clear start mode setb UartTxMode ;1 Enter Tx mode jmp UartTxRet ;3 Isr Time = +n cycles UartRxDataIsr decsz UartRxDivide ;1/2 jmp UartRxRet ;3 Isr Time = +n cycles decsz UartRxBitCount ;1/2 jmp :Read ;3 :Stop mov UartRxData, UartRxBits ;2 Copy bits into UartData clrb UartRxMode ;1 Finished setb UartRxAvail ;1 jmp UartRxRet ;3 Isr Time = +n cycles :Read clc ;1 Determine bit snb UartRxPin ;1/2 Determine bit stc ;1 Determine bit rr UartRxBits ;1 Record bit mov UartRxDivide, #UartSpeed ;2 Apply baud rate jmp UartRxRet ;3 Isr Time = +n cycles UartRxStartIsr mov UartRxDivide, #UartSpeed / 2 ;2 UartDivide = UartSpeed * 0.5 mov UartRxBitCount, #10 ;2 Bit count = 10 (1/2 start, 8 data, 1 stop) setb UartRxMode ;1 Enter rx mode jmp UartRxRet ;3 Isr Time = +n cycles IsrInit clr IsrStatus bank IsrBank clr IrdaUartStatus mov IrdaSpeed, #Irda9600 mov !option, #%10011111 ;enable rtcc interrupt retp ;******************************************************************************** ENDM
file: /Techref/scenix/lib/io/osi2/ir/da/ISR.SRC, 9KB, , updated: 1999/12/6 15:37, local time: 2024/8/14 14:42,
3.15.206.200:LOG IN
|
©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://sxlist.com/techref/scenix/lib/io/osi2/ir/da/ISR.SRC"> scenix lib io osi2 ir da ISR</A> |
Did you find what you needed? |
Welcome to sxlist.com!sales, advertizing, & kind contributors just like you! Please don't rip/copy (here's why Copies of the site on CD are available at minimal cost. |
Ashley Roll has put together a really nice little unit here. Leave off the MAX232 and keep these handy for the few times you need true RS232! |
.