AT90PWM316

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
david69
Příspěvky: 420
Registrován: 04 led 2007, 00:00

AT90PWM316

#1 Příspěvek od david69 »

Dobry den,
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>
Uživatelský avatar
Atlan
Příspěvky: 4514
Registrován: 10 kvě 2004, 00:00
Bydliště: Košice

#2 Příspěvek od Atlan »

Simulator proteus 8.6 si na linuxe nespustis co?
Osobne by som port nerotoval. Ale premenu a tu zapisal na vystup portu.

Upraveny prispevok koli rotacii v Cku.
Uživatelský avatar
david69
Příspěvky: 420
Registrován: 04 led 2007, 00:00

#3 Příspěvek od david69 »

zkousel jsem simulator na Linuxu, ale padalo me to, zkousel jsem tam pridat
script v rozsahu pameti chipu,

#include "avr/io.h"

.text

/* Initialize the stackpointer. */
ldi r16, lo8 (RAMEND)
out _SFR_IO_ADDR (SPL), r16
ldi r16, hi8 (RAMEND)
out _SFR_IO_ADDR (SPH), r16

.extern avr_start
rjmp avr_start

tohle v AVRStudiu bezi bez vetsich problemu... >>

.INCLUDE "pwm3def.inc"
.LIST
.CSEG
.DEF REG=R16
.EQU DDR=DDRC
.EQU PORT=PORTC

LDI REG,$FF
OUT DDR,REG
LDI REG,LOW(RAMEND)
OUT SPL,REG
LDI REG,HIGH(RAMEND)
OUT SPH,REG
LDI REG,$FF
LDI R20,1

SMYCKA: OUT PORT,REG
RCALL CEKEJ
ADD REG,R20
RJMP SMYCKA

CEKEJ:
LDI R17,36
CYK3: LDI R18,150
CYK2: LDI R19,250
CYK1: DEC R19
BRNE CYK1
DEC R18
BRNE CYK2
DEC R17
BRNE CYK3
RET

cokoliv podobne v "Ccku" NE! potreboval bych tedy neco?
ukazkovyho funkcniho Cckovyho.... ale nejdriv zkusim
nahrat hex file nejakeho funkcniho assembleru a flashnu ho
pres avrdude a pak napisu :) Zatim diky

dave
Uživatelský avatar
david69
Příspěvky: 420
Registrován: 04 led 2007, 00:00

#4 Příspěvek od david69 »

tak avrdude je OK :) naflashuje chip...
avr-objcopy -j .text -j .data -O ihex led.elf led.hex
avr-objcopy -O ihex -R .eeprom data.elf data.hex
bohuzel generuje neco odlisnyho nez AVRStudio4 z assembleru :(
v pripade podobnyho led.c a led.asm...
jak pokracovat?
diky Dave
Uživatelský avatar
david69
Příspěvky: 420
Registrován: 04 led 2007, 00:00

#5 Příspěvek od david69 »

zkusil jsem toto
#include <avr/io.h>

int main(void)
{
DDRC = 0xFF; //Nakes PORTC as Output
while(1) //infinite loop
{
PORTC = 0xFF; //Turns ON All LEDs
int i;
i=1;
while(i<255)
i++;

PORTC= 0x00; //Turns OFF All LEDs
i=1;
while(i<255)
i++;
}
}

avr-gcc teda neco vykompilovalo, chip je naprosto chaotickej :)
chaotickej puls na pinech brany PortD a PortC
chip danej uplne novej... fuse nastaveny dle avrdude s krystalem 8MHz

diky dave
Uživatelský avatar
david69
Příspěvky: 420
Registrován: 04 led 2007, 00:00

#6 Příspěvek od david69 »

udelany v podstate to stejny v asm, a chip bezi, nerozumim :(
jeste jsem nasel AVRA compilator pro Linux, vyzkousim vytvorit hex file
zatim diky Dave
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#7 Příspěvek od frpr666 »

Jak to kompiluješ? Přes příkazovou řádku? Jaké předáváš parametry do avr-gcc? Našel jsi v dokumentaci, že chip AT90PWM316 je podporovaný v avr-gcc?
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#8 Příspěvek od frpr666 »

Zkusil jsem tvůj příklad dát do AVR Studio.
Pokud je zapnutá optimalizace, avr-gcc ignoruje kód, který nemá na funkci vliv.
V tomto konkrétním případě vyhodil proměnnou "i", protože není "volatile".

Kód: Vybrat vše

    int i;
    i=1;
    while(i<255)
      i++;
Přílohy
snapshot_09-12-2017.JPG
(85.13 KiB) Staženo 240 x
Uživatelský avatar
david69
Příspěvky: 420
Registrován: 04 led 2007, 00:00

#9 Příspěvek od david69 »

david22:~/Documents/Elektronika/AT90PWM3/test# ls
blikac.asm blikac1.asm blinker.hex shift.asm shift.hex vyuka.pdf
blikac.hex blinker.c Makefile shift.c shift.lss
blikac-ukazka.c blinker.elf prevod-elf shift.elf shift.s
david22:~/Documents/Elektronika/AT90PWM3/test# avr-gcc -mmcu=at90pwm316 -nostdlib -g -o blikac-ukazka.elf blikac-ukazka.c -Wall -I. -Wcpp -lgcc
In file included from blikac-ukazka.c:4:0:
/usr/lib/avr/include/util/delay.h:112:3: warning: #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed" [-Wcpp]
# warning "Compiler optimizations disabled; functions from <util/delay.h> won't
^
/tmp/user/0/cc1hcAoS.o: In function `main':
/usr/lib/avr/include/util/delay.h:191: undefined reference to `__mulsf3'
/usr/lib/avr/include/util/delay.h:192: undefined reference to `__ltsf2'
/usr/lib/avr/include/util/delay.h:194: undefined reference to `__gtsf2'
/usr/lib/avr/include/util/delay.h:197: undefined reference to `__mulsf3'
/usr/lib/avr/include/util/delay.h:197: undefined reference to `__fixunssfsi'
/usr/lib/avr/include/util/delay.h:207: undefined reference to `__fixunssfsi'
collect2: error: ld returned 1 exit status
david22:~/Documents/Elektronika/AT90PWM3/test#

>>> je videt evidentni chyba linkeru! to znamena ze kompilacni prostredi pro AVRko
je blbe, jenze otazkou je, jak ho nastavit,??

zkusil jsem ukazkovy program
#define F_CPU 8000000UL

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
DDRB = 0xFF; // PB0-PB4 output
PORTB = 0x00; // Set all pins low

// Turn LED on for 1 sec and then off for 1 sec forever
for(;;)
{
_delay_ms(1000);
PORTB++;
}
return 0;
}
diky dave
Uživatelský avatar
david69
Příspěvky: 420
Registrován: 04 led 2007, 00:00

#10 Příspěvek od david69 »

#include <avr/io.h>

volatile int i;

int main(void)
{
DDRC = 0xFF; //Nakes PORTC as Output
while(1) //infinite loop
{
PORTC = 0xFF; //Turns ON All LEDs
i=1;
while(i<255)
i++;

PORTC= 0x00; //Turns OFF All LEDs
i=1;
while(i<255)
i++;
}
}

zmenil jsem na volatile, diky, a myslim ze prvni uspech :)
ted se to prelozilo celkem dobre, a i brana generuje
signal...

takze zustava otazkou, jak to ma byt na Debianu konfigurovany,
kdyz linker krici, abych mel knihovny v ceste...

dave
Uživatelský avatar
lesana87
Příspěvky: 4395
Registrován: 20 zář 2014, 00:00

#11 Příspěvek od lesana87 »

david69 píše:avr-gcc -mmcu=at90pwm316 -nostdlib -g -o blikac-ukazka.elf blikac-ukazka.c -Wall -I. -Wcpp -lgcc
>>> je videt evidentni chyba linkeru! to znamena ze kompilacni prostredi pro AVRko je blbe, jenze otazkou je, jak ho nastavit,??

Nevidím žádnou evidentní chybu linkeru, ty mu tam dáváš přepínač -nostdlib, tj. zakazuješ použití standardních knihoven, a on hlásí, že nemá standardní knihovny. :?
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#12 Příspěvek od frpr666 »

Na internetu lze dohledat makefile pro kompilování AVR pod Linuxem.
Pokud jednou nastavíš makefile správně. Potom stačí zkompilovat přez příkaz "make".

Kód: Vybrat vše

# Hey Emacs, this is a -*- makefile -*-
#----------------------------------------------------------------------------
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
#
# Released to the Public Domain
#
# Additional material for this makefile was written by:
# Peter Fleury
# Tim Henigan
# Colin O'Flynn
# Reiner Patommel
# Markus Pfaff
# Sander Pool
# Frederik Rouleau
# Carlos Lamas
#
#----------------------------------------------------------------------------
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF.
#
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device, using avrdude.
#                Please customize the avrdude settings below first!
#
# make debug = Start either simulavr or avarice as specified for debugging,
#              with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
#                   bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------
Uživatelský avatar
david69
Příspěvky: 420
Registrován: 04 led 2007, 00:00

#13 Příspěvek od david69 »

no dobre, jsme porad u podobnyho file

#define F_CPU 8000000UL // frekvence CPU v Hz
#include <avr/io.h>
#include <util/delay.h>

void _start(void)
{
DDRC = 0xFF; //Nakes PORTC as Output
while(1) //infinite loop
{
PORTC = 0xFF; //Turns ON All LEDs
_delay_ms(1000);

PORTC= 0x00; //Turns OFF All LEDs
_delay_ms(1000);
}
}

to se sice kompiluje uz bez ld error
avr-gcc -mmcu=at90pwm316 -Wall -O2 -nostdlib -o xx.elf xx.c
ale je to nefunkcni, ...
pricemz s while je kompilat funkcni...

dave
Uživatelský avatar
david69
Příspěvky: 420
Registrován: 04 led 2007, 00:00

#14 Příspěvek od david69 »

collect2: error: ld returned 1 exit status je chyba linkeru,
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#15 Příspěvek od frpr666 »

Jestli to není stejná situace, jak psala Lesana, stdlib máš zakázánu.

Navíc delay. h bude potřebovat informaci o frekvenci chipu, jedině tak může spočítat správně, kolik je jedna milisekunda.

Nejlépe, pokud si seženeš makefile, který vytvořil již nějaký AVR guru a jen tam upravíš:
# MCU name
MCU = atmega128
F_CPU = 8000000

C:\programs\WinAVR-20100110\sample\Makefile
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“