Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

AT90PWM316
Jdi na stránku 1, 2, 3  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
david69



Založen: Jan 04, 2007
Příspěvky: 410

PříspěvekZaslal: čt prosinec 07 2017, 17:12    Předmět: AT90PWM316 Citovat

Dobry den,
nedari se mi naprogramovat funkcni AT90PWM316 pres gcc-avr Sad
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<Cool //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<Cool //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>
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Atlan



Založen: May 10, 2004
Příspěvky: 4513
Bydliště: Košice

PříspěvekZaslal: pá prosinec 08 2017, 8:29    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
david69



Založen: Jan 04, 2007
Příspěvky: 410

PříspěvekZaslal: pá prosinec 08 2017, 12:32    Předmět: Citovat

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 Smile Zatim diky

dave
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
david69



Založen: Jan 04, 2007
Příspěvky: 410

PříspěvekZaslal: pá prosinec 08 2017, 12:52    Předmět: Citovat

tak avrdude je OK Smile 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 Sad
v pripade podobnyho led.c a led.asm...
jak pokracovat?
diky Dave
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
david69



Založen: Jan 04, 2007
Příspěvky: 410

PříspěvekZaslal: pá prosinec 08 2017, 19:39    Předmět: Citovat

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 Smile
chaotickej puls na pinech brany PortD a PortC
chip danej uplne novej... fuse nastaveny dle avrdude s krystalem 8MHz

diky dave
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
david69



Založen: Jan 04, 2007
Příspěvky: 410

PříspěvekZaslal: so prosinec 09 2017, 13:23    Předmět: Citovat

udelany v podstate to stejny v asm, a chip bezi, nerozumim Sad
jeste jsem nasel AVRA compilator pro Linux, vyzkousim vytvorit hex file
zatim diky Dave
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: so prosinec 09 2017, 20:19    Předmět: Citovat

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?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: so prosinec 09 2017, 20:42    Předmět: Citovat

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:

    int i;
    i=1;
    while(i<255)
      i++;



snapshot_09-12-2017.JPG
 Komentář:

Stáhnout
 Soubor:  snapshot_09-12-2017.JPG
 Velikost:  85.13 kB
 Staženo:  199 krát

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
david69



Založen: Jan 04, 2007
Příspěvky: 410

PříspěvekZaslal: ne prosinec 10 2017, 11:38    Předmět: Citovat

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(;Wink
{
_delay_ms(1000);
PORTB++;
}
return 0;
}
diky dave
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
david69



Založen: Jan 04, 2007
Příspěvky: 410

PříspěvekZaslal: ne prosinec 10 2017, 14:12    Předmět: Citovat

#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 Smile
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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
lesana87



Založen: Sep 20, 2014
Příspěvky: 3405

PříspěvekZaslal: ne prosinec 10 2017, 14:19    Předmět: Citovat

david69 napsal(a):
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. Confused
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: ne prosinec 10 2017, 14:39    Předmět: Citovat

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:
# 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".
#----------------------------------------------------------------------------
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
david69



Založen: Jan 04, 2007
Příspěvky: 410

PříspěvekZaslal: ne prosinec 10 2017, 17:09    Předmět: Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
david69



Založen: Jan 04, 2007
Příspěvky: 410

PříspěvekZaslal: ne prosinec 10 2017, 17:13    Předmět: Citovat

collect2: error: ld returned 1 exit status je chyba linkeru,
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: ne prosinec 10 2017, 19:06    Předmět: Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2, 3  Další
Strana 1 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.22 sekund