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
Kb 700000 átfogásban kellene impulzust/frekvenciát generálni (legnagyobb/legkisebb freki). Meg lehetne ezt oldani valamilyen egyszerü modon?
(ATmega644) Kösz!
Sziasztok!
Rászántam magam, hogy bővítsem ismereteimet AVR programozás terén. El is indultam a megszakítások felé vezető úton, de sajnos már a legelején elakadtam. Szeretnék egy kis segítséget kérni tőletek. Attiny2313-ra próbáltam átírni ezt a példaprogramot. Amit csinálnia kellene a programnak: alapesetben a PB0-PB7 lábakon egymás után kapcsolja fel majd le a ledeket, (ez működik is kifogástalanul) és ha az INT0 (PD2) lábon felfutó élt lát, akkor villantsa fel az összes ledet 8 alkalommal, majd folytassa a ledek sorban fel-le kapcsolását. A hiba ott van, hogy amikor belép az ISR(INT0_vect) függvénybe, csak 1-szer villantja fel a ledeket, majd utána mintha egy reset jelet kapna, és előről indul a main függvény. Csatolom a C fájlt, amit "alkottam".
Szia!
A megszakitas rutinon belul nem szokas keslelteteseket rakni. A rutint a leheto legrovidebbre kell megirni, azon belul csak egy flag erteket valtoztasd meg, amit a foprogramon belul figyelsz. Ezekhez hasonloan: Prell Kulso megszakitasos pelda
Sziasztok!
Egy olyan kérdésem volna, hogy ezt az AVR-t ajánljátok-e USB-s kapcsolatra... Igazából egy-egy kapcsolatnál egy "string"-et kellene átírni, ami alapján a program futna... Egyelőre csak elméleti síkon gondolkodok... Köszönöm!
Hello!
Az miért van, hogy az Atmega48 olcsóbb mint az Attiny2313? Több a lába, több dolgot tud, mega és nem tiny, nem értem. Bár ha itt járunk akkor a mega48 mitől gyanúsan olcsóbb mint bármelyik másik? A hozzászólás módosítva: Márc 20, 2014
Mert az egyikböl kismilliot gyártanak a masikbol meg csak 100000 darabot
áhááá. na akkor beszerzek egy marékkal.
Nos közben sikerült megoldani, egy angol fórum segítségével, érteni nem igazán értem, inkább úgy mondom nem tudom mi a konkrét fizikája a dolognak, de a lényeg, hogy az akku bikázása közben az áramot nem szabad elvezetni azon a körön ahonnan a mikrokontroller kapja a tápot.
Tehát a tranzisztor emmiterjét is közelebb kell bekötnöm a tápegységhez mint ahogy az attiny kapja a földet, és ugyanígy kell eljárnom a táppal is. Érdekes mert ugye így is úgyis ugyanarról a vezetékről beszélünk és mégis ekkora különbséget jelent....
Köszönöm a gyors választ.
Azt értem, hogy nem szokás használni késleltetést, de attól még lehet - gondolom én. Mint írtam, ez egy példaprogram, és számomra arra szolgál, hogy megértsem, el tudjak indulni a megszakításokkal. Javíts(atok) ki ha tévedek, de eddigi tudásom szerint a megszakítás is "csak" egy függvény, annyi különbséggel, hogy ez nem szoftveres kód hatására aktivizálódik. Tehát a kérdésem még mindig él, miért csak egyszer fut le az ISR(INT0_vect) megszakításomban a for utasítás? És miért nem oda tér vissza a megszakítás után a futási ciklus, ahol kilépett belőle? Hol hibáztam a kóddal? A hozzászólás módosítva: Márc 20, 2014
Egy kérdés.
Az interrupt megszakitások mérhetök szkoppal valamelyik lábon? Belsö osczillatorrol hajtom a procit. Egy display és nyomogomb mátrix osztozkodik egy Enablen, és a displaynek sokkal lassabban kellene mennie mint a nyomogomboknak.
Szia,
Nagyon egyszerűen, ha van egy szabad kimeneted. A megszakítás elején billentsd 1-be, a végén vissza 0-ba.
Kösz, nekem is valami hasonlon járt az eszem, de most irom életem elsö kodját interrupttal, igy elég bizonytalan vagyok.
A kerdesed jo, mert annak nyolcszor kellene lefutnia. Nem normalis, hogy ezt csinalja. De miert cpp a file (es nem .c)? Ha nincs eleg stack, abbol lehet problema, meg abbol is, ha az egyszerre nyolc kimenet valatasa valamilyen hardveres gondot okoz. Megrantja a tapot, ilyesmi. Ennek jo szurese, ha az interruptban a for ciklust igy csinalod meg:
Es meg egy dolog. Az altalad linkelt oldalon levo kapcsolas nem jo! A LED-eket direktbe koti a kimenetekre, aramkorlatozo ellenallasok nelkul. Ez pl. okozhatja a problemadat. És sem a LED-nek sem az AVR-nek nem tesz jot. 5V tap eseten (2V koruli nyitofeszultseggel szamolva) minden LED-del sorba illene betenni egy 220~330 Ohm-os ellenallast. Ez LED-enkent kb. 10..15mA lesz. Az AVR-be (-ből) folyo összes aram nem lehet tobb, mint 200mA, amit jelen esetben nem is lepsz tul a 8 x 15mA-rel sem.
Üdv mindenkinek! Kezdőként lenne egy kérdésem a tapasztaltabb PIC-esekhez. Van egy Atmega 8A PU egy "futópad" vezérlőjében. Lehetséges, hogy a benne levő program megsérült. Van-e valamilyen módszer, amivel egy működőből ki tudnám olvasni a tartalmát? A gyártó természetesen azt monda, hogy vegyek egy új komplett panelt. Üdv: Mike
Sikerült beraknom az irq-be egy LED-t amit be és kikapcsolok, de egy kicsit meglepett, hogy 60 ms-nt van egy impulzus. Ez nagyon kevés, a proci 8MHz-s, elöszto kikapcsolva. Ma egy kicsit probálgattam, a legkisebb oszto is szinte leállitotta a programot. Nem tudom mi az oka, hogy miért ilyen lassu. Eredetileg 1024-s osztoval számoltam, hogy a display 20Hz-l legyen frissitve a gombok meg ennek a 10x-resével legyenek leolvasva. Sajnos valami miatt nem igy megy....
A hozzászólás módosítva: Márc 22, 2014
Kód van?
Van, de marha bonyolult, aligha tudom ide berakni.
Mt egy regiszter, a hosszabb parancsok makrok, és az icount mindjárt a code elején van hivva egy Call icount paranccsal. Kb. Ennyit tudok ide berakni, mert az egész rengeteg alprogrambol áll külön-külön fájlokban.
Szia!
Ugyan az assembly-hez nem értek, viszont látom, hogy a TCCR1B regiszterben beállítod az 1024-es osztást, de nem látom milyen üzemmódban használod a TIMER1-et (WGM10,WGM11, a TCCR1A-ban). Ha ezeket nem állítod át, akkor az interrupt 65536 impulzus után fog generálódni. Az FCPU-t leosztod 1024-gyel és ezt további 65536-tal. Ha nem ezt szeretnéd, akkor más üzemmódot kellene választani, nem a normált, hanem pl. a CTC-t, de ekkor nem biztos, hogy a TOIE a jó a TIMSK1-ben, hanem pl. az OCIE1A.
Szia!
Bocs, az este benéztem az 1024-es osztót, így marad a 65536, amivel 8MHz-es FCPU mellett 8,192ms az eltelt idő két interrupt között, feltéve, ha nem töltesz benne sok időt. A 60ms hosszú impulzusokat hogyan detektálod? Azt látom, hogy egy változót növelsz és 128-cal vagy kapcsolatba hozod, gondolom a főprogramban csinálsz vele valamit, de nem világos mit.
Köszönöm!
A for ciklusban miért helytelen utólag inkrementálni a számlálót (i)? Illetve, a példát nem betűről betűre követtem, már azért sem, mert semmilyen Mega szériájú vezérlőm nincs itthon. Attiny2313-ra alkalmaztam, azért is különbözik, bár abban teljesen igazad volt, hogy áramkorlátozó ellenállások nélkül kötöttem rá a ledeket - gondoltam, ezt talán elbírja, de mégsem. Lényeg a lényeg, most már jól működik. Plusz, tegnap este volt egy kis energiám még tesztelgetni, és arra is rájöttem, hogy 8MHz-en ha bekapcsolom a CKDIV8-at, akkor a főprogram rendes időzítéssel fut, viszont az interruptba belépve a _delay_ms késleltetés megsokszorozódik. Erre van valami magyarázat?
Most nincs benne az oszto ezért van a TCCR1B-ben 0b10000001 (eredetileg 0b10000100 -nak kellene ott lennie ami 256 osztást jelent).
Most beraktam egy portot az irq rutinba ( led dioda) amit be- és kikapcsolok. Igy azon stabil frekit tudok mérni 60 ms periodussal - ami kb 16 Hz. Nem tudom miért. A dioda nélkül, csak akkor jelentek meg az impulzusok valamelyik adatvonalon (A0-A7), ha megnyomtam egy gombot. Most, miután elvben a Led kijelzi, hogy mikor kérdez le. Más irq-m még nincs, igy keveredés nem igen lehet. ( de szerintem én baltázok el valamit a kodban, ez az irq még nagyon nem megy ) Idézet: Nem helytelen. Nincs semmi jelentosege, en igy szoktam meg. Amig a muvelet erteket nem hasznalod fel, addig a ketto pont ugyanazt jelenti. Ha fel is hasznalod a muvelet erteket, akkor mar nem mindegy:„A for ciklusban miért helytelen utólag inkrementálni a számlálót (i)?”
Ha jol ertem, akkor az ellenallasoktol javult meg? Legjobb tudomasom szerint a _delay_ms() az F_CPU makroban megadott erteket veszi alapul. Az orajel frekvenciat kell megadni Hz-ben. Ha ott nem annyit adsz meg, mint a valosag, akkor sehol nem lesz pontos az idozites vele. 8 MHz-cen, ha a CKDIV8-at bekapcsolod, akkor 1 MHz-cen fog menni a mikrokontrollered, ha kikapcsolod, akkor 8 MHz-cen. Interruptban is meg azon kivul is.
Amugy nálam is be van kapcsolva a CKDIV8 ( gyári állapot)
Ezt valamikor régen tanították nekünk (számláló inkrementálás) de ugye akkor nem volt érdekes, csak most, amikor használnom is kell.
Igen, jól érted, az ellenállásoktól javult meg (szegény mit élhetett át minden alkalommal, mikor megpróbálta az összes ledet felkapcsolni). Ezért ment át reset-be, mert túl sok mA-t akartam kisajtolni belőle. Az F_CPU dologgal még kísérletezem, érdekes dolgokra vezet rá. Még egy dolog: külső megszakításnál mit érdemes figyelni (felfutó élt, lefutót, alacsony szintet vagy bármilyen logikai változást)? Van erre egy bevált módszer? Pl. nyomógomb érzékelésére mindig lefutó él - ilyesmire gondolok. Továbbá ha egy lábat megszakításra használok, azt mindig kimenetnek kell beállítsam? Ezekre sehol nem találok választ. Idézet: Az a megszakitas forrasatol fugg. Erre nem tudok neked egyertelmu szabalyt mondani.„külső megszakításnál mit érdemes figyelni (felfutó élt, lefutót, alacsony szintet vagy bármilyen logikai változást)? Van erre egy bevált módszer?” Idézet: Ha egy labat megszakitasra hasznalsz, akkor az bemenet kell legyen. Vagy nem ertem a kerdest. „Továbbá ha egy lábat megszakításra használok, azt mindig kimenetnek kell beállítsam? Ezekre sehol nem találok választ.”
Kezd tisztulni a dolog számomra.
Idézet: - Igen, ezt elírtam, mindig bemenetet akartam írni.„Továbbá ha egy lábat megszakításra használok, azt mindig kimenetnek kell beállítsam? Ezekre sehol nem találok választ.” Nagyon szépen köszönöm, sokat segítettél. Ha lesz még kérdésem (és biztos, hogy lesz) akkor még írok.
Sziasztok,
azt hittem már értek a uC-khez, de vannak még alapvető gondok. Kérdés: Attiny2313 pinB0-7 ig input pinD0-3 output 4-6 input DDRB = 0x00; DDRD = 0b1110000; PORTB=0xff; PORTD=0b1110000; én azt hittem ez igy jó,de mégsem működik helyesen, valami trükk van a D porton?vagy csak simán elhibáztam valamit? |
Bejelentkezés
Hirdetés |