Mikrokontroléry (MCU) - jak začít a s čím - rady, vaše zkušenosti, názory a tipy

Pontiaq

Děkuji vám moc za rady. Jen bych ještě přece jen potřeboval poradit s výběrem jádra Cortex Mx. Jedná se o jádro M0+ s frekvencí max 48Mhz, vyšší řády M3 a M4 mají výkon větší, včetně instrukční sady. Rád bych s tím kitem frdm kl25z různě experimentoval, a tak se ptám, zda je to dostatečné, abych tak nemusel později rychle dokupovat jádro rychlejší. Sice má kl25z dost slušnou hardwarovou výbavu, ale je o něco dražší. Nebo můžete doporučit i jiný, pokud možno lepší vývojový kit? Zkušenosti s programováním v C už mám ze střední školy a moc mě to bavilo, takže mi stačí si už jen znalosti osvěžit a dát se hned na to.


eltech

Děkuji vám moc za rady. Jen bych ještě přece jen potřeboval poradit s výběrem jádra Cortex Mx. Jedná se o jádro M0+ s frekvencí max 48Mhz, vyšší řády M3 a M4 mají výkon větší, včetně instrukční sady. Rád bych s tím kitem frdm kl25z různě experimentoval, a tak se ptám, zda je to dostatečné, abych tak nemusel později rychle dokupovat jádro rychlejší. Sice má kl25z dost slušnou hardwarovou výbavu, ale je o něco dražší. Nebo můžete doporučit i jiný, pokud možno lepší vývojový kit? Zkušenosti s programováním v C už mám ze střední školy a moc mě to bavilo, takže mi stačí si už jen znalosti osvěžit a dát se hned na to.

No samozřejmě záleží, co na tom chceš dělat. Potom se dá soudit, jestli je to dostatečné nebo ne.

Ale obecně, Cortex-M0+ je velmi osekané jádro (ještě víc než M0), které vzniklo jako levná a úsporná náhrada 8mi bitů (jen pro zajímavost, jádra M3 a M4 byly na trhu dřív, než M0+..takže se osekávalo z nich). Např. instrukční sada obsahuje z velké části pouze 16bitové instrukce, což tě může limitovat při využítí pracovních registrů jádra (zbydou jen 3 bity v instrukci na určení pracovního registru). Na druhou stranu pipeline je jen 2-stupňová, což může být výhoda..ale asi ne moc signifikantní:) Dále, architektura je z pohledu sběrnic Von Neumann. Má také méně stupňů přerušení a pokud se nepletu, nejdou maskovat samostatně, což může být problem při použití RTOSu.

Naopak M4F s floating point unit je docela komplexní jádro s SIMD instrukcemi (dobrý základ pro NEON na Cortex-A;) a spoustou jiných užitečných instrukcí a konfiguračních registrů, s kterými při chytrém využití může být aplikace efektivnější (ale většinou dražší a s větším pouzdrem) než s Cortex M0+, jelikož čím rychleji něco spočítáš, tím déle může procesor spát nebo celkově běžet na nižší frekvenci. Podpora pro RTOS je lepší, stejně tak systém sběrnic.

Otázka ale je, do jaké míry tě tyhle detaily jádra budou zajímat, pokud budeš používat C a pravděpodobně nějaké předpřipravené knihovny jako Mbed. Pochybuju, že se hned ze startu pustíš do nějaké ultra low power aplikace.

Další věc jsou ostatní periferie. Obecně, "nižší frekvence, méně tranzistorů = menší plocha, nižší cena, nižší spotřeba", a to je často cílem MCU s M0+, takže i periferií je často méně a jsou jednodušší. Od NXP si můžes jako alternativu ke FRDM-KL25Z koupit kit FRDM-K64F s M4F, kde máš ale mnohem složitější DMA kontroler, SPI atd.. stačí si otevřít referenční manuál a hned poznáš rozdíl:)

Myslíš, že budeš potřebovat ze začátku složitý DMA kontroler, kterým budeš triggrovat a vazbit přes cross-bar jiné periferie ideálně bez probuzení jádra pro ultra low power aplikace? Nebo několik MAC jednotek a VLIW architekturu (potom bych tedy doporučoval nějaký DSC, jak zmiňoval kolega předemnou)?

Já si osobně myslím, že ne, ale nechci tě podceňovat ani to za tebe rozhodovat.

Jen pokud bych mohl jednu radu, tak to zas tak neřeš..nekupuješ auto.. a věřím, že kit za pár stovek by ti koupila i univerzita.. Tipů na kity jsi podle mě dostal dost a z mého osobního pohledu jsou všechny více méně ok.. takže prostě jeden z nich vyber a začni;) 

Good luck!

Joskoo

To eltech: Pekna odpoved, uplne suhlasim :)

Z mojho skromneho pohladu a nazoru.

Odporucam pre zaciatocnika najst si take prostredie (IDE) ktore mu bude vyhovovat a potom platformu ktora ma snad najrozsirenejsiu komunitu, dobre spracovane Drivery (SDK) a co to je popisane na webe.

Z toho by asi najvyznamnejsie vyslo Arduino, ale to osobne neodporucam (Wiring spravi zle navyky, Takmer ziadna kontrola na code flow, a pre buduceho embeddistu, to nieje vobec vhodny zaciatok).

Po com by som sa pozrel:
STM - Velka komunita a dostupne tutorialy, maju aj SDK, kity sa daju v CR v pohode zohnat
NXP - Vacsia komunita, help dostupny v podobe mcuoneclipse, SDK, IDE zalozene na Eclipse
TI - Osobne som mal od nich iba jeden kit, ale nikdy som s tym neprisiel extra do kontaktu
AVR - IDE zalozene na Visual Studio, pekne spravene Drivery, avrfreaks to isti.

Osobne mam skusenosti s Kinetis-mi , tak pisem na margo tejto rodiny (Da sa to aplikovat na akykolvek ARM)

KL25 pouziva CM0+, ma vsetky klasicke periferie(I2C, SPI, PWM, ADC, UART, Timer) + USB, DMA, dost RAM aj Flash.
Pre zaciatocnika viac nez vhodne! Preco? Periferie su KISS (Keep is simple, stupid), Periferku nastavis zopar registrami, alebo pouzijes driver z SDK, robi to co ma. Samozrejme, jednoducha periferia nevie robit komplexne veci, ale CM0+ ma aj DMA, takze dokazes spravit niektore komplexnejsie ukony pouzitim DMA - DMA je jednoduche, ale svoj ucel splni. Freertos bezi viac nez dobre.

K64F je uz CM4, takze floating point + hardwarova delicka, cip je uz pekne nabuchany. Ma zlozitejsie SPI, DMA, PWM aj Timer, naviac ma podporu Ethernet-u, SDHC kariet, Flexbus (SDRAM/LCD).. v skratke, je to raketa.
Neviem ci niekedy vyuzijes plny potencial toho co ti ponuka.. mne sa to nepodarilo, prakticky asi obmedzenie to nema a zvladne to hodne zaujimave veci. Co som na tom rozbehal:
- Data logger na SD kartu (Freertos +Fatfs)
- Kamera OV7660 a prenos obrazu na LCD (DMA + GPIO -> Flexbus)
- Riadenie BLDC motora (Hall / Sensorless) (PWM + PDB + ADC)

Takze, ako bolo spomenute, proste si nieco kup a zacni :)

mhi_

Dovolil bych si trosku kanibalizovat toto vlakno, ale ono se  to bude hodit i puvodnimu tazateli. Mate srovnani STM32 / NXP / pripadne ARM Atmel (SAM) ?

Prave se rozhoduju, ze bychom predelali neco co je postavene na PIC18 na ARMa, potrebujeme USB + CAN + pomerne rychle GPIO resp. navazane capture timery, abych stihal zpracovavat ruzne digi signaly. Atmelu se chci vyhnout po mych minulych zkusenostech, kdy clovek zjisti "ze veci nejsou jak by mely byt". NXP i ST jsem driv pouzival, ale ne ty moderni rodiny (mam tu nejake vzorky, ale v komercni aplikaci to neni, skoda ze cinani maji devkity hlavne pro STcko).

Padaly tu rady s ruznymi "velkymi" procesory, tak ty kvuli slozitosti rozhodne nedoporucuji. Treba nakonfigurovat nejakou periferii u MediaTeku/Allwinneru stoji mnohdy treba i stovky radek (ty periferie jsou navrzene docela univerzalne a sikovne "oregistrovane", takze z toho jsou takove svycarske noziky :-). Kdo zna puvodni Freescalovsky PPC QorIQ, tak ten je tomu nebjbliz.

Jak se tu resi jestli ARM-rulez nebo ne, tak v automotive je naprosto bezne, ze spouzivaji ruzne PPC / V850 / TriCore aJaNevimCoVsechnoJineho, naopak ARMu tam je poskrovnu (ale nejaky se taky najde).

Joskoo

To mhi_:

Ako to ma STM a AVR to neviem, ale u NXP mas K64, ktory obsahuje CAN (example su obsiahnute v SDK) (alebo si napises baremetal), USB obsahuje (Bud SDK, alebo si stiahnes solo Driver) a k rychlosti GPIO, zalezi..
Neviem ci v novej implementaci pouzivaju uz FGPIO, ale cez Timer + DMA + GPIO -> +-6MHZ Pin Toggle...


mhi_

Ad periferie: to mi je jasne, pouzit MCU selector umim (dokonce uz mam vzorky) a USB a CAN controllery jsou vsude podobne a nebojim se jich :). Slo mi spis o to "jak se s tim v praxi pracuje". Treba PIC18/24 umim dostat do stavu vytuhnuteho CAN controlleru (nejde povolit buffer, nebo tak neco) pouhym nastavenim logickeho rozporu mezi CANTX/CANRX (neni to tak uplne jednoduche, ale princip je ten, ze se tam ve udela dlouhodoba kolize). U MCP2515 se da situace resit tim, ze clovek "zataha za reset", ale to nejde udelat u procesoru s CANem.

O AVRko nemam zajem, to je z blata do louze, kdyz uz tak ten ARM/MIPS.

Joskoo

Tak to CAN je jedina periferia s ktorou som nerobil (nebol dovod)...
Tak to jedine si prejst vsetkych mainstream vyrobcov ARM-u a hlada zle recenzie na ARM.. a vybrat si toho kto ich ma najmenej DELENO velkost komunity :D

mhi_

Tak jak se tu nekdo ptal, dneska mi dorazil balicek z CN (objednavano pred mesicem). Koupil jsem mimo jine veci jen tak na hrani:

https://www.ebay.com/itm/UNO-R3-Mini-Micro-USB-ATmega328P-CH340G-Replace-ATmega16U2-Compatible-to-Arduino/201927954809?ssPageName=STRK%3AMEBIDX%3AIT&var=501935531922&_trksid=p2057872.m2749.l2649

https://www.ebay.com/itm/USBASP-USBISP-AVR-Programmer-Adapter-10-Pin-Cable-USB-ATMEGA8-ATMEGA128-Arduino/310506909410?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649

celkem nejakych 110 Kc. Pozor, ten prodejce se chova dost neochotne kdyz treba dorazi nefunkcni kus, odkazy jsou jen pro informaci o co jde.

Byl jsem az prekvapen jak je to snadne. Nejprve bylo nutne udelat redukci mezi usbasp (schema http://eecs.oregonstate.edu/education/docs/ece375/USBASP-UG.pdf  ) a ICSP schema je na https://learn.sparkfun.com/tutorials/installing-an-arduino-bootloader/connecting-the-programmer (10 minut prace, potreba 2 konektory a par dratu).

V ubuntu staci dat sudo apt-get install avr-libc avrdude binutils-avr gcc-avr srecord (1 minuta i s hledanim)

main.c:
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
 DDRB = 0x20;
 while (1) {
  PORTB = 0; _delay_ms(500);
  PORTB = 0x20; _delay_ms(500);
  }
}

A minimalisticky makefile:

all:
   avr-gcc -o main.elf main.c -mmcu=atmega328 -O2
   avr-objcopy -j .text -j .data -O ihex main.elf main.hex
   avrdude -p ATMEGA328p -c usbasp -U flash:w:main.hex  # nutno dat prava k device nebo pod rootem!

10 minut prace. A blika to ledkou "L". Nemusel jsem nic krome te redukce bastlit a je to cista prace bez veskereho odpadu co sebou nese arduino.

Takze pokud nekdo chcete zacit, objednejte a za mesic + 30 minut prace je prvni aplikace a za +- 100 Kc. Se slzou v oku vzpominam na doby, kdy mne zakoupeni vseho na blikani ledkou (PIC16F84) stalo vic nez tisicovku a nez jsem zablikal, trvalo mi to snad 2 dny uceni se a instalace MPLABu apod. Zrovna jsem mel stesti na nejakou ne prilis fungujici verzi a nebyla k tomu skoro zadna literatura krome datasheetu... to byly doby.

Jinak to Arduino jsem koupil jen za tim ucelem, abych mohl naprogramovat neco na jeden "shield" a nechtelo se mi dratovat nebo pod ten shield kreslit vlastni desku.

Mam jeste desky se STM32 + stlink, muzu napsat i o nem.

Kit

10 minut prace. A blika to ledkou "L". Nemusel jsem nic krome te redukce bastlit a je to cista prace bez veskereho odpadu co sebou nese arduino.

Kdyby sis koupil Arduino Nano, měl bys té práce ještě méně a o něco levněji. Nemusel jsem ani bastlit redukci - prostě jsem ho připojil dodaným USB kabelem k PC a mohl jsem programovat. Navíc je to mnohem menší. Pokročilejší pak přejdou na Arduino Mini Pro, které je ještě menší a ještě levnější, ale nemá ten USB převodník.

Zrovna se však piplám s ATtiny85, které se na drobnosti do 6 I/O hodí o něco lépe a je to prcek.

mhi_

Potreboval jsem neco "pod" ten shield ktery mne zajima, to uz jsem rovnou mohl pouzit nejakeho ARMa ci PICe. V minulosti jsem myslim Ard. nano koupil, ale nekde skoncilo zapadle prachem.

Asi doslo k nedorozumeni, vyse uvedenym postupem jsem prepsal bootloader arduina (po resetu jde rovnou do aplikace). Samozrejme to slo rozjet i s tim arduino bootloaderem, ale to ja neumim ani se nehodlam ucit, na nic to nepotrebuji.

MarSik

Bootloader se hodí, není pak potřeba programátor. Prostě se to po resetu pošle přes seriovou linku. Co se učení týče.. žádné není. avrdude se používá pořád stejně, jen se možná zvolí jiná rychlost, jiný usb port a jiný typ (dle konfigurace bootloaderu).

mhi_

Uceni: ja ten arduinacky bootloader vubec neznam. treba jak se skrz nej passuji interrupty. Rozhodne nejsem proti mit nejaky bootloader, ale uz jen popravde receno kdybych si mel zvolit desku MCU+serial-USB vs. ciste MCU, tak bych asi volil druhou variantu. Vetsinou totiz delam veci kde ten seriovy port vubec nevyuziju- bud' staci LEDky/display na zobrazeni stavu nebo je seriak moc pomaly a data se musi vyhodnotit v MCU). Casto je mym nastrojem taky osciloskop a na MCU jeden trigger pin...

Pro muj styl prace uplne nesedi ta "arduino-cesta", ani po HW ani SW strance. Je to hodne dobre pro "bastleni" ve stylu slepim neco v jednom-dvou kusech, pripadne kdyz clovek zatim nerozumi/nechce rozumet embedded vyvoji a vsem souvislostem.

anonym


No tak vzdyt o ty knihovny jde. Resi se tady, jaky procesor low level programovat. Vzdyt nejvetsi mnozstvi knihoven bude stejne napsanych v C, Ty si treba budes hrat s njakym ARM procesorem, ale co udelas, az budes potrebovat zpracovavat treba obraz z kamery, nebo posilat nejake data po LAN nebo pres WiFi? Na Arduinu to udelas, protoze je tam velka komunita a knihovny jsou, ale co treba ty dalsi monolity, ktere tu uvadite? Co kdyz budes potrebovat zalozit na tom monolitu i nějaký malý server, který bude moct reagovat na okolí. Fakt by me zajimalo, co se tady u nas v CR v prumyslu realne na tech mikroporcesorech dela, kdes najdes uplatneni, kdyz umims programovat ARM.
Presne tohle je prede mnou. Zpravovat obraz z kamery, zvuk z mikrofonu, zkomprimovat je, poslat streamem pryc a na druhe strane ho dekomprimovat, zobrazit na LCD a poslat do repraku.

A jak to udelam? Vezmu si datasheety k procesorum, ke kamere, k LCD a dalsim periferiim, ktere k tomu budu potrebovat, nastuduju si je a napisu si to kompletne sam. A proc? Protoze ty knihovny, co jsou ke kamere, LCD atd. dostupne pro arduino jsou sice fajn, ale nikdy nemas jistotu, ze budou delat to, co potrebujes, ve vsech situacich. A to si proste v produkcni verzi nemuzes dovolit.

Ale to delas jako skolni projekt, ne? Kdo ti něco takového zaplatí? Na desktopu to máš práci na pár dní, ale ty to máš na pár měsiců. To by mě opravdu zajímalo, kde se u nás něco takového vyvíjí.

Technik

Kolegové jen chtěli naznačit, že jste si mohl ušetřit práci s tou redukcí ( koupě programátoru se samozřejě může hodit ).
Stačilo propojit tu Arduino  desku s PC USB kabelem a místo vašeho příkazu:

avrdude -p ATMEGA328p -c usbasp -U flash:w:main.hex

použít něco jako:

avrdude -v -p atmega328p -c arduino -P /dev/ttyUSB0 -b 57600 -D -U flash:w:main.hex:i

Pak by to tam AVRdude natlačil s použitím bootloaderu, který tam už je od výrobce.