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
Hülyeségnek nem hülyeség, de azt nevezzük inkább HW-es pollingnak. Ugyanis ADC ha freerun-ban van, akkor X időközönként beesve az interrupt tudsz gombot olvasni (kiértékelni).
Tehát lényegében még ez is polling.
Nem mondtal, sot, elterjedt megoldas ez. Ilyenkor komparator modban talan lehet megszakitast is generaltatni, de:
A billentyu (es mas mechanikus kapcsolok) eseteben megszakitast csak akkor celszeru alkalmazni ha a debouncing hardveresen van megoldva. Ha nem akkor a bouncing idejere rengeteg interrupt beeshet - ez pedig teljesseggel felesleges es akar nehany tiz ms-nyi idore is gyakorlatilag blokkolhatja (kisajatithatja) a feldolgozo egyseget. Emiatt elterjedt az a szokas, hogy a timer bizonyos idokozonkent (par ms altalaban) megszakitast csinal es akkor vegeznek el egy pollozast -- es igy meg a szoftveres debouncing is konyebben elvegezheto...
Igen, a PCINT jó ötlet csak nem tudom hogy én néztem-e el de az ATMega32-n nem láttam ilyen funkciót, a Tiny2313-on pedig simán van.
Igen, igazából valami hasonlóba futottam bele egy enkóder kapcsán. Az egyik INT-en volt az enkóder egyik csatornája, a másik pedig egy port egy lábán és figyeltem az interrupt rutinban, hogy épp magas v. alacsony szinten van-e a láb.
A gond az hogy hiába állítottam be hogy legyen blokkoló az int. rutin és hogy úgy kezdődjön hogy _delay_ms(10.0) (ez mint sw. debouncing), valahogy sosem akart működni rendesen. Igazából most sem tudom hogy hogy kéne enkódert használni normálisan pedig szerintem elolvastam az összes ide vonatkozó oldalt az interneten... Végül feladtam.
Ez egy mechanikus rotary encoder? Azoknal mindig csak egy csatorna pereg, igy mindig legfeljebb ket egymas mellett levo allapotok kozott tortenhet atmenet. Az interrupt rutint amugy nem kell blokkolora beallitani. Egy flaget kell betenni, ami az aktualis allapotot figyeli -- azaz a timer interrupt periodikusan bejon, es az elozo allapothoz kepest kell mindig cselekedni.
Ugye van egy stabil allapotod (a legutolso allapot aminel a kapcsolo/encoder allapota valid volt). Van ezen felul egy legutoljara mert allapotod, amivel a kapcsolok/encoder vonalak allasat kell ossze vetni. Ha az encoder allapota az elozo olvasashoz kepest valtozott, akkor csak aktualizalni kell ezt az allapot jelzot. Ha ugyanaz, akkor az allapot stabil tehat a stabil allapotot jelzo regisztert kell aktualizalni. Nyilvan erdemes az aktualizalas elott ossze vetni, hogy valtozott-e a ket stabil allapot kozott a gombok/ancoder vonalak allapota, es ha igen akkor flaggel jelezni a valtozast ill megoldani a szamlalo leptetest vagy egyeb funkcio aktivalasat. Ezt meg amugy tovabb is lehet bonyolitani, hogy a forgas iranyat is figyeljuk, igy ha ne adj isten az encoder epp ket erteken all akkor elofordulhat, hogy az encoder egyfolytaban bouncingol es igy veletlen szeruen A vagy B allapotot validnak talalna a fentebb leirt algoritmus. Tehat ha egy tovabbi flaggel eltaroljuk, hogy az elozo lepes felfele vagy lefele tortent akkor a vissza iranyu lepest csak akkor fogadja el, ha legalabb ket utemet lepett vissza (magyaran az ilyesfajta perges kizarhato) Az egesznek a lenyege amugy az idozites, a timer interruptot celszeru a bouncing idejenel hosszabbra megvalasztani, viszont eleg surunek ahhoz, hogy az encoder maximalis sebessege mellett is meg megfelelo szamu leolvasast tudjunk elvegezni.
1 interruptos enkóder
Igaz bascom. Az egyik eltekerés iránya INTet vált ki. a másik lába így magas vagy alacsony, így tudom merre csavargattam... Kb. az oldal közepén a rajz és a Bascom mintaprg is...
Megoldható szerintetek 10db 100mA-es fehér LED AVR-el való meghajtása. Vagy inkább tranyókat kössek a kimenetekre mert sok lesz a teljesitmeny?
PWM üzemben hajtanam öket a dimmelhetőség miatt, na meg ugy kevesebbet is esznek. Lehet hogy agyuval verébre de én igy tudnám csak megoldani.
10x100mA-t semmikeppen nem tudsz kivenni az AVRbol. Kimenetekre tranyot, vagy tr.tombot. (UDN, ULN).
Szia!
Bár érteném mit jelent ez... de minden jószándékod benne van, szóval köszi Szóval: Igen, mechanikus rotary encoder. TavIR-AVR: Igen, én is erre gondoltam hogy ez jó lesz. Raktam is egy kis sw. pergésmentesítést az int. rutinba, de nem igazán sikerült a dolog.
nem. lábanként max 20 mA vehető ki (ökölszabály). Tranzisztormezővel segíts rá. Pl. ULN2308.
Sziasztok!
Linux alatt avrdude-al használom az Olimex-féle ISP programozót (stk500v2), és egy 17k-s flash beprogramozása, egy ATMEGA32-be kb 90 másodpercig tart, a visszaolvasás szintén ilyen lassú. Szerintetek mi okozhatja ezt a lassúságot? Petya
Ugyan a linux-os formát még nem láttam, de az ISP freki gondolom ott is állítható.
Probáld megkeresni és nagyobbra állítani.
IT rutinba prell mentesítés (delay)?
Akkor minek az it? Nem lenne elég egy main-es vagy egy timer-es pingelés? Én egyébként 2db ilyet kezelek + 6db szegmens kijelző + SPI-n továbbítja az enkóder adatokat és onnan veszi, hogy mit írjon ki, de ez neked nem igen jó, mert és nem int-el oldottam meg, hanem ping-el.
szerintem ebben semmi ellentmondás nincs.
Sajnos timer-rel pollozni nem igazán tudom a fel v. lefutó éleket, egy enkódert mindenképpen él-triggerelten kell vizsgálni -> ezért kell interruptosan kezelni. Valamit rosszul értelmezek?
Nem kell interrupt, elég a poll. Élt tudsz detektálni úgy, hogy az előző állapotot és az aktuális állapotot is figyelembe veszed a poll során. Mitöbb, az egész enkóder lekezelésére elég egy állapotgép egy jól felépített állapotgráffal, az állapotváltozókba bele kell venni az aktuális állapotot, az előéletet meg az aktuális állapot reprezentálja. Ha elég ügyesen építed fel az állapotgráfot, akkor még pergésmentesítés sem kell, legfeljebb oda-vissza ugrál pár köztes állapoton a pergés alatt.
Idézet: „az állapotváltozókba bele kell venni az aktuális állapotot, az előéletet meg az aktuális állapot reprezentálja” Na, ez jó érthetetlen lett... Tehát: az állapotváltozókba bele kell venni a bemenetek aktuális állapotát, az előéletet meg az állapotgép aktuális állapota reprezentálja
értem.
és nem viccelek! megvan a holnapi programom, köszi! ... mondjuk még mindig nem értem hogy interruptokkal megoldva miért nem volt jó a dolog, de végülis mindegy. megnézem ezt a pollos témát.
na, most meg a fránya ISP-m nem akar kommunikálni az AVR-rel...
Egyébként ha az ISP-vel össze van kötve az eszköz akkor az órajelet is onnan kapja, ugye?
Igazából valamiért mindig a jól ismert ablak ugrik fel AVRStudio-ban, pedig az ISP órajele 115kHz. Az AVR tuti hogy működik - amúgy külső kvarcról jár amikor épp a természetes környezetében van. Persze kipróbáltam úgy is hogy van ott egy kristály meg a két kondi, de úgy sem akart menni... Nem tudom mi lehet.
Hello.
Egy kis segítségre lenne szükségem, megépítettem az AVR újraélesztőt ami itt van a kapcsolások között, de egy hiba van, nem akar istennek sem életre kelni az avr. ATtiny2313ról van szó, az áramkörbe 4MHz-s kvarcot raktam és 5V-ról táplálom, STK200as íróval próbálom írni. Esetleg 1MHz-sel próbáljam szerintetek, vagy mi lehet a hiba? A fuse biteker állítottam be rosszul, ponsotan a FUSEBIT KLA987-et Bascomban (101111-re) és utána már nemtudtam belépni...
Nem inkabb 8-12MHz kristaly kellene oda? En nem azzal az ujraelesztovel kiserleteznek ha igy van beallitva a fuse, hanem, hogy a kristaly az AVR-re van rateve.
Rendben. És az stk200 beüzemelésekor hova kössem xtal1 és xtal2 közé a kvarcot? vagy xtal1 és gnd közé?
Xtal1-Xtal2 koze ahogy az adatlapban van (lasd mellekelt kep)
kiprobáltam 27pF-es kondit raktam be az általad küldött kapcsolásba és 12MHz-s kvarcot de meg sem nyikkan. Egyéb 5let?
Kisebb kondikkal sem? 12-22pF-et ajanl az adatlap -- meg hat ez a verzio nyilvan akkor mukodhet ha valoban azok a fuse bitek vannak beallitva (es ha nem neztem el az adatlapot )
Most kiprobáltam 22pF-el. Semmi változás. és biztos hogy az lett elállítva mert előtte mindig elállítottam mentettem, és jó volt. Ja 3 ATtiny2313-at is sikerült igy pihenőre rakni szóval még az sem mondható hogy csak egyet gyilkoltam így le
A kulcsszó a Bootloader.
|
Bejelentkezés
Hirdetés |