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
Ez csak egy próba. Azt próbálgattam vele, hogy ha bekattintom a szimulátoron a 0.bitet (PINB), akkor meghívja-e a szubrutint. Igazából a státusz regiszter bitjeit és a különböző Assembly utasításokat próbálgatom csak úgy minden cél nélkül.
De jó lenne tudni, hogy ha a szimulátorban a program legelejére ugrik a mutató, akkor a valóságban is úgy van? Mert lehet ott olyan utasítás is ami éppen felülírja a stackból elővett regiszter tartalmát. Kipróbáltam a te verziódat - ami lényegesen kiforrottabb az enyémnél - de a ret utasítás után az "rjmp reset" sorra ugrott vissza. Én meg azt hittem, hogy a "jmp program"-ra kellene. Vagy mégsem így van?
Hali
Nem vagyok atmeles, de a szubrutint altalaban nem "jmp" utasitassal erjuk el, hanem "call" utasitassal. Tehat:
Udv Vili
Ezek szerint a breq és a hozzá hasonló utasításokkal nem lehet szubrutint hívni?
[szerk] Megvilágosodtam! Hát pesze, hogy nem! Köszönöm mindkettőtöknek!
Hali
Az egyik tipus ugro utasitas, a masik hivo. Azert jo a "call" utasitas, mert mikor sokszor kell hasznalni ugyanazon utasitasok sorozatat ( Pl. "delay" ), egyszer megirod a szubrutint, es ezerszer is meghivhatod. Viszont a kodban csak egyszer kerul bele. Udv Vili
Közben már rájöttem, de azért itt is megköszönöm.
Sokat segítettetek.
Szia!
Elég nagy butaságot írtam...
A "breq" elágazás után nem "ret"-tel kell visszatérni, mivel nem szubrutin hívás (call) történt... Bocsi a félreértés végett, még én sem vagyok profi...
Viszont ezzel a részlettel is nagyon sokat segítettél.
Majd jövök még biztosan. Köszönöm ismét mindkettőtöknek!
Igazából ezzel még nem volt dolgom, tudnál adni valami forrást hozzá, hogy tudnék elindulni rajta? Előre is nagyon köszönöm!
Sziasztok!
Lassan készen van a tervezett "beléptetőrendszerem" szoftvere. Már csak egy apró részlet vár megoldásra. Ez pedig az, hogy adott idő eltelte után (10sec pl.) a beütött kódot nullázza ki. Azért hogy, ha véletlen megnyomódik egy gomb ne legyen letárolva annak értéke ki tudja meddig. Remélem érthetően fogalmaztam. Az általam megírt beolvasásért felelős függvényt egy for ciklus hívja meg annyiszor ahány jegyű a kód. Miután a függvény a beolvasott értékkel visszatér elindul egy számláló ami minden gombnyomáskor nullázódik. Ha viszont eléri az adott időtartamhoz tartozó értéket akkor az egész kód beolvasása kezdődik elölről. Hogyan oldható ez meg melyik timer modul-t használjam hozzá? Egyáltalán jó-e ez így ahogy elképzelem? Köszönöm!
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=50106
Itt talalsz valaszt az idozitos kerdesekre.
Nekem viszont a promlemam a kovetkezo:
Konstrukcio a kovetkezo: GND =vezetek=> gomb1-2-3 =vezetek=> PIND 5-6-7 Igy elvileg akkor van 0 a PIN-en, ha a gomb le van nyomva. Namarmost miutan az EEPROM-ba iras megtortenik, a main fv elejere ugrik a progi, es a PIND7-re meno gomb allapotatol fuggetlenul ugrik be a setup fv-be. Mit rontok el? Gyanitom valami nagyon alapveto dologrol van teves elkepzelesem szerk: Az AVRstudio debugere azt mutatja, hogy a gombok() fv hivasakor ugrik vissza a main() elejere.
Van gombok() függvény? Mert itt nem látszik.
termeszetesen.
Most igy probalkoztam:
Ennek hatasara, amikor a debuger a MCUCR =... sorhoz er, akkor urik vissza a main elejere. ISTENEM! Az INT1 lab egy sajat kommunikacios protokollhoz kell. Namarmost jol latszik, hogy komment szerint INT0-t kapcsolok be, de az egy masik projectben vmiert nem mukodott rendesen ( talan mar arra is rajottem ), ezert attettem INT1-re. Mivel mellette pont szabad volt egy lab, igy inkabb ebben a projectben is atirtam, azonban az ISR(INT0_vect)-et nem. Ha jol tudom MCUCR/GICR valtozaskor generalodik egy interrupt, es ennek a kezelojet kereste volna, es mivel azt nem irtam at, ugrott a main elejere.
Meg mindig nem jo.. Viszont most mar a debuger szerint mukodnie kellene.
Megprobalom kideriteni honnan ugrik vissza, mert igy dbg nelkul fogalmam sincs.
Sziasztok!
Jól értelmezem, hogy Attiny45-nél a TCNT0 egy olyan 8 bites regiszter melynek értéke minden ("x" előosztás esetén F_CPU/x) órajel után inkrementálódik és nullázni/megállítani ezt a számlálót a TCCR0=0x00; paranccsal lehet? Valamint a flag bit szerepe az, hogy túlcsordulás (TCNT0=255 elérése) után 1 értéket vesz fel? Egyelőre csak tapogatózom a Timereket illetően, remélem nem kérdeztem túl nagy hülyeséget Köszönöm szépen!
Bővebben: Link
Észreveszitek a hibát? Én még agyalok, hogy vegyek-e ilyet...
Táp és kvarc kell csak neki, és már megy is a cucc!
Helló!
Atmega8-nál használom az I2C portot és 7szegmenses kijelzőhöz multiplexnél használnám még az alsó 4 bitjét a C portnak a digitek meghajtásához. Nem fogja zavarni egymást, hogy az I2c is a C porton van, és én is használnám közben a port többi részét?
Hat ha zavarna az eleg kenyelmetlen lenne Atmelre nezve.
Ha megfelelően kezeled a regisztereket, akkor nem kellene zavarnia.
Oké, köszi a válaszokat. Már csak egy gondom van. Csináltam egy egyszerű megszakítás alapon működő multiplexelést, de nem megy sehogy. VFd kijelzőt használok, ehhez van csinálva a program is. Világít az összes szegmens, tehát a portok nullán vannak, pedig már a program elején mindkét portot magas szintre kapcsolom. Ötlet?
Szia!
Én úgy látom, mintha, nem lenne benne végtelen ciklus. A main()- ből milliszekundumon belül kiér a program és visszatér 0-val. Javaslatom, hogy a
ilyet:
A végtelen ciklusod amikor fut, attól az interrupt ugyanúgy be fog következni. Remélem tudtam segíteni. Üdv!
Sajnos ez sem segít(egyébként volt benne, de akkor sem ment), mintha el sem indulna a processzor, mert a portokat sem húzza fel magas szintre. Eddig tökéletesen ment ez a proci, csak most ezzel nem akar menni.
Szerk.: Hülye voltam és figyelmetlen. Nem is azt a programot töltöttem bele. Megviccelt az avr studio.
Valami még mindig nem jó. elindul most rendesen, majd 2-3s múlva kiakad és csak 1 digiten mutat egy számot és kész. Áramtalanítás után megint meg pár másodpercig és kész, megint megadja magát.
Ne hívj delay-t interruptban. Alapszabály és vérzik a processzor tőle.
Használj státusz változót, és egyszerre, egy interruptban csak 1 számjegyet frissíts.
Szia!
Ha a szám 1234 decimálisan, akkor a 38. sor még jó, hiszen a (szám % 10) értéke 0..9 közé esik. A 41. sor már túlcímez a tömbön, hiszen a 1234 / 10 = 123, ami nagyobb, mint 9. Ide a
kellene. Ugyanígy a 44. sor is túlcímez a seg tömbön, ide a
kellene. A 47. sor csak azért jó, mert a szam <10000.
Valóban ezzel is gond lehet, sőt.
Egyébként ilyet inkább úgy célszerű megírni, hogy van egy tömböd...
Sziasztok!
Egy stoppert készítenék aminek nem kell atomóra pontosnak lennie de századmp-t mérne. Szerintetek használjak simán delay-t végtelenitett ciklussal vagy a Timer-ral probálkozzak? |
Bejelentkezés
Hirdetés |