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
Sziasztok!
Egy kis segítségre lenne szükségem! Kezdő avr programozó vagyok ! Lenne egy ilyen problémám , hogy az istenért nem tudom lefordítani a programomat! Nem értem mi a baj kérlek segítsetek! Előre is köszönöm!
Az elérési útban nem lehet se szóköz, se ékezetes karakter. Nálad mindkettő ott van.
Ez már nagyon régi AVR Studio - valójában WinAVR - hiba, nem is értem miért nem került ki a "WinAVR / GCC alapszabályok" közé, megérdemelne egy fél sort főleg a kezdőknek! A hozzászólás módosítva: Okt 12, 2013
Sziasztok szeretnék egy gombot beiktatni ami egy változót növel mikor meg nyomom a gombot.
Elvileg jó mert érzékeli ha meg nyomom a gombot de semmi sem történik.A program elindul mert belépteti a kapcs=1 be de ha meg nyomom a gombot semmi se történik se a 4-es led nem kapcsol-be de nem is lépteti tovább. Mit ronthattam el?
Nézd meg valamelyik ".inc" definíciós fájlt, mindegy melyik AVR-hez, az eredmény ugyanaz lesz
ha benne megkeresed a "PINB4"-re mit ír. Csak egy szám natúrba, ami mindig "4"-et ad vissza és semmi köze a portlábakhoz. Szerintem neked valami ilyesmi kell:
De ezt a sort még én se tudom mire vélni:
Ha gombnyomást és elengedést akarsz érzékelni, akkor tárolni kell az előző állapotot!
Igazából egy angol leírásból csináltam és ott ezt írta bele.
a (..) közé mit kéne tennem? Akkor még utána olvasgatok ennek csak néhol binárisban adják meg a lábakat stb amit nem tudok értelmezni.
A "(..)" részre azt raksz amit akarsz, a programrész ami kezeli a cuccost.
Más ötletem nincs hogyan írjam le...
Be irtam hogy kapcs++; es semmi :'D nem irodott hozzá mert a led ugyan ugy maradt.
Szervusztok,
milyen fejlesztő környezetet ajálnátok ha AVR mikrokontrolerekkel szeretnék foglalkozni ? melyik operácios rendszerrel Windows7/64 vagy esetleg Linux/64bit és melyik IDE ?
Én Windows 7/8 használok AVR Studio 6 és Eddig USBASP programozo most egy USBTinyISP 3.0 használok. remélem segiettem
![]()
Csak keresgélj, hátha nem kötöttél be valamit, felhúzó ellenállás, stb.
Vagy tudod mit? Csináljon annyit a programod hogy vár a gombnyomásra, ha megtörténik akkor kigyújtasz egy LED-et és kész, nem megy tovább (végtelen ciklus). Ha még ez sem megy akkor kezdd a LED kigyújtással, feltétel nélkül. Így kezdi mindenki...
Nem találok egy épkézláb leírást mindenhol az összes portot állítják be stb. Nekem kifejezetten Egy inputom kell, hogy legyen és azt figyelje.De mindenhol túl van cifrázva. Sajna nekem ez tul magas nincs a kezdő szintemhez mérten leirva mármint ahogy én Nyitom a portot a DDRB stb.
Bővebben: Link
Ennél egyszerűbben és érthetőbben nem lehet megfogalmazni. Idézet: „Nem találok egy épkézláb leírást mindenhol az összes portot állítják be” Ezt mire alapozod? A hozzászólás módosítva: Okt 12, 2013
Elöször a port irányát kell a DDRx- el meghatároznod pl. cbi DDRy,PBx. Ez a PYx lábat ( bitet) fogja az Y porton bemenetre kapcsolni.
Ezután már csak olvasnod kell az adott bemenetet, ha 1 akkor kapcsolhat valamit ( mehetsz tovább), ha 0, akkor ujra olvasod stb. ( azaz egy hurkot csinálsz) A hozzászólás módosítva: Okt 12, 2013
Bocsánat javítom az én szintemnek nem megfelelő.
[off] Az, hogy a te szinteden azt nem tudom értelmezni.
Azt neked kell tudnod, hogy melyik leírás felel meg a te szintednek.
Amit adtál leírást az segített köszönöm szépen (Bár a végére a return; nem kellet volna) az miatt nem ment eddig már majdnem írtam, hogy mi lehet a hiba.Köszönöm a segítséget.
Sziasztok!
Neki álltam kíváncsiságból avr-t programozni, "kicsit" haladtam is, de elakadtam és nem tudok rájönni hol.
Van ez a kódom hiba nincs benne legalább is a compilártor szerint, de nem úgy működik ahogy neki kellene. Amikor letesztelem akkor az a hibajelenség, hogy amikor lenyomom az egyik gombot akkor nem csinál semmit és ha lenyomom a másik gombot is akkor a kijelzőn meg jelenik az egy. Pedig úgy kéne, hogy működjön, ha egyik gombot nyomom le akkor egyik mutat 1-et, ha a másik gombot nyomom le akkor a másik.
A motor1 és motor2-be ez van:
A hozzászólás módosítva: Okt 13, 2013
Habár nem értem hogy jön a gombnyomáshoz az ADC... de a kód szerintem több helyen is hibás.
Nézd át ezt a kódot: Bővebben: Link
A legegyszerűbb helyzetben szeretném kipróbálni, hogy kell használni az ADC-t. Rendbe, átnézem a kódot.
Milyen kijelződ van?
Amúgy a readADC visszatérési értéke nem tudom honnan jön. És az init-et se kéne lefuttatni minden olvasás előtt, csak jól kell megírni az olvasás részt. De ebben remélem segít a linkelt kód, ott részletesen leírtam mindent.
A kijelző egy 11 digites 7 szegmenses kijelző multiplexelve és szétosztva úgy, hogy 4 digit, 3 digit és 4 digit. A multiplexelés se megy jól valami ott is el van rontva. A readADC az innen jő
Ez a kód 7-hez konvergál (Az OR művelet miatt az előző állapot megjegyződik).
Az AVCC be van kötve (VCC-re)? Az AREF és a föld között van 100nF kapacitás? A hozzászólás módosítva: Okt 13, 2013
Sziasztok,
3 db szervót szeretnék vezérelni egy ATmega328-cal. Szoft PWM-mel próbálkozok, azaz a program törzsben elvégzek egy ellenőrzést, hogy áll a számláló (TCNT1) és ha egy VÁLTOZÓ értéket meghalad akkor a servo vezérlő láb jelszintjét alacsonyba állítom. egyébként meg egy belső megszakítás minden TCNT1 ciklus végén magasba állítja ezen a lábon a jelszintet. Azt kellene megoldani, hogy egy külső interupt hatására ezen VÁLTOZÓ értéke 1 mp-ig megváltozzon, majd utána megint 1mp-ig egy másik értékre változzon majd utána álljon vissza az eredeti értékre. Azzal gondoltam, hogy a fenti ellenőrző ciklusba beleteszek egy számlálót amivel az időt tudom kontrollálni, de nem vagyok benne biztos, hogy ez a jó megoldás. Hogy tudom a leghatékonyabban megoldani? Gacserus
Én azért végiggondolnám mégegyszer. Egyrészt, miért kell PWM, miért kell az az 1mp-es várakozás, stb. Utóbbival az a probléma hogy egy szervó válaszideje ennek töredéke kell hogy legyen és ha beiktatsz egy ilyen várakozást, problémák adódhatnak.
Én így vezérelnék szervót, DC motort és H-hidat feltételezve: A szervó elektronika(AVR) valahonnan jelet kap hogy egy adott pozícióba kell fordulni. A megfelelő irányba elindulva a sima indulást PWM-el oldom meg(+H híd), úgy hogy minden PWM ciklus végén(ahol interruptol!) növelem a komparátor(OCRxA) értékét. Közben azt is lesem hogy a jeladó (és a rá épülő számláló) milyen közel van a célhoz. Ha már közelít, akkor a PWM-en keresztül csökkenteni kell(OCRxA). Ha már közel van akkor a H-hidat át kell fordítani, mert fékezni kell a cuccost. Nem árt a sebességet is figyelni a jeladón, mert ha ezt és a mozgatott cucc dinamikáját is figyelembe veszed, korábban el kell kezdeni fékezni, és még az is lehet hogy az ellentétes irányú áramot is csutkára fel kell tolni hogy pont ott álljon meg ahol kell. Ha jól csinálod, akkor ezután nem lengedezik a cucc a célpont körül. A hozzászólás módosítva: Okt 14, 2013
Sziasztok! Ezt szeretném megípteni de a at89c51-et nem sikerül felprogramozni, mert amit építettem programozót az csak az s szériát támogatja.
Valójában ez egy módosított servo, hogy folyamatos tudjon forogni és egy robot két kerekét hajtja.
Azt szeretném, hogy ha akadállyal találkozik akkor előbb tolasson 1mpig majd forduljon meg és menjen megint előre. gacserus
Szia!
Mellekelem az altalam irt kodot. ATMega8-assal leteszteltem, mukodik. A port D-re kotott max. 8 db szervo vezerlesere jo. A szervok vezerlojele 500-2500 ms kozott valtoztathato, de En csak 1000-2000 ms kozotti jelekkel vezerelnem a szervokat, mert hatha a szelesebb jelet nem birjak. A program fixen 20ms-onkent frissiti a szervo vezerlojelet. Megprobalom roviden osszefoglalni: Az ATMega8-nak 3 Timere van, ebbol 2db 8 bites es 1db 16 bites. Ezekhez osszesen 3db hardveres PWM lab tartozik (2db a 16 bites timerhez es 1db a 8 biteshez). Szoftveres szervo PWM-hez a 16 bites Timer1-et erdemes hasznalni. A 16 bites Timer1 0-tol 65535-ig tud szamolni, de beallithato olyan szamlamasi mod is, ahol meg lehet adni ennel kisebb maximalis erteket is (ez a TOP ertek). A peldaban egy 8MHz-es AVR-nel 8-as Timer1 eloosztast hasznalva, masodpercenkent pont 1000000-szor fog a timer lepni, ez pont 1us. Ha a timert ugy allitom be, hogy 2500-ig szamoljon, akkor pont 2.5ms-kent csordul tul. (Az ICR1 regiszter erteke adja meg, hogy meddig szamoljon a timer es ezutan kezdi elolrol). Beallithato az is hogy a timer mikor adjon megszakitast. A peldaban 2 megszakitast hasznalok. Az elso amikor a timer eleri a 2500-as erteket es tulcsordul (Timer overflow), a masik amikor a timer elszamol egy megadott ertekig (Output Compare megszakitas- ezt hasznalom a szervojel hosszanak beallitasahoz). A peldaban annyi az elteres a hagyomanyos Fast PWM beallatasoktol, hogy a PWM jelet nem adja ki az AVR az OCR1A es OCR1B labakra, csak a megszakitasokat hasznalom a szoftveres PWM idozitesere. A Timer tulcsordulasa utan bekapcsolom az elso szervo vezerlojelet. Ha a Timer1 elszamolt az elso szervo megadott poziciojahoz tartozo jelhosszig, akkor az Output Compare megszakitas lekapcsolja az elso szervot es beallitja a masodik szervohoz tartozo jelhosszt az Output Compare megszakitasban es beallitja a masodik szervot a Timer tulcsordulasahoz tartozo megszakitasban. Ha a Timer 2.5ms utan tulcsordul, akkor az egesz fenti folyamat kezdodik elolrol a masodik szervoval es igy tovabb a nyolcadik szervoig, ami utan ujra az elso szervoval kezdodik az egesz elolrol... A program a 8 szervot felvaltva allitja be a ket szelso allasba es a kozepallasba... |
Bejelentkezés
Hirdetés |