Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
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
Lapozás: OK   594 / 838
(#) Massawa hozzászólása Márc 19, 2014 /
 
Kb 700000 átfogásban kellene impulzust/frekvenciát generálni (legnagyobb/legkisebb freki). Meg lehetne ezt oldani valamilyen egyszerü modon?
(ATmega644)
Kösz!
(#) yohnsee hozzászólása Márc 19, 2014 /
 
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".
(#) Fizikus válasza yohnsee hozzászólására (») Márc 20, 2014 / 1
 
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
(#) cmdnetwizard hozzászólása Márc 20, 2014 /
 
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!
(#) esemve hozzászólása Márc 20, 2014 /
 
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
(#) Massawa válasza esemve hozzászólására (») Márc 20, 2014 /
 
Mert az egyikböl kismilliot gyártanak a masikbol meg csak 100000 darabot
(#) esemve válasza Massawa hozzászólására (») Márc 20, 2014 /
 
áhááá. na akkor beszerzek egy marékkal.
(#) prody válasza prody hozzászólására (») Márc 20, 2014 /
 
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....
(#) yohnsee válasza Fizikus hozzászólására (») Márc 20, 2014 /
 
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
(#) Massawa hozzászólása 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.
(#) lokátoros válasza Massawa hozzászólására (») Márc 21, 2014 /
 
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.
(#) Massawa válasza lokátoros hozzászólására (») Márc 21, 2014 /
 
Kösz, nekem is valami hasonlon járt az eszem, de most irom életem elsö kodját interrupttal, igy elég bizonytalan vagyok.
(#) killbill válasza yohnsee hozzászólására (») Márc 22, 2014 1 /
 
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:
  1. for(i = 0; i < 8; ++i){
  2.    PORTB ^= 1;
  3.   _delay_ms(500);
  4.  }
(#) killbill válasza killbill hozzászólására (») Márc 22, 2014 /
 
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.
(#) Chipmunk1960 hozzászólása Márc 22, 2014 /
 
Ü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
(#) Massawa válasza Massawa hozzászólására (») Márc 22, 2014 /
 
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
(#) Istvanpisti válasza Massawa hozzászólására (») Márc 22, 2014 /
 
Kód van?
(#) Massawa válasza Istvanpisti hozzászólására (») Márc 22, 2014 /
 
Van, de marha bonyolult, aligha tudom ide berakni.
(#) Massawa válasza Massawa hozzászólására (») Márc 22, 2014 /
 
  1. icount:
  2. Ldi a,0b10000001.       ; osztas
  3. Outio TCCR1B,a
  4. Setbio TIMSK1,TOIE      ; timer1 irq mask
  5. Sei
  6.  
  7. Ret
  8.  
  9. Ovf1_irq:
  10. Push mt
  11. In irqsr,sreg
  12. Lds mt,t1_msb
  13. Inc mt
  14. Ori mt,$80
  15. Sts t1_msb,mt
  16. Pop mt
  17. Out sreg,irqsr
  18. Reti


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.
(#) Istvanpisti válasza Massawa hozzászólására (») Márc 22, 2014 /
 
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.
(#) Massawa hozzászólása Márc 22, 2014 /
 
Azok mintha stimmelnének
TCCR1A-0b00000000 van irva
(#) Istvanpisti válasza Massawa hozzászólására (») Márc 23, 2014 /
 
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.
(#) yohnsee válasza killbill hozzászólására (») Márc 23, 2014 /
 
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?
(#) Massawa válasza Istvanpisti hozzászólására (») Márc 23, 2014 /
 
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 )
(#) killbill válasza yohnsee hozzászólására (») Márc 23, 2014 /
 
Idézet:
„A for ciklusban miért helytelen utólag inkrementálni a számlálót (i)?”
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:

  1. i++;        -----> i = i + 1;
  2. ++i;        -----> i = i + 1;
  3. a = i++;    ----> a = i; i = i + 1;
  4. a = ++i;    ----> i = i + 1; a = 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.
(#) Massawa válasza Massawa hozzászólására (») Márc 23, 2014 /
 
Amugy nálam is be van kapcsolva a CKDIV8 ( gyári állapot)
(#) yohnsee válasza killbill hozzászólására (») Márc 23, 2014 /
 
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.
(#) killbill válasza yohnsee hozzászólására (») Márc 23, 2014 /
 
Idézet:
„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?”
Az a megszakitas forrasatol fugg. Erre nem tudok neked egyertelmu szabalyt mondani.
Idézet:
„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.”
Ha egy labat megszakitasra hasznalsz, akkor az bemenet kell legyen. Vagy nem ertem a kerdest.
(#) yohnsee válasza killbill hozzászólására (») Márc 23, 2014 /
 
Kezd tisztulni a dolog számomra.
Idézet:
„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.”
- Igen, ezt elírtam, mindig bemenetet akartam írni.
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.
(#) Cicow hozzászólása Márc 23, 2014 /
 
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?
Következő: »»   594 / 838
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem