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

#16 Příspěvek 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#
Uživatelský avatar
lesana87
Příspěvky: 4397
Registrován: 20 zář 2014, 00:00

#17 Příspěvek od lesana87 »

A čteš, co ti to píše za chyby? Undefined reference to main, nemáš tam main funkci.
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#18 Příspěvek 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.
Uživatelský avatar
david69
Příspěvky: 420
Registrován: 04 led 2007, 00:00

#19 Příspěvek 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
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#20 Příspěvek 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

Kód: Vybrat vše

i=1;
while(i<255)
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;
      }
    }
  }
}
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#21 Příspěvek 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.
Uživatelský avatar
david69
Příspěvky: 420
Registrován: 04 led 2007, 00:00

#22 Příspěvek 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
Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 00:00

#23 Příspěvek 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. :D
https://www.cbsnews.com/news/toyota-unintended-acceleration-has-killed-89/
Uživatelský avatar
david69
Příspěvky: 420
Registrován: 04 led 2007, 00:00

#24 Příspěvek 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....
Uživatelský avatar
david69
Příspěvky: 420
Registrován: 04 led 2007, 00:00

#25 Příspěvek 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
Uživatelský avatar
lesana87
Příspěvky: 4397
Registrován: 20 zář 2014, 00:00

#26 Příspěvek od lesana87 »

A nožiček to má kolik? :oops:
Uživatelský avatar
david69
Příspěvky: 420
Registrován: 04 led 2007, 00:00

#27 Příspěvek od david69 »

at90pwm1=0x1E9383
at90pwm216=0x1E9483
at90pwm2=0x1E9381
at90pwm2b=0x1E9383
at90pwm316=0x1E9483
at90pwm3=0x1E9381
at90pwm3b=0x1E9383
at90pwm81=0x1E9388
Uživatelský avatar
david69
Příspěvky: 420
Registrován: 04 led 2007, 00:00

#28 Příspěvek od david69 »

http://www.datasheetdir.com/AT90PWM316+ ... ontrollers

tohle popisove sedi, bud PWM3,PWM3B nebo PWM316
Uživatelský avatar
lesana87
Příspěvky: 4397
Registrován: 20 zář 2014, 00:00

#29 Příspěvek od lesana87 »

0x1e9483 je AT90PWM216 nebo AT90PWM316, liší se jen počtem nožiček, stačí umět počítat do 32. :oops:
Uživatelský avatar
david69
Příspěvky: 420
Registrován: 04 led 2007, 00:00

#30 Příspěvek 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,,,,
Odpovědět

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