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! ![]() 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
![]()
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 |