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
Helló
Iskolába kell egy feladatot csinálnom, ami a következő: egy LED kijelzőn kell 99től 2másodperces intervallumokban visszafelé számolni 0ig, megszakítások segítségével, utánna ha a kijelző értéke elérte a 0át, akkor villogtatni két LEDet majd folytatni a számlálást megint 99től. Az egészet leprogramoztam csak az egyik megszakítás után ahol a reti utásítással vissza kéne ugrania a kód elejére egy teljesen más helyre ugrik és fogalmam sincs miért csinálja, felvettem az egészet videóra a reti parancs után pár sorral feljebb ugrik az ldi kezdetű sorhoz, ahelyett hogy az elejére ugrana. Valaki tudna segíteni? Köszönöm A hozzászólás módosítva: Jún 8, 2013
Sziasztok bocsi hogy zavarok na szoval sikerült némi előrelépést csinálni a projektemben csak elakadtam.
Forráskód:Bővebben: Link Eredeti: Bővebben: Link ez alapján csináltam/módosítottam de akármit csinálok a led nem világit se fényre se sötétségre.Valaki segítene, hogy mit ronthattam el??Köszönöm előre is. Link javítva. Kérlek használd a LINK gombot! A hozzászólás módosítva: Jún 9, 2013
Szia!
Az eredeti kodban 2 db LDR-en let megmerve ADC-vel a fenyero. Az ingerkuszob valtozoval azt lehetett beallitani hogy a 2 mert ADC ertek kulonbesege legalabb mekkora legyen, aminel a robot elkezd fordulni (a cikkben 8-as erteket hasznaltam). Te nem 2 erteket hasonlitasz ossze, a kododban hasznalt 1-es ertek nagyon keves. Probald meg 50, 100, 150 es 200-as ertekkel (nem tudom milyen LDR-t mekkora ellenallasokkal egyutt hasznalsz).
Akkor az ingerküszöböt állítgassam csak?
Igen. Az ADC-vel mersz egy 0-255 koze eso szamot. Ez fog valtozni ha az LDR-t megvilagitod majd letakarod hogy sotetben legyen. A legjobb az lenne ho soros porton kiiratnad az ADC ertekeket PC-re, akkor pontosan latnad hogy mennyit valtoznak az ADC ertekek es a kuszoberteket is konnyebb lenne beloni...
Tranzisztorral meg csináltam ott egy 100K ellenállást használtam és pöpecül ment. Gondolom ide kisebb kell de hiába cserélgetem az ellenalasokat es az értékeket semmise történik.
Tranzisztorral meg csináltam ott egy 100K ellenállást használtam és pöpecül ment. Gondolom ide kisebb kell de hiába cserélgetem az ellenalasokat es az értékeket semmise történik.
Modositás:Bővebben: Link ezt használom. A hozzászólás módosítva: Jún 9, 2013
Merjed ki hogy az ellenallasoszto kapcsolasban mekkora feszultseg van az LDR labain, ebbol is lehet kovetkeztetni arra hogy kb mekkora lesz az ADC ertek.
Őő rendben bár ha 255 re van allitva (ahol érzéketlen akkor vagy világítania kéne vagy világítania kéne nem?).Bár lehet maga a kód is hibás ahogy átírtam.
Csak a nagyobb logikai hibakat neztem a kodban, reszletesen nem neztem hogy mas hiba is van-e.
Mert van a kép az LDR ADC bekötésére megcsináltam (az ADC lábról megy az ellenállás ugye a GND re?)
Ugy kell bekotni, ahogy ezen az oldalon a vonalerzekelo szenzorra vonatkozo reszben leirtam (a LED-et es az 510 ohm-os ellenallast hagyd ki, az nem kell neked)
Bővebben: Link
Szerintem a kóddal van a gond mert lehet kivettem a jobb "LDR" de lehet az összehasonlítás vagy az IF ami nem jó.mert most is végig próbáltam 10 töl az értékeket de semmi és 47K,100K,100Ohm 47ohm ellenállásokkal próbáltam végig.
A program sem jo. A PB0-as labra kotott LED-et kapcsolgatod.
A PB4-es labat allitod be bemenetnek es erre kotod az LDR-t, a kodban viszont az LDRbal = Beolvas8bitADC(0); utasitassal a PC0-as labon levo feszultseget olvasod be. Raadasul ha Atmega8-ast hasznalsz, akkor csak a portC labai az analog bemenetek nem a portB ...
Látom, alapvető villamosságtani ismeretek hiányoznak. A képen egy ilyet látsz.
A tekercs legyen 47uH-100uH, a kondi 470nF-10µF közötti. A hozzászólás módosítva: Jún 9, 2013
Bocs!
A sietség átka! Töröld a linkből a ;-őt! 60 nap alatt Arduino #35 - Programozás/Bootloader Közben Robert Mester is bejelentkezet!
1. miért assembly-ben programozol? A C simán lekezeli az egészet helyetted.
2. a RETI a vermet használja, mint visszatérési címet Ha lenyomsz a verembe push-sal valamit, amit elfelejtesz kivenni, vagy pop-pal többet veszel ki, mint kellene, akkor a RETI értelemszerűen máshová fog visszaugrani. Ha C-ben programoznál assembly helyett, ilyen problémád nem lenne egyáltalán, mert a C elintéz mindent helyetted 3. minthogy a reti visszatérési értéke a veremben van simán felül tudod írni, lásd a kódomat
A hozzászólás módosítva: Jún 9, 2013
Iskolába kell neki(le is írta az elején) azaz meg van kötve a keze. Assembly és kész!
Nálunk (BME) szintén assembler volt a kötelező, az AVR GCC-vel évekkel később találkoztam.
ASM rutint keresek léptetömotorhoz.
Adott az idö és a lépésszám. A motornak optimálisan kellene gyorsulnia illetve lassulnia az adott határok között ( pl. 10 mp alatt tegyen meg 100 lépést szépen kigyorsulva és lassulva). Kösz.
Nem akarlak megsérteni, de ez MICSODA? Alapvető problémák vannak a programoddal! És nem az a legnagyobb hogy rossz helyre térsz vissza. Kezdeném a legsúlyosabbal: az SREG-et és a felhasznált regisztereket miért nem mented és töltöd vissza az interruptban? Ülj le fiam, egyes!
A következő probléma már az átláthatósággal van. Látom hogy kiugrasz az interruptból, és máshol adod ki a reti parancsot. Ez nem olyan súlyos, mert az ugrással nem végzel veremműveletet, bátran lehet ugrálni egy interrupton belül. De: az előző bekezdésben láthattad hogy vissza kell tölteni az r16-ot és az SREG-et, ami a RETI előtt még 3 sor. Ezt minden RETI elé be kéne tenni, ami macerás és veszélyes ha valamit elfelejtesz megduplázni. Ezért a Te érdekedben tartsd tiszteletben a szabályt: az interrupt legyen egy független blokk, egyetlen belépési és egyetlen kilépési ponttal! Hogy érthető legyen:
Itt direkt ugrást tettem be hogy látványos legyen, de az SBIC sokkal szebb(SBIC SREG,Z). A harmadik probléma, hogy inicializáláskor nem állítod be a stack pointer-t. Pedig kell, ha a programodban használsz 1:szubrutin hívást; 2:interruptot; 3: stack-ben tárolást. Elvileg körbefordul(indításkor zérus), de azért jobb ha beállítod:
Egy kis segítség assemblerhez a csatolmányok között, hasznos!!! A hozzászólás módosítva: Jún 9, 2013
Úgy beszélsz, mintha sosem lettél volna diák életedben.
Egyelőre nem tiszta számomra, hogy mi akadályozza meg abban, hogy megírja a programot C-ben, a generált assembly kódot meg kisebb-nagyobb változtatásokkal beadja. Én úgy tanultam meg az AVR assembly-t, hogy kielemeztem, hogy mit fordít a fordító. Sajnos időnként még előfordul, hogy jobb kódot generál nálam, de ahhoz több tudás kell, hogy megverjem sebességben és méretben. A hozzászólás módosítva: Jún 9, 2013
Köszönöm a bő választ, sokminden tisztázódott belőlle. Abból a hibás feltételezlsből indultam ki, hogy a ret és reti utasítások vissza ugranak az elágazás, megszakítás, stb, helyére.
Ha azt adja be aztán rákérdez hogy ez miért, az miért? Neki assemblerben kell MEGÍRNI és BEADNI. Melyik része nem érthető?
Igen, mondjuk puskázni is tudni kell. Egy pedagógus mondta nekem, hogy aki hülye, az puskával is 1-esre írja a dolgozatát.
Természetesen ha az avr-gcc LIBC-s részét bemásolod az interrupt tábla utánra, akkor ha életében egy C projektet már lefordított a tanár, látni fogja, hogy a kód generált. Diákéveimben gyakran éltem olyan eszközökkel, hogy megnéztem, hogy a nagyfiúk hogyan számolnak ki egy elektronikai kapcsolást. Utána a saját egyenleteimet úgy alakítottam, hogy az jöjjön ki és fele annyi idő alatt oldottam meg a feladatot, mint mások. A számológépemben ott volt a 3-ad 4-ed fokú egyenletmegoldó képlet, kivágta az összes gyököt, ezután leírtam, hogy "vegyük észre, hogy a 12 megoldása az egyenletnek"... (nem mertek a tanárok csak olyan köbös egyenleteket írni, ahol az egyik gyök találgatással kiszámolható volt, de hülye lettem volna találgatni).
Még azt szeretném kérdezni, hogy ha beugrok egy elágazásba így:
Visszaugorni és folytatni a főprogramot így kell, vagy van rá valami szebb trükk?
Nem tiszta, hogy a LOOP-ot mire akarod használni,
C-ben:
Lefordítva:
Te a kódodban összevissza rjmp-zel, ez pedig szerintem felesleges.
Ami még itt érdekes, hogy a gcc fordító
Ergo: levont a regiszterből -1-et növelés helyett. A két utasítás teljesen egyenértékű, mégis látszik, hogy a kód generált, mert normális ember inkább növeli a számlálót, mintsem -1 -gyel csökkentse.
Igen, ez így van, még csak ismerkedek a témával.
Még egy olyan kérdésem lenne, hogy ezt a kis részt az AVR és a MOSTFET közé tegyem, vagy a MOSFET és a ventilátor közé?
LOOP részbe nem szokás beleugrani, pontosan az ellenkezőjét kell csinálni. Ha a korábbi, azaz a LOOP-ba ugrás feltétele NEM teljesül, akkor ÁTUGROD, egyébként "belefutsz" a LOOP-ba.
Illusztrálom:
|
Bejelentkezés
Hirdetés |