Fórum témák

» Több friss téma
Fórum » ARM - Miértek hogyanok
 
Témaindító: gtk, idő: Jún 26, 2007
Lapozás: OK   85 / 176
(#) cpt.zoltan.simon válasza csatti2 hozzászólására (») Jan 29, 2017 /
 
További érdekesség: A memory-memory copy sem működik.
Egyik helyről a másikra, 8byte-os méretben mindkét oldal együtt inkrementálva stb.
Ugyan azt csinálja. Single transfer semmi burst.
A hozzászólás módosítva: Jan 29, 2017
(#) csatti2 válasza cpt.zoltan.simon hozzászólására (») Jan 29, 2017 /
 
Ez a kód nálam tökéletesen működik (átmásolja a konstans teszt "szemetet" a cél memória területre).

  1. RCC->AHB1ENR |= (1 << 22);
  2.   DMA2_Stream7->CR &= ~(1); // EN
  3.   //                 Channel     Mburst      PBurst       Double buff Priority    PINCOS      MSize       PSize       MInc        PInc       Circular   Dir        Flow
  4.   DMA2_Stream7->CR = (4 << 25) | (0 << 23) | ( 0 << 21) | (0 << 18) | (3 << 16) | (0 << 15) | (0 << 13) | (0 << 11) | (1 << 10) | (1 << 9) | (0 << 8) | (2 << 6) | (0 << 5);
  5.   DMA2_Stream7->FCR &= ~(1 << 2); // FIFO disabled
  6.   DMA2_Stream7->NDTR = sizeof(defaultfont);
  7.   DMA2_Stream7->PAR = (uint32_t)&defaultfont;
  8.   DMA2_Stream7->M0AR = (uint32_t)&target;
  9.   DMA2_Stream7->CR |= 1; // EN


Most nézem, hogy az utolsó sorban sima egyenlőségjel van nálad "vagy" nélkül!
A hozzászólás módosítva: Jan 29, 2017
(#) cpt.zoltan.simon válasza csatti2 hozzászólására (») Jan 29, 2017 /
 
Ezt nézd mekkora barom vagyok!
(#) csatti2 válasza cpt.zoltan.simon hozzászólására (») Jan 29, 2017 /
 
Feltűnt.
(#) cpt.zoltan.simon válasza csatti2 hozzászólására (») Jan 29, 2017 /
 
Egy karakteren elúszott egy délutánom. Fáradt vagyok na. Most már jónak kell lennie. Köszönöm a segítséget!
(#) csatti2 válasza cpt.zoltan.simon hozzászólására (») Jan 29, 2017 /
 
Ezért használom én az SPL könyvtárat inicializálásra és a regisztereket csak időkritikus helyen piszkálom (bár ott is írok rá inkább inline függvényeket, hogy olvashatóbb maradjon a kód).
(#) cpt.zoltan.simon válasza csatti2 hozzászólására (») Jan 29, 2017 /
 
Nincs ezzel semmi gond, nem szoktam ekkorákat hibázni, de most 4 hónap alatt letoltam 1000 munkaórát, így egy kicsit másképp fog az agyam, ezt nem tudom egy hét alatt kipihenni.
Egyébként meg oly mindegy mit használ az ember, user-code-ban is simán el tudom így rontani, minden külső segítség nélkül teljesen egyedül!
Kijavítottam a sajátot, rögtön csinálja amit kell. Ezt szeretem ebben a szakmában, a gép sosem hülye, csak aki piszkálja.
(#) csatti2 válasza cpt.zoltan.simon hozzászólására (») Jan 29, 2017 /
 
Ahogy az angol mondja ez PEBKAC volt. // Problem exists between keyboard and chair.
Amikor nem akarjuk, hogy az operátor értse mikor szidjuk, mi a wetware-re szoktunk hivatkozni.
(#) cpt.zoltan.simon hozzászólása Jan 30, 2017 /
 
Hali okosabbak!

Megint bénázom. Illetve tegnap még ment.
van egy változóm:

double hanyados;

hanyados = 700.25; Ezt letárolja, ahogy kell.
hanyados = 700.25 / 3; Ebből egy szép hosszú kétszáz akármekkora eredmény lesz, sok tizedessel. Frankó

Ezek után:
hanyados = 4/3; Itt az eredmény EGY ahelyett hogy 1.33 lenne

Majd jön a véső, az eredeti egyenlet:
hanyados = 60 000 000 / 76800; Ennek 781.25-nek kellene lennie. Közben csak 725.

Keil, optimalizáció NULLA, lebegőpontos egység használva.

Nos?
(#) csatti2 válasza cpt.zoltan.simon hozzászólására (») Jan 30, 2017 /
 
De ezt így integer mateknak veszi ám!
hanyados = 4.0/3;
hanyados = 60 000 000.0 / 76800;
(#) cpt.zoltan.simon válasza csatti2 hozzászólására (») Jan 30, 2017 /
 
Oké, de tegnap meg nem vette annak. Ez a bajom.
A 60 000 000 az egy Clocks.APB2Freq nevű változó, a 76800 meg a USART baud-rate számolás.
És tegnap este szépen kijött az eredeti formulával a 781.25.

USARTDIV = (Clocks.APB2Freq MHz / (8* (2-OVER8) * BaudRate));

Ami csak és kizárólag egész számokat ad, mégis lebegőpontosként tolta az eredményt.
Hol lehet kényszeríteni hogy kellenek a tizedek?
(#) csatti2 válasza cpt.zoltan.simon hozzászólására (») Jan 30, 2017 /
 
Ott a példám az előző hozzászólásban!

Ha minden változód egész, akkor tisztán egész matematikát fog használni és csak a legvégén konvertálja át lebegőpontosba. Tehát vagy lebegő-pontosítod az egyik egészt vagy typecast-olod a változóid.
A hozzászólás módosítva: Jan 30, 2017
(#) cpt.zoltan.simon válasza csatti2 hozzászólására (») Jan 30, 2017 /
 
Láttam persze. Az ok, de a kérdés az, hogy létezik olyan típusmódosító ami azt mondja a fordítónak hogy ehhez a matekhoz nem nyúlsz? Vagy a Baudrate-et tegyem át float-ra?
(#) csatti2 válasza cpt.zoltan.simon hozzászólására (») Jan 30, 2017 / 1
 
USARTDIV = ((float)Clocks.APB2Freq MHz / (8.0 * (2.0-(float)OVER8) * (float)BaudRate));
Ugyan nem muszáj mindet, de így egyértelműbb mit akarsz.
Ha pedig számít a sebesség, akkor megtartod az integer matekot egész az osztásig:
USARTDIV = ((float)Clocks.APB2Freq MHz / (8 * (2-OVER8) * (uint32_t)BaudRate));
A hozzászólás módosítva: Jan 30, 2017
(#) cpt.zoltan.simon válasza csatti2 hozzászólására (») Jan 30, 2017 /
 
A Clocks.APB2Freq elé betettem hogy (double), mert az utána következő művelet ahol a 781.25 öt szét kell szednem egész és tört részre (külön műveletet kell velük végeznem) mindenképpen double típust kér, ami egyébként hosszas keresésnek hála

  1. tort = modf(USARTDIV, &egesz);
(#) csatti2 válasza cpt.zoltan.simon hozzászólására (») Jan 30, 2017 /
 
Ha jól tudom a Cortex-M4-ben single precision a lebegőpontos egység, azaz a double már nem hardveresen gyorsított.
(#) cpt.zoltan.simon válasza csatti2 hozzászólására (») Jan 30, 2017 /
 
Igen. De a math.h modf függvénye csak double-el dolgozik. Persze még faragom, de most már legalább a 781.25 az 781.25.
Másfelől ez csak az inicializációs rész és arról szól a történet hogy ne kelljen előre számolt táblázattal bajlódnom, hanem meghívom az USART init-et, beírom neki hogy hanyas USART, mennyi a BaudRate, meg hogy "PA9", "PA10". Vagy éppen amit akarok (ha hülyeséget írok akkor hisztizik természetesen, aztán jónapot. Egyébként kerülöm a double-t.
(#) csatti2 válasza cpt.zoltan.simon hozzászólására (») Jan 30, 2017 /
 
Nézz rá a modff és modfl függvényekre.
(#) benjami válasza csatti2 hozzászólására (») Jan 30, 2017 /
 
Ha nem akarsz futás közben BAUDRATE-et állítgatni, én a fordítóval számoltatnám ki az osztási arányt. Ha egész számos osztásnál (ami alapban mindig lefelé kerekít) a kerekítést jól akarod megoldani, akkor először az osztandóhoz hozzá kell adni az osztó felét és úgy elvégezni az osztást: c = a / b helyett c = (a + (b >> 1)) / b legyen.
pl:
35 / 6 = 5.83 -> lefelé kerekítve 5
(35 + 3) / 6 = 6.33 -> lefelé kerekítve ez már 6, ami közelebb van kívánatos hányadoshoz.
Mindenesetre erre használni a lebegőpontos számítást, szerintem az ágyúval verébre esete (még akkor is, ha az M4-nek ez nem akkora probléma).
(#) cpt.zoltan.simon válasza benjami hozzászólására (») Jan 30, 2017 /
 
Számoltatom vele olykor olykor, mert ha visszaveszem a frekit a felére, újra kell számolnom mindent.
Szeretek kiskapukat hagyni.
(#) benjami válasza cpt.zoltan.simon hozzászólására (») Jan 30, 2017 /
 
Ha nem akarod egészben használni a HAL függvényeit, akkor legalább lopd ki belőle a BRR beállítást.
  1. #define UART_DIV_SAMPLING16(_PCLK_, _BAUD_)     (((_PCLK_)*25U)/(4U*(_BAUD_)))
  2. #define UART_DIVMANT_SAMPLING16(_PCLK_, _BAUD_) (UART_DIV_SAMPLING16((_PCLK_), (_BAUD_))/100U)
  3. #define UART_DIVFRAQ_SAMPLING16(_PCLK_, _BAUD_) (((UART_DIV_SAMPLING16((_PCLK_), (_BAUD_)) - (UART_DIVMANT_SAMPLING16((_PCLK_), (_BAUD_)) * 100U)) * 16U + 50U) / 100U)
  4.  
  5. #define UART_BRR_SAMPLING8(_PCLK_, _BAUD_)       (((UART_DIVMANT_SAMPLING8((_PCLK_), (_BAUD_)) << 4U) + \
  6.                                                   ((UART_DIVFRAQ_SAMPLING8((_PCLK_), (_BAUD_)) & 0xF8U) << 1U)) + \
  7.                                                    (UART_DIVFRAQ_SAMPLING8((_PCLK_), (_BAUD_)) & 0x07U))

Aztán egy ilyen sor és be is van állítva a sebesség:
  1. USART1->BRR = UART_BRR_SAMPLING8(60000000U, 115200);
A hozzászólás módosítva: Jan 30, 2017
(#) csabeszq hozzászólása Feb 4, 2017 /
 
Csatoltam a szkóp legújabb változatát, breadboard alatt hellyel közzel megy.

A zajszint meglehetősen jó, elég szépen számol. Zajt fülhallgatóval mértem, amikor az LCD-t frissíti, akkor csinál zajt, viszont olyankor nem is mér semmit.

Megpróbálom összelapátolni prototípus PCB-n, ha meg működőképesnek bizonyul, csináltatok NYÁK-ot is belőle.
(#) csatti2 válasza csabeszq hozzászólására (») Feb 4, 2017 /
 
AC módot szándékosan hagytad ki? Analóg jelek vizsgálatánál nagyon hasznos.
Érdemes lenne készítened külön hardveres triggert is egy komparátor meg egy olyan programozható műveleti erősítő segítségével (ha jól emlékszem az általad használt uC-ben nincs DAC, de könnyen csinálhatsz egyet egy PWM kimenet és egy hagyományos műv. erősítővel készített alul-áteresztő sallen-key szűrővel).
A műveleti erősítőid kimenetét mindenképp szűrném legalább egy sima RC szűrővel (sallen-key jobb), hogy leszedjem a nagy frekvenciás zajokat (különben aliasing hibád lesz).
(#) rascal válasza csatti2 hozzászólására (») Feb 4, 2017 /
 
Külső triggert én is javaslom, legalább kipróbálás erejéig. Én viszont nem pwm-mel állítanám elő a feszültséget, hanem valamilyen külső DAC-al, hogy kevesebb legyen a zaj amit a készülék termel. Csak a Hestore-n nézegettem a kínálatot. A belinkelt a legolcsóbb kb. 500 Ft, talán meg is tenné ide. Ennek csak be kell írni amikor változás van, utána elvan csendben statikus állapotban. MCP4726A0T-E/CH
(#) csabeszq válasza csatti2 hozzászólására (») Feb 4, 2017 /
 
Köszi,

1. A triggerről: még csak elvileg működik -> nem próbáltam ki

Felfutó él mérése: 10% ugrást
- a körkörösen mintavételez folyamatosan
- a watchdogot beállítom az utolsó mintavétel -1% és utolsó mintavétel +10%-ra
- ha a +10%-nál jelez az analóg watchdog, akkor megvan a trigger
- ha kisebb irányba megy át, akkor átállítom a watchdog limiteket (ereszkedő jel esete)

Magyarul interruptosan oldanám meg a triggert analóg watchdoggal. Nem próbáltam ki, ez az elképzelés.

2. Kimenetszűrés az erősítőkön:

ennek utána fogok nézni, köszi
(#) csatti2 válasza csabeszq hozzászólására (») Feb 4, 2017 /
 
1, Biztos voltam benne, hogy a normál triggert vmi hasonló módon oldod majd meg. A külső trigger viszont nagyon gyakran hasznos, mert hozzá tudod kötni vmilyen az analóg jelektől független forráshoz is (pl. digitális kimenet felfutó/lefutó éle, vmilyen órajel, stb.).
2, Ez fontos, mert különben nagyon kellemetlen meglepetések érhetnek. A letörési frekvenciát pedig kb. a mintavételezési frekvenciád feléhez esetleg negyedéhez válaszd.
3, Nem írtál az AC csatolásról. Az is nagyon hasznos dolog, szerintem ne hagyd ki.
A hozzászólás módosítva: Feb 4, 2017
(#) csabeszq válasza csatti2 hozzászólására (») Feb 4, 2017 /
 
1. az ábrán van egy EXT_TRG jel, ami egy pinre van kötve egy 1k-s ellenálláson keresztül. Ezt szánnám külső trigger csatlakozásnak.

2. jó hogy mondod, mert a letörési frekvenciát kissé feljebb tettem volna. Kipróbálom felesbe, negyedesbe is.

3. AC csatolás: arra gondolsz, hogy tegyek be egy leválasztó kondenzátort AC méréshez?

Igazából elég nehéz dolgom van, mert utoljára rendes oszcilloszkópot 20 éve egyetemi laborban láttam. Van némi hiányosság a témában, ennek ellenére élvezem a tanulást. Legutóbb pofára is estem, mert a négyszögjelem túllőtt, utána jöttem rá, hogy ez így normális, az összes szkóp ezt csinálja, ehhez kell a hangolható kapacitás (kompenzáció).
(#) csatti2 válasza csabeszq hozzászólására (») Feb 4, 2017 /
 
Igen, arra gondoltam. Ez akkor jó, amikor egy DC ofszet jelre ültetett kisértékű jelet akarsz megvizsgálni.

Külső triggert lehet úgy is mint, ahogy írtad, csak akkor sokkal kevésbé flexibilis, mert a 3V3-as TTL-hez vagy akkor kötve.

Az a kis kondi be van építve a szondákba, behangolásához készíthetsz egy négyszögjel kimenetet PWM-el (gyári szkópokon is úgy szokták).
(#) csabeszq válasza csatti2 hozzászólására (») Feb 5, 2017 /
 
Az erősítő szűrése stabilizált a kimeneten. A négyszögjel még 10x-es erősítésnél sem kezd túllőni.

500 kHz-n szűrök: 10 nF + 33 ohm

Nem volt otthon 1 nF-os kapacitásom, azért lett a szűrő ilyen. Kipróbáltam 22 kohm-mal és 22 pF-dal is, de a 20 k valami hihetetlen zajt vitt a rendszerbe.

1 nF-es + 330 ohm-mal azért még ki fogom próbálni.
(#) csatti2 válasza csabeszq hozzászólására (») Feb 5, 2017 /
 
A próbapanel érzékeny. Nyákon valszeg sokkal jobb lenne az eredmény. Mondjuk az analóg bemenetnek is van szivárgó árama, illetve kapacitása ezért felesleges lemenni ennyire kicsi szűrő kondikig.
Következő: »»   85 / 176
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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