Fórum témák

» Több friss téma
Fórum » RP2040
Lapozás: OK   1 / 3
(#) vargham hozzászólása Feb 21, 2022 / 1
 
Az RP204 olcsó, és érdekes felépítésű ARM magos mikrokontroller.
Ami érdekessé teszi, hogy két magos, és van benne két programozható IO vezérlő, egyenként 4 állapotgéppel, shift regiszterekkel és általános célú regiszterekkel. Ezek a processzor magoktól függetlenül működnek, saját gépi kódjuk van, és DMA csatornán (is) kapcsolódnak a fő memóriához. Így nagyon gyors reakciójú, CPU interrupt latency nélkül működő, egyedi perifériákat lehetséges létrehozni.
(#) vargham hozzászólása Feb 21, 2022 /
 
(#) vargham hozzászólása Feb 21, 2022 /
 
(#) sdrlab válasza vargham hozzászólására (») Júl 8, 2022 / 1
 
Én most ismerkedek vele. Vannak érdekes tulajdonságai..., pl a fent említett PIO modulok..., és hogy a DMA-ja órajelen képes dolgozni(nem a 4-ével, mint sok más)
Viszont, számomra érthetetlen, hogy egy modern mikrovezérlőből, hogyan lehet kihagyni a flasht?!! Hiszen azon túl, hogy így kényelmetlen használni(+1 IC), még ráadásul a kódvédelmet is elfelejthetjük! Nem is csoda, hogy eddig nem láttam egy kereskedelmi terméket sem ezzel a csodával....
(#) cua hozzászólása Júl 9, 2022 /
 
Egy ideje itt lapul a fiokban, de meg nem volt szuksegem ekkora teljesitmenyre
Lassan elokerul, mar csak az erdekessege miatt is.
(#) Lucifer válasza sdrlab hozzászólására (») Júl 9, 2022 / 1
 
Idézet:
„Viszont, számomra érthetetlen, hogy egy modern mikrovezérlőből, hogyan lehet kihagyni a flasht?!!”


Jelentősen egyszerűsítette a gyártástechnológiát ami a mai fab elérhetőségek mellett nagyon nyomós érv lehetett...
(#) Josi777 válasza vargham hozzászólására (») Júl 9, 2022 /
 
Ha jól értettem meg a felépítését, akkor ebben nincs olyan lehetőség, hogy egyszerre egy byte tartalmát kiírjam 8 kimenetre. Csak shift regiszteren keresztül tehetem meg, ami pl. egy Arduino 16 MHz-es procijával közel azonos sebességgel hajtódik végre.
(#) benjami válasza Josi777 hozzászólására (») Júl 9, 2022 / 1
 
Már miért ne lenne erre lehetőség? A GPIO_OUT regiszterbe írva egyszerre 32 kimentet tudsz írni (illetve annyit nem, mert nincs annyi lába a chipnek). De ha párhuzamos buszt akarsz csinálni a 2 PIO segédprocesszor valamelyikét használva a vezérlőjeleket is el tudod intézni a főprocesszor(ok)-tól független módon.
(#) rolandgw válasza Josi777 hozzászólására (») Júl 9, 2022 /
 
Egy példa:
Bővebben: Link
(#) Josi777 válasza rolandgw hozzászólására (») Júl 9, 2022 /
 
A link is azt mutatja, hogy a state machine-on keresztül hogyan lehet a kivezetéseket írni, olvasni, de ez nem igazi párhuzamos port kezelés, hanem csak annak a megvalósítása shift regiszteren keresztül. Úgy meg hiába a 133MHz, a port írás legjobb esetben 8 bitnél csak 16,626 MHz-es lesz.
(#) Josi777 válasza benjami hozzászólására (») Júl 9, 2022 /
 
Mutasd, hogyan, mert a GPIO_OUT is shifteli bitenként a megfelelő kivezetésekre a változó értékét, nem pedig közvetlenül írja ki.
A hozzászólás módosítva: Júl 9, 2022
(#) benjami válasza Josi777 hozzászólására (») Júl 9, 2022 /
 
Csináltam egy példakódot:
  1. uint32_t t = 0;
  2.  
  3.   gpio_init(0);
  4.   gpio_set_dir(0, GPIO_OUT);
  5.   gpio_init(1);
  6.   gpio_set_dir(1, GPIO_OUT);
  7.   gpio_init(2);
  8.   gpio_set_dir(2, GPIO_OUT);
  9.   gpio_init(3);
  10.   gpio_set_dir(3, GPIO_OUT);
  11.   gpio_init(4);
  12.   gpio_set_dir(4, GPIO_OUT);
  13.   gpio_init(5);
  14.   gpio_set_dir(5, GPIO_OUT);
  15.   gpio_init(6);
  16.   gpio_set_dir(6, GPIO_OUT);
  17.   gpio_init(7);
  18.   gpio_set_dir(7, GPIO_OUT);
  19.  
  20.   gpio_init(8);
  21.   gpio_set_dir(8, GPIO_OUT);
  22.   gpio_init(9);
  23.   gpio_set_dir(9, GPIO_OUT);
  24.   gpio_init(10);
  25.   gpio_set_dir(10, GPIO_OUT);
  26.   gpio_init(11);
  27.   gpio_set_dir(11, GPIO_OUT);
  28.   gpio_init(12);
  29.   gpio_set_dir(12, GPIO_OUT);
  30.   gpio_init(13);
  31.   gpio_set_dir(13, GPIO_OUT);
  32.   gpio_init(14);
  33.   gpio_set_dir(14, GPIO_OUT);
  34.   gpio_init(15);
  35.   gpio_set_dir(15, GPIO_OUT);
  36.  
  37.   while(1)
  38.   {
  39.     sio_hw->gpio_out = t;
  40.     t++;
  41.     sio_hw->gpio_out = t;
  42.     t++;
  43.     sio_hw->gpio_out = t;
  44.     t++;
  45.     sio_hw->gpio_out = t;
  46.     t++;
  47.     sio_hw->gpio_out = t;
  48.     t++;
  49.     sio_hw->gpio_out = t;
  50.     t++;
  51.     sio_hw->gpio_out = t;
  52.     t++;
  53.     sio_hw->gpio_out = t;
  54.     t++;
  55.  
  56.     sio_hw->gpio_out = t;
  57.     t++;
  58.     sio_hw->gpio_out = t;
  59.     t++;
  60.     sio_hw->gpio_out = t;
  61.     t++;
  62.     sio_hw->gpio_out = t;
  63.     t++;
  64.     sio_hw->gpio_out = t;
  65.     t++;
  66.     sio_hw->gpio_out = t;
  67.     t++;
  68.     sio_hw->gpio_out = t;
  69.     t++;
  70.     sio_hw->gpio_out = t;
  71.     t++;
  72.   }

Az egy jó kérdés, hogy a platformio milyen proci órajelet állít be, de a logikai analizátorommal a 3. lábon 3.4MHz-et mértem. Ez azt jelenti, hogy a 2. lábon ennek a duplája, az 1. lábon a 4-szerese, a 0. lábon a 8-szorosa van. Ez 27.2MHz. Mivel egy négyszöghullámhoz 2x kell a láb írását elvégezni, ez azt jelenti, hogy 54.4Mhz sebességgel tudja írni a kimeneti lábakat. A végtelen ciklusba azért tettem bele ilyen sokszor az írást, hogy a ciklus ugró utasítása minél kevesebbet lassítson. Mivel ez mind a 16 kimeneti lábat írja, elég valószínűtlen, hogy lábanként írná.
(#) sdrlab válasza Lucifer hozzászólására (») Júl 10, 2022 /
 
És mit nyertek volna ezzel? Flash nélkül használhatatlan kavics az egész, tehát kell mellé mindenképpen! És ez így mitől lenne jobb, olcsóbb, vagy valami, ha együttesen drágábbra jön ki, mint egybeépítve?!! A kódvédelmet meg sem említve itt...
(#) sdrlab válasza Josi777 hozzászólására (») Júl 10, 2022 /
 
De, kódból simán írhatod 1 utasítással mind a 30 lábat ráadásul....
A probléma a DMA használatával jelentkezik. Na itt nem lehet ezt megvalósítani normál módon, csak a PIO modulon keresztül..., ha írtál megfelelő kódot hozzá(PIO asm)!
(#) Josi777 válasza benjami hozzászólására (») Júl 10, 2022 /
 
Az az eltérés, hogy a Pico-nál kizárólag egyesével tudod csak a portokat írni, nincs olyan lehetőség, hogy egy órajel alatt kikerül egy byte a kimenet 8 kivezetésére. Így viszont egy 8 bites adat kiírása közel annyi idő, mintha egy Arduinonak egyetlen utasítással való 1 byte kiírása a portra. Pico-nál nem az a lényeg, hogy 1 kivezetést milyen gyorsan képes billegtetni, hanem hogy 8-at mennyi idő alatt. És mivel nem képes egyszerre, csak külön, külön, így 8-szor lassabb lesz, mintha egyszerre írná mind a 8 bitet.
(#) Josi777 válasza sdrlab hozzászólására (») Júl 10, 2022 /
 
De sebességben semmivel sem vagyok előrébb, mert nem az a kérdés, hogy hány utasítással írom, hanem az, hogy egyszerre 8 bitet milyen sebességgel lehet kiírni a kimenetekre. És ez a Pico-nál 8-szor lassabb, mint az Arduinonál, mivel egyesével írja a biteket, nem pedig egyszerre egy byte-ot. Végig ez volt a kérdés, nem pedig az utasítások száma.
(#) cua válasza Josi777 hozzászólására (») Júl 10, 2022 /
 
En abszolut kezdo vagyok pico teren, es remelem abszolut felreertelek
En (tobbek kozt) azert is vettem egy pico-t, hogy nagy sebesseggel tudjak 8/16 bitnyi portot kapcsolgatni/olvasni.
Amit te irsz az alapjan a pico nem tud (mondjuk) 16 bitet kikuldeni egyetlen orajel alatt?
Tehat az elso es utolso port ki/bekapcsolasa kozott elszalad (legalabb) 16 orajel?
A hozzászólás módosítva: Júl 10, 2022
(#) rolandgw válasza Josi777 hozzászólására (») Júl 10, 2022 /
 
Kezdő vagyok pythonban, de én úgy látom a kódból, hogy egy utasításra kiírja.
A tévedés jogát fenntartom
Bővebben: Link
(#) benjami válasza Josi777 hozzászólására (») Júl 10, 2022 /
 
Te megnézted a fenti kódot? Kipróbáltad? Megmérted? Miből gondolod, hogy a fenti példában a 16 láb nem egy órajel alatt íródik ki?
(#) sdrlab válasza Josi777 hozzászólására (») Júl 10, 2022 /
 
Értem, hogy mit mondasz, csak azt nem, hogy honnan veszed ezt?!! A port biteket lehet egyesével is írni, vagy egy utasítással egyben a 30 fizikai port bitet!
A "SIO: GPIO_OUT Register" pont ezt csinálja. Egyszerre írja mind a 30(!) kimenetet...
(#) Josi777 válasza rolandgw hozzászólására (») Júl 10, 2022 /
 
Az első felvetésnél azzal kezdtem, hogy ha jól értelmezem ..., tehát a lehetőséget szeretném tisztázni, hogy ha lehet, akkor hogyan. Az eddig felmerült lehetőségek egyike sem alkalmas rá és a te általad linkelt példaprogram sem egyetlen órajel alatt kezel több kimenetet, mivel az is a state machine-t használja a portok kezelésére és habár az egyetlen utasítás, de valójában egy FIFO-n keresztül van kapcsolat, amiben pedig shiftelődik az adat. A micropyton utasítások is a state machine-t használják, más megoldást nem találtam, de lehet, hogy elkerülte a figyelmemet. A tévedés jogát én sem zárom ki.
(#) Josi777 válasza cua hozzászólására (») Júl 10, 2022 /
 
Nem szeretnélek félrevezetni, de nekem úgy tűnik, hogy az eddigi összes megoldás egyszerre több a port kezelésére mind a state machine-al van megvalósítva, én legalábbis nem találtam más példát. Az viszont shifteli az adatot a portbitekre. Így viszont nem egy órajel alatt történik fizikailag a kiírás vagy olvasás. De lehet, csak én értelmezem rosszul, és ha így van, akkor szeretnék látni egy olyan példaprogramot, ahol egy olyan byte tartalma kiíródik 8 kivezetésre, melynek az értéke folyamatosan 1-el nő. Így a maximálisan elérhető frekvencia a 0. bithez tartozó kimeneten mérhető, míg a többin rendre ezeknek a fele.
(#) Josi777 válasza sdrlab hozzászólására (») Júl 10, 2022 /
 
Én nem akadékoskodok, hanem tisztázni szeretném a párhuzamos port kezelést. Sajnálom, hogy indulatos lettél, talán majd máskor folytathatjuk.
(#) sdrlab válasza Josi777 hozzászólására (») Júl 10, 2022 /
 
Én sem annak vettem! De feltettem egy kérdést, hogy honnan vetted azt, hogy nem lehet egyszerre írni a kimeneti portokat?! Erre azért várnám az utalást... Ha ilyen makacsul ragaszkodsz ehhez az állításodhoz, csak van valami alapja, azt gondolnám...

Ami számomra nem egyértelmű, az a PIO modulokon keresztül történő vezérlés... De a PIO asm utasításai szintén tudják az összes portbitet írni/olvasni egyszerre, és olvastam olyan véleményt, miszerint ezen keresztül is lehet 1 órajel - 1 kiírás sebességet elérni!
A hozzászólás módosítva: Júl 10, 2022
(#) Josi777 válasza benjami hozzászólására (») Júl 10, 2022 /
 
Természetesen azonnal ki szerettem volna próbálni, de az a kellemetlen helyzet állt elő, hogy sem tegnap, sem pedig ma az istennek sem találom a Pico-kat, pedig 3-at is vettem. Hétfőn veszek még és ahogy tudom, kipróbálom. Addig is köszönöm a segítségedet. Arduino IDE alatt programozok, és az init utasításokat nem ismeri, viszont ha azokat kivettem, akkor lefordult a program.
(#) rolandgw válasza Josi777 hozzászólására (») Júl 10, 2022 /
 
Ez az emulátor biztos sokat segítene a megértésben, még küzdök a fordítással Linuxon.
Bővebben: Link
(#) rolandgw válasza rolandgw hozzászólására (») Júl 10, 2022 /
 
Működőképes
(#) Josi777 válasza benjami hozzászólására (») Júl 11, 2022 /
 
Köszi a ráfordított idődet, de sajnos egyetlen egy kimeneten sem jelenik meg semmi. Arduino IDE alatt próbáltam, ahol a gpio_init()-et nem is ismeri, hibát ad rá. Ha azokat kiveszem, akkor lefordul. Ha a programot kiegészítem egy port írással
  1. digitalWrite(16,HIGH);
  2. digitalWrite(16,LOW);
Akkor 775 kHz-es freki mérhető a 16-os kivezetésen. Ha csak ez a két utasítás van a loop-ban akkor 884,9 kHz mérhető. Ez semmiképp nem nevezhető közvetlen port kezelésnek.
Csak úgy kipróbáltam ugyanezt a kódot egy Arduino Nano-n és ott 147,3 kHz-et mértem.
Az órajelükben 8-szoros a különbség, míg a kimeneten mérhető frekvencia különbség 6-szoros.
(#) sdrlab válasza Josi777 hozzászólására (») Júl 11, 2022 1 / 1
 
Most komolyan...nem akarlak bántani, de Arduinos könyvtár bohóckodással szeretnéd lemérni a hardver sebességét?!! Ennél perverzebb dolgot el sem tudnék képzelni...

Legalább valami ilyesmivel próbálkozz:

sio_hw->gpio_oe = 0xFFFF;
sio_hw->gpio_out = 0x05555;
sio_hw->gpio_togl = 0xFFFF;

Ez arduino alatt is fordul. És közvetlen regiszterek elérése van itt...nem holmi könyvtárak elcsépelt tartalmát hívogatod meg....
(#) Josi777 válasza sdrlab hozzászólására (») Júl 11, 2022 /
 
Szépen kértelek, hogy normálisan beszélj, én is így teszek!
Most újra meg szeretnélek kérni, hogy ne ebben a stílusban kommunikálj velem, mert ez számomra nem elfogadható! Köszönöm!
Következő: »»   1 / 3
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem