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
Ezeket a beállításokat hol érem el az Atmel Studio 6.0-ban?
Ez hogyan fordult neked?
Idézőjelbe kellene a %1.4f-et írni.
Sziasztok
Olyannal találkoztatok már, hogy port egyes lábai nem adnak le áramot? Jelenleg LED-ek vannak rákötve portra, amelyik lába működik ott 4,95V és 4,5mA van. De pár meg csak halványan világít 4,75V-nál 90uA-t ad ki magából. Van rá esély hogy ez csak valami szoftveres hiba lesz? Múltkor próbapanelól kötöttem rá ezt azt, könnyen meglehet hogy ott valami összeért aminek nem kellett volna. De az érdekesség a dologban, hogy ezek a lábak között vannak az ISP lábai is, amin keresztül programozni tudom. És a másik dolog, hogy a programozó se volt lehúzva róla teszt közben és az meg működik (mondjuk legközelebb asszem erre jobban figyelek majd) Van valami ötletek mi okozhatja a hibát? Elég drágáért adják az IC-ket, ha nem fontos nem vennék újat.
mega644 portB 2-7 lábai. A portB többi lába megy, a portD, portC-t néztem még azok működnek.
Hát akkor nincs tippem, hacsak nem a PORT-C 2-7 nem stimmel, mert oda van kivezetve a JTAG.
Alapból engedélyezve van... a fuse biteknél lehet kikapcsolni, hogy normál i/o lábként működjenek.
Hardwareből is tiltható a JTAGEN fusebittel és/vagy a szoftveresen is van regiszterírással erre mód.
Közben rátöltöttem egy régebbi programot, azzal hiba nélkül megy, minden kimenet működik.
Úgyhogy most már tippem sincs mi lehet a baja. DDRB 0xFF-be van állítva itt is, és ráadásul PORTB-t csak a mainből írom egyszer, utána sehol nincs a programban.
Lehet hogy a fordítónak más IC-t adtál meg. Ezt nem az égetéskor adod meg, hanem a Project Options részben. Na meg az SPI is ezeken a lábakon van, azaz ha bekapcsolod a programban akkor a lábakat másra nem tudod használni.
Az SPI-hoz nem nyúltam, azon csak a programozó van. Az IC is jól van beállítva. Timerekkel lesz valami gubanc.
Külön programban nekiálltam részenként végignézni, ott a TIMER1-el volt baj. Elnéztem és overflowra állítottam compA helyett, utána már működött rendesen. Na de mikor ezeket a módosításokat megcsináltam az eredeti programban is, az továbbra se ment. Azt meg már végkép nem értem, hogy ugyan annál az előosztásnál mért hívódott meg gyorsabban a megszakítás overflow-nál mint mikor OCRA-ra komparáltam. Úgyhogy próbálgatom tovább hátha meglesz a többi hiba is
Esetleg még amivel probléma lehet, hogy két timert használok. Timer0-át használom 7szegmenses kiaratáshoz meg később majd gombok kezelésére, és a 16bites Timer1-ből pedig egy 1sec-es megszakítást az órához. Elvileg kettő mehet együtt és Timer1 a nagyobb pioritásu mivel az van előrébb a megszakítás vektortáblán, de ezekben már nem vagyok 100%ig biztos.
berakom a kódot is hátha ti látjátok benne elsőre a hibát. De asm-ben kell írnom, ami hibakeresést nagyban nehezíti...
Csak apró lépésekkel előre. Ha nem vagy biztos egy kódrész működőképességében, ugord át vagy előtte állítsd le az egész program működését. Utóbbit kb. így:
Na meg a másik: túl sok a makró, nem szeretjük! Helyette szubrutint(függvényt) illik használni. A stack init részt egyből a "main" legelejére kell tenni, ne rakd külön makróba!
Igen én is így lépésenként nézegetem, szép lassan haladok vele. Mondjuk eddig kikommenteztem a feles részeket, de így megállítani egyszerűbb lesz.
A makrókat meg mi úgy tanultuk, hogy a fordító egy az egyben bemásolja oda a kódrészletet ahol meg van hívva a makró. Ezért is csak inithez raktam mert ha pl olyan van amit többször meghívok akkor az már szubrutinba megy. Bár azon kívül hogy átláthatóbb lesz tőle a kód más előnyéről nem tudok a makrónak.
Makrókat nem szokás úgy tanítani hogy "átláthatóbb lesz a kód". Ez egyébként igaz, én is
folyamatosan használok ilyet, de egy kezdőt pillanatok alatt össze lehet velük zavarni. A rövid (1-2 soros) makrókat azért jó ha megtartod, pl. portbeállításnál jobban néz ki.
A makrok fö elönyét abban látom, hogy egyszer kidolgozol egy bizonyos lépést, amit aztán késöbb mindig a makro kezel ( pl. én gyakran használok word-ket, amikhez makroban egyszer megirtam azokat a lépéseket, amit a word-ökkel általában tenni kell - hogyan irod öket a regiszterekbe stb.) .
Makró: gyorsabb program futás, viszont nagyobb kódot generál ha többször használjuk (egyszerűbb kifejezéseket szoktak makróban megírni)
Szubrutin: Lassabb mivel ugrásokat tartalmaz, viszont kisebb kódméret gyakori használatnál
64bites Win8 alá megoldható a Topi féle AVR Doper driver telepítése?
Sehogy se jön össze nekem. Eszközkezelő felismeri, de a driver telepítés nem sikerül.
Bootoláskor, F8 majd aláírás ellenőrzés kikapcsolása. Ezután fel lehet telepíteni, de minden használatkor így kell elindítani a gépet.
Sziasztok!
Van egy 8x8-as mátrixom (led). Úgy oldottam meg a meghajtását, hogy tranzisztorok kapcsolják a sorokat tápfeszre (persze R van előttük). Ők az A porton vannak, tehát A0-A7-ig. Az oszlopokat invertereken keresztül kapcsolom testre. (Egyébként C0-C7) S így a kódban 1-esekkel tudok dolgozni... Kérdés: Jó ez így? Sikerült is egy smile-t kirajzolni. Ezt úgy csináltam, hogy az első sorban (A0) bekapcsoltam a középső 4 ledet (C2-C3-C4-C5). Ez világít 3 ms-t. Majd következő sor, aztán megint, megint.... És kész is. Egyszerűbben meglehet ezt oldani? Esetleg a sorok váltását megszakítással vezérelni? Vagy valamilyen számlálással? Tud valaki egy kis magyarázattal mutatni egy irányt, hogy mégis, hogy csinálják ezt a nagyok? Egyenlőre animációra nincs szükségem, csak a megjelenítés... Persze, jó lenne majd ezt a smile-t mozgatni is... Köszönöm szépen! ![]()
Szia!
Amíg úgy működik ahogy Neked jó addig jól csinálod. Ha rosszul csinálsz valamit vagy túlbonyolítod, azzal csak magaddal szúrsz ki. Meg néha velünk is. ![]() A cuccnak a háttérben kell futnia(igen, sorváltások!), időzítő megszakítás használatával. Értelmes animációról ne is álmodj amíg ez nincs meg! Meghajtás: az ellenállásokat a "gyengébb" oldalra tenném, de igazából mindegy, a lényeg hogy egy egyetlen világító LED-et tartalmazó sor LED-je ugyanakkora fényerővel világítson, mint egy másik sor összes LED-jei ahol az összes világít. Invertert bátran tehetsz oszlop és sormeghajtónak is. Illetve az oszlopokat én az AVR-re szoktam kötni inverter és tranyó nélkül(spórolás!), természetesen az ellenállások is ide kerülnek mivel ez a "gyengébb" oldal. Az inverter egy jó tehermentesítő a portlábaknak. A hozzászólás módosítva: Nov 27, 2013
Hm ezt, hogy hozzam össze?
Hogy 1 sor 1 led-je olyan fényerővel mint egy másik sor összed led-je egyszerre? Illetve, ha tranyó és inverter nélkül dolgozok, akkor az a 10-12 mA-es áramerősség nem terheli le a portot? up1.: Aprópó. Ha a soroknál hagyom a tranyót, a ledek katódjait meg csak simán a portokra kötöm... Csak így ugye, a kódban 0-val kell majd dolgozni.. Ugyi? A hozzászólás módosítva: Nov 27, 2013
A matrix sorokbol es oszlopokbol all. Oda kell tenni az ellenallasokat, ahol egyszerre tobb kimenet is aktiv lehet. A te esetedben a sorokat valasztod ki (egyszerre mindig csak egy sort), es az oszlopokat hajtod meg az eppen kivalasztott soron belul. Ezert neked a oszlopokhoz kell tenni az ellenallasokat. Megpedig azert, mert ha a sorokhoz tenned, akkor az ellenallason lehet, hogy csak 1, de maskor 8 LED arama folyna keresztul.
A port terhelhetoseget az adatlap tartalmazza! Es figyelj oda, mert elofordul, hogy az adtlap megadja a port maximalis terheloaramat, de azt is megadja, hogy a mikrokontroller tap vagy fold laban osszesen mekkora aram folyhat. Pl. a port 20mA, de a fold lab 100mA. Ez azt jelenti, hogy hiaba tud egy-egy port lab 20mA-t, ha mar 8 port labat terhelsz 20mA-rel, akkor az 160mA lenne a tap labon, ami nem megengedett. Mindenkeppen nezd meg a hasznalt mikrokontroller adatlapjat. Sokszor meg egy mikrokontrolleren belul is valtozik, hogy melyik portot mennyire lehet terhelni.
Én mindenképpen azt javaslom, hogy meghajtásra ne használjátok a kontrollert, mert nem az a feladata, hanem a megfelelő jelek előállítása. Ha valami balul üt ki, jobb egy kb 40 Ft-os IC-t/tranyót cserélni, mint kompletten egy mikrovezérlőt.
Sziasztok!
A kérdéses vezérlő egy mega128-as. A sorok kapcsolását tranzisztorral, míg az oszlopokét inverterrel végzem. Nem tudom, hogy lehet-e probléma az, hogy a bázisok elé nem tettem ellenállást... Illetve ha a C porton lévő oszlopokat egyszerre akarom "kigyújtani", megcsinálja de halványan. A táp 3A-es, szóval ez nem lehet probléma... Esetleg bázisok elé korlátozó ellenállás segíthet? Köszi! Idézet: Ok, de neked kell megnezni az adatlapban a hataradatokat, nem nekunk. Segitunk (en legalabbis), de nem ugy, hogy megoldjuk a problemat, hanem megmutatjuk a helyes utat a megoldashoz.„A kérdéses vezérlő egy mega128-as.” Idézet: „Nem tudom, hogy lehet-e probléma az, hogy a bázisok elé nem tettem ellenállást...” A bazisok ele vagy kell ellenallas vagy nem. Az legfokepp attol fugg, hogy hol vannak az emitterek. A tranzisztor bazis-emitter atmenete egy dioda. Arra nem kothetsz 5V-ot, mert tonkremegy. Korlatozni kell a bazisba folyo aramot. Ha emitterkovetot epitesz, akkor nem feltetlenul kell a bazisba ellenallas. De ez az egesz itt nem AVR dolog, hanem elektro alapok. Vesd fel a problemat a kezdo kerdesek topikban. Idézet: „Illetve ha a C porton lévő oszlopokat egyszerre akarom "kigyújtani", megcsinálja de halványan.” Elmondtam a lenyeget az elozo hsz-ben, de teszek meg egy kiserletet: hol vannak a LED elotet ellenallasok? Ha csinalsz egy rajzot (akar papirra es lefenykepezed), akkor hamarabb latjuk, hogy mi a helyzet.
Ez elmeletben jo kellene legyen. Gyakorlatban viszont a BC237 az 100mA-es tranzisztor, es ha jol szamolok, akkor a LED-enkenti ~20mA az 8 LED eseten mar 160mA. Az sok a 100mA-s tranzisztornak. Oda valami jobb kellene, mondjuk BC338 vagy P csatornas MOSFET. Es milyen inverter van benne? Birja a 20mA-t?
Sziasztok. Mit múltkor írtam problémákat azokat nagy nehezen de sikerült megtalálni. De közben felmerült még pár kérdés, hátha tudtok segíteni.
Az egyik probléma az volt, hogy két reggisztert összehasonlítottam és Z bitet vizsgáltam. De ez "cp" utasítással nem működött. Pedig súgó szerint Z: Set if the result is $00; cleared otherwise.
![]() Illetve van még egy olyan gondom, hogy bekapcsoláskor néha teljesen random értékeket ír ki(7 szegmenses) és ilyenkor ha jön a következő számjegy, egyes szegmensek akkor se világítanak. Pedig main-ben törlök minden reggisztert, csak azokat nem miknek később úgyis értéket adok át. Ha hosszabb ideig van kikapcsolva akkor csinálja csak ezt, egy perc szünet után, illetve rátöltés után minden gond nélkül indul. Az első most így cpse-vel működik, de a másodikra nincs ötletem. Nem tudjátok mi okozhatja?
Hááááát.. Azt sem eppen 20mA-re terveztek. Valami durvabb kellene, nem sima LS kapu. Esetleg 74LS245, az buszmeghajto, 24mA L szinten. De ha egy TPIC6C595-ot tennel oda, akkor az biztosan birja aramban, es meg kevesbb labat is foglal a mikrokontrolleren. Igaz, hogy kicsit bonyolultabb a program. Mutatok egy rajzot egy matrixrol. Ebben 6x16 LED volt.
|
Bejelentkezés
Hirdetés |