Fórum témák
» Több friss téma |
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.
É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....
Egy ideje itt lapul a fiokban, de meg nem volt szuksegem ekkora teljesitmenyre
Lassan elokerul, mar csak az erdekessege miatt is. 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...
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.
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.
Egy példa:
Bővebben: Link
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.
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
Csináltam egy példakódot:
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á.
É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...
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)!
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.
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.
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
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
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?
É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...
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.
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.
É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.
É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
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.
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
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
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.
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....
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! |
Bejelentkezés
Hirdetés |