📄 softuart.lst
字号:
1 .file "softuart.c"
2 __SREG__ = 0x3f
3 __SP_H__ = 0x3e
4 __SP_L__ = 0x3d
5 __CCP__ = 0x34
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
90 .global softuart_putc
92 softuart_putc:
1:io/softuart.c **** /*
2:io/softuart.c **** ,-----------------------------------------------------------------------------------------.
3:io/softuart.c **** | io/softuart
4:io/softuart.c **** |-----------------------------------------------------------------------------------------
5:io/softuart.c **** | this file implements a very basic 19200baud software uart
6:io/softuart.c **** | - USE AN 7.3728MHz OSC !
7:io/softuart.c **** | - does NOT use any timer
8:io/softuart.c **** | - might not work with every uart
9:io/softuart.c **** | - if interrupted by timer interrupt there might be some garbage
10:io/softuart.c **** |
11:io/softuart.c **** | Author : {{removed according to contest rules}}
12:io/softuart.c **** | -> circuitcellar.com avr design contest 2006
13:io/softuart.c **** | -> Entry #AT2616
14:io/softuart.c **** |
15:io/softuart.c **** |-----------------------------------------------------------------------------------------
16:io/softuart.c **** | License:
17:io/softuart.c **** | This program is free software; you can redistribute it and/or modify it under
18:io/softuart.c **** | the terms of the GNU General Public License as published by the Free Software
19:io/softuart.c **** | Foundation; either version 2 of the License, or (at your option) any later
20:io/softuart.c **** | version.
21:io/softuart.c **** | This program is distributed in the hope that it will be useful, but
22:io/softuart.c **** |
23:io/softuart.c **** | WITHOUT ANY WARRANTY;
24:io/softuart.c **** |
25:io/softuart.c **** | without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
26:io/softuart.c **** | PURPOSE. See the GNU General Public License for more details.
27:io/softuart.c **** |
28:io/softuart.c **** | You should have received a copy of the GNU General Public License along with
29:io/softuart.c **** | this program; if not, write to the Free Software Foundation, Inc., 51
30:io/softuart.c **** | Franklin St, Fifth Floor, Boston, MA 02110, USA
31:io/softuart.c **** |
32:io/softuart.c **** | http://www.gnu.de/gpl-ger.html
33:io/softuart.c **** `-----------------------------------------------------------------------------------------*/
34:io/softuart.c **** #include "softuart.h"
35:io/softuart.c ****
36:io/softuart.c **** void softuart_put_ip(uint32_t ip){
37:io/softuart.c **** softuart_put_uint8(ip>>24); softuart_putc('.');
38:io/softuart.c **** softuart_put_uint8(ip>>16); softuart_putc('.');
39:io/softuart.c **** softuart_put_uint8(ip>> 8); softuart_putc('.');
40:io/softuart.c **** softuart_put_uint8(ip);
41:io/softuart.c **** }
42:io/softuart.c ****
43:io/softuart.c **** void softuart_put_uint16(unsigned int c){
44:io/softuart.c **** unsigned int tmp;
45:io/softuart.c **** unsigned int mul;
46:io/softuart.c **** unsigned char l;
47:io/softuart.c ****
48:io/softuart.c **** l=0;
49:io/softuart.c **** for(mul=10000; mul>0; mul = mul/10){
50:io/softuart.c **** tmp = '0';
51:io/softuart.c **** while(c>=mul){
52:io/softuart.c **** c -= mul;
53:io/softuart.c **** tmp++;
54:io/softuart.c **** l=1;
55:io/softuart.c **** }
56:io/softuart.c **** if (l==0 && tmp == '0' && mul!=1)
57:io/softuart.c **** softuart_putc(' ');
58:io/softuart.c **** else
59:io/softuart.c **** softuart_putc(tmp);
60:io/softuart.c **** }
61:io/softuart.c **** }
62:io/softuart.c ****
63:io/softuart.c **** void softuart_put_uint8(unsigned char c){
64:io/softuart.c **** unsigned int tmp;
65:io/softuart.c **** unsigned char mul;
66:io/softuart.c **** unsigned char l;
67:io/softuart.c ****
68:io/softuart.c **** l=0;
69:io/softuart.c **** for(mul=100; mul>0; mul = mul/10){
70:io/softuart.c **** tmp = '0';
71:io/softuart.c **** while(c>=mul){
72:io/softuart.c **** c -= mul;
73:io/softuart.c **** tmp++;
74:io/softuart.c **** l=1;
75:io/softuart.c **** }
76:io/softuart.c **** if (l==0 && tmp == '0' && mul!=1)
77:io/softuart.c **** softuart_putc(' ');
78:io/softuart.c **** else
79:io/softuart.c **** softuart_putc(tmp);
80:io/softuart.c **** }
81:io/softuart.c **** }
82:io/softuart.c ****
83:io/softuart.c **** void softuart_putnewline(){
84:io/softuart.c **** softuart_puts_progmem("\r\n");
85:io/softuart.c **** }
86:io/softuart.c ****
87:io/softuart.c **** void softuart_puts_progmem2(PGM_P pointer){
88:io/softuart.c **** unsigned char c = pgm_read_byte(pointer++);
89:io/softuart.c **** while(c){
90:io/softuart.c **** softuart_putc(c);
91:io/softuart.c **** c = pgm_read_byte(pointer++);
92:io/softuart.c **** }
93:io/softuart.c **** }
94:io/softuart.c ****
95:io/softuart.c **** void softuart_puts (char *s){
96:io/softuart.c **** while (*s){
97:io/softuart.c **** softuart_putc(*s);
98:io/softuart.c **** s++;
99:io/softuart.c **** }
100:io/softuart.c **** }
101:io/softuart.c ****
102:io/softuart.c **** void softuart_putc(unsigned char c){
93 tabn 68,0,105,.LM1-.LFBB1
94 .LM1:
95 cbi 35-32,1
96 .LBB44:
97 .LBB45:
103:io/softuart.c **** uart_putc(unsigned char c){
104:io/softuart.c **** unsigned char cnt = 8;
105:io/softuart.c **** //send startbit: (=low)
98 6:
99 .LBB47:
101 .Ltext1:
103 .LM2:
104 ldi r25,lo8(108)
105 /* #APP */
106 ; 83 "c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h" 1
1:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** /* Copyright (c) 2002, Marek Michalkiewicz
2:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** Copyright (c) 2007 Joerg Wunsch
3:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** All rights reserved.
4:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
5:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** Redistribution and use in source and binary forms, with or without
6:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** modification, are permitted provided that the following conditions are met:
7:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
8:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** * Redistributions of source code must retain the above copyright
9:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** notice, this list of conditions and the following disclaimer.
10:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
11:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** * Redistributions in binary form must reproduce the above copyright
12:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** notice, this list of conditions and the following disclaimer in
13:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** the documentation and/or other materials provided with the
14:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** distribution.
15:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
16:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** * Neither the name of the copyright holders nor the names of
17:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** contributors may be used to endorse or promote products derived
18:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** from this software without specific prior written permission.
19:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
20:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** POSSIBILITY OF SUCH DAMAGE. */
31:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
32:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** /* $Id: delay_basic.h,v 1.1 2007/05/13 21:23:20 joerg_wunsch Exp $ */
33:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
34:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** #ifndef _UTIL_DELAY_BASIC_H_
35:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** #define _UTIL_DELAY_BASIC_H_ 1
36:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
37:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** #include <inttypes.h>
38:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
39:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** /** \file */
40:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** /** \defgroup util_delay_basic <util/delay_basic.h>: Basic busy-wait delay loops
41:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** \code
42:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** #include <util/delay_basic.h>
43:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** \endcode
44:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
45:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** The functions in this header file implement simple delay loops
46:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** that perform a busy-waiting. They are typically used to
47:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** facilitate short delays in the program execution. They are
48:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** implemented as count-down loops with a well-known CPU cycle
49:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** count per loop iteration. As such, no other processing can
50:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** occur simultaneously. It should be kept in mind that the
51:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** functions described here do not disable interrupts.
52:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
53:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** In general, for long delays, the use of hardware timers is
54:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** much preferrable, as they free the CPU, and allow for
55:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** concurrent processing of other events while the timer is
56:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** running. However, in particular for very short delays, the
57:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** overhead of setting up a hardware timer is too much compared
58:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** to the overall delay time.
59:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
60:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** Two inline functions are provided for the actual delay algorithms.
61:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
62:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** */
63:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
64:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** #if !defined(__DOXYGEN__)
65:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** static inline void _delay_loop_1(uint8_t __count) __attribute__((always_inline));
66:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** static inline void _delay_loop_2(uint16_t __count) __attribute__((always_inline));
67:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** #endif
68:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
69:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** /** \ingroup util_delay_basic
70:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
71:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** Delay loop using an 8-bit counter \c __count, so up to 256
72:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** iterations are possible. (The value 256 would have to be passed
73:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** as 0.) The loop executes three CPU cycles per iteration, not
74:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** including the overhead the compiler needs to setup the counter
75:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** register.
76:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
77:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** Thus, at a CPU speed of 1 MHz, delays of up to 768 microseconds
78:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** can be achieved.
79:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** */
80:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** void
81:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** _delay_loop_1(uint8_t __count)
82:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** {
83:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** __asm__ volatile (
107 25
108 brne 1b
109 0002 9CE6 ; 0 "" 2
110 /* #NOAPP */
111 ldi r18,lo8(8)
112 0004 9A95 .LBE47:
113 0006 01F4 .LBE46:
114 .LBE45:
115 .LBE44:
116 0008 28E0 .LBB48:
117 .LBB49:
118 .LBB50:
119 .LBB51:
120 ldi r19,lo8(108)
121 .L5:
122 .LBE51:
123 .LBE50:
124 .LBE49:
125 000a 3CE6 .LBE48:
127 .Ltext2:
129 .LM3:
130 sbrs r24,0
131 rjmp .L2
106:io/softuart.c **** //send startbit: (=low)
107:io/softuart.c **** SOFTUART_TXPIN_LO();
108:io/softuart.c **** SOFTUART_DELAY();
109:io/softuart.c ****
133 L3
134 .L2:
136 000e 00C0 .LM5:
110:io/softuart.c **** SOFTUART_DELAY();
137 35-32,1
138 .L3:
139 0010 199A .LBB55:
140 0012 00C0 .LBB54:
141 .LBB53:
111:io/softuart.c **** ();
112:io/softuart.c **** SOFTUART_DELAY();
142 2:
144 0014 1998 .Ltext3:
146 .LM6:
147 mov r25,r19
148 /* #APP */
149 ; 83 "c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h" 1
150 1: dec r25
151 brne 1b
152 ; 0 "" 2
153 /* #NOAPP */
154 0016 932F .LBE52:
155 .LBE53:
156 .LBE54:
157 0018 9A95 .LBE55:
159 .Ltext4:
161 .LM7:
162 subi r18,lo8(-(-1))
164 .LM8:
165 breq .L4
113:io/softuart.c **** ();
114:io/softuart.c **** SOFTUART_DELAY();
115:io/softuart.c ****
116:io/softuart.c **** while(cnt > 0){
117:io/softuart.c **** if (c & 0x01)
118:io/softuart.c **** SOFTUART_TXPIN_HI();
167 .L4:
169 001c 2150 .LM10:
170 sbi 35-32,1
171 .LBB56:
172 001e 01F0 .LBB57:
173 .LBB58:
174 .LBB59:
176 0022 00C0 .Ltext5:
119:io/softuart.c **** OFTUART_TXPIN_HI();
120:io/softuart.c **** else
121:io/softuart.c **** SOFTUART_TXPIN_LO();
122:io/softuart.c ****
178 r24,lo8(108)
179 /* #APP */
180 0024 199A ; 83 "c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h" 1
181 1: dec r24
182 brne 1b
183 ; 0 "" 2
184 /* epilogue start */
185 /* #NOAPP */
186 .LBE59:
187 .LBE58:
188 .LBE57:
189 0026 8CE6 .LBE56:
191 .Ltext6:
193 002a 01F4 .LM12:
194 ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -