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
Szerintem itt az a bökkenő hogy a timer megszakításban való kezelése kicsit komplikált, ha meg azon kívül csinálja(main loop-ban) akkor pont a timer és a többi interrupt miatt zavaros a vétel. Én az 1-es timert használnám, amelynek az ICP lábára kötném a szenzort. Az "input capture" egységet úgy programoznám fel hogy felhúzó élre generáljon "eseményt", ami két dolgot csinál: beállítja az ICR1 regisztert, és megszakítást generál. Az ICR1-be bemásolódik a TCNT1 értéke az esemény(felfutó él) pillanatában, ezért nem probléma ha eközben más megszakítást is kiszolgál az AVR. Az OCR1A-t pedig úgy állítanám be hogy a bitidő végén CTC módban lenullázza az időzítőt és szintén megszakítást generál.
Szerintem egy (inkrementális) enkóder nem pontosan így működik. Az enkóder mindkét csatornájának mindkét élére kell reagálni. Az INT lábakat úgy állítsd be hogy "toggle" módban generáljanak megszakítást, azaz fel-és lefutó élre is. A két megszakítás nyugodtan lehet ugyanaz a kód. A lényege hogy a megszakítás végén eltárolja a két láb értékét, és a következő megszakításnál ezzel hasonlítja össze. A különbség +/- 1 lehet az előzőhöz képest, ez alapján állítod az enkódertől függő számlálót a megszakításból. Az enkódernek kell egy kezdő érték is, ezt a processzor indulásakor állítod be a csatornák beolvasásával még a megszakítások engedélyezése előtt. Ne felejtsd el a megszakítás-engedélyezés előtt az interrupt flageket törölni! Ha van C csatorna akkor érdemes azt is vizsgálni, hogy az egyes fáziskihagyásokat utólag korrigálni lehessen.
A hozzászólás módosítva: Feb 25, 2015
Nekem nem inkrementális enkóderem van, és ahogy írtam csak az A csatorna van az INT0 lábon, a másik atorna más lábon van a panelon.
Bocsánat, de egy enkóder aminek A és B csatornája van és fordulatonként 24 különállónak számító pozíciója van az nekem nagyon inkrementálisnak tűnik. Tévedek?
A beolvasas idejere tiltsd le a megszakitasokat, igy elkerulheted, hogy beolvasas kozben megszakadjon a kommunikacio rossz erteket olvasva be.
Bocsánat, tisztázzuk, annyira nem vagyok pro az enkóderekben.
![]()
Nem baj, a pap is holtáig tanul.
![]() Az inkrementális enkóder lényege, hogy egy recézett tárcsán (minimum) kettő érzékelő van, és az érzékelők által vett jel(pontosabban: azok élátmenetei) mutatják hogy melyik irányba fordult el a tárcsa. Ha szétszedsz egy golyós egeret, magad is láthatod hogyan néz ki egy (kettő) inkrementális enkóder. De a mai optikai egerekben is megtalálható egy, mert a scrollgomb(kis tekerő középen elöl) továbbra is ezen az elven működik. Egyes enkódereknek van egy harmadik(C) csatornája is, ez arra való hogy a tengely nullpontját be lehessen mérni vele. A C csatorna csak egyetlen csík az enkóder tárcsáján. CNC gépekben ez nagyon fontos, mert a "külső" nullpontérzékelő optokapu már nem olyan pontos hogy minden alkalommal, a mindenkori fényviszonyok, páratartalom és hőmérséklet mellett század-/ezred- milliméter pontossággal ugyanott érzékelje a nullpontot. A hozzászólás módosítva: Feb 26, 2015
Az abszolút enkódereknek n csatornája van, és ezzel 2^n pozíciót(szöget) lehet mérni vele. Ezeknél a kódtárcsa már nem recézett, sokkal inkább egy "faágra" hasonlít a mintázata. Ez a gray-kód, egy bináris kódrendszer aminek az a lényege hogy az egymással szomszédos pozíciók pontosan egy bitben különböznek. Tehát egy 24 pozícióval rendelkező(és végtelenített forgású) enkóder nem lehet abszolút típusú (lásd: kép). Egy abszolút kódolású enkóder előnye hogy a szögpozíció mindig, minden pillanatban mérhető, még a készülék bekapcsolásának pillanatában is. Forgatógombos kezelőszerveknél ez a tulajdonság kiemelten fontos, ha a kezelőszerv skálával és mutatóval rendelkezik. Léteznek motoros hajtások, szabályzó rendszerek amelyeknél üzemi körülmények között nem engedhető meg a nullpont keresés érdekében történő végállás megkeresése.
A hozzászólás módosítva: Feb 26, 2015
Köszönöm a korrekt felvilágosítást és jófejséget!
![]() Szóval az rendben van, hogy úgy kezelem, hogy az A csatornát az Atmega8L interruptra kötöm, a B-tpedig egy sima portra. Felhúzóellenállás be és az interrupt megszakításban pedig figyelem, hogy a B láb milyen szinten van, ebből eldönthetem, hogy melyik irányba tekertem. Az alapelv jó? Csak mert egyszer már működött ugyan ezzel a típussal és most csak a panel változottamit már 1000-szer átmértem meg az hogy csak sima atmega8-al csináltam. Az Atmega8L-ben máshohy kell kezelni az INT0-t?
Szerintem ugyanúgy kell kezelni mint a "sima" mega8-at, csak a CPU freki nem lehet 8MHz-nél nagyobb. Ha viszont csak az egyik csatornát kötöd interrupt lábra, akkor csak minden második pozíciót fogsz csak tudni mérni, tehát egy körbefordulás alatt 12 pozíciód lesz a 24 helyett. Így is működhet a dolog, de nekem elég körülményesnek tűnik. A lényeg az, hogy egy A csatornán történő élátmenetnél mit ad a B csatorna. Ha balra forduláskor az A és B állapota megegyezik, jobbra forduláskor különbözik(és fordítva). De a csatornákra kell tenned valami szűrőt, mert az élátmenet nem biztos hogy sima lesz és ez zavart okozhat a rendszerben.
A hozzászólás módosítva: Feb 26, 2015
100nF-os kondikat raktam szűrőnek. Ténylag az a furcsa hogy egyszer már működött ugyanilyen típusú enkóderrel, ugyan ezzel a bekötéssel, programkódal csak a mega8 lett L-es változat. Tehát csak arra tudok gyanakodni. Bekötöttem az A és B csatornát is megcserélve, hátha én vagyok hülye de úgy sem működött rendesen, perszeez még nem zárja ki... Most ott tartok, hogy holnap a szóp két csatornáját rákötöm.
Sziasztok, kiolvastam a fuse biteket egy vadiúj atmega48PA-PU mikrokontrollerből és egyedül az órajelet állítottam át 2-ről 8MHz-re (természetesen belső OSC maradt és a többi paraméter is az eredeti) beírtam az új fuse biteket és most meg "failed to enter programming mode" üzenetet kapok. Valakinek valami ötlete?
A mega48-nak nincs 2MHz-es belső órajele. Egy másik IC(pl. mega8) volt beállítva neked,
az új érték beírásával egy másfajta értéket kapott az AVR. Próbálj meg órajelet adni az XTAL1 lábra.
Szia zombee, köszönöm a válaszod. Egyébként azthiszem tőled vettem az égetőt, remekül szuperál még mindíg!
![]() ![]()
Más chipnek feleltetted meg a kiolvasott fusebiteket...
Sajnos külső kristállyal sem sikerül csatlakozni, pedig legutóbb egy atmega8-at sikerült így ujraéleszteni
![]()
Erre már gondoltam, viszont így fogalmam sincs hogy mit mire állítottam, amit órajelnek hittem lehet hogy teljesen más volt
![]() ![]()
Azt hiszem nekiállok összedobni egy fuse bit helyreállítót...
![]()
Sikerült végül visszaállítani az eredeti fuse biteket. Hamarosan feldobom a kapcsolási rajzot hátha más is kizárja még magát egy Atmega46 ból
![]()
Szia, ez a cikk csak akkor segít, ha külső kristályt állítunk be órajel forrásaként, de ha kikapcsolnom a SPIEN bitet is ez tuti nem működne. Nekem sem éledt fel a mikrokontroller a külső kristályról mert valószínűleg a SPIEN-t is kikapcsoltam. Én high voltage párhuzamos programozót kötöttem a halott mikrokontrolleremre, de lehet erről is van cikk viszont én nem találtam.
Fejlemény: most sikerüt működésre bírni! Az INT0 úgy van beállítva hogy felmenő élre aktiválódik. Az volt a gond, hogy az egyik 100nF-os kondenzátor rossz volt, mindkettőt cseréltem. Most a következő a gond: megszakításnál egy változót 5-el növel vagy csökkent attól függ milyen irányba tekerem. Az irány felismeréssel nincs gond. De néha nem 5-el hanem 10-el vagy 20-al is növeli a vàltozót. Kb olyan arányban hogy tekerem négyet, növeli mindig 5-5el, majd az ötödiknél 10-el növel, majd a 6-nál pedig 20-al növeli.
Mi lehet a gond?
Tranziens van a vonalon, vagy a tárcsa van elkoszolódva. Esetleg sorjás...
Az encoder zsír új. Próbáljam ki nagyobb kondival, pl 220nF?
Lehet az enkoder is vacak... volt már, hogy új, drágább enkóder össze-vissza jeleket adott ki. Amint kicseréltem egy olcsó kínaira remekül működött.
Én is erre gyanakodtam, amíg át nem raktam egy másik áramkörömbe, szóval tuti hogy jó. Az az érdekes, hogy a másik áramkörben a program csak lefutó élre aktiválódik mint a digitális forrasztóállomásodban, itt meg úgy összevissza értékeken ugrált és csak az isc000 és isc01 bitek 1-be állításával hajlandó működni.
Sziasztok, ha már megígértem felteszem a magas feszültségű párhuzamos programozó (fuse bit doctor) kapcsolását és kódját. A schematic képen az atmega8 a doktor a Meaga48/88/168-PU pedig a páciens
![]() ATmega8(doktor) ATmega48(beteg) PD0 -> PB0 (1K) PD1 -> PB1 (1K) PD2 -> PB2 (1K) PD3 -> PB3 (1K) PD4 -> PB4 (1K) PD5 -> PB5 (1K) PD6 -> PC0 (1K) PD7 -> PC1 (1K) PB1 -> PD4 (1K) PB2 -> PD3 (1K) PB3 -> PD2 (1K) PB4 -> PD1 (1K) PB5 -> PD5 (1K) PC2 -> PC2 (1K) PC3 -> PB6 (XTAL1) (1K) PC4 -> PD6 (1K) PC5 -> PD7 (1K) PB0 -> Vcc, AVcc Én nem használtam külső kristályt, 1MHz-re állítottam a Mega8 belső órajelét. Mindenhova tettem 1K ellenállást kivéve a PB0 -> Vcc,Avcc közé. Csatolva megtaláljátok a C forrást is én avr-gcc-vel fordítottam és avrstudióval tettem a mikrokontrollerre. Remélem másnak is hasznos lesz és visszahoztok pár mikrokontrollert az életbe ![]() ![]()
Nekem 20 lépéses kínai encoderem van, ez 80 jelváltozást eredményez fordulatonként, amiből csak minden negyedikre van szükségem (DDS frekvenciabeállításhoz használom) elegendő akkor feldolgozni, amikor A és B csatorna is nulla. Időzítő megszakításból használom 1000 lekérdezés/másodperc sebességgel, így nincs szükség pergésmentesítő kondenzátorokra, anélkül is hiba nélkül működik. A kódom a következő:
Én ezt úgy küszöböltem ki, hogy egy bizonyos sebességnél gyorsabban fizikailag lehetetlen forgatni az encodert kézzel, így megszabtam, hogy ha x időn belül újra forgást érzékelek, ne történjen semmi. Ugyan ez, a forgásirány váltáskor. Néha egyenletes tekerésnél azt is vettem észre, hogy a növelt változó néha csökkent. Megszabtam, hogy ha egyik irányba forgatás történik, akkor ismét egy bizonyos időn belül történő forgásirányváltás legyen figyelmen kívül hagyva. Az időkre már nem emlékszem, úgy kísérleteztem ki soros monitor segítségével, milyen gyorsan tudom oda-vissza pörgetni az encodert, mi a leggyorsabb forgatási sebesség.
Ez jól ahangzik. A forráskódot esetleg fel tudod tenni?
|
Bejelentkezés
Hirdetés |