📄 avrsms_com.lst
字号:
##############################################################################
# #
# 24/Sep/2005 02:15:51 #
# IAR Atmel AVR C/C++ Compiler V4.10A/W32, Evaluation Version #
# Copyright 1996-2005 IAR Systems. All rights reserved. #
# #
# Source file = C:\Documents and Settings\vemund\Desktop\AVRGSM\Files\A #
# VRSMS_com.c #
# Command line = --cpu=m128 -ms -o "C:\Documents and #
# Settings\vemund\Desktop\AVRGSM\Debug\Obj\" -lCN #
# "C:\Documents and Settings\vemund\Desktop\AVRGSM\Debug\ #
# List\" -lA "C:\Documents and #
# Settings\vemund\Desktop\AVRGSM\Debug\List\" -y #
# --initializers_in_flash -z3 --no_cse --no_inline #
# --no_code_motion --no_cross_call --no_clustering #
# --no_tbaa --debug -DENABLE_BIT_DEFINITIONS -e -I #
# D:\Programs\iar\avr\INC\ -I #
# D:\Programs\iar\avr\INC\CLIB\ --eeprom_size 4096 #
# "C:\Documents and Settings\vemund\Desktop\AVRGSM\Files\ #
# AVRSMS_com.c" #
# List file = C:\Documents and Settings\vemund\Desktop\AVRGSM\Debug\L #
# ist\AVRSMS_com.lst #
# Object file = C:\Documents and Settings\vemund\Desktop\AVRGSM\Debug\O #
# bj\AVRSMS_com.r90 #
# #
# #
##############################################################################
C:\Documents and Settings\vemund\Desktop\AVRGSM\Files\AVRSMS_com.c
1 /*! \file ********************************************************************
2 *
3 * Atmel Corporation
4 *
5 * - File : AVRSMS_com.c
6 * - Compiler : IAR EWAAVR 3.20C
7 *
8 * - Support mail : avr@atmel.com
9 *
10 * - Supported devices : The example is written for ATmega169
11 *
12 *
13 * - AppNote : AVR323 - Interfacing Cellphones
14 *
15 * - Description : Example of how to use AVR Butterfly as Mobilephone controller
16 *
17 * $Revision: 1.1 $
18 * $Date: Tuesday, November 08, 2005 12:26:18 UTC $
19 *****************************************************************************/
20 //Includes
21
22 #ifdef S_SPLINT_S
23 #include"splint.h"
24 #endif
25
26 #include<iom128.h>
27 #include<inavr.h>
28 #include"AVRSMS_com.h"
29
\ In segment NEAR_Z, align 1, keep-with-next
\ 00000000 REQUIRE `?<Segment init: NEAR_Z>`
30 int rx_overflow, rx_ack; //Extern readable variables
\ rx_overflow:
\ 00000000 DS 2
\ In segment NEAR_Z, align 1, keep-with-next
\ 00000000 REQUIRE `?<Segment init: NEAR_Z>`
\ rx_ack:
\ 00000000 DS 2
\ In segment NEAR_Z, align 1, keep-with-next
\ 00000000 REQUIRE `?<Segment init: NEAR_Z>`
31 static unsigned char searchStr, rx_buffer[RX_BUFFER_SIZE];
\ ??searchStr:
\ 00000000 DS 1
\ In segment NEAR_Z, align 1, keep-with-next
\ 00000000 REQUIRE `?<Segment init: NEAR_Z>`
\ ??rx_buffer:
\ 00000000 DS 256
\ In segment NEAR_Z, align 1, keep-with-next
\ 00000000 REQUIRE `?<Segment init: NEAR_Z>`
32 static int rx_i, rx_wr_i;
\ ??rx_i:
\ 00000000 DS 2
\ In segment NEAR_Z, align 1, keep-with-next
\ 00000000 REQUIRE `?<Segment init: NEAR_Z>`
\ ??rx_wr_i:
\ 00000000 DS 2
\ In segment NEAR_F, align 1, keep-with-next
33 const unsigned char __flash OK[] = "OK\r\n";
\ OK:
\ 00000000 4B4F0A0D00 DB "OK\015\012"
\ In segment NEAR_F, align 1, keep-with-next
34 const unsigned char __flash CMTI[] = "+CMTI: ";
\ CMTI:
\ 00000000 432B544D3A49 DB "+CMTI: "
\ 0020
\ In segment NEAR_F, align 1, keep-with-next
35 const unsigned char __flash READY[] = "> ";
\ READY:
\ 00000000 203E00 DB "> "
\ In segment NEAR_F, align 1, keep-with-next
36 const unsigned char __flash CR_LF[] = "\r\n";
\ CR_LF:
\ 00000000 0A0D00 DB "\015\012"
\ In segment NEAR_Z, align 1, keep-with-next
\ 00000000 REQUIRE `?<Segment init: NEAR_Z>`
37 const unsigned char __flash *searchFor;
\ searchFor:
\ 00000000 DS 2
\ In segment NEAR_I, align 1, keep-with-next
\ 00000000 REQUIRE `?<Segment init: NEAR_I>`
38 const unsigned char __flash *searchStrings[4] = {OK, CMTI, READY, CR_LF};
\ searchStrings:
\ 00000000 DS 8
\ 00000008 REQUIRE `?<Initializer for searchStrings>`
39
40
41 /*! \brief USART initialization
42 *
43 * \param input Desired baudrate...see datasheet
44 *
45 * \retval void
46 *
47 */
\ In segment CODE, align 2, keep-with-next
48 void COM_init( unsigned int baudrate )
\ COM_init:
49 {
50 UBRR0H = (unsigned char) (baudrate>>8); //Setting baudrate
\ 00000000 0198 MOVW R19:R18, R17:R16
\ 00000002 2F23 MOV R18, R19
\ 00000004 93200090 STS 144, R18
51 UBRR0L = (unsigned char) baudrate; //Setting baudrate
\ 00000008 B909 OUT 0x09, R16
52
53 UCSR0B = ( 1 << RXEN0 ) | ( 1 << TXEN0 ); //Enable receiver and transmitter
\ 0000000A E108 LDI R16, 24
\ 0000000C B90A OUT 0x0A, R16
54 UCSR0C = ( 1 << USBS0 ) | ( 1 << UCSZ01 ) | ( 1 << UCSZ00 ); //8N1...see Datasheet for more information
\ 0000000E E00E LDI R16, 14
\ 00000010 93000095 STS 149, R16
55
56 COM_rx_reset(); //Reset buffers etc.
\ 00000014 .... RCALL COM_rx_reset
57 }//end COM_Init
\ 00000016 9508 RET
58
59
\ In segment CODE, align 2, keep-with-next
60 void COM_rx_reset( void )
\ COM_rx_reset:
61 {
62 UCSR0B &= ~(1<<RXCIE0); // Disable RX interrupt
\ 00000000 9857 CBI 0x0A, 0x07
63 rx_i = rx_wr_i = 0; //Init variables
\ 00000002 E000 LDI R16, 0
\ 00000004 E010 LDI R17, 0
\ 00000006 .... LDI R30, LOW(??rx_wr_i)
\ 00000008 .... LDI R31, (??rx_wr_i) >> 8
\ 0000000A 8300 ST Z, R16
\ 0000000C 8311 STD Z+1, R17
\ 0000000E .... LDI R30, LOW(??rx_i)
\ 00000010 .... LDI R31, (??rx_i) >> 8
\ 00000012 8300 ST Z, R16
\ 00000014 8311 STD Z+1, R17
64 rx_overflow = rx_ack = 0; //Zero overflow flag
\ 00000016 E000 LDI R16, 0
\ 00000018 E010 LDI R17, 0
\ 0000001A .... LDI R30, LOW(rx_ack)
\ 0000001C .... LDI R31, (rx_ack) >> 8
\ 0000001E 8300 ST Z, R16
\ 00000020 8311 STD Z+1, R17
\ 00000022 .... LDI R30, LOW(rx_overflow)
\ 00000024 .... LDI R31, (rx_overflow) >> 8
\ 00000026 8300 ST Z, R16
\ 00000028 8311 STD Z+1, R17
65 rx_buffer[ rx_wr_i ] = '\0'; //Buffer init.
\ 0000002A E000 LDI R16, 0
\ 0000002C .... LDI R30, LOW(??rx_wr_i)
\ 0000002E .... LDI R31, (??rx_wr_i) >> 8
\ 00000030 8120 LD R18, Z
\ 00000032 8131 LDD R19, Z+1
\ 00000034 01F9 MOVW R31:R30, R19:R18
\ 00000036 .... SUBI R30, LOW((-(??rx_buffer) & 0xFFFF))
\ 00000038 .... SBCI R31, (-(??rx_buffer) & 0xFFFF) >> 8
\ 0000003A 8300 ST Z, R16
66 }
\ 0000003C 9508 RET
67
68
\ In segment CODE, align 2, keep-with-next
69 void COM_rx_on( void )
\ COM_rx_on:
70 {
71 UCSR0B |= ( 1 << RXCIE0 ); // Enable RX interrupt
\ 00000000 9A57 SBI 0x0A, 0x07
72 }
\ 00000002 9508 RET
73
74
\ In segment CODE, align 2, keep-with-next
75 void COM_rx_off( void )
\ COM_rx_off:
76 {
77 UCSR0B &= ~( 1 << RXCIE0 ); // Disable RX interrupt
\ 00000000 9857 CBI 0x0A, 0x07
78 }
\ 00000002 9508 RET
79
80
\ In segment CODE, align 2, keep-with-next
81 void COM_setSearchString( unsigned char Response )
\ COM_setSearchString:
82 {
83 UCSR0B &= ~( 1 << RXCIE0 ); // Disable RX interrupt
\ 00000000 9857 CBI 0x0A, 0x07
84 searchFor = searchStrings[Response]; //Set desired search dtring
\ 00000002 2F20 MOV R18, R16
\ 00000004 E030 LDI R19, 0
\ 00000006 0F22 LSL R18
\ 00000008 1F33 ROL R19
\ 0000000A 01F9 MOVW R31:R30, R19:R18
\ 0000000C .... SUBI R30, LOW((-(searchStrings) & 0xFFFF))
\ 0000000E .... SBCI R31, (-(searchStrings) & 0xFFFF) >> 8
\ 00000010 8120 LD R18, Z
\ 00000012 8131 LDD R19, Z+1
\ 00000014 .... LDI R30, LOW(searchFor)
\ 00000016 .... LDI R31, (searchFor) >> 8
\ 00000018 8320 ST Z, R18
\ 0000001A 8331 STD Z+1, R19
85 searchStr = Response; //Used in rx_isr
\ 0000001C 9300.... STS ??searchStr, R16
86 rx_i = 0;
\ 00000020 E000 LDI R16, 0
\ 00000022 E010 LDI R17, 0
\ 00000024 .... LDI R30, LOW(??rx_i)
\ 00000026 .... LDI R31, (??rx_i) >> 8
\ 00000028 8300 ST Z, R16
\ 0000002A 8311 STD Z+1, R17
87 }
\ 0000002C 9508 RET
88
89
90 // Interrupt handler
91
92 /*! \brief USART Receive interrupt service routine
93 *
94 */
95 /*
96 #pragma vector=USART0_RXC_vect
97 __interrupt void USART0_RX_interrupt( void )
98 {
99 unsigned char data; //Local variable
100
101 data = UDR0; //Always read something
102
103 rx_buffer[ rx_wr_i++ ] = data; //Store new data
104 rx_buffer[ rx_wr_i ] = '\0'; //Always terminate string!
105
106 if( rx_wr_i > RX_BUFFER_MASK ) //Check for overflow
107 {
108 rx_wr_i = 0; //Reset write index
109 rx_overflow = 1; //Set flag high
110 UCSR0B &= ~( 1 << RXCIE0 ); // Disable RX interrupt
111 }
112
113 if( searchFor[rx_i] == data ) //Test response match
114 {
115 rx_i++;
116
117 if( !searchFor[rx_i] ) //End of new_message string...received new message!
118 {
119 rx_i = 0;
120 rx_ack = 1; //Set new message flag
121 UCSR0B &= ~( 1 << RXCIE0 ); // Disable RX interrupt
122 }
123 }
124 else
125 {
126 rx_i = 0; //Not valid search pattern...start again.
127 }
128 }//end rx-isr
129 */
130 #pragma vector=USART0_RXC_vect
\ In segment CODE, align 2, keep-with-next
131 __interrupt void USART0_RX_interrupt( void )
\ USART0_RX_interrupt:
132 {
\ 00000000 93BA ST -Y, R27
\ 00000002 93AA ST -Y, R26
\ 00000004 93FA ST -Y, R31
\ 00000006 93EA ST -Y, R30
\ 00000008 935A ST -Y, R21
\ 0000000A 934A ST -Y, R20
\ 0000000C 933A ST -Y, R19
\ 0000000E 932A ST -Y, R18
\ 00000010 931A ST -Y, R17
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -