nedari se mi naprogramovat funkcni AT90PWM316 pres gcc-avr
assembler v AVRStudiu4 me na chipu bezi!
programuji chip pres ISP STK500, pouzivam avrdude dle manualu,
pro ukazku prikladam zdroj v C a vysledny disassemblovany ELF
mate nekdo funkcni prostredi s ukazkou pro GNU AVR? na Linux...
Diky David
#include <avr/io.h>
#include <stdlib.h>
int main(void)
{ DDRC = 0xff; //port C jako výstupní
while(1)
{ PORTC = 0b11111111; //zhasnutí všech LED diod
for(unsigned char n=0;n<16;n++)
{
if (n<8) //dokud nedojdeš na poslední pozici
{ PORTC <<=1; //tak posunuj doleva
}
else //když si dojel nakonec
{
PORTC <<=1; //tak posunuj doleva
PORTC |= 0x01; //a zprava doplň jedničku
}
int i;
i=1;
while(i<255)
i++;
}
}
}
shift.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00000000 00800100 0000008e 00000102 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 0000008e 00000000 00000000 00000074 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .stab 00000624 00000000 00000000 00000104 2**2
CONTENTS, READONLY, DEBUGGING
3 .stabstr 00000da2 00000000 00000000 00000728 2**0
CONTENTS, READONLY, DEBUGGING
4 .comment 00000011 00000000 00000000 000014ca 2**0
CONTENTS, READONLY
Disassembly of section .text:
00000000 <main>:
#include <avr/io.h>
#include <stdlib.h>
int main(void)
{ DDRC = 0xff; //port A jako výstupní
0: cf 93 push r28
2: df 93 push r29
4: 00 d0 rcall .+0 ; 0x6 <__zero_reg__+0x5>
6: 1f 92 push r1
8: cd b7 in r28, 0x3d ; 61
a: de b7 in r29, 0x3e ; 62
c: 87 e2 ldi r24, 0x27 ; 39
e: 90 e0 ldi r25, 0x00 ; 0
10: 2f ef ldi r18, 0xFF ; 255
12: fc 01 movw r30, r24
14: 20 83 st Z, r18
while(1)
{ PORTC = 0b11111111; //zhasnutí všech LED diod
16: 88 e2 ldi r24, 0x28 ; 40
18: 90 e0 ldi r25, 0x00 ; 0
1a: 2f ef ldi r18, 0xFF ; 255
1c: fc 01 movw r30, r24
1e: 20 83 st Z, r18
for(unsigned char n=0;n<16;n++)
20: 19 82 std Y+1, r1 ; 0x01
22: 31 c0 rjmp .+98 ; 0x86 <__SREG__+0x47>
{
if (n<8) //dokud nedojdeš na poslední pozici
24: 89 81 ldd r24, Y+1 ; 0x01
26: 88 30 cpi r24, 0x08 ; 8
28: 50 f4 brcc .+20 ; 0x3e <__SP_H__>
{ PORTC <<=1; //tak posunuj doleva
2a: 88 e2 ldi r24, 0x28 ; 40
2c: 90 e0 ldi r25, 0x00 ; 0
2e: 28 e2 ldi r18, 0x28 ; 40
30: 30 e0 ldi r19, 0x00 ; 0
32: f9 01 movw r30, r18
34: 20 81 ld r18, Z
36: 22 0f add r18, r18
38: fc 01 movw r30, r24
3a: 20 83 st Z, r18
3c: 12 c0 rjmp .+36 ; 0x62 <__SREG__+0x23>
}
else //když si dojel nakonec
{
PORTC <<=1; //tak posunuj doleva
3e: 88 e2 ldi r24, 0x28 ; 40
40: 90 e0 ldi r25, 0x00 ; 0
42: 28 e2 ldi r18, 0x28 ; 40
44: 30 e0 ldi r19, 0x00 ; 0
46: f9 01 movw r30, r18
48: 20 81 ld r18, Z
4a: 22 0f add r18, r18
4c: fc 01 movw r30, r24
4e: 20 83 st Z, r18
PORTC |= 0x01; //a zprava doplň jedničku
50: 88 e2 ldi r24, 0x28 ; 40
52: 90 e0 ldi r25, 0x00 ; 0
54: 28 e2 ldi r18, 0x28 ; 40
56: 30 e0 ldi r19, 0x00 ; 0
58: f9 01 movw r30, r18
5a: 20 81 ld r18, Z
5c: 21 60 ori r18, 0x01 ; 1
5e: fc 01 movw r30, r24
60: 20 83 st Z, r18
}
int i;
i=1;
62: 81 e0 ldi r24, 0x01 ; 1
64: 90 e0 ldi r25, 0x00 ; 0
66: 9b 83 std Y+3, r25 ; 0x03
68: 8a 83 std Y+2, r24 ; 0x02
while(i<255)
6a: 05 c0 rjmp .+10 ; 0x76 <__SREG__+0x37>
i++;
6c: 8a 81 ldd r24, Y+2 ; 0x02
6e: 9b 81 ldd r25, Y+3 ; 0x03
70: 01 96 adiw r24, 0x01 ; 1
72: 9b 83 std Y+3, r25 ; 0x03
74: 8a 83 std Y+2, r24 ; 0x02
PORTC <<=1; //tak posunuj doleva
PORTC |= 0x01; //a zprava doplň jedničku
}
int i;
i=1;
while(i<255)
76: 8a 81 ldd r24, Y+2 ; 0x02
78: 9b 81 ldd r25, Y+3 ; 0x03
7a: 8f 3f cpi r24, 0xFF ; 255
7c: 91 05 cpc r25, r1
7e: b4 f3 brlt .-20 ; 0x6c <__SREG__+0x2d>
int main(void)
{ DDRC = 0xff; //port A jako výstupní
while(1)
{ PORTC = 0b11111111; //zhasnutí všech LED diod
for(unsigned char n=0;n<16;n++)
80: 89 81 ldd r24, Y+1 ; 0x01
82: 8f 5f subi r24, 0xFF ; 255
84: 89 83 std Y+1, r24 ; 0x01
86: 89 81 ldd r24, Y+1 ; 0x01
88: 80 31 cpi r24, 0x10 ; 16
8a: 60 f2 brcs .-104 ; 0x24 <__zero_reg__+0x23>
int i;
i=1;
while(i<255)
i++;
}
}
8c: c4 cf rjmp .-120 ; 0x16 <__zero_reg__+0x15>