Fórum témák
» Több friss téma |
Köszi, ezt a linket!
Pont ilyesmit reméltem találni. Lesz mivel kísérleteznem a hétvégén.
Szeretnék invertált kimenetet csinálni 2 pwm csatornán. Be is állítottam a 2-3 csatornán a CH2 CH2N illetve a CH3CH3N funkciót. Akárhogy variálom a beállításokat nem hajlandó megjelenni az invertált kimenet ránéznétek a beállításaimra: CH2 CH3 adja a PWM-et de a N-es kimeneteken semmi.
A hozzászólás módosítva: Aug 21, 2016
Közben sikerült megtalálni hol volt a baj. A cubeMX természetesen nem állít be mindent hiába várjuk el tőle. Mindenhol írja a komplementer kimenetet egyéb beállításait de a legfontosabb hogy bekapcsolni valahogy elfelejti.
Utólag hozzá kellett adjak 2 sort:
Üdv.
Ebben a megszakítás függvényben mit kéne módosítanom hogy visszadja a speed értékét és a main-ben tudjam használni:
Nekem van egy nagyon halovány emlékképem, hogy megszakítás az nem adhat vissza értéket. De egyáltalán nem biztos hogy jól tudom. Egyszer mindenesetre én is próbálkoztam vele, és akkor ebben a témában hisztizett a KEIL fordítója.
Én azt csinálnám hogy a speed egy globális változó lenne, mindig olvasható. Az mérete legyen nagyobb mint az értéke lehet, és a legfelső bit legyen az "aktuális" bit. Azaz ISR-en belül 0, azaz ne olvasd az értéket mert éppen újat adok, amikor meg kilépsz a bit legyen 1, tehát aktuális, jó érték. Pl egy unsigned long 31. bitje.
Ezt nem értem. Igazából az egész dolog nem világos nekem azért mert egy másik programomban amiben ugyan még a lassabb HAL-os megszakítással veszek adott időközönként az ADC-vel mintét amit egy változóba ment és azt utána tudom használni a main-ben.
Ugyan ez itt nem működik. Ha berakom a main-be ott megy.
Másképp kéne deklarálni? Mire gondolsz?
Ha megszakításban használsz külső változót, mindenképpen volatile legyen.
Idézet: Igazából kinek is adna vissza értéket? Hiszen nem egy függvényként hívja meg a program egy ponton, hanem a HW indítja el és a végén oda tér vissza, ahol az éppen futott programot megszakította. „Nekem van egy nagyon halovány emlékképem, hogy megszakítás az nem adhat vissza értéket.”
Átírtam de nem megy.
Nem értem. Másik programban van hasonló megoldás amikor ac adc vesz mintét 990 minta után átlagol és menti az aram_dis be az eredményt amit utána ugyan úgy használok fel a main-ben akárcsak most használnám a speed-et.
A megszakításkérő függvénynek nem lehet visszatérési értéke. Egy (vagy több) volatile tulajdonságú globális változóba természetesen menthet értéke(ke)t.
Ez utóbbi nem tűnik megszakításkezelő függvénynek.
Ha valakinek van gyakorlati ötlete hogy mikén lehetne megoldani, csupa fül vagyok
Én igazán nem látom mit hol definiáltál, de ha valóban lefut a függvény akkor a biztos hogy rossz helyen definiáltad a speed változót. Alternatíva lehet az extern , ha más ötlet nincs.
A mainben is van egy adc_store nevű lokális változó, és van egy globális is. Az ISR-ből a globális látszik, a mainben pedig a lokális. Tehát a DMA vezérlőnek te a mainben definiált tömb címét adod át, de az ISR-ben a globálisan deklarált tömböt olvasod.
adc_store kétszer szerepel. Mainben és azon kívül is. Csak a külső legyen.
adc_store benn maradt nem szándégos, de vágülis az működik nem azzal van a baj. A speed nem működik a megszkításban amit feljebb osztottam meg.
Szertintem csak casting gondod van, mivel a speed short, a spped_x128buff meg long. Az a 128-cal osztás így lehet, hogy nem úgy fog viselkedni, ahogy gondolod. Érdemes lenne kierőszakolt castinggal minden tényezőnek megmondani, hogy miként kezelje a fordító. Sőt, a "7" konstans is lehet, hogy kevés, én inkább "7L"-t írnék.
Mint írtam a main-ben tökéletesen megy. Ez egy meredekség korlátozó lenne. A mainben tökéletesen fut le csak gyorsabban mert a main 2-3us alatt lefut nekem pedig az túl gyors. De lehet az lesz hogy átírom hogy tovább számoljon és hagyom a main-ben. Csak arra lettem volna kíváncsi hogy miért nem működik a megszakításban mert később lehet olyan feladat lenne amit nem tudok berakni a main-be.
Értem, akkor már csak egy hülye kérdésem lenne: biztos, hogy eljut ide a vezérlés, biztos, hogy működik az interrupt?
Működik beleraktam egy port billegtetését fut 80us-os periódussal.
Lépésenként nyomkövetni nincs mód? Talán csak kiderülne, hogy mit hova pakol és mit számol egyáltalán. A globális volatile változót kellene tudni így írni, annak jónak kellene lennie, én csak arra tudok gondolni, hogy valamilyen oknál fogva rossz adat kerül bele, és emiatt gondolod azt, hogy nem írja. Első körben a 14. sorba tennék töréspontot, ha van erre mód, és onnan vizsgálnám meg a memóriát és a hivatkozásokat, amiket használ.
Hát, pedig ennek így működnie kellene. Az biztos, hogy több programomban használtam ilyen jellegű értékátadást interruptból. Persze volt, ahol szemaforozni kellett (pl. PIC-nél a nagyobb szóhosszúságú értékek módosításánál), de alapvetően a főprogram és a megszakítási rutin is tudta mindig, hogy hol van a változó, amivel dolgoznia kell.
Ki kell debugolni, hogy itt mi történik, mert még az is lehet, hogy fordítóhiba. Annak idején pl. SDCC-ben találtam címzéshibát, amit a fordító rontott el bizonyos esetekben. Apropó, milyen fordítóról beszélünk? Én ARM-ekre Eclipse környezetet és GNU GCC-t használok. # arm-none-eabi-gcc --version arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 4.9.3 20150529 (release) [ARM/embedded-4_9-branch revision 227977] Copyright (C) 2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Na úgy néz ki meglett a baj. Egyrészről mindegyik változót ami a megszakításon belül előfordul lecseréltem volatile-ra valamint van az a sor az If-en belül hogy "speed_x128=(adc_store[4] <<7);" itt az nem tetszhetett neki hogy a longos adatba ami a speed_x128 bele akarom írni az adc_store[4] adatot felszorozva 128-al ami pedig uint32_t adatot volt. Az unit32_t t átírtam short-ra. Így most szépen meg csinálja a meredekségszabályozást amilyet épp szeretnék.
Sok még a csiszolni való a programon de egyenlőre lekopogom jól megy
Üdv! Pár bosszantó LPC tapasztalat. Hozzáteszem nekem szimpatikusabb mint az ST. Szerintem könnyebb konfigurálni, 256K-ig teljes értékű, ingyenes fejlesztőkörnyezet, jó stdlib stb. Kinéztem az M0+ -t kisebb feladatokhoz ( 11U/E6X sorozat) és ezt a fejlesztő panelt LPCopen támagtással. Kb. sehol nem kapni. Cortex M3 belépő szint (13XX) ,board még csak-csak, de például DMA nincs a prociban.Szóval ezen a téren meg sem közelíti az ST-t.
Az osszes ARM ingyenesen fejlesztheto, csak egy Linux kell hozza, ami szinten ingyenes. Mind az ST, mind az LPC-k sima mezei sorosvonalon programozhatok, nem kell draga csilli-villi programozokat venni. Persze nincs ingyenes grafikus felulet, ami helyetted megirja a start kodot, meg a periferiak felprogramozasat, mint a vindozos IDE-kben, viszont igy tudni fogod, hogy mit csinal a program, amit a FLASH-be beegetsz. Teny, hogy erteni kell hozza, el kell olvasni az adatlapot. A kisebb LPC-kben tenyleg nincs DMA, de ezt leszamitva jobbak, mint az ST-k. Nezd csak meg az ST UART-jat, TIMER-eit, es nezd meg az LPC-ben ugyanezeket. 32 bites timer nelkul egy ilyen uC eleg szegyenletes, marpedig az ST-kben nem igen vannak. A legkisebb LPC-ben is van legalabb ket 32 bites es 2 16 bites timer. A UART-janak 16 byte FIFO-ja van ki is, be is. Az SPI-je szinten rendelkezik 8 melysegu FIFO-val, akar 16 bit szeles szavakhoz is. Nem olyan rosszak azok az LPC-k.
|
Bejelentkezés
Hirdetés |