Fórum témák
» Több friss téma |
Szia!
Köszi. Igen, azt bűvölöm továbbra is Viszont ezt a modult használom, amiben van felhúzó ellenállás is. Namost én is raktam az SDA és SCL vonalakra 4,7kOhm-os ellenállást. Meg jön még rá más modul is, aminek valószínűleg szintén van saját felhúzó ellenállása. Okozni fog-e ilyen sok felhúzóellenállás problémát? Vagy a modulokról vegyem inkább le őket?
Hát azért ésszel kell használni őket. Ha az effektív ellenállás 1k5 alá csökken akkor szedjél le belőlük. Mint oly sok minden, ez is kompromisszumokkal működik. A nagyobb ellenállás kisebb fogyasztást jelent viszont cserébe lassabb busz sebesség használható csak. A kisebb ellenállás lehetővé teszi a nagyobb sebesség használatát, de károsíthatja az eszközöket ha az áram már túl nagy.
Szia, köszi, meglesz.
Továbbra is maradnék a STM32-nél, de más jellegű probléma. Van 3 gombom a B12,B13,B14 porton és egy RTC másodpercenkénti megszakítása a B15-ön. Azt szeretném, hogy ha valamelyik gombot megnyomom(akkor ugye meghívódik a hozzá tartozó megszakítás,ezt jelzem a főprogramnak, ahol ha érzékelte a gombnyomást,akkor vár 20ms-t(systickel késleltetve), majd újra ellenőrzi a gomb lenyomott állapotát, ha le van nyomva, akkor hajtja végre az gombhoz tartozó utasítást. Namost gombnyomáskor le kellene tiltani a B15-ön beérkező megszakításokat. De csak ott! Hogyan?
Ez így jó vagy van egyszerűbb módja is? Mert ugye ezzel konfigolom is a B15-t, csak ott ENABLE van.
Direkt regiszter piszkálással egyszerűbb (a low layernek is van elegánsabb utasítása).
Csinálhatod mondjuk így is:
Ahha, viszont ez csak "negál", tehát ha engedélyezve volt, akkor tiltva lesz, ha tiltva volt, akkor engedélyezve lesz. Jól gondolom?
Mert ha igen, akkor ha két függvényt létrehozok, hogy EXTI15_Disable és EXTI15_Enable és belerakom amit az előző hozzászólásban írtam, az úgy kevesebb sor és jobban olvasható.
Háááááááááááát, ez a C-s rövidítések &,!, stb-k nem az én világom még. Szoknom kell és tanulnom.
Amit írtál annak akkor a ! változata lesz az engedélyezés? Viszont nem szép, de
így is működik ?
Kevered a szezont a fazonnal. Az & használata a változó előtt pointerré alakítja át azt, azaz a változót cím és nem pedig érték alapján adjuk át. Ez sokkal "olcsóbb" mint a másik lehetőség, cserébe a hívott függvény beleírhat a változónkba (gyakran ez is a cél), ezért ezzel számolnunk kell.
A megoldásod működni fog, bár a mode és a trigger beállítása a tiltáskor felesleges, mivel figyelmen kívül hagyja majd azokat a függvény.
Igen, sajnos keverek még sok mindent, ez a pointeres dolog még homályos.
8-bites AVR-ektől csöppentem ide, ott is assemblyben programoztam, szóval minden újdonságként hat rám. Ezért kérdezek néha nagyon buta és egyszerű dolgokat is. Ezért bocsánatot kérek mindenkitől. Nekem ezek még nem triviálisak. Esetleg valami könyv, ahol ezeknek utána lehet nézni(magyarul ha lehetséges)? Ettől függetlenül köszi a segítséget.
Nézd át ezt:
Programozás C nyelven Ha vmiről többet szeretnél tudni, akkor keress rá a stack overflow-n, esetleg vegyél rendes papírkönyvet.
Sziasztok!
Újabb gondom támadt.STM32F103C8 Systicket használom fel a késleltetésekhez és van időszak, amikor nem használom, mert nincs olyan dolog,amit késleltetni kell. Ebben az esetben, pár másodperc eltelte után megakad a programomban a kijelzés. A program fut,mert az RTC 1Hz-en villogó lábát követi a kimenetre kötött Led. Viszont a kijelzéshez hozzá tartozik SPI-s és I2C-s kommunikáció(ami szintén megszakítást használ, mint a Systick). Ha ilyenkor megállítom a programot, a TimeTick_Decrement vagy SysTick_Handler részben áll meg. Így használom a Systicket, véleményetek szerint ez így jó, vagy csináljak valamit másképp?
A hozzászólás módosítva: Nov 3, 2017
Ez borzasztó!
1us-enként meghívsz egy megszakítást, ami utána meghív egy másik másik funkciót, ami csökkent egy változót. A procid az ideje nagy részében feleslegesen teker egy rosszul megírt időzítőrutin érdekében... Vedd figyelembe, hogy a megszakítás költséges (regiszterek mentése/visszaállítása, CPU állapot váltások stb.), a függvényhívás szintén költséges (kivéve ha a fordító okosabb nálad és inline-á teszi). Jobb megoldás lenne, ha úgy konfigurálnád fel az időzítőd, hogy bizonyos (értelmes) időközönként meghívódik (pl. 1-10ms), ezzel növelhetsz egy belső időreferencia értéket (akármit). A főprogramodban pedig ciklikusan figyelhetnéd, kell-e vmit csinálni és ha nem, akkor elküldheted aludni a CPU-t a "__WFI();" utasítással (a megszakítások majd felébresztik, ekkor újra lefuthat a ciklus). A hozzászólás módosítva: Nov 3, 2017
Igen, ez lemaradt:
Ezért usecenként systick(sorry ez lemaradt),mert van periféria,ahol a us-es késleltetés kell, a semmi kevés, a ms meg már sok és látszódik a kijelzőn, hogy megakad,bár ha átvariálom, akkor talán nem.
Delay-t megszakítás nélkül is csinálhatsz Systick-el, flag figyeléssel. Ezt a Low-layer könyvtárból vettem át NXP-re, egy az egyben, mivel a core része, csak átneveztem. A frekvenciát kell korrigálnod:
LPC_Init1msTick(30000000); NVIC_SetPriority(SysTick_IRQn,0);
Milyen perifériához kell neked us időzítés? Bitbang-elsz vmit?
Egy VDF kijelző írás parancsai között kell egy kis szünetet tartani, 10us már elegendő. Ha ms tartományba megyek előfordulhat villogás.
Megpróbálom a megszakítás nélküli delayt megoldani. Hátha megértem, hogy hogyan működik.
Sziasztok! STM32 ADC kérdésem van. Mikrokontroller: STM32F103C8.
ADC Setup:
DMA Setup:
Finish callback:
Használt változók:
Indítás a program elején:
Négy ADC csatornára feszültségosztóként van kötve négy potméter. Állásuk: min, max, max, min. Nem állítom át őket. A mérés megtörténik, rendszeres időközönként (1mp) kiírom a nyers értékeket:
Látszik, hogy időnként rossz memóriaterületre írja az adott csatornáról olvasott értéket. Mit rontok el? Köszönöm.
Én nem használok HAL-t, de alapvetően nem látok semmi problémát a kóddal.
Egy dolog viszont feltűnt és köze lehet a problémához. Minden egyes konverziócsoport végén újraindítod az ADC-t DMA-val a DMA konverzió végén. Ez teljesen felesleges. Konfiguráld a DMA-t körkörös puffer módra (circular buffer) és úgy használd. Innentől kezdve nem kell foglalkoznod az ADC-vel és a DMA-jával, a csoport konverziójának végén újra kezdi majd az elejétől. Ha szűrni szeretnéd később az adatokat, akkor hozz létre egy nagyobb puffert (8-al osztható eleműt). Használd a DMA félpuffer kész és konverzió kész megszakításokat, hogy a puffer megfelelő felét szűrhesd.
Köszönöm. Úgy tűnik, hogy a circular buffer megoldotta.
Sziasztok!
Adott az STM32f103rbt mikrovezérlős board (pár $, ebay), amin soros kommunikációt szeretnék PC-vel. A kommunikáció megy is, ám amikor megkapja a 3 db byte-ból álló parancsot, válaszként nem csak az "eredmény" jön, hanem a kérés 3 byte-ja is. Azaz pl. kérés (PC->board) #?v a válasz (board->PC) #?vABCD. A válaszban nem kellene szerepelnie a #?v szekvenciának. Találkoztatok már ilyennel? Köszönöm, Roland USART beállítása:
Szia!
Az Usart IrqHandlert is mutasd meg! Idézet: „"Amúgy van ARM-es topic "” A hozzászólás módosítva: Nov 13, 2017
Köszönöm, bocsánat, hogy nem oda tettem..
Nem lehet, hogy a programban amivel küldöd/fogadod az adatokat be van kapcsolva a küldött adatok ismétlése?
Attól függ milyen programot használsz...
Coocox 1.7.6 - erre érted?
PC-n hercules a soros "figyelő" A string végén lévő karakterek: "\n\r". És nem "\r\n". Igyanez a PC program, ezzel a szekvenciával jól ment (igaz PIC18F vezérlőn)
Szerintem:
Jobb klikk: Hercules> Recevied/Sent dat És pipa kivesz: Local Echo
természetesen nem is volt pipa.
Csak az STM32F103 board teszi ezt a jelenséget. A PIC nem. Mindkettő kommunikációs felületét én írtam, ill. PC-s (qt creator) progit is. A hercules csak tesztnél kell. Arra gondoltam, hogy az STM32 soros inicializálásában lehet vmi. Ma du. megpróbálom DMA-val is. A hozzászólás módosítva: Nov 13, 2017
Nem tudok ilyen beállítási lehetőségről az STM-nél. Ha van logikai analizátorod, akkor szerintem nézd meg tényleg jönnek-e ezek az adatok a vezetéken.
Sosem tapasztaltam a problémát az STM32F103-on. A kód hiányos, ezért nem lehet róla mit mondani.
- egy biztos: a mikrovezérlő nem küldi ki a jelet UART-on, nem ismétel - vagy a te programod küldi ki, mert összeakadnak a globális változóid - vagy áthallás van a vezetéken, amikor küldesz, az RX pin lebeg és a TX megjelenik rajta Én arra tippelek, hogy a küldő rutinod rossz, amit nem részleteztél és valahogy belepakolod az inputba az outputot is. Az RX egyébként (adatfogadás) összezavarja a TX-et a kódodba, ami okozhat kellemetlen mellékhatásokat.
A hozzászólás módosítva: Nov 13, 2017
|
Bejelentkezés
Hirdetés |