Fórum témák
» Több friss téma |
WinAVR / GCC alapszabályok: 1. Ha ISR-ben használsz globális változót, az legyen "volatile" 2. Soha ne érjen véget a main() függvény 3. UART/USART hibák 99,9% a rossz órajel miatt van 4. Kerüld el a -O0 optimalizációs beállítást minden áron 5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás 6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et Bővebben: AVR-libc FAQ
Ez igy elegge tag. Pl. ezt szoktak ilyenre hasznalni.
Hát igen ez azért eléggé nem lowcost
![]() Képfeldolgozás alatt arra gondoltam, hogy elég ha mondjuk 0,3 másodpercenként kiértékel egy képet. Mivel még ilyet nem csináétam nem tudom hogy pl. egy ARM11 elég-e erre a feladatra? pl ez: http://www.arm9board.net/sel/prddetail.aspx?id=348&pid=200
Nekem már van Pi-m, de még a fiókban van. Csak megnézés fázison esett át. Ez nagyon off...
![]()
Hat attol fugg, mit szeretnel kiertekelni. Egy jobb kepfelismero program (rendszam es auto pozicijanak erzekelese) egy kozepes Pentium 3 konfigon fut el. Az Atmel termekei kozul a SAM9-es ARM-ok viszik a linuxot. Viszi az AT32AP is, viszont ez a termekvonal megszunik, mert csak a sajat ARM-jaiknak csinalt konkurenciat.
Esetleg ha jobban erdekel az FPGA, akkor vehetsz Spartan6-os fejlesztopanelt. Egy XC6SLX45-os FPGA-ba belefer egy softcore proci (LEON3), amin fut a linux es meg szabadon marad az FPGA fele. Egy ilyen panel kb. 180 euro+tapegyseg. A hozzászólás módosítva: Szept 24, 2012
FPGA-t annyira nem szeretem, tudom gyorsabb meg rengeteg előnye van, csak egész egyszerűen nekem nem szimpatikus, illetve nincs is akkora tapasztalatom benne, hogy nyugodtan neki merjek vágni.
A szavaidból azt veszem ki, hogy az általam linkelt konfiguráció már tökéletesen elég arra a célra amire nekem szükségem van, árban is korrektebbnek tűnik. Még sosem használtam LINUX-ot futtató magot, szóval ezért is tettem fel a kérdést. De mivel tudom, jól, hogy ebben van a jövő, szeretném odahaza kisebb feladatokra is használni. Első körben egy egyszerű valamilyen szenzor parkot telepítek a szobába és annak a kiértékelt eredményeit küldeném egy webes felületre mondjuk. A lényeg hogy ezzel foglalkozzak kicsit. Későbbiekben az lenne a cél, hogy képfeldolgozásra kiértékelésre használjam.
Hát, nekem az AVR fordító csinál érdekes dolgokat.
uint8_t portbit=2; PORTB |= _BV(portbit); hivatkozást ahogy láttam 16 biten fordította. Pedig sem a PORTB sem a portbit nem 16 bites. ![]() A hozzászólás módosítva: Szept 25, 2012
Esetleg megprobalhatsz kinabol rendelni valami olcso cortex a8/9/10/11 alapu SoC-cal felszerelt androidos modult. Vagy a vegen marad a raspberry, ha van fel eved varni a megerkezesre
![]()
Az AVR utasításkészlete (azaz 1 elemi utasítás) 16 bites(2 bájt). Mi is itt a kérdés?
Ja igen: ha változót definiálsz, azt az SRAM-ba teszi, pontosabban a STACK-re. Ez 2 vagy 3 utasítás. Ha közvetlen utána írod a PORTB-re, 1 utasításba belefér(optimalizál).
AVR-libc FAQ:
Why does the compiler compile an 8-bit operation that uses bitwise operators into a 16-bit operation in assembly? Bitwise operations in Standard C will automatically promote their operands to an int, which is (by default) 16 bits in avr-gcc. To work around this use typecasts on the operands, including literals, to declare that the values are to be 8 bit operands. This may be especially important when clearing a bit: var &= ~mask; /* wrong way! */ The bitwise "not" operator (~) will also promote the value in mask to an int. To keep it an 8-bit value, typecast before the "not" operator: var &= (unsigned char)~mask;
Ha a -mint8 kapcsolot megadod az avr-gcc-nek, akkor 8 bit az alapertelmezett.
Hát, ezt kihagynám. Az intnek azért legyen rendes mérete. Inkább kasztolgatok.
Mondjuk ez nekem 8 bitesnek fordul le. Siman sbi 0x18,2 lesz a produkalt kod. (-O2 mellett)
> sbi 0x18,2
Hát, akkor valamit nagyon elírtál. Próbáld a kettőt változóba rakni, úgy hogy véletlenül se optimalizálja ki. for(i=0; i< 7; i++) PORTB |= _BV(i); Én -Os-t használok, 4.3 vagy 4.4 alól. Állítólag a 4.7-től már a hiba javítva van. Mindenesetre nekem mindig 16 bites, a kasztolás sem segített.
Valtozoba raktam, es ugy csinalta. Nem irtam el rajta semmit. -Os es -O2 is ugyan ezt az eredmenyt adja. A verzio 4.7.0, de minek hasznalna az ember regit, ha az hibas...
A hozzászólás módosítva: Szept 28, 2012
Ha változó lett volna, nem pedig konstans, akkor nem sbi 0x18,2-t fordított volna.
![]()
Mondom, hogy valtozoban volt, raadasul a main fuggvenyen kivul deklaralva. Egyszeruen kioptimalizalta. Vedd figyelembe, hogy masodik alkalommal kicsit mas kodot irtal le.
A hozzászólás módosítva: Szept 29, 2012
Megneztem a for ciklussal is. Ott is optimalizalta, egyedul egy movw maradt benne a kezdoertek betolteskor, de az aritmetikai muveleteket, stb. mar 8 biten vegzi. A movw es a mov ugyan ugy 1 orajel alatt lemegy...
A hozzászólás módosítva: Szept 29, 2012
Oké, pongyola voltam. A nem jel (hullám) nem jött át megfelelően, azt javítsátok.
A remekmű fordítás után:
A hozzászólás módosítva: Szept 29, 2012
Fura. Nalam ez:
Igy fordul le:
Szerintem terjel at a 4.7.0-ra.
Hello!
Azt szeretném megtudni, hogy az ADC mintavételezési sebességébe bele kell-e kalkulálna azt, hogy 13 ciklust vesz igénybe egy konverzió? Ha a mikrovezérlő 8MHz órajellel működik és az ADPS biteket úgy állítottam be, hogy 64-el ossza el, akkor az ADC mintavételezés frekvenciája 125kHz. Ezt még el kell osztanom 13-mal vagy nem?
Az a 125kHz az ADC orajele es nem a mintavetelezes frekvenciaja. Az ADC-nek 13 ADC orajelbe kerul, mig csinal egy konverziot. Azaz el kell osztani 13-mal.
Köszönöm!
Free running módhoz tudtok jó leírást? Egy FFT algoritmushoz szeretnék megtölteni egy N hosszúságú tömböt mintákkal. Jelenleg így csinálom:
Úgy gondolom hatékonyabb lenne ha csak akkor vételezne újabb N számú mintát ha már az előzőn lefutott az FFT.
Szerintem inkabb hasznaljak ket puffert, es amig az egyiket az ADC megszakitasaval toltod, addig a masikat tudod szamolni. Csak arra kell ugyelni, hogy ne gyujtsel gyorsabban adatot, mint feldolgozod vagy szemaforokkal szinkronizald a ket muveletet. Nem tudom milyen mennyisegu adatot szeretnel igy feldolgozni, de igazabol erre mar inkabb az AVR32 valo, mert rendelkezik DSP utasitasokkal es peldaul a szorzas+akkumulacio egy utasitassal megvan.
A hozzászólás módosítva: Okt 1, 2012
Interruptot rendelsz hozzá ami letárolja a mért értéket, majd újra elindítja a konverziót.
A hardveres free-running lényegében annyi hogy az ADC kiolvasásakor új ciklust indít, semmi komoly. Ezt Te magad is megoldhatod, így nem kell free-running módba kapcsolni. Ha így teszel akkor interruptból le is állíthatod: "ha X minta van, nem indít új konverziót" Nem kell feltétlenül interruptot használni, ha a mintavételezés alatt nem csinál mást a cucc. Mintavételezés: 20ksps-nél NE állíts be nagyobb mintavételi frekit mert hibás lesz az eredmény! Tehát 8MHz esetében az előosztó minimum 8000000/13/20000~=30 (tehát 32). Ha 2 csatornát felváltva használsz... 1: arányosan csökkenteni kell a mintavételi frekit: max. 10ksps 2 csatornánál, 6.6ksps 3 csatornánál... 2: az ADMUX beállítása és új konverzió indítása között legalább 300us-nek el kell telnie! A hozzászólás módosítva: Okt 1, 2012
Az eredmeny mindig hibas, csak kerdes, hogy mekkora merteku a hiba
![]()
Köszönöm a válaszokat.
ATmega2560-ason írom, egy csatornát használok. Jelenleg így néz ki. Gombnyomásra indul és áll le a folyamat azért van megszakítás. Elméletileg nem csinál semmit mintavételezés közben, akkor ez azt jelentené, hogy nem szükséges az ADC megszakításokkal való kezelése?
A problémám az, hogy az FFT algoritmus helyes spektrumot ad ha olyan tömbökön futtatom le amiket én töltöttem fel szinusz/négyszög/háromszög hullámoknak megfelelő értékekkel, viszont ha egy függvénygenerátort kötök rá és valós jeleket adok az algoritmusnak, helytelen spektrumot kapok. Azt tudom, hogy a mintavételezési frekvenciának legalább duplájának kell lennie a mérni kívánt jel frekvenciájánál. A mérést ennek megfelelően végeztem, számításba vettem azt is, hogy az ADC órajelét el kell osztanom 13-mal de így sem jó. Nem tudom mi lehet a gond.
A megszakitas akkor celszeru, hogyha a konverzio alatt is szeretnel muveletet vegezni. Ha nem, akkor az "ADC Noise Reduction Sleep" hasznalata a celszeru, mert pontosabb lesz a mintavetelezett jel erteke.
Kulso jelforrasnal eloszor szerintem ne az FFT-t probald, hanem rajzold ki a memoriaban levo jel alakjat, igy lathatod, hogy a mintavetelezessel minden rendben van-e. Az analog bemenetre mindenkeppen tegyel egy alulatereszto szurot, aminek a vagasi frekvenciaja a mintavetelezesi frekvencia fele. Altalaban ez szokott hibat okozni. Ezen felul a kvantalasi zaj miatt mindig lesz valamennyi hiba, de ez eleg kicsi es elvileg egyenletes eloszlassal jelentkezik a teljes spektrumban. A hozzászólás módosítva: Okt 1, 2012
Ablak függvény alkalmazására is gondoltam de azt nem nagyon tudom, hogy kéne megvalósítani.
|
Bejelentkezés
Hirdetés |