📄 main.lss
字号:
{
192: af 92 push r10
194: bf 92 push r11
196: cf 92 push r12
198: df 92 push r13
19a: ef 92 push r14
19c: ff 92 push r15
19e: 0f 93 push r16
1a0: 1f 93 push r17
1a2: cf 93 push r28
1a4: df 93 push r29
1a6: cd b7 in r28, 0x3d ; 61
1a8: de b7 in r29, 0x3e ; 62
1aa: 26 97 sbiw r28, 0x06 ; 6
1ac: 0f b6 in r0, 0x3f ; 63
1ae: f8 94 cli
1b0: de bf out 0x3e, r29 ; 62
1b2: 0f be out 0x3f, r0 ; 63
1b4: cd bf out 0x3d, r28 ; 61
1b6: 5b 01 movw r10, r22
1b8: 6c 01 movw r12, r24
1ba: 7a 01 movw r14, r20
char tmp;
int Timeout;
char CMD17[] = {0x51,0x00,0x00,0x00,0x00,0xFF}; //Commando 16 zum lesen eines Blocks
1bc: 46 e0 ldi r20, 0x06 ; 6
1be: 9e 01 movw r18, r28
1c0: 2f 5f subi r18, 0xFF ; 255
1c2: 3f 4f sbci r19, 0xFF ; 255
1c4: 66 e6 ldi r22, 0x66 ; 102
1c6: 70 e0 ldi r23, 0x00 ; 0
1c8: d9 01 movw r26, r18
1ca: fb 01 movw r30, r22
1cc: 01 90 ld r0, Z+
1ce: 0d 92 st X+, r0
1d0: 4a 95 dec r20
1d2: e1 f7 brne .-8 ; 0x1cc
/*Die Adressierung der MMC/SD-Karte wird in Bytes angegeben,
addr wird von Blocks zu Bytes umgerechnet danach werden
diese in das Commando eingef黦t*/
addr = addr << 9; //addr = addr * 512
1d4: 39 e0 ldi r19, 0x09 ; 9
1d6: aa 0c add r10, r10
1d8: bb 1c adc r11, r11
1da: cc 1c adc r12, r12
1dc: dd 1c adc r13, r13
1de: 3a 95 dec r19
1e0: d1 f7 brne .-12 ; 0x1d6
CMD17[1] = ((addr & 0xFF000000) >>24 );
1e2: 2d 2d mov r18, r13
1e4: 33 27 eor r19, r19
1e6: 44 27 eor r20, r20
1e8: 55 27 eor r21, r21
1ea: 2a 83 std Y+2, r18 ; 0x02
CMD17[2] = ((addr & 0x00FF0000) >>16 );
1ec: cb 82 std Y+3, r12 ; 0x03
CMD17[3] = ((addr & 0x0000FF00) >>8 );
1ee: 80 e0 ldi r24, 0x00 ; 0
1f0: 9f ef ldi r25, 0xFF ; 255
1f2: a0 e0 ldi r26, 0x00 ; 0
1f4: b0 e0 ldi r27, 0x00 ; 0
1f6: a8 22 and r10, r24
1f8: b9 22 and r11, r25
1fa: ca 22 and r12, r26
1fc: db 22 and r13, r27
1fe: bb 27 eor r27, r27
200: ad 2d mov r26, r13
202: 9c 2d mov r25, r12
204: 8b 2d mov r24, r11
206: 8c 83 std Y+4, r24 ; 0x04
//Sendet Commando CMD16 an MMC/SD-Karte (Read 1 Block/512 Bytes)
tmp = Write_Command_MMC (CMD17);
208: ce 01 movw r24, r28
20a: 01 96 adiw r24, 0x01 ; 1
20c: 84 df rcall .-248 ; 0x116
if (tmp != 0)
20e: 88 23 and r24, r24
210: 29 f0 breq .+10 ; 0x21c
{
return(tmp);
212: 99 27 eor r25, r25
214: 1c c0 rjmp .+56 ; 0x24e
}
//Wartet auf Start Byte von der MMC/SD-Karte (FEh/Start Byte)
Timeout = 0;
while (tmp != 0xfe)
{
tmp = Read_Byte_MMC();
Timeout++;
if (Timeout > 400)
{
return(1);
216: 81 e0 ldi r24, 0x01 ; 1
218: 90 e0 ldi r25, 0x00 ; 0
21a: 19 c0 rjmp .+50 ; 0x24e
21c: 00 e0 ldi r16, 0x00 ; 0
21e: 10 e0 ldi r17, 0x00 ; 0
220: ad df rcall .-166 ; 0x17c
222: 0f 5f subi r16, 0xFF ; 255
224: 1f 4f sbci r17, 0xFF ; 255
226: 91 e0 ldi r25, 0x01 ; 1
228: 01 39 cpi r16, 0x91 ; 145
22a: 19 07 cpc r17, r25
22c: a4 f7 brge .-24 ; 0x216
22e: 8e 3f cpi r24, 0xFE ; 254
230: b9 f7 brne .-18 ; 0x220
}
}
//Lesen des Bolcks (512Bytes) von MMC/SD-Karte
for (int a=0;a<512;a++)
232: 0f ef ldi r16, 0xFF ; 255
234: 11 e0 ldi r17, 0x01 ; 1
{
*Buffer++ = Read_Byte_MMC();
236: a2 df rcall .-188 ; 0x17c
238: d7 01 movw r26, r14
23a: 8d 93 st X+, r24
23c: 7d 01 movw r14, r26
23e: 01 50 subi r16, 0x01 ; 1
240: 10 40 sbci r17, 0x00 ; 0
242: 17 ff sbrs r17, 7
244: f8 cf rjmp .-16 ; 0x236
}
//CRC-Byte auslesen
tmp = Read_Byte_MMC();//CRC - Byte wird nicht ausgewertet
246: 9a df rcall .-204 ; 0x17c
tmp = Read_Byte_MMC();
248: 99 df rcall .-206 ; 0x17c
return(0);
24a: 80 e0 ldi r24, 0x00 ; 0
24c: 90 e0 ldi r25, 0x00 ; 0
}
24e: 26 96 adiw r28, 0x06 ; 6
250: 0f b6 in r0, 0x3f ; 63
252: f8 94 cli
254: de bf out 0x3e, r29 ; 62
256: 0f be out 0x3f, r0 ; 63
258: cd bf out 0x3d, r28 ; 61
25a: df 91 pop r29
25c: cf 91 pop r28
25e: 1f 91 pop r17
260: 0f 91 pop r16
262: ff 90 pop r15
264: ef 90 pop r14
266: df 90 pop r13
268: cf 90 pop r12
26a: bf 90 pop r11
26c: af 90 pop r10
26e: 08 95 ret
00000270 <Write_Block_MMC>:
//Routine zum schreiben eines Blocks(512Byte) auf die MMC/SD-Karte
char Write_Block_MMC (unsigned long addr, char *Buffer)
{
270: af 92 push r10
272: bf 92 push r11
274: cf 92 push r12
276: df 92 push r13
278: ef 92 push r14
27a: ff 92 push r15
27c: 0f 93 push r16
27e: 1f 93 push r17
280: cf 93 push r28
282: df 93 push r29
284: cd b7 in r28, 0x3d ; 61
286: de b7 in r29, 0x3e ; 62
288: 26 97 sbiw r28, 0x06 ; 6
28a: 0f b6 in r0, 0x3f ; 63
28c: f8 94 cli
28e: de bf out 0x3e, r29 ; 62
290: 0f be out 0x3f, r0 ; 63
292: cd bf out 0x3d, r28 ; 61
294: 5b 01 movw r10, r22
296: 6c 01 movw r12, r24
298: 7a 01 movw r14, r20
char tmp;
char CMD24[] = {0x58,0x00,0x00,0x00,0x00,0xFF}; //Commando 24 zum schreiben eines Blocks
29a: 46 e0 ldi r20, 0x06 ; 6
29c: 9e 01 movw r18, r28
29e: 2f 5f subi r18, 0xFF ; 255
2a0: 3f 4f sbci r19, 0xFF ; 255
2a2: 6c e6 ldi r22, 0x6C ; 108
2a4: 70 e0 ldi r23, 0x00 ; 0
2a6: d9 01 movw r26, r18
2a8: fb 01 movw r30, r22
2aa: 01 90 ld r0, Z+
2ac: 0d 92 st X+, r0
2ae: 4a 95 dec r20
2b0: e1 f7 brne .-8 ; 0x2aa
/*Die Adressierung der MMC/SD-Karte wird in Bytes angegeben,
addr wird von Blocks zu Bytes umgerechnet danach werden
diese in das Commando eingef黦t*/
addr = addr << 9; //addr = addr * 512
2b2: 69 e0 ldi r22, 0x09 ; 9
2b4: aa 0c add r10, r10
2b6: bb 1c adc r11, r11
2b8: cc 1c adc r12, r12
2ba: dd 1c adc r13, r13
2bc: 6a 95 dec r22
2be: d1 f7 brne .-12 ; 0x2b4
CMD24[1] = ((addr & 0xFF000000) >>24 );
2c0: 2d 2d mov r18, r13
2c2: 33 27 eor r19, r19
2c4: 44 27 eor r20, r20
2c6: 55 27 eor r21, r21
2c8: 2a 83 std Y+2, r18 ; 0x02
CMD24[2] = ((addr & 0x00FF0000) >>16 );
2ca: cb 82 std Y+3, r12 ; 0x03
CMD24[3] = ((addr & 0x0000FF00) >>8 );
2cc: 80 e0 ldi r24, 0x00 ; 0
2ce: 9f ef ldi r25, 0xFF ; 255
2d0: a0 e0 ldi r26, 0x00 ; 0
2d2: b0 e0 ldi r27, 0x00 ; 0
2d4: a8 22 and r10, r24
2d6: b9 22 and r11, r25
2d8: ca 22 and r12, r26
2da: db 22 and r13, r27
2dc: bb 27 eor r27, r27
2de: ad 2d mov r26, r13
2e0: 9c 2d mov r25, r12
2e2: 8b 2d mov r24, r11
2e4: 8c 83 std Y+4, r24 ; 0x04
//Sendet Commando CMD24 an MMC/SD-Karte (Write 1 Block/512 Bytes)
tmp = Write_Command_MMC (CMD24);
2e6: ce 01 movw r24, r28
2e8: 01 96 adiw r24, 0x01 ; 1
2ea: 15 df rcall .-470 ; 0x116
if (tmp != 0)
2ec: 88 23 and r24, r24
2ee: 11 f0 breq .+4 ; 0x2f4
{
return(tmp);
2f0: 99 27 eor r25, r25
2f2: 1c c0 rjmp .+56 ; 0x32c
}
//Wartet einen Moment und sendet einen Clock an die MMC/SD-Karte
for (int a=0;a<100;a++)
2f4: 03 e6 ldi r16, 0x63 ; 99
2f6: 10 e0 ldi r17, 0x00 ; 0
{
tmp = Read_Byte_MMC();
2f8: 41 df rcall .-382 ; 0x17c
2fa: 01 50 subi r16, 0x01 ; 1
2fc: 10 40 sbci r17, 0x00 ; 0
2fe: 17 ff sbrs r17, 7
300: fb cf rjmp .-10 ; 0x2f8
}
//Sendet Start Byte an MMC/SD-Karte
Write_Byte_MMC(0xFE);
302: 8e ef ldi r24, 0xFE ; 254
304: 42 df rcall .-380 ; 0x18a
//Schreiben des Bolcks (512Bytes) auf MMC/SD-Karte
for (int a=0;a<512;a++)
306: 0f ef ldi r16, 0xFF ; 255
308: 11 e0 ldi r17, 0x01 ; 1
{
Write_Byte_MMC(*Buffer++);
30a: d7 01 movw r26, r14
30c: 8d 91 ld r24, X+
30e: 7d 01 movw r14, r26
310: 3c df rcall .-392 ; 0x18a
312: 01 50 subi r16, 0x01 ; 1
314: 10 40 sbci r17, 0x00 ; 0
316: 17 ff sbrs r17, 7
318: f8 cf rjmp .-16 ; 0x30a
}
//CRC-Byte schreiben
Write_Byte_MMC(0xFF); //Schreibt Dummy CRC
31a: 8f ef ldi r24, 0xFF ; 255
31c: 36 df rcall .-404 ; 0x18a
Write_Byte_MMC(0xFF); //CRC Code wird nicht benutzt
31e: 8f ef ldi r24, 0xFF ; 255
320: 34 df rcall .-408 ; 0x18a
//Wartet auf MMC/SD-Karte Bussy
tmp = 0;
while (tmp != 0xff)
{
tmp = Read_Byte_MMC();
322: 2c df rcall .-424 ; 0x17c
324: 8f 3f cpi r24, 0xFF ; 255
326: e9 f7 brne .-6 ; 0x322
}
return(0);
328: 80 e0 ldi r24, 0x00 ; 0
32a: 90 e0 ldi r25, 0x00 ; 0
}
32c: 26 96 adiw r28, 0x06 ; 6
32e: 0f b6 in r0, 0x3f ; 63
330: f8 94 cli
332: de bf out 0x3e, r29 ; 62
334: 0f be out 0x3f, r0 ; 63
336: cd bf out 0x3d, r28 ; 61
338: df 91 pop r29
33a: cf 91 pop r28
33c: 1f 91 pop r17
33e: 0f 91 pop r16
340: ff 90 pop r15
342: ef 90 pop r14
344: df 90 pop r13
346: cf 90 pop r12
348: bf 90 pop r11
34a: af 90 pop r10
34c: 08 95 ret
0000034e <IOInit>:
//Installation der Seriellen Schnittstelle
void IOInit (void)
{
//Enable TXEN im Register UCR TX-Data Enable
outp ((1 << TXEN),UCR);
34e: 88 e0 ldi r24, 0x08 ; 8
350: 8a b9 out 0x0a, r24 ; 10
//Teiler wird gesetzt
outp ((sysclk / (baud_rate * 16L) - 1) , UBRR);
352: 89 e1 ldi r24, 0x19 ; 25
354: 89 b9 out 0x09, r24 ; 9
}
356: 08 95 ret
00000358 <uart_putchar>:
//Routine f黵 printf
int uart_putchar (char c)
{
358: cf 93 push r28
35a: c8 2f mov r28, r24
if (c == '\n')
35c: 8a 30 cpi r24, 0x0A ; 10
35e: 11 f4 brne .+4 ; 0x364
uart_putchar('\r');
360: 8d e0 ldi r24, 0x0D ; 13
362: fa df rcall .-12 ; 0x358
//Warten solange bis Zeichen gesendet wurde
loop_until_bit_is_set(USR, UDRE);
364: 5d 9b sbis 0x0b, 5 ; 11
366: fe cf rjmp .-4 ; 0x364
UDR = c;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -