Code:
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00000004 00800100 00000218 0000028c 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 00000218 00000000 00000000 00000074 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .debug_aranges 00000020 00000000 00000000 00000290 2**0
CONTENTS, READONLY, DEBUGGING
3 .debug_pubnames 0000004c 00000000 00000000 000002b0 2**0
CONTENTS, READONLY, DEBUGGING
4 .debug_info 00000314 00000000 00000000 000002fc 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_abbrev 00000155 00000000 00000000 00000610 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_line 0000029e 00000000 00000000 00000765 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_frame 00000050 00000000 00000000 00000a04 2**2
CONTENTS, READONLY, DEBUGGING
8 .debug_str 00000115 00000000 00000000 00000a54 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_loc 00000280 00000000 00000000 00000b69 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 19 c0 rjmp .+50 ; 0x34 <__ctors_end>
2: 2b c0 rjmp .+86 ; 0x5a <__bad_interrupt>
4: 2a c0 rjmp .+84 ; 0x5a <__bad_interrupt>
6: 29 c0 rjmp .+82 ; 0x5a <__bad_interrupt>
8: 28 c0 rjmp .+80 ; 0x5a <__bad_interrupt>
a: 27 c0 rjmp .+78 ; 0x5a <__bad_interrupt>
c: 26 c0 rjmp .+76 ; 0x5a <__bad_interrupt>
e: 25 c0 rjmp .+74 ; 0x5a <__bad_interrupt>
10: 24 c0 rjmp .+72 ; 0x5a <__bad_interrupt>
12: 23 c0 rjmp .+70 ; 0x5a <__bad_interrupt>
14: 22 c0 rjmp .+68 ; 0x5a <__bad_interrupt>
16: 21 c0 rjmp .+66 ; 0x5a <__bad_interrupt>
18: 20 c0 rjmp .+64 ; 0x5a <__bad_interrupt>
1a: 1f c0 rjmp .+62 ; 0x5a <__bad_interrupt>
1c: 1e c0 rjmp .+60 ; 0x5a <__bad_interrupt>
1e: 1d c0 rjmp .+58 ; 0x5a <__bad_interrupt>
20: 1c c0 rjmp .+56 ; 0x5a <__bad_interrupt>
22: 1b c0 rjmp .+54 ; 0x5a <__bad_interrupt>
24: 1a c0 rjmp .+52 ; 0x5a <__bad_interrupt>
26: 19 c0 rjmp .+50 ; 0x5a <__bad_interrupt>
28: 18 c0 rjmp .+48 ; 0x5a <__bad_interrupt>
2a: 17 c0 rjmp .+46 ; 0x5a <__bad_interrupt>
2c: 16 c0 rjmp .+44 ; 0x5a <__bad_interrupt>
2e: 15 c0 rjmp .+42 ; 0x5a <__bad_interrupt>
30: 14 c0 rjmp .+40 ; 0x5a <__bad_interrupt>
32: 13 c0 rjmp .+38 ; 0x5a <__bad_interrupt>
00000034 <__ctors_end>:
34: 11 24 eor r1, r1
36: 1f be out 0x3f, r1 ; 63
38: cf ef ldi r28, 0xFF ; 255
3a: d4 e0 ldi r29, 0x04 ; 4
3c: de bf out 0x3e, r29 ; 62
3e: cd bf out 0x3d, r28 ; 61
00000040 <__do_copy_data>:
40: 11 e0 ldi r17, 0x01 ; 1
42: a0 e0 ldi r26, 0x00 ; 0
44: b1 e0 ldi r27, 0x01 ; 1
46: e8 e1 ldi r30, 0x18 ; 24
48: f2 e0 ldi r31, 0x02 ; 2
4a: 02 c0 rjmp .+4 ; 0x50 <.do_copy_data_start>
0000004c <.do_copy_data_loop>:
4c: 05 90 lpm r0, Z+
4e: 0d 92 st X+, r0
00000050 <.do_copy_data_start>:
50: a4 30 cpi r26, 0x04 ; 4
52: b1 07 cpc r27, r17
54: d9 f7 brne .-10 ; 0x4c <.do_copy_data_loop>
56: c2 d0 rcall .+388 ; 0x1dc <main>
58: dd c0 rjmp .+442 ; 0x214 <_exit>
0000005a <__bad_interrupt>:
5a: d2 cf rjmp .-92 ; 0x0 <__vectors>
0000005c <step>:
int akt_x = 1000, akt_y = 1000;/*aktuelle Koordinaten*/
/*Funktion zur Generation eines Schrittes. Parameter: Motor und Richtung*/
void step (uint8_t motor, uint8_t direction)
{
switch(motor)/*Motor wählen*/
5c: 81 30 cpi r24, 0x01 ; 1
5e: 89 f0 breq .+34 ; 0x82 <step+0x26>
60: 81 30 cpi r24, 0x01 ; 1
62: 18 f0 brcs .+6 ; 0x6a <step+0xe>
64: 82 30 cpi r24, 0x02 ; 2
66: 21 f5 brne .+72 ; 0xb0 <step+0x54>
68: 18 c0 rjmp .+48 ; 0x9a <step+0x3e>
{
case _Z_MOTOR:
if(direction == 1)/*Richtung wählen*/
6a: 61 30 cpi r22, 0x01 ; 1
6c: 11 f4 brne .+4 ; 0x72 <step+0x16>
{
PORTC |= (1<<PC1);
6e: 41 9a sbi 0x08, 1 ; 8
70: 01 c0 rjmp .+2 ; 0x74 <step+0x18>
}
else
{
PORTC &= ~(1<<PC1);
72: 41 98 cbi 0x08, 1 ; 8
}
PORTC &= ~(1<<PC0);
74: 40 98 cbi 0x08, 0 ; 8
milliseconds can be achieved.
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
76: 8e ee ldi r24, 0xEE ; 238
78: 92 e0 ldi r25, 0x02 ; 2
7a: 01 97 sbiw r24, 0x01 ; 1
7c: f1 f7 brne .-4 ; 0x7a <step+0x1e>
_delay_ms(_WAIT_MS);
PORTC |= (1<<PC0);
7e: 40 9a sbi 0x08, 0 ; 8
80: 08 95 ret
break;
case _X_MOTOR:
if(direction == 1)/*Richtung wählen*/
82: 61 30 cpi r22, 0x01 ; 1
84: 11 f4 brne .+4 ; 0x8a <step+0x2e>
{
PORTB |= (1<<PB1);
86: 29 9a sbi 0x05, 1 ; 5
88: 01 c0 rjmp .+2 ; 0x8c <step+0x30>
}
else
{
PORTB &= ~(1<<PB1);
8a: 29 98 cbi 0x05, 1 ; 5
}
PORTB &= ~(1<<PB0);
8c: 28 98 cbi 0x05, 0 ; 5
8e: 8e ee ldi r24, 0xEE ; 238
90: 92 e0 ldi r25, 0x02 ; 2
92: 01 97 sbiw r24, 0x01 ; 1
94: f1 f7 brne .-4 ; 0x92 <step+0x36>
_delay_ms(_WAIT_MS);
PORTB |= (1<<PB0);
96: 28 9a sbi 0x05, 0 ; 5
98: 08 95 ret
break;
case _Y_MOTOR:
if(direction == 1)/*Richtung wählen*/
9a: 61 30 cpi r22, 0x01 ; 1
9c: 11 f4 brne .+4 ; 0xa2 <step+0x46>
{
PORTB |= (1<<PB4);
9e: 2c 9a sbi 0x05, 4 ; 5
a0: 01 c0 rjmp .+2 ; 0xa4 <step+0x48>
}
else
{
PORTB &= ~(1<<PB4);
a2: 2c 98 cbi 0x05, 4 ; 5
}
PORTB &= ~(1<<PB3);
a4: 2b 98 cbi 0x05, 3 ; 5
a6: 8e ee ldi r24, 0xEE ; 238
a8: 92 e0 ldi r25, 0x02 ; 2
aa: 01 97 sbiw r24, 0x01 ; 1
ac: f1 f7 brne .-4 ; 0xaa <step+0x4e>
_delay_ms(_WAIT_MS);
PORTB |= (1<<PB3);
ae: 2b 9a sbi 0x05, 3 ; 5
b0: 08 95 ret
000000b2 <sgn>:
};
/*Signum (Mathematik)*/
int sgn (int x)
{
return (x > 0) ? 1 : (x < 0) ? -1 : 0;
b2: 18 16 cp r1, r24
b4: 19 06 cpc r1, r25
b6: 1c f4 brge .+6 ; 0xbe <sgn+0xc>
b8: 21 e0 ldi r18, 0x01 ; 1
ba: 30 e0 ldi r19, 0x00 ; 0
bc: 07 c0 rjmp .+14 ; 0xcc <sgn+0x1a>
be: 89 2b or r24, r25
c0: 19 f4 brne .+6 ; 0xc8 <sgn+0x16>
c2: 20 e0 ldi r18, 0x00 ; 0
c4: 30 e0 ldi r19, 0x00 ; 0
c6: 02 c0 rjmp .+4 ; 0xcc <sgn+0x1a>
c8: 2f ef ldi r18, 0xFF ; 255
ca: 3f ef ldi r19, 0xFF ; 255
};
cc: c9 01 movw r24, r18
ce: 08 95 ret
000000d0 <abs_koo>:
* Ausgabe:
* void step()
*---------------------------------------------------------------
*/
void abs_koo (uint16_t xstart, uint16_t ystart, uint16_t xend, uint16_t yend)
{
d0: 2f 92 push r2
d2: 3f 92 push r3
d4: 4f 92 push r4
d6: 5f 92 push r5
d8: 6f 92 push r6
da: 7f 92 push r7
dc: 8f 92 push r8
de: 9f 92 push r9
e0: af 92 push r10
e2: bf 92 push r11
e4: cf 92 push r12
e6: df 92 push r13
e8: ef 92 push r14
ea: ff 92 push r15
ec: 0f 93 push r16
ee: 1f 93 push r17
f0: df 93 push r29
f2: cf 93 push r28
f4: 00 d0 rcall .+0 ; 0xf6 <abs_koo+0x26>
f6: 00 d0 rcall .+0 ; 0xf8 <abs_koo+0x28>
f8: cd b7 in r28, 0x3d ; 61
fa: de b7 in r29, 0x3e ; 62
fc: 1c 01 movw r2, r24
fe: 2b 01 movw r4, r22
100: 3a 01 movw r6, r20
102: 49 01 movw r8, r18
int x, y, t, dx, dy, incx, incy, pdx, pdy, ddx, ddy, es, el, err;
/* Entfernung in beiden Dimensionen berechnen */
dx = xend - xstart;
dy = yend - ystart;
104: c9 01 movw r24, r18
106: 86 1b sub r24, r22
108: 97 0b sbc r25, r23
10a: 8a 01 movw r16, r20
10c: 02 19 sub r16, r2
10e: 13 09 sbc r17, r3
110: 17 ff sbrs r17, 7
112: 03 c0 rjmp .+6 ; 0x11a <abs_koo+0x4a>
114: 10 95 com r17
116: 01 95 neg r16
118: 1f 4f sbci r17, 0xFF ; 255
11a: 9c 83 std Y+4, r25 ; 0x04
11c: 8b 83 std Y+3, r24 ; 0x03
11e: 97 ff sbrs r25, 7
120: 05 c0 rjmp .+10 ; 0x12c <abs_koo+0x5c>
122: 90 95 com r25
124: 81 95 neg r24
126: 9f 4f sbci r25, 0xFF ; 255
128: 9c 83 std Y+4, r25 ; 0x04
12a: 8b 83 std Y+3, r24 ; 0x03
{
dy = -dy;
}
/* feststellen, welche Entfernung größer ist */
if (dx>dy)
12c: 8b 81 ldd r24, Y+3 ; 0x03
12e: 9c 81 ldd r25, Y+4 ; 0x04
130: 80 17 cp r24, r16
132: 91 07 cpc r25, r17
134: 24 f0 brlt .+8 ; 0x13e <abs_koo+0x6e>
136: 1a 83 std Y+2, r17 ; 0x02
138: 09 83 std Y+1, r16 ; 0x01
13a: 6c 01 movw r12, r24
13c: 05 c0 rjmp .+10 ; 0x148 <abs_koo+0x78>
13e: eb 81 ldd r30, Y+3 ; 0x03
140: fc 81 ldd r31, Y+4 ; 0x04
142: fa 83 std Y+2, r31 ; 0x02
144: e9 83 std Y+1, r30 ; 0x01
146: 68 01 movw r12, r16
}
/* Initialisierungen vor Schleifenbeginn */
x = xstart;
y = ystart;
err = el/2;
148: 76 01 movw r14, r12
14a: f5 94 asr r15
14c: e7 94 ror r14
14e: aa 24 eor r10, r10
150: bb 24 eor r11, r11
152: 2a c0 rjmp .+84 ; 0x1a8 <abs_koo+0xd8>
/* Pixel berechnen */
for(t=0; t<el; ++t) /* t zaehlt die Pixel, el ist auch Anzahl */
{
/* Aktualisierung Fehlerterm */
err -= es;
154: 89 81 ldd r24, Y+1 ; 0x01
156: 9a 81 ldd r25, Y+2 ; 0x02
158: e8 1a sub r14, r24
15a: f9 0a sbc r15, r25
if(err<0)
15c: f7 fe sbrs r15, 7
15e: 0c c0 rjmp .+24 ; 0x178 <abs_koo+0xa8>
{
/* Fehlerterm wieder positiv (>=0) machen */
err += el;
160: ec 0c add r14, r12
162: fd 1c adc r15, r13
/* Schritt in langsame Richtung, Diagonalschritt */
x += ddx;
y += ddy;
if (xend>xstart)/*X-Richtung ist positiv*/
164: 26 14 cp r2, r6
166: 37 04 cpc r3, r7
168: 18 f4 brcc .+6 ; 0x170 <abs_koo+0xa0>
{
step(_X_MOTOR, 1);
16a: 81 e0 ldi r24, 0x01 ; 1
16c: 61 e0 ldi r22, 0x01 ; 1
16e: 02 c0 rjmp .+4 ; 0x174 <abs_koo+0xa4>
}
else/*Y_Richtung ist negativ*/
{
step(_X_MOTOR, 0);
170: 81 e0 ldi r24, 0x01 ; 1
172: 60 e0 ldi r22, 0x00 ; 0
174: 73 df rcall .-282 ; 0x5c <step>
176: 0c c0 rjmp .+24 ; 0x190 <abs_koo+0xc0>
else
{
/* Schritt in schnelle Richtung, Parallelschritt */
x += pdx;
y += pdy;
if(dx>dy)/*X ist schnelle Richtung*/
178: eb 81 ldd r30, Y+3 ; 0x03
17a: fc 81 ldd r31, Y+4 ; 0x04
17c: e0 17 cp r30, r16
17e: f1 07 cpc r31, r17
180: 3c f4 brge .+14 ; 0x190 <abs_koo+0xc0>
{
if (xend>xstart)/*X-Richtung ist positiv*/
182: 26 14 cp r2, r6
184: 37 04 cpc r3, r7
186: 10 f4 brcc .+4 ; 0x18c <abs_koo+0xbc>
{
step(_X_MOTOR, 1);
188: 81 e0 ldi r24, 0x01 ; 1
18a: 06 c0 rjmp .+12 ; 0x198 <abs_koo+0xc8>
}
else/*Y_Richtung ist negativ*/
{
step(_X_MOTOR, 0);
18c: 81 e0 ldi r24, 0x01 ; 1
18e: 07 c0 rjmp .+14 ; 0x19e <abs_koo+0xce>
}
}
else/*Y ist schnelle Richtung*/
{
if(yend>ystart)/*Y_Richtung ist positiv*/
190: 48 14 cp r4, r8
192: 59 04 cpc r5, r9
194: 18 f4 brcc .+6 ; 0x19c <abs_koo+0xcc>
{
step(_Y_MOTOR, 1);
196: 82 e0 ldi r24, 0x02 ; 2
198: 61 e0 ldi r22, 0x01 ; 1
19a: 02 c0 rjmp .+4 ; 0x1a0 <abs_koo+0xd0>
}
else/*Y_Richtung ist negativ*/
{
step(_Y_MOTOR, 0);
19c: 82 e0 ldi r24, 0x02 ; 2
19e: 60 e0 ldi r22, 0x00 ; 0
1a0: 5d df rcall .-326 ; 0x5c <step>
x = xstart;
y = ystart;
err = el/2;
/* Pixel berechnen */
for(t=0; t<el; ++t) /* t zaehlt die Pixel, el ist auch Anzahl */
1a2: 08 94 sec
1a4: a1 1c adc r10, r1
1a6: b1 1c adc r11, r1
1a8: ac 14 cp r10, r12
1aa: bd 04 cpc r11, r13
1ac: 9c f2 brlt .-90 ; 0x154 <abs_koo+0x84>
step(_Y_MOTOR, 0);
}
}
}
}
};
1ae: 0f 90 pop r0
1b0: 0f 90 pop r0
1b2: 0f 90 pop r0
1b4: 0f 90 pop r0
1b6: cf 91 pop r28
1b8: df 91 pop r29
1ba: 1f 91 pop r17
1bc: 0f 91 pop r16
1be: ff 90 pop r15
1c0: ef 90 pop r14
1c2: df 90 pop r13
1c4: cf 90 pop r12
1c6: bf 90 pop r11
1c8: af 90 pop r10
1ca: 9f 90 pop r9
1cc: 8f 90 pop r8
1ce: 7f 90 pop r7
1d0: 6f 90 pop r6
1d2: 5f 90 pop r5
1d4: 4f 90 pop r4
1d6: 3f 90 pop r3
1d8: 2f 90 pop r2
1da: 08 95 ret
000001dc <main>:
int main (void)
{
/*Initialisierungen*/
DDRC |= (1<<PC1) | (1<<PC2) | (1<<PC0); /*1 - EN/CW-CCW/CLK*/
1dc: 87 b1 in r24, 0x07 ; 7
1de: 87 60 ori r24, 0x07 ; 7
1e0: 87 b9 out 0x07, r24 ; 7
DDRD |= (1<<PD7); /*HALF/FULL*/
1e2: 57 9a sbi 0x0a, 7 ; 10
DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3) | (1<<PB4) | (1<<PB5);/*2/3 - EN/CW-CCW/CLK*/
1e4: 84 b1 in r24, 0x04 ; 4
1e6: 8f 63 ori r24, 0x3F ; 63
1e8: 84 b9 out 0x04, r24 ; 4
if(_FULLSTEPMODUS == 1)
{
PORTD &= ~(1<<PD7); /*FULLstep-Modus*/
1ea: 5f 98 cbi 0x0b, 7 ; 11
{
PORTD |= (1<<PD7); /*HALFstep-Modus*/
}
if(_ENABLED == 1)
{
PORTC |= (1<<PC2); /*1 - EN set*/
1ec: 42 9a sbi 0x08, 2 ; 8
PORTB |= (1<<PB2) | (1<<PB5); /*2/3 - EN set*/
1ee: 85 b1 in r24, 0x05 ; 5
1f0: 84 62 ori r24, 0x24 ; 36
1f2: 85 b9 out 0x05, r24 ; 5
PORTC &= ~(1<<PC2); /*1 - EN clear*/
PORTB &= ~((1<<PB2) | (1<<PB5)); /*2/3 - EN clear*/
}
/*Main-Teil*/
abs_koo(akt_x, akt_y, 2000, 2000);
1f4: 60 91 02 01 lds r22, 0x0102
1f8: 70 91 03 01 lds r23, 0x0103
1fc: 80 91 00 01 lds r24, 0x0100
200: 90 91 01 01 lds r25, 0x0101
204: 40 ed ldi r20, 0xD0 ; 208
206: 57 e0 ldi r21, 0x07 ; 7
208: 20 ed ldi r18, 0xD0 ; 208
20a: 37 e0 ldi r19, 0x07 ; 7
20c: 61 df rcall .-318 ; 0xd0 <abs_koo>
}
20e: 80 e0 ldi r24, 0x00 ; 0
210: 90 e0 ldi r25, 0x00 ; 0
212: 08 95 ret
00000214 <_exit>:
214: f8 94 cli
00000216 <__stop_program>:
216: ff cf rjmp .-2 ; 0x216 <__stop_program>
Lesezeichen