📄 twi_usart.lss
字号:
TWI_USART.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 000001dc 00000000 00000000 00000054 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .stab 0000036c 00000000 00000000 00000230 2**2
CONTENTS, READONLY, DEBUGGING
2 .stabstr 00000084 00000000 00000000 0000059c 2**0
CONTENTS, READONLY, DEBUGGING
3 .debug_aranges 00000020 00000000 00000000 00000620 2**0
CONTENTS, READONLY, DEBUGGING
4 .debug_pubnames 00000094 00000000 00000000 00000640 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_info 000003ef 00000000 00000000 000006d4 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_abbrev 000001d7 00000000 00000000 00000ac3 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_line 00000333 00000000 00000000 00000c9a 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_frame 000000b0 00000000 00000000 00000fcd 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_str 0000012a 00000000 00000000 0000107d 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_loc 000000f2 00000000 00000000 000011a7 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 2a 00 jmp 0x54 ; 0x54 <__ctors_end>
4: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
8: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
c: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
10: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
14: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
18: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
1c: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
20: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
24: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
28: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
2c: 0c 94 9b 00 jmp 0x136 ; 0x136 <__vector_11>
30: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
34: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
38: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
3c: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
40: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
44: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
48: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
4c: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
50: 0c 94 45 00 jmp 0x8a ; 0x8a <__bad_interrupt>
00000054 <__ctors_end>:
54: 11 24 eor r1, r1
56: 1f be out 0x3f, r1 ; 63
58: cf e5 ldi r28, 0x5F ; 95
5a: d4 e0 ldi r29, 0x04 ; 4
5c: de bf out 0x3e, r29 ; 62
5e: cd bf out 0x3d, r28 ; 61
00000060 <__do_copy_data>:
60: 10 e0 ldi r17, 0x00 ; 0
62: a0 e6 ldi r26, 0x60 ; 96
64: b0 e0 ldi r27, 0x00 ; 0
66: ec ed ldi r30, 0xDC ; 220
68: f1 e0 ldi r31, 0x01 ; 1
6a: 02 c0 rjmp .+4 ; 0x70 <.do_copy_data_start>
0000006c <.do_copy_data_loop>:
6c: 05 90 lpm r0, Z+
6e: 0d 92 st X+, r0
00000070 <.do_copy_data_start>:
70: a0 36 cpi r26, 0x60 ; 96
72: b1 07 cpc r27, r17
74: d9 f7 brne .-10 ; 0x6c <.do_copy_data_loop>
00000076 <__do_clear_bss>:
76: 10 e0 ldi r17, 0x00 ; 0
78: a0 e6 ldi r26, 0x60 ; 96
7a: b0 e0 ldi r27, 0x00 ; 0
7c: 01 c0 rjmp .+2 ; 0x80 <.do_clear_bss_start>
0000007e <.do_clear_bss_loop>:
7e: 1d 92 st X+, r1
00000080 <.do_clear_bss_start>:
80: a0 36 cpi r26, 0x60 ; 96
82: b1 07 cpc r27, r17
84: e1 f7 brne .-8 ; 0x7e <.do_clear_bss_loop>
86: 0c 94 b1 00 jmp 0x162 ; 0x162 <main>
0000008a <__bad_interrupt>:
8a: 0c 94 00 00 jmp 0 ; 0x0 <__vectors>
0000008e <I2C_start>:
#define TW_BUS_ERROR 0x00 //由于非法的START 或STOP 引起的总线错误
*/
/*****************************************************/
void I2C_start(void)
{
8e: 84 ea ldi r24, 0xA4 ; 164
90: 86 bf out 0x36, r24 ; 54
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTA); //TWINT清零
while (!(TWCR & (1<<TWINT))); //0x08
92: 06 b6 in r0, 0x36 ; 54
94: 07 fe sbrs r0, 7
96: fd cf rjmp .-6 ; 0x92 <I2C_start+0x4>
98: 08 95 ret
0000009a <I2C_stop>:
}
/*****************************************************/
void I2C_stop(void)
{
9a: 84 e9 ldi r24, 0x94 ; 148
9c: 86 bf out 0x36, r24 ; 54
9e: 08 95 ret
000000a0 <I2C_write>:
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
}
/*****************************************************/
void I2C_write(uchar addr,uchar c)
{
a0: 98 2f mov r25, r24
TWDR = SLA_W;
a2: 80 ea ldi r24, 0xA0 ; 160
a4: 83 b9 out 0x03, r24 ; 3
TWCR = (1<<TWINT) | (1<<TWEN);
a6: 84 e8 ldi r24, 0x84 ; 132
a8: 86 bf out 0x36, r24 ; 54
while (!(TWCR & (1<<TWINT))); //0x18
aa: 06 b6 in r0, 0x36 ; 54
ac: 07 fe sbrs r0, 7
ae: fd cf rjmp .-6 ; 0xaa <I2C_write+0xa>
TWDR = addr;
b0: 93 b9 out 0x03, r25 ; 3
TWCR = (1<<TWINT) | (1<<TWEN);
b2: 84 e8 ldi r24, 0x84 ; 132
b4: 86 bf out 0x36, r24 ; 54
while (!(TWCR & (1<<TWINT))); //0x28
b6: 06 b6 in r0, 0x36 ; 54
b8: 07 fe sbrs r0, 7
ba: fd cf rjmp .-6 ; 0xb6 <I2C_write+0x16>
TWDR = c;
bc: 63 b9 out 0x03, r22 ; 3
TWCR = (1<<TWINT) | (1<<TWEN);
be: 84 e8 ldi r24, 0x84 ; 132
c0: 86 bf out 0x36, r24 ; 54
while (!(TWCR & (1<<TWINT))); //0x18
c2: 06 b6 in r0, 0x36 ; 54
c4: 07 fe sbrs r0, 7
c6: fd cf rjmp .-6 ; 0xc2 <I2C_write+0x22>
c8: 08 95 ret
000000ca <I2C_read>:
}
/*****************************************************/
uchar I2C_read(uchar addr) //读一字节
{
ca: 98 2f mov r25, r24
uchar temp;
TWDR = SLA_W;
cc: 80 ea ldi r24, 0xA0 ; 160
ce: 83 b9 out 0x03, r24 ; 3
TWCR = (1<<TWINT) | (1<<TWEN);
d0: 84 e8 ldi r24, 0x84 ; 132
d2: 86 bf out 0x36, r24 ; 54
while (!(TWCR & (1<<TWINT))); //0x18
d4: 06 b6 in r0, 0x36 ; 54
d6: 07 fe sbrs r0, 7
d8: fd cf rjmp .-6 ; 0xd4 <I2C_read+0xa>
TWDR = addr;
da: 93 b9 out 0x03, r25 ; 3
TWCR = (1<<TWINT) | (1<<TWEN);
dc: 84 e8 ldi r24, 0x84 ; 132
de: 86 bf out 0x36, r24 ; 54
while (!(TWCR & (1<<TWINT))); //0x28
e0: 06 b6 in r0, 0x36 ; 54
e2: 07 fe sbrs r0, 7
e4: fd cf rjmp .-6 ; 0xe0 <I2C_read+0x16>
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTA);
e6: 84 ea ldi r24, 0xA4 ; 164
e8: 86 bf out 0x36, r24 ; 54
while (!(TWCR & (1<<TWINT))); //0x10
ea: 06 b6 in r0, 0x36 ; 54
ec: 07 fe sbrs r0, 7
ee: fd cf rjmp .-6 ; 0xea <I2C_read+0x20>
TWDR = SLA_R;
f0: 81 ea ldi r24, 0xA1 ; 161
f2: 83 b9 out 0x03, r24 ; 3
TWCR = (1<<TWINT) | (1<<TWEN);
f4: 84 e8 ldi r24, 0x84 ; 132
f6: 86 bf out 0x36, r24 ; 54
while (!(TWCR & (1<<TWINT))); //0x40
f8: 06 b6 in r0, 0x36 ; 54
fa: 07 fe sbrs r0, 7
fc: fd cf rjmp .-6 ; 0xf8 <I2C_read+0x2e>
TWCR = (1<<TWINT) | (1<<TWEN);
fe: 84 e8 ldi r24, 0x84 ; 132
100: 86 bf out 0x36, r24 ; 54
while (!(TWCR & (1<<TWINT))); //0x58
102: 06 b6 in r0, 0x36 ; 54
104: 07 fe sbrs r0, 7
106: fd cf rjmp .-6 ; 0x102 <I2C_read+0x38>
return(TWDR);
108: 83 b1 in r24, 0x03 ; 3
}
10a: 99 27 eor r25, r25
10c: 08 95 ret
0000010e <TWI_init>:
/****************************************************
函数名:TWI_init
作 用:TWI接口的初始化
*****************************************************/
void TWI_init(void)
{
10e: 81 e0 ldi r24, 0x01 ; 1
110: 85 bb out 0x15, r24 ; 21
PORTC = _BV(PC0); // i2c SCL
PORTC = _BV(PC1); // i2c SDA
112: 82 e0 ldi r24, 0x02 ; 2
114: 85 bb out 0x15, r24 ; 21
TWAR = 0x00; //主机模式,该地址无效
116: 12 b8 out 0x02, r1 ; 2
TWSR = 0x00;
118: 11 b8 out 0x01, r1 ; 1
TWBR=(F_CPU/FSCL-16)/2; // TWI比特率
11a: 8f e2 ldi r24, 0x2F ; 47
11c: 80 b9 out 0x00, r24 ; 0
//TWBR = Baud_set; //100
//TWSR = P_value; //64分频
TWCR = 0x00; //关闭TWI模块
11e: 16 be out 0x36, r1 ; 54
TWCR=(1<<TWEA)|(1<<TWEN); //允许ACK应答:On
120: 84 e4 ldi r24, 0x44 ; 68
122: 86 bf out 0x36, r24 ; 54
124: 08 95 ret
00000126 <UartInit>:
}
/****************************************************/
void UartInit( )
{
126: 88 e9 ldi r24, 0x98 ; 152
128: 8a b9 out 0x0a, r24 ; 10
//接收使能,发送使能,接收中断允许
UCSRB=(1<<RXCIE)|(1<<TXEN)|(1<<RXEN);
//UBRR=CK/(BUAD*16)-1,(CK=11.059MHz ATMEG16)
//1200 UBRRH=2; UBRRL=63; 575
//4800 UBRRH=0; UBRRL=143;
//9600 UBRRH=0; UBRRL=71;
//19200 UBRRH=0; UBRRL=35;
//38400 UBRRH=0; UBRRL=17;
//57600 UBRRH=0; UBRRL=11;
//115200 UBRRH=0; UBRRL=5;
//到目前为止,1200波特率还不能设置,原因是UBRRH写上进去东西
//UBRR=CK/(BUAD*16)-1,(CK=8.169984MHz ATMEG48)
//1200 UBRR0H=1; UBRR0L=0xA9;
//4800 UBRR0H=; UBRR0L=0x69;
//9600 UBRR0H=; UBRR0L=0x34;
//19200 UBRR0H=; UBRR0L=0x1A; 由于内部不是RC振荡器,所以高了不可取
//38400 UBRR0H=; UBRR0L=;
//57600 UBRR0H=; UBRR0L=;
//115200 UBRR0H=; UBRR0L=;
UBRRH=0; UBRRL=0x0C; //内部晶振,CK=1MHZ,UBRR=CK/(BUAD*16)-1
12a: 10 bc out 0x20, r1 ; 32
12c: 8c e0 ldi r24, 0x0C ; 12
12e: 89 b9 out 0x09, r24 ; 9
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
130: 86 e8 ldi r24, 0x86 ; 134
132: 80 bd out 0x20, r24 ; 32
134: 08 95 ret
00000136 <__vector_11>:
}
/****************************************************/
//接收中断
SIGNAL(SIG_UART_RECV)
{
136: 1f 92 push r1
138: 0f 92 push r0
13a: 0f b6 in r0, 0x3f ; 63
13c: 0f 92 push r0
13e: 11 24 eor r1, r1
140: 8f 93 push r24
unsigned char c=UDR;
142: 8c b1 in r24, 0x0c ; 12
144: 8f 91 pop r24
146: 0f 90 pop r0
148: 0f be out 0x3f, r0 ; 63
14a: 0f 90 pop r0
14c: 1f 90 pop r1
14e: 18 95 reti
00000150 <SendChar>:
// if(c=='*') cRecState=1;
// else if(c=='A' && cRecState==1) cRecState=2;
// else if(c=='.' && cRecState==2) cGiveGift=1;
// else cRecState=0;
}
//发送中断
//SIGNAL(SIG_UART_TRANS)
//{
// if(--g_bTxdLen>0)
// UDR=g_aSendBuf[++g_bTxdPos];
//
//}
/****************************************************/
//从发送缓冲区发送指定长度的数据
void SendChar(unsigned char num)
{
150: 5d 9b sbis 0x0b, 5 ; 11
152: fe cf rjmp .-4 ; 0x150 <SendChar>
while((UCSRA & (1<<UDRE))==0);
UDR=num;
154: 8c b9 out 0x0c, r24 ; 12
156: 08 95 ret
00000158 <RevChar>:
}
/****************************************************/
//从接收缓冲去接收数据并返回
unsigned char RevChar ( void )
{
158: 5f 9b sbis 0x0b, 7 ; 11
15a: fe cf rjmp .-4 ; 0x158 <RevChar>
while ( (UCSRA & (1<<RXC))==0 );
return UDR;
15c: 8c b1 in r24, 0x0c ; 12
}
15e: 99 27 eor r25, r25
160: 08 95 ret
00000162 <main>:
/****************************************************/
int main (void)
{
162: f8 94 cli
uchar temp;
cli();
//Chip_init();
TWI_init();
164: 0e 94 87 00 call 0x10e ; 0x10e <TWI_init>
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
168: 80 e0 ldi r24, 0x00 ; 0
16a: 9c e6 ldi r25, 0x6C ; 108
16c: 01 97 sbiw r24, 0x01 ; 1
16e: f1 f7 brne .-4 ; 0x16c <main+0xa>
170: 88 e9 ldi r24, 0x98 ; 152
172: 8a b9 out 0x0a, r24 ; 10
174: 10 bc out 0x20, r1 ; 32
176: 8c e0 ldi r24, 0x0C ; 12
178: 89 b9 out 0x09, r24 ; 9
17a: 86 e8 ldi r24, 0x86 ; 134
17c: 80 bd out 0x20, r24 ; 32
_delay_ms(10);
UartInit();
sei();
17e: 78 94 sei
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
180: 80 e0 ldi r24, 0x00 ; 0
182: 9c e6 ldi r25, 0x6C ; 108
184: 01 97 sbiw r24, 0x01 ; 1
186: f1 f7 brne .-4 ; 0x184 <main+0x22>
188: 84 ea ldi r24, 0xA4 ; 164
18a: 86 bf out 0x36, r24 ; 54
18c: 06 b6 in r0, 0x36 ; 54
18e: 07 fe sbrs r0, 7
190: fd cf rjmp .-6 ; 0x18c <main+0x2a>
_delay_ms(10);
while(1)
{
//写一个字节c到addr位置
I2C_start();
I2C_write(0x00,0x05);//addr,data
192: 65 e0 ldi r22, 0x05 ; 5
194: 80 e0 ldi r24, 0x00 ; 0
196: 0e 94 50 00 call 0xa0 ; 0xa0 <I2C_write>
19a: 84 e9 ldi r24, 0x94 ; 148
19c: 86 bf out 0x36, r24 ; 54
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
19e: 80 e0 ldi r24, 0x00 ; 0
1a0: 90 e0 ldi r25, 0x00 ; 0
1a2: 01 97 sbiw r24, 0x01 ; 1
1a4: f1 f7 brne .-4 ; 0x1a2 <main+0x40>
1a6: 84 ea ldi r24, 0xA4 ; 164
1a8: 86 bf out 0x36, r24 ; 54
1aa: 06 b6 in r0, 0x36 ; 54
1ac: 07 fe sbrs r0, 7
1ae: fd cf rjmp .-6 ; 0x1aa <main+0x48>
I2C_stop();
_delay_ms(50);
//读出刚才写入的数据
I2C_start();
temp = I2C_read(0x00);//addr
1b0: 80 e0 ldi r24, 0x00 ; 0
1b2: 0e 94 65 00 call 0xca ; 0xca <I2C_read>
1b6: 28 2f mov r18, r24
1b8: 84 e9 ldi r24, 0x94 ; 148
1ba: 86 bf out 0x36, r24 ; 54
I2C_stop();
//如果读出的数据与写入相同,则亮灯,灯闪
if (temp == 0x05)
1bc: 25 30 cpi r18, 0x05 ; 5
1be: 51 f4 brne .+20 ; 0x1d4 <main+0x72>
{
PORTA |=(1<<PA5);
1c0: dd 9a sbi 0x1b, 5 ; 27
DDRA |=(1<<PA5);//LED亮
1c2: d5 9a sbi 0x1a, 5 ; 26
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
1c4: 80 e0 ldi r24, 0x00 ; 0
1c6: 90 e0 ldi r25, 0x00 ; 0
1c8: fc 01 movw r30, r24
1ca: 31 97 sbiw r30, 0x01 ; 1
1cc: f1 f7 brne .-4 ; 0x1ca <main+0x68>
_delay_ms(1000);
DDRA &=~(1<<PA5);//LED暗
1ce: d5 98 cbi 0x1a, 5 ; 26
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
1d0: 01 97 sbiw r24, 0x01 ; 1
1d2: f1 f7 brne .-4 ; 0x1d0 <main+0x6e>
1d4: 5d 9b sbis 0x0b, 5 ; 11
1d6: fe cf rjmp .-4 ; 0x1d4 <main+0x72>
1d8: 2c b9 out 0x0c, r18 ; 12
1da: d6 cf rjmp .-84 ; 0x188 <main+0x26>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -