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 Idézet: „a csatolt fájlokat hiába próbálom lefordítani az AVR Studió-ban, egy csomó hibát dob ki, és nem jön létre a hex fájl” Milyen hibát? Az RPM mérő röviden a következőként megy: Az AVR IC-t 1 MHz-en járatják, definiálnak egy számlálót 1024-es előosztással. Azaz 1000000/1024=976 Hz. Ezt írják be, mint a számláló teteje, tehát másodpercenként megnézi a szoftver, hogy hányszor bizgették a reflektív optót. Ennek értelemszerűen a pontossága 1 RPM. Hogyan lehet ennél pontosabban mérni? Úgy, hogy nem másodpercenként nézed, hogy hányat fordul, hanem mondjuk 10 másodpercenként. Ekkor 9760-at írsz az OCR1A-ba, a végeredményt pedig 10-zel osztod. Légy tekintettel arra, hogy az OCR1A maximális értéke 65535, szóval 97600 ebben a formában már nem fog menni. A hozzászólás módosítva: Szept 10, 2013
Szia! Az AVR Studio-ról küldök valami képernyőmentést, néhány perc...
Én is valami hasonló megoldáson agyaltam, - 10mp mintavételezés, csak ezt nem 60, hanem 6-tal szorozni, hogy megkapjam az RPM-et.
A képek:
Elkonfiguráltad az AVR típusát. Mi az az Atmega8a?
A képen, amit csatoltál, kidob egy csomó eszközt, amit ismer. Nem látok mindent, de válassz valami olyan eszközt, ami a listában benne van és a neve Atmega8-ra hasonlít. Kizárt dolog, hogy az AVRStudio ne ismerje az Atmega8-at, csak lehet, hogy nem Atmega8a-nak hívják.
Igen! Sejtettem, hogy valami banális hibát csinálok, így már lefordítja gond nélkül. Köszönöm! Most már lehet próbálkozni a módosítással. A 10-es osztást az RPS-re gondoltad? Ezt hogy tudom megvalósítani?
Köszi! Innét már remélhetőleg elboldogulok.
Majd éjjel próbálkozok, most készülnöm kell melóba... Majd írok, ha sikerült valamit összehozni (vagy ha nem) A hozzászólás módosítva: Szept 10, 2013
Ha ugyanolyan hosszu a tomb tartalma mindig es le van zarva \0 karakterrel, akkor
Sziasztok!
Megjött az LCD kijelzőm és találtam egy cikket, hogy 1 lábról is lehet működtetni az lcd-t... Van egy kapcsolási rajz, viszont nincs hozzá mellkelve kész nyák terv. Bővebben: Link Tudna valaki segíteni ebben? (DIP alkatrészeim vannak csak sajnos) Köszi! A hozzászólás módosítva: Szept 13, 2013
Sziasztok!
Atmega128-as kontrollernél belefutottunk egy olyan hibába, amit nem értünk. A program megakad a következő sornál:
verify értéke 1 MPU6050_DMP_MEMORY_CHUNK_SIZE értéke 16 Többször is lefut ez a sor, de aztán egyszer elakad. Atmega 328-nál a hiba nem jelentkezik. Bári ötletet szívesen fogadok. A segítséget előre is köszönöm! A hozzászólás módosítva: Szept 14, 2013
Ezt hogy erted?
Idézet: Talan fel is kellene szabaditani neha a lefoglalt memoriat. (?) „Többször is lefut ez a sor, de aztán egyszer elakad.”
Ez a sor egy függvényben van, ami többször is meg van hívva. Többször is lefut hibátlanul, de x-edik alkalommal, amikor meghívom a függvényt, a bemásolt sor alatti utasításokat (pl. egy LED bekapcsolása) nem hajtja végre, a program futása megáll.
Nem írtam, de a függvény végén, a return előtt fel van szabadítva a lefoglalt memória. A hozzászólás módosítva: Szept 14, 2013
Az if-es malloc képes meglepetéseket okozni.
Nem látjuk a kódot, de ha
Annak elvileg jónak kellene lennie, feltéve, hogy nem foglalsz annyit, hogy a stack-et kezdjed felülírni. Ha a kód másképp néz ki, akkor dupla free simán előfordulhat, ami ugyebár mindenütt fagyás.
A felszabaditasnal nezed hogy az elozo lefoglalas sikeres volt-e ?
Na, így rossz (az if-es malloc szépségei).
Mert csak akkor kell felszabadítani, ha a verify igaz volt. Mert akkor foglaltad le te a függvényben. Ha nem te foglaltad le, ne is szabadítsd fel. Az, hogy a verifyBuffer konkrétan nulla-e, sehol nem derül ki. Nem véletlenül írtam, hogy az if-be malloc-ot csak módjával és csak ha tudod, hogy mit miért csinálsz. A hozzászólás módosítva: Szept 14, 2013
En nem tudom mi az a verify jelen esetben,..Mindenkeppen nezni kell hogy nem-e null a malloc visszateresi erteke,..aztan a tobbit a program szerkezet alapjan dontse el a programozo.
Üdv! Egy kis segítségre lenne szükségem.
Tegyük fel hogy van egy esemény, ami beindít egy számlálót egy AVR-ben. A számláló szépen elkezd számolni, ám mire az idő végére érne, az ezután végrehajtandó utasítást felül kellene írni. Hogyan tudom megoldani, hogy egy másik, magasabb prioritású esemény leállítsa a timert?
Start Timer ill Stop Timer Bascom alatt. Gyakorlatilag a regiszterének írásával megállítható/indítható.
Utasítás felülírás? Szoftverből, vagy afelhazsnáló szempontjából csinál mást?
Igen a free is if-ben van, pont úgy, ahogy írtad.
Hello!
Én ezt az egész malloc-os dolgot kerülném AVR-ben. Az a baj hogy egyrészt a memória túl kicsi ahhoz hogy dinamikusan foglalgassuk, a másik hogy AVR-eknél nem fut a háttérben olyan kernel ami az egészet menedzselné. Ezért hamar előjönnek a klasszikus memóriafoglalási anomáliák.
Gondolom a timer lejárata egy interruptot generál. Ugyanezt kell tudnia a "magasabb prioritású" eseménynek is, tehát interruptot generál és leállítja a timert(TCCRx[B]=0).
Vigyázz! Ha egy Interruptban benne vagy, azt egy másik INT nem szakíthatja meg (de a jelzőbitet ott is figyelheted ha kritikus).
Ezért kell egy interruptnak rövidnek lennie, nem az esti mese felolvasására való.
![]() Ha kritikus akkor az interruptban engedélyezhető a többi(sei utasítás), de körültekintően kell használni nehogy egy interrupt önmagára fusson. Ez utóbbi elkerülhető, ha a kérdéses interruptban a sei előtt a sajátját kimaszkolja, majd az interrupt végén engedélyezi azt(amennyiben szükséges).
Sziasztok!
gyenge 2 év után előszedtem az AVR-es cuccaimat. De mivel azt a kicsit is elfelejettem amit tudtam (és valahol elveszítettem az összes működő projektemet a gépről) kellene egy kis segítség. Szóval kellene atmega 8 ra valami nagyon egyszerű ledvillogtatós BIZTOSAN működő program. elviekben minden működik, amit a fiókból előszedtem, de mégse megy. Szóval kellene valami ami biztos... előre is kösz.
Fuse bitek jól álnak? Gondolok itt arra, hogy nem kell mellé véletlen külső órajel?
A mikrokontroller.net -n de máshol van egy sereg jol müködö program. Üsd be a googliba és válogass!
Idézet: „a klasszikus memóriafoglalási anomáliák” Ezt informatikusokon kívül senki sem érti. ![]() Kicsit bővebben: ha lefoglalsz egy 5 elemű helyet, egy 10 elemű helyet, egy 20 elemű helyet, utána egy 1 elemű helyett, az első hármat felszabadítod (5-10-20), akkor a memóriád úgy fog kinézni, hogy 35 hely üresen, utána 1 hely lefoglalva. Ha ezután egy 40-es elemet akarsz lefoglalni, az a 35+1+1 pozícióra fog kerülni, mert az első 35 szabad bájt használhatatlan. Ez persze fokozódhat, ha olyan szerencsétlenül foglalsz, hogy van 1k szabad memóriád, de a legnagyobb összefüggő használható blokk az 35 bájt a töredezettség miatt. (egyik anomália) A free elfelejtéséről nem beszélek, mert AVR alatt olyan kicsi a memória, hogy gyakorlatilag azonnal betelik ha a program elfolyatja (másik anomália). A harmadik az, amikor 1 bájtos blokkokat foglalsz le malloc-kal. Az adminisztrációja belül gondolom többe kerül, mint a lefoglalt méret. Előfordulhat, hogy 1 byte lefoglalása 5 byte-tal csökkenti a szabad helyek számát. Emellett PC-n van memory mapping, azaz a memóriában egy blokk ide-oda tologatása fizikai másolás nélkül történik meg. Átírnak egy értéket egy címen. Ha van egy 200MByte méretű blokkod és realloc-kal 250MByte méretű blokkot csinálsz, a gép nanoszekundum alatt megcsinálja, mert csak megváltoztatja a memóriatérképet. AVR alatt nincs ilyen, tehát egy realloc fizikailag átmásolja a régi tartalmat az új nagyobb helyre, ami eszméletlenül lassú. PC-n ez az egész szépen ki lett tesztelve és optimalizálva, meglehetősen jól is működik. AVR alatt is ki lett tesztelve, optimalizálva lett, de nem sebességre és hatékonyságra gyúrtak, hanem méretre, hogy a kód a lehető legkisebb helyen elférjen. Ennek természetesen ára van és gondolom az AVR-es malloc/free negyedakkora hatékonyságot sem mutat, mint a PC-s megfelelője. Sem memóriatakarékosság, sem gyorsaság terén.
Bascom-avr alatt jó?
Bővebben: Link Vagy van az Arduino blink.pde az egyszerűség kedvéért:
ASM, C, Micropascal, FastAVR, MicroC, MicroBasic majd legközelebb....
Ehhez ugyan kell egy nyomogomb is, de mukodik:
Bővebben: Link A hozzászólás módosítva: Szept 16, 2013
Az AVR-es malloc-ra visszatérve:
1) A heap vége az első hívás utáni stack pointer -32. (Ez kicsit húzós lehet, mert egy interrupt 16 elemet nyom le helyből). Ezen persze lehet javítani: __malloc_margin = 64; 2) semmiképpen se írd felül a memóriát. Ha 10 byte-ot foglalsz, akkor a 0-9 címeket írhatod. Felülírás esetén kialakulhat végtelen ciklus. |
Bejelentkezés
Hirdetés |