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
Bővebben: Link
Ebben már benne van a gyorsabb tekerés észlelése is! Ha jól látom, hiányzik belőle az irányváltás védelem, azt rád bízom! De ha nem rakod bele, akkor sem lesz zavaró, ha rendesen van kondival és soros ellenállással pergésmentesítve az encoder. A hozzászólás módosítva: Márc 1, 2015
Köszi! Én mondjuk soros ellenállást nem kötöttem be, csak párhuzamos kondit. Még sokat kell rajta faragni, mert ugye atmega8-on nincs millis függvény.
Tehát az irányváltás védelem úgy működik, ha tekertem pl jobbra, akkor ki van védve hogy utána csak x ms múlva tekerhetem balra, ugye? Egyébként ötletes megoldás, tetszik! Ha egy tippet elfogadsz, használd a #define-t! Pl: #define HIPERGYORS_VALT 50 Ez azért jobb, mintha változót használnál mert a fordító, de lehet hogy nem is az hanem a linker kicseréli a HIPERGYORS_VALT szót 50-re, tehát nem jut el a mikrovezérlőig, míg a változó plusz memóriát használ.
Üdv mindenki!
Van egy probléma amire nem találtam megoldást hosszas keresgélés után sem. Nem ketyeg a kvarc... (ATMEGA328P-AU TQFP32) Pontosítok, mert azért mértem is. A kavics egyik lábán alacsony szintet mérek, a másik láb rendben van. Külső oszcillátorral működik. Első programfeltöltés után működött rendesen, majd apróbb változtatások, 2-3 újbóli feltöltés, és jött a hibaüzenet hogy nem elérhető. Segédórajellel persze ment rendesen. feltöltöttem egy korábban írt programot teszt ként hátha ott van valami probléma. Továbbá ezeknél a modelleknél i/o ként fel lehet használni az xtal lábakat is, de ezt a lehetőséget már kizártam. kicseréltem a chipet is egy másikra, és ugyan ez lett a vége.
Órajelforrás megadásod hibás? Fusebitek elállítva...
Timer2-t óraként definiálod? A hozzászólás módosítva: Márc 1, 2015
Egy pársoros alap programmal kizártam a programhibákat, ahol csak egy LED villog 100 as delay el.
És valóban a fusebit volt a hibás! Köszönöm a gyors választ!
És valóban a fusebit volt a hibás! Köszönöm a gyors választ!
ezt elsiettem. Annyi történt, hogy bekapcsoltam a belső órajelet, de mikor külsőre váltottam teljesen elvesztettem. Már nem tudom külső órajelgenerátorral sem elérni.
Kívül:
- szakadt/hibás/törött/forrasztáselengedett 2 db kondi (12...27pF) - sérült kvarc - hosszú vezeték, a kvarcok fele - forrasztógyanta/nedvesség
Kb 18mm hosszú a szál a kvarc felé, a gyanta miatti kapacitásra gondoltam korábban, de rendesen le van takarítva.
A kondikat cseréltem, a szakadásokat mértem, a viákat is végigmértem. kvarcokat cserélgettem 8, 16, 20 MHz... külső generátor 8MHz. nedvesség kizárható, a kvarc egyik lábán alacsony logikai állapot volt eddig. Most viszont ez a jelenség megszűnt. Marok egy új nyákot és meglátjuk. Esetleg van valami ötlet mi eredményezhette ezt 2x egymás után ?
Én lehet hogy timert használnék amivel X időnként leolvasom az értéket ÉS fel is dolgozom, beállítom az enkódertől függő változót és kész. Ennek az időnek természetesen igazodnia kell a lehető leggyorsabb forgatáshoz, legfeljebb az "események" közt eltelt legkisebb időnek 1/4-e lehet, de ne legyen túl gyors(pl. ezred része) sem! Pl. ha motoros forgatásról beszélünk 3000/perc fordulatú motorral és egy 24 lépéses enkóderrel akkor kb. 4.8kHz-es leolvasásról beszélünk. Egy "humán interfész" ennél sokkal lassabb!
Egy működőképes enkódernél lehetetlen, hogy amikor az egyik jelnél váltás van, akkor a másik jel nem stabil. Függetlenül a szűréstől. Ezért nagyon érdekes számomra minden olyan esemény, amikor egy egységnyi elfordulásnál 5-10 egységeket is lép a változó. Legfeljebb 1-1 egységet ugrálhatna fel-le, azt is csak ha határon van a dolog. Ezt az egyszerű kódot próbálta már valaki? Nem épp optimális, de egy 8MHz-es AVR-en simán elmegy:
A hozzászólás módosítva: Márc 1, 2015
Egy kérdés
A studio4 szimulator üzemmodban nem akarja beolvasni a kézzel állitott port bemeneteket. Ldi r16,$0 Out ddrd,r16. ; ddrd bemenet In r16, pind Ha a pinD ben az egérrel 11111110- állitok (7 fekete kocka 1 üres) akkor 254 helyett is csak 0-t olvas. Nem tudok rájönni miért. Ez a rutin eddig mindig ment.
Mikor állítod ? Mert ha a pin olvasás előtti utasításnál az már késő.
Szia!
Én bekapcsolnám a felhúzóellenállásokat. ldi r16,0x00 out ddrd,r16 ldi r16,0xff ;enable pull-up out portd,r16 in r16,pind Üdv.
Már sikerült 4-5 lepéssel korábban akkor megy.
Kösz, azok ott vannak alapbol, most inkább a szimulátorral voltam gondban. Ahhoz meg nem kell a pull-up.
A hozzászólás módosítva: Márc 2, 2015
Ez akkor is működik, ha a beteg egy ATmega8L és a doktor is egy mega8?
Nincs valakinek irányváltos ASM kodja unipoláris léptetömotorhoz?
Egyirányu van és megy is, de van némi gondom az irányváltással. ( lépésvesztés). Kösz
Szia elvileg azzal is mennie kell (tök ugyan az a lábkiosztása mint a mega48-nak), de ha gondolod holnap kifingatom az egyik mega8-amat és megnézem. Csak a C kódban kell a kívánt fuse biteket átírni.
Szia, én így léptetem az enyémet. Max 100-at engedem balra és jobbra lépkedni (stepcount) mert egy hajólapátot kormányoz. Értelemszerűen a dir az irány. dir==0 nál visszaáll középre, dir==1 balra lépked dir==2 jobbra lépked.
Kódom nincs, de talán segíthet az alábbi pár "tétel"
- legyen egy 8 bites változód (számláló), ami 0 és n-1 közötti értéket vehet fel - n az a szám amennyi állapotból áll egy ciklus. Pl. 4 tekercses motornál általában 4, finomátmenetekkel 8. - minden állapothoz legyen egy portmegfeleltetés, pl. 0=0011; 1=0110; 2=1100; 3=1001; - egy előre vagy hátra léptetés a számláló növelésével vagy csökkentésével áll elő - ilyenkor ellenőrizni kell hogy benne van-e a 0..n-1 tartományban, szükség esetén korrigálni azt - és természetesen az új értéknek megfelelően meg kell változtatni a portkimenetet is Csak szólok hogy ez igazából nagyon hasonlít az (inkrementális) enkóder kezeléséhez... A hozzászólás módosítva: Márc 2, 2015
Kezdésnek csak beállítok valami külső kristályt meg kikapcsolom a SPIEN-t, de átgondolva ezt is felesleges, csak egyszerűen megpróbálok a jelenlegitől eltérő fuse biteket beirni és ha beveszi akkor boldogság!
Én is valahigy igy okoskodom, de azt hiszem egyszerübb lesz megirni a semmiböl mint a meglevöt változtatni.
Sajnoc a C nyelvet nem értem...
Sziasztok! Építettem egy RFMxx modulokkal működő adót és vevőt (hajó), szeretném a vevőn elérni, hogy ha 1 másodpercig nem kap jelelt leállítsa a motorokat. Jelenleg ha kikapcsolom az adót a vevő a legutolsó állapotban ragad, azaz ha előre ment a hajó akkor kimegy a világból. Valami timerre gondoltam ami ha eléri az 1secet akkor csinál egy interruptot amiben lekezelem a motorok leállítását, ha pedig jön adat elkezd ismét 0-tol számolni. Van erre valakinek példakódja?
Amit küldtem kódot nagyon minimális C tudást igényel. A leg bonyolultabb művelet a maradékos osztás "%" benne. A stepcount tartalmazza hogy hányat léptünk. Pédául ha lépkedünk balra akkor a stepcount értéke 1,2,3,4,5....100 lesz. Onnét tudom hogy melyik a következő lépés hogy a stepcountot elosztom 4-gyel maradékosan. Pl stepcount = 9 akkor stepcount%4 = 1 lesz ebböl tudom hogy ha jobbra akarok lépni akkor melyik a következő tekercs amit húznom kell. Ugyanígy a másik irányba lépkedve a stepcount -1,-2,...-100 lesz ekkor ha stepcount = -7 akkor stepcount%4 = -3 és ebböl tudom hol állok éppen (melyik tekercsen) és hogy mi legyen a következő.
Nekem csak egy bajom van, hogy ha igy csinálom meg ( c ben amugy sem tudom) akkor lesz egy határ - tegyük fel 640 lépés egy fordulat, s ha a 640. poziciorol az 1. -re kell menni, akkor nekem vissza kell forogni 639-t, ahelyett, hogy egyet lépne elöre.
Ha jól értelmezem a te kododat. Én ugy gondoltam, hogy gyakorlatilag elég volna elmenteni a 4 alaplépésböl ($05,$06,$09,$0A) az utolsot és onnan indulni a kivánt irányba. Igy nincs abszolut helyzet.
Nem ismer véletlenül valaki olyan enkódert ami egy vezetéken kommunikál? Pl. Dallas OneWire buszon.
Szia, kipróbáltam, mega8-at is gyógyít A kódban csak a FUSE biteket írtam át erre:
Kb 8-10 másodpercig kellett nyomnom a gombot mire a led ujra felvillant (kész lett a gyógyítás). Lehet nem árt leírni, ha feléled a doktor világít a led, amint lenyomod a gombot kialszik a led és nyomva kell tartani míg fel nem villan. A hozzászólás módosítva: Márc 3, 2015
|
Bejelentkezés
Hirdetés |