⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.s90

📁 Wind sensor for control speed air flow.
💻 S90
字号:
//////////////////////////////////////////////////////////////////////////////
//                                                                           /
//                                                     14/Nov/2007  16:06:20 /
// IAR Atmel AVR C/C++ Compiler V4.12A/W32, Evaluation Version               /
// Copyright 1996-2005 IAR Systems. All rights reserved.                     /
//                                                                           /
//    Source file  =  D:\Work\Devices\WindSensor\Software\uart.c             /
//    Command line =  D:\Work\Devices\WindSensor\Software\uart.c --cpu=m8    /
//                    -ms -o D:\Work\Devices\WindSensor\Software\Debug\Obj\  /
//                    -lB D:\Work\Devices\WindSensor\Software\Debug\List\    /
//                    --initializers_in_flash --version1_calls -s2 --no_cse  /
//                    --no_inline --no_code_motion --no_cross_call           /
//                    --no_clustering --no_tbaa --debug                      /
//                    -DENABLE_BIT_DEFINITIONS -e -I "C:\Program Files\IAR   /
//                    Systems\Embedded Workbench 4.0 Evaluation\avr\INC\"    /
//                    -I "C:\Program Files\IAR Systems\Embedded Workbench    /
//                    4.0 Evaluation\avr\INC\CLIB\" --eeprom_size 512        /
//    List file    =  D:\Work\Devices\WindSensor\Software\Debug\List\uart.s9 /
//                    0                                                      /
//                                                                           /
//                                                                           /
//////////////////////////////////////////////////////////////////////////////

        NAME uart

        RSEG CSTACK:DATA:NOROOT(0)
        RSEG RSTACK:DATA:NOROOT(0)

        EXTERN ?need_segment_init

        PUBWEAK `?<Segment init: NEAR_Z>`
        PUBWEAK `??USART_RX_Complete??INTVEC 22`
        PUBWEAK `??USART_UDR_Empty??INTVEC 24`
        PUBLIC USART_RX_Complete
        PUBLIC USART_UDR_Empty
        PUBWEAK _A_UBRRL
        PUBWEAK _A_UCSRB
        PUBWEAK _A_UDR
        PUBWEAK __?EEARH
        PUBWEAK __?EEARL
        PUBWEAK __?EECR
        PUBWEAK __?EEDR
        PUBLIC g_receiveBuffer
        PUBLIC g_transmitBuffer
        PUBLIC serGetTransmitBufferEmpty
        PUBLIC serGetTransmitBufferFull
        PUBLIC serHasBytesBeenReceived
        PUBLIC serInit
        PUBLIC serReadByte
        PUBLIC serWriteByte
        PUBLIC serWriteFromSRAM

USART_RX_Complete   SYMBOL "USART_RX_Complete"
`??USART_RX_Complete??INTVEC 22` SYMBOL "??INTVEC 22", USART_RX_Complete
USART_UDR_Empty     SYMBOL "USART_UDR_Empty"
`??USART_UDR_Empty??INTVEC 24` SYMBOL "??INTVEC 24", USART_UDR_Empty

        EXTERN buInitBuffer
        EXTERN buWriteByte
        EXTERN buIsBufferEmpty
        EXTERN buReadByte
        EXTERN buIsBufferFull

// D:\Work\Devices\WindSensor\Software\uart.c
//    1 /************************************************
//    2    uart.c - Routines for a buffered UART.
//    3 *************************************************/
//    4 #include <iom8.h>

        ASEGN ABSOLUTE:DATA:NOROOT,029H
// union <unnamed> volatile __io _A_UBRRL
_A_UBRRL:
        DS 1

        ASEGN ABSOLUTE:DATA:NOROOT,02aH
// union <unnamed> volatile __io _A_UCSRB
_A_UCSRB:
        DS 1

        ASEGN ABSOLUTE:DATA:NOROOT,02cH
// union <unnamed> volatile __io _A_UDR
_A_UDR:
        DS 1
//    5 #include "uart.h"
//    6 #include "buffer.h"
//    7 
//    8 #define UART_BAUD_RATE			115200
//    9 #define UART_UBRR			3//((F_CPU / 16 / UART_BAUD_RATE)-1)
//   10 

        RSEG NEAR_Z:DATA:NOROOT(0)
        REQUIRE `?<Segment init: NEAR_Z>`
//   11 bsCircBuffer g_receiveBuffer;
g_receiveBuffer:
        DS 10

        RSEG NEAR_Z:DATA:NOROOT(0)
        REQUIRE `?<Segment init: NEAR_Z>`
//   12 bsCircBuffer g_transmitBuffer;
g_transmitBuffer:
        DS 10
//   13 
//   14 // serInit() - Initialises the serial port routines

        RSEG CODE:CODE:NOROOT(1)
//   15 void serInit(void)
serInit:
//   16 { buInitBuffer(&g_receiveBuffer);
        LDI	R16, LOW(g_receiveBuffer)
        LDI	R17, (g_receiveBuffer) >> 8
        RCALL	buInitBuffer
//   17   buInitBuffer(&g_transmitBuffer);
        LDI	R16, LOW(g_transmitBuffer)
        LDI	R17, (g_transmitBuffer) >> 8
        RCALL	buInitBuffer
//   18   UCSRB = 0xD8;
        LDI	R16, 216
        OUT	0x0A, R16
//   19   UBRRL = UART_UBRR;
        LDI	R16, 3
        OUT	0x09, R16
//   20 }
        RET
//   21 // ISR : RX - When a byte is received, throw it into the receive buffer.
//   22 #pragma vector = USART_RXC_vect

        RSEG CODE:CODE:NOROOT(1)
//   23 __interrupt void USART_RX_Complete(void)
USART_RX_Complete:
//   24 { unsigned char nByte;  
        ST	-Y, R25
        ST	-Y, R24
        ST	-Y, R31
        ST	-Y, R30
        ST	-Y, R3
        ST	-Y, R2
        ST	-Y, R1
        ST	-Y, R0
        ST	-Y, R23
        ST	-Y, R22
        ST	-Y, R21
        ST	-Y, R20
        ST	-Y, R19
        ST	-Y, R18
        ST	-Y, R17
        ST	-Y, R16
        IN	R25, 0x3F
//   25   nByte = UDR;
        IN	R16, 0x0C
        MOV	R24, R16
//   26   buWriteByte(&g_receiveBuffer, nByte);
        MOV	R20, R24
        LDI	R16, LOW(g_receiveBuffer)
        LDI	R17, (g_receiveBuffer) >> 8
        RCALL	buWriteByte
//   27 }
        OUT	0x3F, R25
        LD	R16, Y+
        LD	R17, Y+
        LD	R18, Y+
        LD	R19, Y+
        LD	R20, Y+
        LD	R21, Y+
        LD	R22, Y+
        LD	R23, Y+
        LD	R0, Y+
        LD	R1, Y+
        LD	R2, Y+
        LD	R3, Y+
        LD	R30, Y+
        LD	R31, Y+
        LD	R24, Y+
        LD	R25, Y+
        RETI
//   28 // ISR : TX - When the data buffer is empty, transmit a byte if possible, otherwise disable
//   29 // this interrupt.
//   30 #pragma vector = USART_UDRE_vect

        RSEG CODE:CODE:NOROOT(1)
//   31 __interrupt void USART_UDR_Empty(void)
USART_UDR_Empty:
//   32 { if(!buIsBufferEmpty(&g_transmitBuffer))
        ST	-Y, R25
        ST	-Y, R24
        ST	-Y, R31
        ST	-Y, R30
        ST	-Y, R3
        ST	-Y, R2
        ST	-Y, R1
        ST	-Y, R0
        ST	-Y, R23
        ST	-Y, R22
        ST	-Y, R21
        ST	-Y, R20
        ST	-Y, R19
        ST	-Y, R18
        ST	-Y, R17
        ST	-Y, R16
        IN	R25, 0x3F
        LDI	R16, LOW(g_transmitBuffer)
        LDI	R17, (g_transmitBuffer) >> 8
        RCALL	buIsBufferEmpty
        TST	R16
        BRNE	??USART_UDR_Empty_0
//   33   { unsigned char nData;    
//   34     nData = buReadByte(&g_transmitBuffer);
        LDI	R16, LOW(g_transmitBuffer)
        LDI	R17, (g_transmitBuffer) >> 8
        RCALL	buReadByte
        MOV	R24, R16
//   35     UDR = nData;
        OUT	0x0C, R24
        RJMP	??USART_UDR_Empty_1
//   36   }
//   37   else UCSRB_Bit5 = 0;
??USART_UDR_Empty_0:
        CBI	0x0A, 0x05
//   38 }
??USART_UDR_Empty_1:
        OUT	0x3F, R25
        LD	R16, Y+
        LD	R17, Y+
        LD	R18, Y+
        LD	R19, Y+
        LD	R20, Y+
        LD	R21, Y+
        LD	R22, Y+
        LD	R23, Y+
        LD	R0, Y+
        LD	R1, Y+
        LD	R2, Y+
        LD	R3, Y+
        LD	R30, Y+
        LD	R31, Y+
        LD	R24, Y+
        LD	R25, Y+
        RETI
//   39 // serHasBytesBeenReceived() - Returns whether or not bytes have been received.
//   40 // Returns:
//   41 //   0 - Input buffer empty
//   42 // else - Bytes are available

        RSEG CODE:CODE:NOROOT(1)
//   43 unsigned char serHasBytesBeenReceived(void)
serHasBytesBeenReceived:
//   44 { return (buIsBufferEmpty(&g_receiveBuffer) ? 0 : 1);
        LDI	R16, LOW(g_receiveBuffer)
        LDI	R17, (g_receiveBuffer) >> 8
        RCALL	buIsBufferEmpty
        TST	R16
        BREQ	??serHasBytesBeenReceived_0
        LDI	R16, 0
        RET
??serHasBytesBeenReceived_0:
        LDI	R16, 1
        RET
//   45 }
//   46 // serReadByte() - Returns a received byte from the buffer.  Ensure that there
//   47 // is data in the buffer first by reading serGetBytesReceived() first.
//   48 // Returns:
//   49 //   A byte from the receive buffer

        RSEG CODE:CODE:NOROOT(1)
//   50 unsigned char serReadByte(void)
serReadByte:
//   51 { return buReadByte(&g_receiveBuffer);
        LDI	R16, LOW(g_receiveBuffer)
        LDI	R17, (g_receiveBuffer) >> 8
        RCALL	buReadByte
        RET
//   52 }
//   53 // serWriteByte() - Puts a byte into the transmit buffer, and enable the transmit
//   54 // interrupt.
//   55 // Returns:
//   56 //   The number of bytes written into the buffer.

        RSEG CODE:CODE:NOROOT(1)
//   57 unsigned char serWriteByte(unsigned char nData)
serWriteByte:
//   58 { unsigned char nBytesInBuffer;
        ST	-Y, R25
        ST	-Y, R24
        MOV	R25, R16
//   59   if(buWriteByte(&g_transmitBuffer, nData) != 0) nBytesInBuffer = 0;
        MOV	R20, R25
        LDI	R16, LOW(g_transmitBuffer)
        LDI	R17, (g_transmitBuffer) >> 8
        RCALL	buWriteByte
        TST	R16
        BREQ	??serWriteByte_0
        LDI	R24, 0
        RJMP	??serWriteByte_1
//   60   else
//   61   { nBytesInBuffer = 1;
??serWriteByte_0:
        LDI	R24, 1
//   62     UCSRB_Bit5 = 1;
        SBI	0x0A, 0x05
//   63   }
//   64   return nBytesInBuffer;
??serWriteByte_1:
        MOV	R16, R24
        LD	R24, Y+
        LD	R25, Y+
        RET
//   65 }
//   66 
//   67 // serGetTransmitBufferFull() - Indicates if the output buffer is full or not
//   68 // Returns:
//   69 //   0 - Transmit buffer is not full
//   70 //   1 - Transmit buffer is full

        RSEG CODE:CODE:NOROOT(1)
//   71 unsigned char serGetTransmitBufferFull(void)
serGetTransmitBufferFull:
//   72 { return buIsBufferFull(&g_transmitBuffer);
        LDI	R16, LOW(g_transmitBuffer)
        LDI	R17, (g_transmitBuffer) >> 8
        RCALL	buIsBufferFull
        RET
//   73 }
//   74 // serWriteFromSRAM() - Writes a string to the serial port from SRAM.
//   75 //   pString - A pointer to SRAM
//   76 //   nLength - The number of characters in the string
//   77 // Returns:
//   78 //   The number of bytes written to the transmit buffer

        RSEG CODE:CODE:NOROOT(1)
//   79 unsigned char serWriteFromSRAM(const unsigned char *pString, unsigned char nLength)
serWriteFromSRAM:
//   80 { unsigned char nBytesInBuffer;
        ST	-Y, R27
        ST	-Y, R26
        ST	-Y, R25
        ST	-Y, R24
        MOVW	R25:R24, R17:R16
        MOV	R26, R20
//   81   nBytesInBuffer = 0;
        LDI	R27, 0
//   82   for( ; nLength > 0; nLength--)
??serWriteFromSRAM_0:
        CPI	R26, 1
        BRCS	??serWriteFromSRAM_1
//   83   { if(buWriteByte(&g_transmitBuffer, *pString) != 0) break;
        MOVW	R31:R30, R25:R24
        LD	R20, Z
        LDI	R16, LOW(g_transmitBuffer)
        LDI	R17, (g_transmitBuffer) >> 8
        RCALL	buWriteByte
        TST	R16
        BRNE	??serWriteFromSRAM_1
//   84     nBytesInBuffer++;
        INC	R27
//   85     pString++;
        ADIW	R25:R24, 1
//   86   }
        DEC	R26
        RJMP	??serWriteFromSRAM_0
//   87   UCSRB_Bit5 = 1;
??serWriteFromSRAM_1:
        SBI	0x0A, 0x05
//   88   return nBytesInBuffer;
        MOV	R16, R27
        LD	R24, Y+
        LD	R25, Y+
        LD	R26, Y+
        LD	R27, Y+
        RET
//   89 }
//   90 // serGetTransmitBufferEmpty() - Returns whether or not the transmit buffer
//   91 // is emtpy.
//   92 // Returns:
//   93 //    0 - Transmit buffer not empty
//   94 // else - Transmit buffer empty

        RSEG CODE:CODE:NOROOT(1)
//   95 unsigned char serGetTransmitBufferEmpty(void)
serGetTransmitBufferEmpty:
//   96 { return buIsBufferEmpty(&g_transmitBuffer);
        LDI	R16, LOW(g_transmitBuffer)
        LDI	R17, (g_transmitBuffer) >> 8
        RCALL	buIsBufferEmpty
        RET
//   97 }

        ASEGN ABSOLUTE:DATA:NOROOT,01cH
__?EECR:

        ASEGN ABSOLUTE:DATA:NOROOT,01dH
__?EEDR:

        ASEGN ABSOLUTE:DATA:NOROOT,01eH
__?EEARL:

        ASEGN ABSOLUTE:DATA:NOROOT,01fH
__?EEARH:

        COMMON INTVEC:CODE:ROOT(1)
        ORG 22
`??USART_RX_Complete??INTVEC 22`:
        RJMP	USART_RX_Complete

        COMMON INTVEC:CODE:ROOT(1)
        ORG 24
`??USART_UDR_Empty??INTVEC 24`:
        RJMP	USART_UDR_Empty

        RSEG INITTAB:CODE:NOROOT(0)
`?<Segment init: NEAR_Z>`:
        DW	SFE(NEAR_Z) - SFB(NEAR_Z)
        DW	SFB(NEAR_Z)
        DW	0
        REQUIRE ?need_segment_init

        END
// 
//   3 bytes in segment ABSOLUTE
// 328 bytes in segment CODE
//   6 bytes in segment INITTAB
//   4 bytes in segment INTVEC
//  20 bytes in segment NEAR_Z
// 
// 328 bytes of CODE memory (+ 10 bytes shared)
//  20 bytes of DATA memory (+  3 bytes shared)
//
//Errors: none
//Warnings: none

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -