AT90PWM316
Moderátor: Moderátoři
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#
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
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
Kód: Vybrat vše
i=1;
while(i<255) 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;
}
}
}
}
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.frpr666 píše:@main,Every full C program begins inside a function called "main".
.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
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/
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
tak jak dale postupovat....
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
tohle popisove sedi, bud PWM3,PWM3B nebo PWM316