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
Órajel frekvencián állítottál? A programban megadtad, hogy mekkora frekvencián megy a cucc?
meg adtam mindent 125khz-n írtam be és az avr studió automatikusan állítja be a frekvenciát
Az elv nagyon egyszerű.
Bővebben: Link Az elv gyakorlatilag ugyan ez, annyi a különbség hogy invertált a felhúzó ellenállások miatt a T-Bird Exp panel. Mellékletben egy nagyon egyszerű általam a demókhoz írt billentyűzet olvasó rutin.
Köszönöm a segítséget!
Az egyszerűből azért arra következtetek, hogy van még hova fejlődnöm. , azért a következő 11hónap csak elég lesz megéretni.
Schuster Gyuri? Humm, valaha diákja voltam. Beszélnem kellene vele az említett két írás miatt!
Engem Ő még nem tanított, majd Infó2-őt fog Ő is tanítani.
Sracok, nem kellene az offokat valahol mashol megbeszelni?
Billentyűzet kezelő függvénnyel kapcsolatban lenne kérdésem. Csak két sor szorulna magyarázatra.
Mi történik ebben a két sorban? Sajnos ilyen rövidített formákat soha nem használtam.
Bitenkénti logiaki operátorok
Az általad írt 3. sorban kitörli a KBRD_PORT változóban a KBRD_MASK értékeit. Az 5. sor magáért beszél. Összeéseli a 7-ik bitet önmagával, majd beír a 4-ik bitbe 1-et.
Az oldalon lévő Nyolc lábbal AVR IV. részének az RGB hangulat világítás című kapcsolását szeretném kicsit átírni, a következő képpen:
Egy nyomógomb használatával választani 4 opció közül: 1: csak piros fény 2: csak zöld fény 3: csak kék fény 4: RGB színkeverés Úgy megtudtam csinálni hogy ezt 4 különböző gomb megnyomására csinálja.
A gg értéke csak a gomb lenyomásának az idejére lesz 2. az if(gg==5) gg=1; sorral szerettem volna a 4. állapot után visszatérni az elsőre, de sajnos a 2. állapotra se jutottam el. Hogy lehet ezt megvalósítani? A választ előre is köszönöm: Tecsa
Nem csoda. A g változó csak addig él a gomb() függvényben, amíg az fut. Hiába írsz bele bármit is, legközelebb megint 1-re inicializálod. Keress rá a static előtagra.
Sziasztok
Egy ADC értékét szeretném 7 szegmenses kijelzőre kiírni. Addig eljutottam hogy az ADC-t beolvastam és egy nyolc bites értéket kaptam.
0,9V nál kéne 0 és 4,5V nál 40et kiírni 3digites kijelzőre. A harmadik digit csak tizedes jegy lenne (0,5 pontosság elég) Ebben kérném a segítségeteket, én elég kezdő vagyok ehhez. Ahogy számoltam nem jönne ki egészre az értékek közötti különbség (4,6onként) . De gondolom ezt így nem lehet beírni neki... Valakinek nincs ötlete hogy lehetne megoldani? A legjobb az lenne ha egy külön byteos változóba be lenne írva az érték 0-40ig és egy külön változóba a tizedesjegye. A kijelző vezérlése már megvan. Minden segítséget szívesen várok.
Sakkozd ki milyen matematikai függvénnyel valósítható meg a dolog. Gyanítom lineáris lesz ez a függvény.
x=0,9 -> y=0 x = 4,5 -> y =40 Ha nem megy a matek, akkor írd be excelbe egy x-y grafikonba és az megmondja a függvényt ami közelíti.
Kedves hozzárétők!
Vagy egy AT90USB1287 AVR-em,a mivel kicsit meggyűlt a bajom. Elég misztikus hibákat produkál, amit arra tudtam visszavezetni, hogy UART adatküldéskor resetelődik a kontroller. A probléma akkor derült ki, amikor visszaküldettem vele a belső adatokat. Kiderült, hogy az UART-ről beolvasott adatokat simán eltárolja, de ha vissza is küldetem, a küldés után minden belső változó újra inicializálódott. Ez a gyakorlatban úgy néz ki, hogy az első UART parancs hatására minden, korábban UART-on kapott adatot visszaküldött, a közvetlenül utána küldött kiolvasó parancsra viszont már csupa null érték jött. A végletekig egyszerűsítve mutatja a problémát az alábbi forrsákód, melyet futtatva végtelen mennyiségű '?' árasztja el a soros portot.
Ebből a callAllInit az alábbi USART initet hívja:
Az enableTransciever ezt a két függvényt hajtja végre:
A sendChar() pedig így működik:
Van valakinek ötlete, hogy ez mi lesz?
Nem csak resetelődik az egész AVR? Nem tudom fut e watchdog, mindenesetre ne fusson.
Hogy mi okozott resetet azt eltárolja a MCUSR registerben, azt ki tudod olvasni, hátha okosabb leszel. Ilyen fura adateltűnéseket tömbön kívüli írások okozhatnak. Nézd át, hogy mindenhol jól kezeled őket. A kódod átlesve bennem erősen él a watchdog gyanú amúgy.
Elvileg induláskor kilövöm a kutyát. Lehet, hogy valami visszakapcsolja? Azért fura, mert akármeddig elmegy koherensen, beleírom az adatokat és fél óra múlva is ki tudom olvasni, majd jön a reset.
MCUSR szerint power up down reset volt. A tápot egy step-up converter állítja elő, de rámérve szépen adja a 3,3 voltot. Szkópom viszont nincs. Akkor hogyan tovább?
A fuse beállításokban a WDTON (Watchdog timer always on) fuse-zal mi a helyzet?
Bár a MCUSR állapota szerint valszeg nincsen bekapcsolva. De próba cseresznye.
Ki van lőve, és az MCUSR szerint sem WDT resetből áll fel.
Igen, az szerkből már ment tőlem is (bocsánat).
Akkor még a következő gondolatom támadt: WINAVR féle Avrgcc-vel fordítod, vagy az atmel féle Avrtoolchainnel? Utóbbit nagyon szídják az avrfreaksen, egyszerűen bugosnak ítélik a legtöbben. MCU típusa biztos At90USB1287-re van állítva a makefileban?
Van egy szep buglistje, de a legtobb nem valami komoly hiba, hanem az optimalizacio hianya. Attol nem fog ujraindulni a uC.
Probald meg, hogy ideiglenesen mashonnan taplalod meg egy sima atereszto tappal (pl. 9V elem vagy usb port + 3.3V-os stab). Ha akkor is ez a hiba, akkor biztos nem a tappal van gond.
Az alapproblemadhoz visszaterve: nekem ilyen jellegu hibak akkor szoktak elojonni, ha a stack eleri a valtozokat.
Sziasztok!
74HC595-ös shift regiszterekből álló rendszert illesztenék AVR-hez. Nem ez az első, már több sikeres eszközt építettem ezzel a módszerrel. A probléma hogy a tápfeszültség ráadásakor egy pillanatra az összes kimenet "HI" állapotba kerül ami egy ilyen vezérlőnél nemkívánatos jelenség. Még az AVR-t sem építettem bele hogy megbizpnyosodjak, nem-e az okozza a problémát. Hát nem! A panelt úgy terveztem hogy a shift regiszter "/MR - Master Reset" bemenetére felhúzóellenállás-kondi párost kötöttem, a "/G" lábakat pedig automatikusan a földpontra. Ez nem vált be, és az IC adatlapjából azonnal rá is jöttem mi a baj: a Master Reset csak a shift regisztert törli, a Latch-et nem! Megáll az ész... (Az eredeti terv egy részlete a csatolt képen is látható.) Ezután a "/G" bemenetet levágtam a földpontról, tettem rá felhúzó ellenállást(2k2), és az AVR-re kötöttem. Mivel így a shift regiszter kimenete nagyimpedanciás is lehet, a FET-ek lehúzó ellenállást is kaptak. Így a Gate vezérlését is az AVR-re bízom, de ez sem vált be: most már nem villantak fel a LED-ek, de ha sokáig nem kap áramot(több óra) akkor a jelenség megismétlődik, a LED-ek felvillannak. Most az összes felvillan, de az eredeti megoldással csak azok amelyek a kikapcsoláskor HI állapotban voltak. Mivel tudnám ezt a hibát megszüntetni? Segítségeteket előre is köszönöm.
Valami problema lehet a keppel, amit feltoltottel, mert sem a bongeszo nem jeleniti meg, se a photo viewer, ha letoltom.
De ha az OE lab a tapra van huzva, akkor biztos nagyimpedancias allapotban kell lennie a kimenetnek. Ha ez megsem igy van, akkor vagy az OE lab nincs tapon(uC valamiert lehuzza) vagy hibas az IC.
Valamiért nem engedi feltölteni. ITT elérhető.
Pár perce már leszedtem az AVR-t, én is gondoltam rá hogy az okozza a hibát. A következő bekapcsolásnál újra villant a cucc, szóval nem az volt a gond...
En a tobb ora utani felvillanasra gondoltam, amikor a uC hibajat emlitettem.
Sajnos ezeknel az IC-knel nincsen semmilyen garancia arra, hogy bekapcsolaskor ugy viselkedik, mint ahogy te szeretned. Ha a jelenseget meg szeretned figyelni, akkor adjal neki kulon tapot labortaprol es lassan noveld a tapfeszultseget, hatha megtudsz valami erdekeset. A kimeneten a villanast szerintem RC vagy LC taggal szurd ki. Ha ez nem megoldas, akkor egyebb aramkori kiegeszitesen kell gondolkodni. Peldaul hasznaljal kettot ebbol az IC-bol, es a LED-eket ket szomszedos lab koze kossed. Igy csak akkor fognak vilagitani a LED-ek, ha 10(vagy 01, bekotestol fugg) bitsorozatokat kuldesz ki.
Sajnos nem megoldható a 2 shift regiszter, ráadásul nem a LED-ek vezérlése a cél hanem a FET-eké.
A LED-ek csak visszajelzésre szolgálnak, a korrekt visszajelzés érdekében a FET hajtja meg őket...
Igen, most neztem meg a masik helyre feltett kepet. Ugy latszik, akkor marad a szures. Esetleg probalj meg egy masik tipust, pl. a HCT595-ot. Vagy egy masik gyartotol szarmazot probalj ki. Ha ezek sem valnak be, akkor a kritikus alkalmazasokban inkabb microchip fele i/o expandert hasznalj.
Van egy "misztikus" hibám. Nem tudom találkozott-e valaki ezzel, vagy volna-e valakinek ötlete:
Adott egy Atmega168, amelynek a TWI portjára van kötve egy PCF8583 óra IC. A kapcsolásban +5V-os tápra nagyobb kondenzátor van kötve, hogy ha elmegy a táp az atmega még EEPROM-ba ki tudja írni a státuszát. Az AVR-ben lévő program folyamatosan olvassa a PCF8583-at (00-04 regisztereket) és ez alapján megjeleníti az időt. Probléma akkor van, ha át akarom állítani az órát. Amikor a program beírja az új értékeket a fenti regiszterekbe az óra lelassul (sacc/kb a felére, 2 mp alatt vált 1 mp-et). Először arra gondoltam, hogy a programmal van valami baj, de ha reset-elem az atmegát a jelenség továbbra is fenn áll. Utána arra gondoltam, hogy rossz érték kerül beírásra a PCF8583-ba, de ha néhány másodpercre megszakítom a tápot, akkor az atmega újra indul, de az óra még megtartja a beállított értéket (a fent említett kondenzátorok miatt), viszont ez után már újra jól működik a következő beírásig. Bárkinek volna ötlete mit nézzek meg vagy merre induljak?
Megvan a gond, nem volt lekezelve a TX complete interrupt, ez hülyítette meg.
|
Bejelentkezés
Hirdetés |