aktualizování firmwaru přes uart
Úvodní stránka › Fórum › Vaše projekty › Arduino › aktualizování firmwaru přes uart
- Toto téma obsahuje celkem 68 odpovědí. Do diskuze (3 diskutující) se naposledy zapojil uživatel
michal123 a poslední změna proběhla před 7 roky a 3 měsíci.
-
AutorPříspěvky
-
19.4.2017 v 11:51 #11176
michal123
ÚčastníkDěkuji, už to také vidím ale porád si nedovedu vysvětlit, že to vracelo blbosti i když tam HEX nebylo.
Az přiijdu odpoledne domů tak to znovy vyzkouším s polem UINT_8 které by k tomu mělo být nejspíš nejlepší.19.4.2017 v 12:46 #11177Vojtěch Vosáhlo
ÚčastníkNo s typem pole problém nebude, jde o to co a jak do něj zapíšete.
19.4.2017 v 22:42 #11185michal123
ÚčastníkNějak mi trvalo dlouho než jsem se k tomu vůbec dostal, tady posílám nějak opravený neodzkoušený kód
Zítra se k němu dostanu zase až pozdě, zatím kód funguje do funkce kolem řádku 311 taže už to snad brzy vyjde.22.4.2017 v 16:59 #11195michal123
ÚčastníkTak jsem pořád zaseknutý na tomhle
Proč to nefunguje? a jak na to?22.4.2017 v 17:49 #11196Vojtěch Vosáhlo
ÚčastníkNo na začátku jste arduinu řekl že chcete proměnnou uložit do flash, teď mu tedy musíte říct že chcete číst z flash. Aby kód fungoval, musí vypadat takto:
const uint8_t strr[4][50] PROGMEM = {//tohle je pro ukazku, dale se bude nacitat postupne coz uz ale nebude problem "0123456789ABCDEF", "230000000000000000000000000000", "600000000000000000000000000000", "800000000000000000000000000000" }; void setup() { Serial.begin(115200); Serial.println(strr[0][1]); Serial.println(strr[0][13]);//tady to jeste funguje for (int a = 0; a < 13; a++) { //3 Serial.print(a); Serial.print(","); Serial.print(pgm_read_byte(&(strr[0][a])), BIN);//proc to ve foru nefunguje? Serial.print("\t,"); Serial.println(pgm_read_byte(&(strr[1][a])), BIN); } } void loop() { }
Důležité je právě pgm_read_byte();, to označuje že chcete číst z programové paměti.
22.4.2017 v 19:35 #11197michal123
ÚčastníkDěkuji, mám další problém.
Nejspíš jsem ze zamotal kolem 336 řádku, zdá se, že proces již proběhne celý ale někde v tatech musí bých chyba protože arduino pořád nebliká.22.4.2017 v 20:18 #11198Vojtěch Vosáhlo
ÚčastníkZkuste trošku přiblížit co to má dělat, pak na to můžu kouknout. Jak nebliká, jako sériová komunikace?
22.4.2017 v 20:27 #11199michal123
ÚčastníkMělo by to do druhého procesoru přes piny A2 A3 sw serial nahrát hex z proměné str.
vypadá to, že procesor naváže synchronizaci, něco i do druhého naprgramuje ale druhý procesor po naprogramování a restartování nic nedělá.
(doufám, že to takto stačí)23.4.2017 v 14:28 #11205Vojtěch Vosáhlo
ÚčastníkTak bylo tam hned několik problémů. Zaprvé problém s konverzí toho ascii na hex a pak i se samotným zápisem v poli + pár smyček atd.
Nebudu vysvětlovat vše co jsem změnil ale jen to co potřebujete vědět. Nejdůležitější je asi konverze kterou jste prováděl, v poli jste měl sice zapsané byty tak jak by měly být ale pak jste posílal prakticky jen polovinu. Příklad:
Měl jste v poli byte 0x0C který by měl být v tomto tvaru odeslán do arduina ale vy jste ho posílal jako 2 byty, 0x00 a 0x0C, takhle tomu bylo u každého z nich.Upravil jsem tedy kód tak, aby jste do pole mohl zapsat jednu stránku, tzn 128B, ve vašem případě !!!256!!! charakterů, 256 kvůli tomu že jeden byte je reprezentován dvěma charaktery. Pokud budete tedy kopírovat data z intel hex souboru, odpovídá 256 charakterů přesně 8mi řádkům (pokud se odstraní :10 0000 00 ze začátků a poslední hex číslo což je checksum).
Opět dávám odkaz na pastebin, ten kód co tam je je PLNĚ funkční a uploadne na arduino program který bliká led na pinu 13 jednou za 100ms. Zkuste si sám jestli vám poběží.
Hezký zbytek dne.
23.4.2017 v 20:18 #11217michal123
ÚčastníkJeště jedna drobnost, proč mi to nejde když tak dám hex od blink z arduina?
24.4.2017 v 20:20 #11223Vojtěch Vosáhlo
ÚčastníkOprava je na tomto linku. Stačilo jen pozměnit delay při posílání charakterů na 10us, viz. řádek 349.
24.4.2017 v 20:30 #11224michal123
ÚčastníkDěkuji brzy ozkouším, jak jste na to přišel?
24.4.2017 v 20:39 #11225Vojtěch Vosáhlo
ÚčastníkNic extra, prostě jen metoda pokus omyl. Vím že při malých datech to fungovalo ale když bylo dat víc, nevzalo arduino vše, tak jsem tipnul a vyšlo to ?
25.4.2017 v 6:37 #11230Vojtěch Vosáhlo
ÚčastníkJeště jsem zapoměl zmínit že jsou tam 2 programy. Kratší je blink v GCC s pauzou 100ms a delší je arduinovské Blink s pauzou 1s. Prostě si odkomentujte co potřebujete a nebo zkuste vlastní kód.
26.4.2017 v 22:06 #11262michal123
ÚčastníkDObrý večer,
nejspíš jsem nepochopil tu 1s pauzu.
Kód funguje pro blink ale už ne pro blink na jiných pinech. Když jsem se na komunikaci kouknul osciloskopem tak jsem zjistil, že arduino když nahrává tak 20,5ms čeká, pošle řídící kód, pak 16ms čeká a pak nahraje stránku a tak to opakuje. (ještě to pak všechno zpětně ověří)
Ale když se podívám na naše data tak, rídících kódů je tam zdáse víc (nevím co arduino neposílá nebo kde nečeká protože z toho nevyluštím konkrétní hodnoty.(případně pošlu nějaké obrázky), časem snad postavím další (arduino) pro paraelní čtení komunikace. -
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.