Fórum témák
» Több friss téma |
Már megint itt vagyok tanácsot kérni!
Soros terminálon próbálom az RTC-t beállítani. Úgy hogy sorba lépkedek minden értéken, és közben +,- 1-el változtatom az értékeket. Működne is egészen a másodpercek belövéséig, de azt elég nehéz ezzel a módszerrel eltalálni! Itt a rutin:
Hogyan lehetne ezt másképpen megoldani? És a szenvedés eredménye:
Persze a végére mégsem lett pontos a másodpercek értéke
Nem lenne egyszerubb ugy megcsinalni, hogy egeszben kell neki beadni a datuomot/idot. Azt pedig az sscanf fuggvennyel szepen szet lehet szedni: egy parancsban valahogy megkapja a pontos idot: "2016.12.29 19:23:00", a sscanf meg kiszedi belole a szamokat a megfelelo valtozokba:
de cifrazhatod is:
Az ’sscanf’ eddig csak hallomásból ismertem.
De tetszik a 2. megoldásod. Ezért most megtanulom használni! Köszönöm a részletes tippet!
Egy kérdésem lenne pointerrekkel kapcsolatban.
Az STM32-ben 4 bájtos a pointer, ami az esetek zömében RAM-ba mutat. A RAM 20k-s maxon, ami simán elférne 2 bájton, de 4 bájtos pointereket hoz a fordító létre. Amikor malloc-kal bonyolultabb struktúrákat hozok létre, a memóriahasználat durván ugrásnak indul. - egy malloc(1) 12 bájt-ot foglal le (8 bájt belső+4 bájt adat) - ha ebbe két pointert belerakok 8+8 byte - ha még egy enumot is, akkor 8+12 bájt, mert 4 bájtra igazít a malloc - így jön ki az, hogy egy kétirányú uint8_t láncolt lista elemenként 20 bájtot foglal le a memóriában. A kérdés, hogy lehetséges-e a pointert 2 bájton tárolni, ha már úgyis a RAM-ba mutat (near pointer)? Eléggé elszáll a memóriahasználat pointerrel és malloc-kal. A hozzászólás módosítva: Dec 31, 2016
A malloc() nem kifejezetten mikrokontrollerre valo dolog. Ha sokat malloc()/free()-zel, akkor feldarabolodhat a memoriad, amitol egy ido utan mar nem tudsz nagyobb darabokat allokalni. Ha nincs free(), akkor nyilvan sokkal egyszerubb a helyzet. Szerintem igazi pointer nem lesz ARM-en 16 bites, viszont te csinalhatsz magadnak, de az mar inkabb index lesz, vagy offset. Ha keves a RAM, akkor ez a jo megoldas. Lefoglalsz egy kelloen nagy darabot (akar malloc()-cal, akkor static char pool[12000]; modon), es azon belul mar csak offset-ekkel dolgozol.
Leírom a kontextust is: SPI LCD, 16 bites színmélység, 160x128-as felbontás.
A DMA nagyon kényelmes dolog, viszont roppant sok memóriát igényel. Ha ki akarom írni, hogy "Hello" a képernyőre 6x10-es jelkészlettel, akkor 6x10x5x2 bájt memóriára van szükségem (ez 600 bájt). Ha megvan a 600 bájt memória, ráeresztem a DMA-t, az pillanatok alatt ledarálja az egészet. A rendszer úgy megy, hogy egy sorba rakom std::list-tel a grafikai rutinokat (rajzolj keretet, töltsd ki, írd bele a szöveget (LCD gomb)), amikor a DMA csatorna szabad, akkor kibontja a színeket és beletolja a DMA csatornába. A kitöltés egyszerű, mert nem növeled a 16 bites SPI memória pozícióját automatikusan, mindig ugyanazt a színt küldöd ki. A kép/szöveg feltöltése már bonyolultabb. A lényeg, hogy a grafikus elemeket kicsiben tárolom a memóriában ("Hello"), amit kibontok színekre és beletolom a DMA-ba. A "kis memória" jelenleg 100-200 bájt körül van, ami nem árulkodik optimális működésről. A hozzászólás módosítva: Dec 31, 2016
Én úgy oldottam meg, hogy karakterenként rajzolom ki a szövegeket. A nagyobbik betűtípusom pl. 21x24-es. Egy olyan buffert használok, ami legalább kétszer akkora, mint a legnagyobb grafikai elem (karakter). Ezután megrajzolom az első karaktert a buffer "alsó" felébe, elindítom a kiküldését dma-val, elkezdem megrajzolni a második karaktert a buffer "felső" felébe, amikor kész megnézem végzett-e a dma, megvárom ha még nem, majd mehet a következő karakter az alsó félbe. Ugyanazt a buffert használja az összes grafikai utasítás, mind a cpu mind az spi elég optimálisan dolgozik így.
Sziasztok!
Azoktól kérdeznék, akik Embitz IDE-t használnak. Új projektet tudtok debugolni? A régiek debugolása megy (register watch ablak működik), de az újaké nem. Úgy látom, hogy az Embitz fejlesztője dobott a felhasználóknak egy csavart labdát, és az SVD file-ok letöltése és használata csak akkor megy, ha regisztrált tag vagy, ami évi 50 dollár. Boldog Új Évet!
És úgy nem megy, ha manuálisan adod meg neki az SVD fájlt?
(Én még nem próbáltam az új verziót.)
Hozzá lehet adni manuálisan is az SVD fájlt a debug/interfaces menüpont alatt. Utána pedig a debug/debugging windows alatt kiválasztható a System registers, hogy látszódjanak is.
Pénzt egyedül az internetes funkciók használatáért kér a srác (mint például az általa fenntartott SVD adatbázis). Vmiből fent kell tartania a projektet.
Tényleg hozzá tudom adni az SVD filet a debug/interfaces menüpontban, a debug/plugins menüpontban, ahol eddig tettem, ott nem ment. (Miért van egy funkcióra két menüpont?)
Van lehetőség valahonnan SVD file-okat letölteni ingyen? Mert nem tudok új kontrollert debugolni SVD file nélkül.
pl.: https://github.com/posborne/cmsis-svd/tree/master/data
múltkor innen töltöttem le egy csomót, de mintha most nem menne: http://ds.arm.com/media/resources/db/chip/
Innen pedig letöltheted a saját STMicro és Atmel SVD gyűjteményemet. Letöltés. Ez a link elévül pár napon/letöltésen belül.
Köszönöm.
Egy gugli kereséssel nem találtam semmi használhatót, de így újra van remény .
A Keil letölti magának az swd fájlokat, akár a demo verzióból is ki tudod nyerni (mint alternatíva).
Csatoltam egy képet azoknak, akik szeretik a vicces dolgokat.
Hány különbséget látsz a képen? A hozzászólás módosítva: Jan 2, 2017
Szia,
Az STM kínai koppintás valami MEGA izé. A belseje teljesen ugyan az csak mást lézereztek rá.(és overclock-olható) Azért lehet a Mega logó rajta. Van a neten egy terjedelmes leírás(ha nagyon akarod előkeresem) A hozzászólás módosítva: Jan 2, 2017
Nem találtál meg minden különbséget.
Figyeld meg, hogy teljesen más a lábkiosztása a két terméknek. A hozzászólás módosítva: Jan 2, 2017
Volt időm javítani az ADC órajelet (36MHz volt).
Visszavettem a rendszer órajelét 56MHz-re, az ADC órajelét 4-gyel osztom, így kijön a 14MHz. Érezhetően stabilabb a végeredmény. Köszi.
Lenne még egy kérdésem ADC-vel kapcsolatban. A fast interleaved mód azt jelenti, hogy az ADC1 és az ADC2 átlapolással mér. Amikor ADC1 félúton jár, ADC2 elkezd mérni, így dupla konverziós sebességet lehet elérni.
Vettem egy joysticket a teszt kedvéért, középállásban. - ADC1 1980-at mért - ADC2 1994-et mért Láthatóan mást mér az ADC1 és az ADC2 ugyanarról a lábról. Kalibrálva voltak az ADC-k, de kalibrálás nélkül sem jobb a helyzet. Van tapasztalatotok a témában? A hozzászólás módosítva: Jan 5, 2017
Megnézve a hiba elsősorban offset-ből áll, tehát az ADC1/2 200-nál és 4000-nél egyformán 12 körüli eltérést mutatott. A nullát mindenütt jól mérte, utána offsetje volt.
Mekkora a mintavételezési időd? Ha nagyobb mint 13,5 ciklus, akkor meg kéne próbálnod csökkenteni (slow mode!, max 7,5 ciklus fast módnál). Lehet, hogy bizonyos ideig egyszerre mintavételezik a csatornát és bezavarják egymást. Ez megmagyarázná azt is miért az ADC1 értéke a kisebb.
A hozzászólás módosítva: Jan 5, 2017
Külön-külön is ugyanennyi az offset. Akkor is, amikor be sem kapcsolom ADC1-et, vagy ADC2-t.
41.5 és 239.5 mintavételezési időkkel próbáltam. Megpróbálhatom 7.5 és 13.5-tel is...
41,5 és 239,5-el nem használhatod az interleaving módot (értelme se nagyon van).
Egy ADC mérés ugyanis 12,5 + mintavételezési idő (ciklusban) ciklusig tart. Ebből adódik, hogy csak addig szabad mintavételezni a csatornát, amíg a másik csatorna a konverzióval van elfoglalva (12,5 ciklus). Ha alapból is ekkora az ADC offset az nem jelent jót. Majd megnézem otthon saját áramkörön, hogy én mit mérek (még mindig STM32F103-asról van szó, ugye?). A legutóbbi projektemben dual adc-t használtam én is, de külön csatornákra (4db 2+2 kiosztásban).
Nem interleaving módban mértem egyelőre. Egyszer az egyiket, máskor a másikat. Az interleaving még függőben van, nem járok ott a programmal.
STM32F103 Annyit még kipróbálok, hogy Arduino alatt megnézem, hogy mit mér. Könnyen lehet, hogy félrekonfigurálok valamit.
Arduino? Vmi ilyesmiről van szó?
Igen, azért Arduinora gondoltam, mert ott elvileg készen van minden. Bár nem biztos, hogy az ADC1, ADC2 menni fog Arduinoval.
A lényeg, hogy ha a programomban lenne a hiba, akkor azonnal látszana, hogy Arduino-val megy-e, vagy sem. Más keretrendszer, beállít nekem mindent előre rendesen. Egyébként C++-ban programozom a panelt, az Arduino csak egy teszt erejéig kellene. A hozzászólás módosítva: Jan 5, 2017
Sikerült elérni, hogy a 2 ADC külön-külön ugyanazt méri.
Azt csináltam eredetileg, hogy ha mértem valamit, ADC_DeInit, ADC beállít, ADC_Init, ADC_ENABLE, ADC indítása szoftveresen, megvárom, míg befejeződik. Úgy tűnik, hogy a rendszer nem szereti, ha az ADC_DeInit-et minden mérés előtt meghívom. Meghívtam egyszer, utána folyamatosan konvertálok és mindkét ADC 2044-et mért 1980 és 1994 helyett. Ez rajtam egyelőre nem segít, mert a mintavételezési frekvenciát, csatornákat,... menet közben nekem néha cserélni kellene...
Közben én is pont befejeztem a mérésemet. Tök ugyanaz lett.
Miért kell csatornákat / frekvenciákat cserélned? De ha tényleg kell, szerintem elég egy ADC_Cmd disable, majd csatornakonfig, és újra enable. |
Bejelentkezés
Hirdetés |