Programová záhada

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#16 Příspěvek od Celeron »

Every mám, tak zkusím. Možná že by stačilo i Teenssy 2.0, má 2560byte RAM. Mám ho nachystanej kvůli velkýmu počtu analogů do jednoho projektu.
Zkusil jsem vyházet všechny čtyřbyte globální proměnný a odkomentovat jejich použití v programu. Je z toho nefunkční troska ale stále se to kouše ve stejným místě. Volných je nyní 1580. Nějak nerozumím tomu, jak se ty proměnný obsazujou, proč se jich tolik uvolnilo když jsem zrušil pouze 6 čtyřbytovek.
Ale asi to bude správná cesta se zvětšováním RAM. Našel jsem na netu s tím mým 1,3"displejem displej přijímače na amatérský pásma, kde kromě kmitočtu jsou grafický čtvrtkruhový stupnice, jako to mívaly starý komunikační přijímače s analogovým laděním. Píše tam něco v tom smyslu, že to 328P nezvládá a proto používá ESP32. Proč ne Every nebo 2560 tam nepíše. Možná to nešlo ani s nima a je potřeba 32 bytů.
Jirka

Proč mi nemůže všechno chodit hned ?!!

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#17 Příspěvek od Celeron »

Hlásím, že to na Every dělá to samý. Takže velikost RAM nemá vliv. Tak už snad jen knihovny. Zkusím U8LIB.
Jirka

Proč mi nemůže všechno chodit hned ?!!

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#18 Příspěvek od Celeron »

Hledal jsem na netu jiný ovládaní pro si5351
A ejhle našel jsem variantu pro 1,3" displej s řadičem SH1106.
No a v tom řádku kde se skáče na ty výpise ve kterých se mě to žvejká je:

Kód: Vybrat vše

statup_text();  //If you hang on startup, comment
Takže nejen problém u mě s původním displejem SSD1306 ale i u jiných s SH1106...
Naposledy upravil(a) Celeron dne 02 kvě 2023, 11:41, celkem upraveno 1 x.
Jirka

Proč mi nemůže všechno chodit hned ?!!

Uživatelský avatar
Mahoney
Příspěvky: 347
Registrován: 26 říj 2019, 02:00

#19 Příspěvek od Mahoney »

Asi je to chyba knihovny, a asi by to chtělo zkusit nulovat proměnné bufferu, jenže je to objektový a zatím jsem se tím moc daleko neprohrabal.

Problém může být i v alokaci místa pro proměnné, takovej "long long int" například může znamenat něco trochu jinýho na 32bit a něco jinýho na 8bit MCU a je to obecně známej problém (proto vznikly standardizovaný typy jako uint8_t a podobně, knihovna stdint), takže záleží i na kompilátoru jak se s tím popasuje (to by mělo být vidět v listingu překladu, pokud to nějakej generuje).

Viděl bych to tak, že jestli chceš mít málo starostí tak to hoď taky na to ESP a uvidíš, co to udělá…

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#20 Příspěvek od Celeron »

To spíš oželím ten výpis počátečních keců. Dělám to pro sebe a tak snad vím, co to umí a co na kterej výstup leze. :lol:
Navíc to už mám nastrkaný do KP krabice a předělávat se mě držák na Pro Mini až tak moc nechce.
Díky za snahu pomoci.
Jirka

Proč mi nemůže všechno chodit hned ?!!

Uživatelský avatar
ondraN
Příspěvky: 209
Registrován: 16 srp 2022, 02:00
Bydliště: Roztoky

#21 Příspěvek od ondraN »

Zkoušel jsi tam ty delay() ? Jen by mě to zajímalo, jestli to má vliv.

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#22 Příspěvek od Celeron »

Dnes jsem to začal strójit do škatule, takže rozebraný. Až poskládám do finálu, budu ještě laborovat. Dostal jsem tip na inicializaci na 128 x 32, odbýt počáteční výpisy v horních dvou řádkách a pak inicializovat na 128 x 64 na finální běh. Mělo by to alokovat menší RAMku, akorát si nejsem jistej, jestli ve spodní části displeje nebude při Clear rozsypanej čaj. Ale možná to stejně nepomůže, všechno směřuje spíš na chybu v knihovně.
Jirka

Proč mi nemůže všechno chodit hned ?!!

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#23 Příspěvek od Celeron »

Tak jsem dotáhnul řízení generátoru do finální podoby. Bohužel, ten startovací výpis není možný vůbec použít, stále se to na něm kouše.
A taky jsem narazil na další záhadnou věc. Chtěl jsem posílat na sériovou linku po zapnutí a změně kmitočtu generátoru hodnotu kmitočtu pro kompenzaci kmitočtový charakteristiky externího atenuátoru. A zase jsem narazil, stačí dát do jakýhoholiv místa void Setup inicializaci sériový linky Serial.begin(9600); a do tý doby chodící řízení generátoru vůbec nenaběhne.
Když zkusím použít Software.serial, tak je to stejný.
Fleška obsazená 26140 byte, RAMka 719 byte. Asi je opravdu problém s tou "hromadou" a stackem. :roll:

Zkusím to přepsat na jinou knihovnu pro OLED SH110X.
Jirka

Proč mi nemůže všechno chodit hned ?!!

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#24 Příspěvek od Celeron »

Na U8GLIB jsem se vykašlal, nenašel jsem od ní nějakej kvalitní popis příkazů.
Vzal jsem Arduino Every, zkontroloval kompatibilitu pinů a zkusil jsem FW přeložit do Every. Pinově to je hodně podobný ale kolem přerušení je všecko jinak. Už jsem to jednou zkoušel a nevím proč mi Every vůbec nešlo, ani blbej Blink.
Nastavení přerušení od pinů 2 a 3 od Pro Mini:

Kód: Vybrat vše

 
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
nepoužitelný, nic z toho Every nezná. Ono je totiž přerušení u Every mnohem složitější, už jen stejný nastavení pro piny 2 a 3:

Kód: Vybrat vše

#define PA0_INTERRUPT PORTA.INTFLAGS & PIN0_bm
#define PA0_CLEAR_INTERRUPT_FLAG PORTA.INTFLAGS &= PIN0_bm
#define PF5_INTERRUPT PORTF.INTFLAGS & PIN5_bm
#define PF5_CLEAR_INTERRUPT_FLAG PORTF.INTFLAGS &= PIN5_bm

  PORTA.PIN0CTRL |= PORT_PULLUPEN_bm | PORT_ISC_BOTHEDGES_gc;
  PORTF.PIN5CTRL |= PORT_PULLUPEN_bm | PORT_ISC_BOTHEDGES_gc;
No a vlastní obsluha přerušení je docela monstrum, asi tak 10 x víc řádků než pro ProMini.

Kód: Vybrat vše

// přerušení od encodéru z knihovny Rotary.h

ISR(PORTA_PORT_vect) {
  char result = r.process();

  if (PA0_INTERRUPT)
    PA0_CLEAR_INTERRUPT_FLAG;

  if (result)  
    rotary_iresult = result;
  if (result == DIR_CW) set_frequency(-1);
  else if (result == DIR_CCW) set_frequency(1);
}

ISR(PORTF_PORT_vect) {
  char result = r.process();

  if (PF5_INTERRUPT)
    PF5_CLEAR_INTERRUPT_FLAG;

  if (result) 
    rotary_iresult = result;

  if (result == DIR_CW) set_frequency(-1);
  else if (result == DIR_CCW) set_frequency(1);
}
Teda přiznám, že kdybych nenašel inspiraci na netu, tak to určitě nedám.
Výsledek je, že chodí vše, co se na ProMini hryzalo včetně software.serial. Vnitřní Uart použít nemůžu, je připojenej natvrdo na USB převodník Onboard Atmel mEDBG programátoru.
Uff, to byla pěkně pro sraná půlka dnešního odpoledne. :roll:

edit: Kurňa, tak tudy cesta asi taky nevede. Ani HW ani SW sériová linka nechodí tak, jak by měly. Asi zase nějaký kolize v tom monstrózním přerušení. Asi to bude chtít nějakou jednodušší obsluhu n-codéru a začít třeba od výpisu výstupních stavů n-codéru na sériový monitor. :roll:
Naposledy upravil(a) Celeron dne 23 kvě 2023, 19:31, celkem upraveno 1 x.
Jirka

Proč mi nemůže všechno chodit hned ?!!

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#25 Příspěvek od Celeron »

Jelikož nechodila ani jedna sériová linka, nejspíš kvůli monstrózní obsluze přerušení napsal jsem si svoje čtení n-codéru s jednoduchým načítáním přes

Kód: Vybrat vše

 attachInterrupt(digitalPinToInterrupt(2), updateEncoder, CHANGE);
Načítání encodéru mi maká bez kiksů na obě strany, SI5351 generátor na to reaguje správně, vysílání hodnoty kmitočtu na Serial print jde taky.
Chtěl jsem tam dodělat ještě nějaký drobnosti ale narazil jsem na nečekanej problém. Pokud je dýlka programu ve flash větší než 59% 29389 byte, tak se program sice přeloží bez chyb ale Avrdude při nahrávání zahlásí chybu Fuse2 RC=-2 a nebo se rovnou vypíše " Ser_open Can´t set com state for "\\.\COM22" a zhroutí se zcela komunikace.
Pokud program zkrátím pod výše vypsanou hodnotu, tak se přeloží a nahraje dobře.
Na netu o té chybě není ani čárka.
Vůbec netuším, kde je problém. Napadá mě chyba ve flash paměti nebo něco v Arduino IDE pro Every. Takže problém s velikostí RAM u 328P vyřešen ale zase je něco kolem velikosti flash u 4809.
Nenapadá vás někoho, co s tím dělat?
Díky!
Naposledy upravil(a) Celeron dne 23 kvě 2023, 19:33, celkem upraveno 1 x.
Jirka

Proč mi nemůže všechno chodit hned ?!!

Uživatelský avatar
Cust
Příspěvky: 5553
Registrován: 17 led 2007, 01:00
Bydliště: Husinec-Řež

#26 Příspěvek od Cust »

Jestli to není rozbité?

Uživatelský avatar
Mahoney
Příspěvky: 347
Registrován: 26 říj 2019, 02:00

#27 Příspěvek od Mahoney »

{deleted}
Naposledy upravil(a) Mahoney dne 23 kvě 2023, 19:31, celkem upraveno 2 x.

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#28 Příspěvek od Celeron »

Opravdu duchaplná odpověď. :roll:
Jirka

Proč mi nemůže všechno chodit hned ?!!

Uživatelský avatar
Mahoney
Příspěvky: 347
Registrován: 26 říj 2019, 02:00

#29 Příspěvek od Mahoney »

Ach tak… Promiň, nerad jsem se tě dotknul.

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#30 Příspěvek od Celeron »

Mahoney píše:Ach tak… Promiň, nerad jsem se tě dotknul.
To nebylo na Tebe, ale na Custa. Mezi tím jsi stihnul odpovědět.

Už jsem Ti to převedl do Code. Ale ten problém je opravdu někde v IDE nebo chyba flešky nebo možná Fuse pro 4809 v AVRdude.
Usmolil jsem kopírováním jen samejma Serial printama program delší než těch cca 29600 byte a zase stejnej problém, jak je to delší, tak buď Fuse2 RC=-2 nebo se skácí COM22 při nahrávání. Jiný Every na identifikaci jestli není bouchlá flash nemám. A jestli jde nějak jinak dostat data do flash 4809 než přes USB štekr jsem zatím nikde nenašel.
Jirka

Proč mi nemůže všechno chodit hned ?!!

Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“