Stránka 2 z 3
Napsal: 10 pro 2017, 20:08
od david69
muj Makefile
all: blikac-ukazka.elf
blikac-ukazka.elf: blikac-ukazka.c
avr-gcc -mmcu=at90pwm316 -g -o $@ $^ -Wall -O2 -I. -lgcc
clean:
$(RM) blikac-ukazka.elf
a chyba linkeru tam evidentne je >>>
david22:~/Documents/Elektronika/AT90PWM3/test# make clean
rm -f blikac-ukazka.elf
david22:~/Documents/Elektronika/AT90PWM3/test# make
avr-gcc -mmcu=at90pwm316 -g -o blikac-ukazka.elf blikac-ukazka.c -Wall -O2 -I. -lgcc
/usr/lib/gcc/avr/5.4.0/../../../avr/lib/avr5/crtat90pwm316.o:(.init9+0x0): undefined reference to `main'
collect2: error: ld returned 1 exit status
Makefile:4: návod pro cíl „blikac-ukazka.elf“ selhal
make: *** [blikac-ukazka.elf] Chyba 1
david22:~/Documents/Elektronika/AT90PWM3/test#
Napsal: 10 pro 2017, 20:24
od lesana87
A čteš, co ti to píše za chyby? Undefined reference to main, nemáš tam main funkci.
Napsal: 11 pro 2017, 22:18
od frpr666
@david69: problémy jsou od toho, aby se řešily.
Díky těmto "chybám" se posuneš dopředu a naučíš se něco nového.
Napsal: 12 pro 2017, 09:56
od david69
kdyz se da -nostdlib, tak se musi definovat funkce"_start"
kdyz se neda -nostdlib, tak se musi definovat funkce "main"
v principu je jedno jestli to ma bezet s prikazovy radky nebo z Makefile,
melo by to chodit v obou pripadech, tu matematickou knihovnu -lgcc
myslim pro nas testovaci program nepotrebujeme
divny ovsem je? ze s while a s delay jsou ruzny vysledky, kdyz je to
porad stejny!
#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);
}
}
delay nebo while, je to stejny, muzete to vyzkouset v AVRStudiu? diky
david
Napsal: 13 pro 2017, 19:26
od frpr666
@main,
Every full C program begins inside a function called "main".
@while a delay_ms() dá různý výsledek, neboť jsou to dva různé programy.
Pokud se podíváš do delay.h, tak uvidíš, jak je funkce napsaná.
Na druhou stranu, smyčka
může trvat různě, podle toho jak to gcc přeloží a zoptimalizuje.
Pro účely časování je nejlépe použít timer, když už nám ho tam výrobci čipů dali. S časovačem se dají dělat různé zábavné věci, dokonce i bez nutnosti použit přerušení.
Kód: Vybrat vše
int8_t time, time_mem;
main()
{
setup(); // setup TCNT0 as free-running
while(1)
{
time = TCNT0;
// ...
if ((time - time_mem) >= (20))
{
time_mem = time;
// ...
if (PORTB != 0)
{
PORTB = 0x00;
}
else
{
PORTB = 0xff;
}
}
}
}
Napsal: 13 pro 2017, 20:04
od mtajovsky
frpr666 píše:@main,
Every full C program begins inside a function called "main".
To není dogma, jenom dohoda, jak se bude jmenovat vstupní bod, odkud začíná kód psaný aplikačním programátorem. Na adresu s návěštím __main se předá řízení po ukončení start-up části kódu, která nastavuje zásobník a dělá jiné věci v závislosti na operačním systému tak, aby se aplikace v systému správně usídlila. Pokud bychom tento start-up kód upravili, mohlo by se volat úplně něco jiného. Například programátoři pod Win API vědí, že jejich program s grafickým rozhraním začíná funkcí WinMain. Existují i další MS rozšíření - _tmain, což se preprocesorem přeloží jako main nebo wmain podle toho, jestli v aplikaci pracujeme se znakovou sadou ASCII - pro main nebo s Unicode (UTF16) - pak je to wmain.
Napsal: 14 pro 2017, 18:08
od david69
no dobre, avr-gcc vyplodi kod ktery nejde, ale kdyz zadavany kod disassembluju
.INCLUDE "pwm3def.inc"
.LIST
.EQU DDR=DDRC
.EQU PORT=PORTC
.cseg
.org 0
ldi r24, 0xFF ; 0000 EF8F
out DDR, r24 ; 0001 B987
avr0002: out PORT, r24 ; 0002 B988
ldi r18, 0xFF ; 0003 EF2F
ldi r19, 0x69 ; 0004 E639
ldi r25, 0x18 ; 0005 E198
avr0006: subi r18, 0x01 ; 0006 5021
sbci r19, 0x00 ; 0007 4030
sbci r25, 0x00 ; 0008 4090
brne avr0006 ; 0009 F7E1
rjmp avr000B ; 000A C000
avr000B: nop ; 000B 0000
out PORT, r1 ; 000C B818
ldi r18, 0xFF ; 000D EF2F
ldi r19, 0x69 ; 000E E639
ldi r25, 0x18 ; 000F E198
avr0010: subi r18, 0x01 ; 0010 5021
sbci r19, 0x00 ; 0011 4030
sbci r25, 0x00 ; 0012 4090
brne avr0010 ; 0013 F7E1
rjmp avr0015 ; 0014 C000
avr0015: nop ; 0015 0000
rjmp avr0002 ; 0016 CFEB
.exit
a podstrcim AVRStudiu tak hex file bezi! je celkem pochopitelny ze vysledny
hex kody nebudou stejny, i v pripade kdyz pouziju optimalizaci,
ale porad si nejsem vedomej svoji chyby? kde je v mojem avr-gcc chyba??
dave
Napsal: 14 pro 2017, 21:12
od frpr666
@ avr-gcc vyplodi kod ktery nejde.
Tak nasdílej C file, a gcc argumenty a co se očekává od programu.
Kód, který si dělá co chce a né to co si prográmátor přeje, to je docela běžná věc.
https://www.cbsnews.com/news/toyota-unintended-acceleration-has-killed-89/
Napsal: 16 pro 2017, 07:03
od david69
urcite je kod, ktery pracuje jinak nez si programator preje, jenze jsem prisel na takovou
malickost, ze Intel hex kod vyprodukovany avr-gcc nebo AVRStudiem flashovany pres ISP
AVRStudiem je 100% funkcni a dela to co programator ocekava! Jenze se to neda rici
o AVRDUDE ktery flashuje blbe, nekdy je vysledek OK, jindy ne

Mozna mam rychle nastavenou ISP sbernici, ale urcite tenhle flashator neni 100% pro AT90PWM316!!!
tak jak dale postupovat....
Napsal: 23 pro 2017, 09:36
od david69
avrdude version 6.3, URL: <http://savannah.nongnu.org/projects/avrdude/>
david22:~# avrdude -c stk500 -p pwm316
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.02s
avrdude: Device signature = 0x1e9483 (probably pwm216)
avrdude: safemode: Fuses OK (E:F9, H:DF, L:4E)
avrdude done. Thank you.
david22:~#
??? tak co je to za chip 0x1e9483 ???
na pouzdre je AT90PWM316 ???? diky
Napsal: 23 pro 2017, 09:54
od lesana87
A nožiček to má kolik?

Napsal: 23 pro 2017, 09:54
od david69
at90pwm1=0x1E9383
at90pwm216=0x1E9483
at90pwm2=0x1E9381
at90pwm2b=0x1E9383
at90pwm316=0x1E9483
at90pwm3=0x1E9381
at90pwm3b=0x1E9383
at90pwm81=0x1E9388
Napsal: 23 pro 2017, 09:58
od david69
Napsal: 23 pro 2017, 10:03
od lesana87
0x1e9483 je AT90PWM216 nebo AT90PWM316, liší se jen počtem nožiček, stačí umět počítat do 32.

Napsal: 24 pro 2017, 13:24
od david69
poslal jsem datasheet, je tam snad tech 2x16 pinu videt,ne?
na pouzdre je 90PWM316-16SU a mam k dispozici 90PWM3B ktery
avrdude detekuje spravne,,,,