Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
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
Lapozás: OK   650 / 837
(#) zombee válasza Istvanpisti hozzászólására (») Feb 25, 2015 /
 
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.
(#) zombee válasza Droot hozzászólására (») Feb 25, 2015 /
 
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
(#) Droot válasza zombee hozzászólására (») 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.
(#) zombee válasza Droot hozzászólására (») Feb 26, 2015 /
 
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?
(#) Zsolt2 válasza zsozsoX hozzászólására (») Feb 26, 2015 /
 
A beolvasas idejere tiltsd le a megszakitasokat, igy elkerulheted, hogy beolvasas kozben megszakadjon a kommunikacio rossz erteket olvasva be.
(#) Droot válasza zombee hozzászólására (») Feb 26, 2015 /
 
Bocsánat, tisztázzuk, annyira nem vagyok pro az enkóderekben. Csak beírtam a keresőbe, hogy inkrementális enkóder és a motorok tengelyére szerelhetőt adta ki. Elvileg így néz ki a kimeneti jele.
(#) zombee válasza Droot hozzászólására (») Feb 26, 2015 /
 
Nem baj, a pap is holtáig tanul. Az inkrementális az nem azt jelenti hogy motorra szerelhető, hanem a működési elvet. Az adatlapban nem volt ilyen, de a típusra rákeresve ilyen képeket is kiadott a google, valahogy hasonlít a tiédre. (100% egyezik, lásd: kép! )

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
(#) zombee válasza zombee hozzászólására (») 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
(#) Droot válasza zombee hozzászólására (») 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?
(#) zombee válasza Droot hozzászólására (») Feb 26, 2015 /
 
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
(#) Droot válasza zombee hozzászólására (») 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.
(#) k3gy3tl3n hozzászólása Feb 27, 2015 /
 
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?
(#) zombee válasza k3gy3tl3n hozzászólására (») Feb 28, 2015 /
 
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.
(#) k3gy3tl3n válasza zombee hozzászólására (») Feb 28, 2015 /
 
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! Egyébként valóban atmega8L-t használtam eddig, de átállítottam az AVR studióban a mikrokontrollert atmega48-ra. Mikor kiolvastam a fuse biteket (a gyári értékeket) akkor láttam hogy 2MHz-re volt állítva az órajel te viszont azt mondod hogy nincs is 2MHz-es belső órajele, akkor ez hogyan lehetséges? Majd miután 8MHz-re állítottam már nem tudtam programozni
(#) TavIR-AVR válasza k3gy3tl3n hozzászólására (») Feb 28, 2015 / 1
 
Más chipnek feleltetted meg a kiolvasott fusebiteket...
(#) k3gy3tl3n válasza k3gy3tl3n hozzászólására (») Feb 28, 2015 /
 
Sajnos külső kristállyal sem sikerül csatlakozni, pedig legutóbb egy atmega8-at sikerült így ujraéleszteni Lehet a SPIEN bit nincs beállítva (pedig azt nem bántottam a gyári értéken hagytam)? Tudnátok valami egyszerű kapcsolást a FUSE bitek resetelésére?
(#) k3gy3tl3n válasza TavIR-AVR hozzászólására (») Feb 28, 2015 /
 
Erre már gondoltam, viszont így fogalmam sincs hogy mit mire állítottam, amit órajelnek hittem lehet hogy teljesen más volt ajjajj
(#) k3gy3tl3n hozzászólása Feb 28, 2015 /
 
Azt hiszem nekiállok összedobni egy fuse bit helyreállítót...
(#) k3gy3tl3n hozzászólása Feb 28, 2015 /
 
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 Itt az oldalon egyébként nem találtam fuse bit doctor kapcsolást, vagy csak rossz helyen kerestem?
(#) Lucifer válasza k3gy3tl3n hozzászólására (») Feb 28, 2015 /
 
Itt van:
Bővebben: Link
A hozzászólás módosítva: Feb 28, 2015
(#) k3gy3tl3n válasza Lucifer hozzászólására (») Feb 28, 2015 /
 
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.
(#) Droot válasza Droot hozzászólására (») Feb 28, 2015 /
 
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?
(#) zombee válasza Droot hozzászólására (») Feb 28, 2015 /
 
Tranziens van a vonalon, vagy a tárcsa van elkoszolódva. Esetleg sorjás...
(#) Droot válasza zombee hozzászólására (») Feb 28, 2015 /
 
Az encoder zsír új. Próbáljam ki nagyobb kondival, pl 220nF?
(#) vzoole válasza Droot hozzászólására (») Feb 28, 2015 /
 
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.
(#) Droot válasza vzoole hozzászólására (») Feb 28, 2015 /
 
É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.
(#) k3gy3tl3n hozzászólása Feb 28, 2015 / 1
 
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 Én konkrétan Atmega8L-t használtam és Atmega48PA volt a beteg. Ennek segítségével ha kizárjátok magatok a mikrokontrollerből (külső kristályt álltatok be de nincs rajta, vagy kikapcsoljátok a SPIEN-t stb..) A kék vonal a következőket takarja:
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 Egy tipp: ha seggel (vagy fejjel) egymás fele teszitek a két mikrokontrollert akkor szinte semmit nem kell X be kötözgetni csak párhuzamosan. Jó élesztgetést!
(#) benjami válasza Droot hozzászólására (») Feb 28, 2015 /
 
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ő:
  1. #define ROT_1A         C, 4
  2. #define ROT_1B         C, 3
  3. #define GLUE(a, b)   a##b
  4. #define GET_(p, m) GLUE(PIN, p) & (1 << (m))
  5. #define GET(x)     GET_(x)
  6.  
  7. ISR (TIMER1_COMPA_vect)
  8. {
  9.   static unsigned char LastRot1a, LastRot1b;
  10.   if(!GET(ROT_1A) && !GET(ROT_1B))
  11.   {
  12.     if(LastRot1a)
  13.       Rot1--;
  14.     if(LastRot1b)
  15.       Rot1++;
  16.   }
  17.   LastRot1a = GET(ROT_1A);
  18.   LastRot1b = GET(ROT_1B);
  19. }
(#) Kovidivi válasza Droot hozzászólására (») Feb 28, 2015 /
 
É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.
(#) Droot válasza Kovidivi hozzászólására (») Márc 1, 2015 /
 
Ez jól ahangzik. A forráskódot esetleg fel tudod tenni?
Következő: »»   650 / 837
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem