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   131 / 840
(#) gtk válasza anklar hozzászólására (») Jún 16, 2009 /
 
Hat ha a beallitasokat nem piszkaltad, akkor meg kellene nezni az adatlapban hogy alapbol mekkora frekin fut a belso oszcillatorrol. Ha nem 8 MHz, ami valoszinu, akkor Fuse biteket ujra irni 8MHz belso oszcillatorra. (remelem tudja, nem ismerem ezt a tipust)
(#) AMD válasza gtk hozzászólására (») Jún 16, 2009 /
 
V/A mérő lenne labortápba de még nincs hozzá LCD kijelzőm. Így "élesben" nem udom kipróbálni. Ha ráklikkelek a "Read flash ROM into buffer"-re akkor beolvassa, minden jónak tűnik, de táp nélkül felpogramoztam volna? Érdekes. Kösz a hozzászólást, ha lesz kijelzőm akkor kipróbálom, ha nem lesz jó akkor újraprogramozom most már táppal.
(#) gtk válasza AMD hozzászólására (») Jún 16, 2009 / 1
 
Volt mar ra pelda hogy tap nelkul felprogramoztak. Reset labon kap ilyenkor tapot.
(#) AMD válasza gtk hozzászólására (») Jún 16, 2009 /
 
Pedig azt írja, hogy:
Idézet:
„A Reset láb alacsony szintre kerül, ez az AVR programozási módja”

Végül is mindegy, erre az egy programozásra dobtam össze a cuccost. A lényeg, hogy működjön.
(#) zombee válasza AMD hozzászólására (») Jún 16, 2009 / 1
 
Nekem is felfrogramozza az ATMEGA16-ot táp nélkül!!!
Legalábbis ha a nyomtatóportos ISP-t használom.
Ez rendkívül kényelmes, mert csak bedugom a breadboardba és már tolom is fel a hex-et.
Az "alacsony" kb. 1.8V-ot jelent, amin a flash funkció még bőven működőképes...
Eddig 30-ból 30-ban sikerült, de nem tudom mennyire tartós ez a megoldás
(#) zombee hozzászólása Jún 17, 2009 /
 
Üdv mindenkinek.

LC mérőt építek, és pár tapasztalatot megosztanék veletek is, mert elég hasznos lehet.

Nemrég átírtam 64 bitesre az aritmetikát 32 bitesről, mert a túlcsordulás elleni trükközéseknek a pontosság látta kárát. Attól tartok, hogy emiatt le kell mondani az ATTINY2313-ról, mert túllépi a 2K adatmemóriát. Később majd megpróbálom optimalizálni, de az garantált hogy elég szoros lesz.

Először hardveres időzítést használtam, de nagyon sokáig nem jöttem rá miért ugrál a számlálás, gyakran 2-3 százalékos kitéréseket is megtéve. Rájöttem hogy az INT0 csúnyán megzavarja az időzítőt, még kisebb frekvencián is. Azt hiszem, hogy OCR módban az időzítő nem csak a számláló lejártakor interruptol, hanem minden előosztás alkalmával is, csak azt nem veszem észre.

Emiatt szoftveres időzítéshez folyamodtam. Első változatban az INT0 kezelését meghagytam a régiben(4 regiszterben számlál). Mivel az INT0 egyetlen megszakítása 22 órajelet fogyaszt, hozzá kellett adnom a 230ms - hoz, ami a szoftveres időzítés várakozási tényezője volt. Ez a módszer viszonylag pontos(1 ezrelék alatti ugrálás/elmászkálás), de a késleltetés nagyban függ az oszcillátor frekvenciától. 400kHz-en kb. 1 másodpercet kell várni két kiértékelés között, míg 5kHz-en már megközelíti a 230ms-ot.

A mai nap leprogramoztam a szoftveres időzítő egy új változatát, aminek segítségével bámulatos stabilitást értem el a számlálásban. 400kHz-en most már csak tényleg az utolsó számjegy ugrál! ! ! Ráadásul a bekapcsoláshoz képesti elmászkálás 0.2 EZRELÉKES!

Ezt jónéhány trükkel értem el, amit magam találtam ki az elmúlt órákban, mégis nagyon hasznos lehet. Először is, az INT0 megszakítását nem kezeli le külön függvény, a megszakítástáblában egy "ret"-et tettem a helyére.(nem "reti", pont az a lényeg). Egy ilyen interrupt 6CLK-t fogyaszt, 2-t az automatikus IRQ mechanizmus(programszámláló push), 4-et a "ret".
A számlálást továbbra is függetlenné tettem a kiértékeléstől: a kiértékelés előtt számlálunk. Egy olyan ciklusban teszem ezt, mely minden esetben ugyanannyi órajel ideig tart, bármi is történjék. Akár lejár vmelyik számláló/akár nem, akár volt interrupt, akár nem. Ez a ciklus max 30CLK lehet(12M/400k==30), ha a kvarc 12MHz-es, és max 400kHz az oszcillátor. Ez a ciklus 128000-szer fut le, ha 320ms a számlálási idő. Ehhez elég 3 számláló regiszter. Első megközelítésben ha volt interrupt, akkor növelek. Ez pazarló, mert ha nem volt interrupt, akkor jó sok "nop" kéne. Helyette inkább akkor számolok, ha NEM VOLT interrupt. méghozzá csökkentek. A megszakításszámlálót ha beállítom az időzítő számláló kezdeti értékére(ez is 3 regiszter), akkor a csökkentéssel pont ugyanazt érem el, mintha megszakításonként növelek.

Na igen. Hogy detektálom, hogy volt-e megszakítás?
A "ret" nem állítja vissza az SREG Interrupt bitjét. Azaz egy "brid" akkor ugrat, ha valaki/valami letiltotta. Ezt csakis egy INT0 megszakítás teheti meg.

Lényeg a lényeg, a ciklus pontosan 19CLK ideig tart minden esetben, ezért tud pontos lenni.
(#) AMD válasza zombee hozzászólására (») Jún 17, 2009 /
 
Kösz a választ. Már kezdtem pánikolni hogy kinyírtam, nem fog működni/nem lehet majd programozni.
(#) anklar válasza gtk hozzászólására (») Jún 17, 2009 /
 
Az adatlapja szerint ezen a feszültségen és ezen a jőmérsékleten kb 8MHz +-0,1MHZ a belső oscillátor frekije, de az egy másodperces delay az nekem vagy 10 másodperc.
(#) zombee válasza anklar hozzászólására (») Jún 17, 2009 /
 
Gyárilag 1MHz van beállítva a belső oszcillátoron. Ez 8-szoros eltérés...
(#) anklar válasza zombee hozzászólására (») Jún 17, 2009 /
 
Akkor valamit elnéztem, és hogyan tudom beállítani magasabb frekvenciára?
(#) zombee válasza anklar hozzászólására (») Jún 17, 2009 /
 
A fuse bitekkel és a szoftverrel. Ugye _delay_ms - t használsz?
A fuse bitek a fizikailag megvalósított órajelet állítják be. AVRStudio - ban legördülő menüvel válogathatsz.

Ezen kívül a Project Options résznél vagy a #define F_CPU érték beállításával meg kell adnod az általad beállított frekit, hogy az _delay_ms rendesen késleltessen.

Amúgy én az LCD kijelzőmet legeslegelőször egy Pascal programmal élesztettem fel, nyomtatóporton keresztül...
(#) anklar válasza zombee hozzászólására (») Jún 17, 2009 /
 
Nekem is nyomtatóporton éledezik (dapa égetővel), de az avr studiós beállításokat nem tudom hasznosítani, sajnos az Atmel nem adta ki linux alá. Tudsz esetleg vmi olyan megoldást amivel linux alól tudom a Fuse bitet piszkálni.
Jah igen _delay_ms-t használok
(#) gtk válasza anklar hozzászólására (») Jún 17, 2009 /
 
AVR Dude-t kell hasznalni Linux alatt. Udv a Linux/AVR taborban Jobb esetben csomagbol fel is tudod telepiteni. Aztan csak egy jol megirt Makefile kell es mehet a make -el forditas, programozas, fusek irasa, minden.
(#) IMi válasza gtk hozzászólására (») Jún 17, 2009 /
 
Hello!
Ajánlanám a Linux-osok figyelmébe (ha eddig még esetleg nem ismernétek) a KontrollerLab nevű alkalmzást. KontrollerLab Home Page
(#) zombee válasza anklar hozzászólására (») Jún 17, 2009 /
 
1. használj windózt!
2. szobatársam MacBook - ján is AVRStudio van, onnan JTAG-el.
3. kétlem hogy ne lenne Linuxra...
(#) gtk válasza zombee hozzászólására (») Jún 17, 2009 /
 
Az nincs Linuxra, de van egy rakas jo szoftver es raadasul teljesen ingyen ! Es csak egy csoppnyi ertelem kell a hasznalatukhoz, nem sok. Raadasul make -el hivhato az osszes program. Jo megismerni a make -t is, nem egy utolso dolog.
(#) MaSTeRFoXX válasza anklar hozzászólására (») Jún 17, 2009 /
 
Létezik egy AVR8 burn-o-mat nevezetű cucc, amivel lehet állítgatni a fusebiteket, elvileg linuxon meg windozon is mennie kell. Annó valamiért nem akart menni valamiért nálam linuxon 64biten, de lehet hogy én voltam béna. (java-s cucc, én nagyon tudom utálni a javat...)
Bővebben: Link


Itt meg az online fusebit számítgató cucc, felparaméterezi az AVR-dude-ot neked
Bővebben: Link
(#) ZLED hozzászólása Jún 18, 2009 /
 
Sziasztok!

Led mátrix kijelzőhöz szeretnék írni egy kis programot, hogy szöveget tudjak vele megjeleníteni. Csak azt nem tudom, hogy csináljam meg hogy a beírt szöveg karaktereit egy bithalmazból kiolvassa és azt a kijelzőre vigye. pl.:
Valami("szöveg"); és a szöveget a kijelző megjeleníti.

Valaki tud segíteni?
(#) zombee válasza ZLED hozzászólására (») Jún 18, 2009 /
 
Hali.
Nos, ilyen esetekben jó, ha az ember tud rétegekben gondolkodni, mert egy-egy részfeladatot megcsinál egy alsóbb réteg, melynek szolgáltatásait használhatja/kibővíti a fölötte lévő. Most lehet hogy kínai ez páraknak, de enélkül NEM FOG MENNI.

Kezdeném is a legalsó réteggel, a fizikaival. Közös oszlop anódokra PNP, közös sor katódokra NPN tranzisztorok mennek. Ez utóbbinál a kollektorra 82-680 ohm ellenállás. A tranzisztorok bázisai 10k-s ellenállással a kontroller portjaira mennek rá.

Folytatnám az erre épülő "adatkapcsolati" réteggel. Van egy nxm bites puffered, amiből egy ciklus oszloponként kiolvassa a biteket, és egyenként a sorokra küldi. Ahogy váltogatja az oszlopot, úgy lép tovább a pufferban.

Erre épülne a "megjelenítési" réteg, mely a kijelölt szövegadatot konvertálja át időben vezérelve a puffer adataira. Ehhez kell egy táblázat, ahol az egyes katakterek képeit tárolod bitekben. Pl. ha 8x8 pixel egy karakter, akkor 8 bájtban tárolódik.

Erre épül rá az alkalmazásod, ami a szövegeket vezérli. A szöveget, a grafikus adatot mind-mind vagy az EEPROM-ban vagy a kódszegmensben tárolhatod. A kódszegmensbe előre definiált adatokat hozhatsz létre, ami még a programkódba kerül, nem kell az EEPROM-al bajlódnod.
Pl. így: lcd_message: .db 'z','o','m','b','e','e',',0,0
Mint látod, 0-végű karakter zárja le és azért van kettő a végén, mert kódszegmensben tárolt adathalmaz csak páros számú bájtban lehet...
Kiolvasása az lpm - el megy bájtonként(load program memory), ehhez előtte be kell állítanod egy pointert: ldi ZH, high(2*lcd_message); ldi ZL, low(2*lcd_message);
Hasonlóan hozhatod létre a grafikus karakterkódokat is.

A kijelző puffere(adatkapcsolati rétegben) célszerű ha az adatszegmensben(.dseg) van. Ehhez változót kell definiálnod.
Pl. így: freq : .byte 8
Hasonlóan érheted el, de van pár különbség a kódszegmenshez képest. Először is, nem adhatsz meg neki kezdő értéket, mert az SRAM tartalma elvész kikapcsoláskor. Másik, hogy lpm helyett ld-vel olvasol és sd-vel írsz, a pointernél pedig nem kell 2* szorzó mert az adatszegmens páratlan szervezésű bájtokból áll.

Lényeg, hogy az egészet kb. 2 hét alatt teljesen elsajátítottam, némi cash ellenében( EZ ITT A REKLÁM HELYE ) leprogramozhatom neked...
(#) Barbár hozzászólása Jún 18, 2009 /
 
Üdv Mindenkinek!

Huba AVR-es ATtiny13 -assal megoldott rendőrségi villogójához ( Link a szóbanforgó cikkhez ) lenne kérdésem:

A három darab trimmer poti mekkora legyen? Mármint hány Ohm -osak legyenek?

Előre is köszi a segítséget!

Üdv!

Barbár
(#) gtk válasza Barbár hozzászólására (») Jún 18, 2009 /
 
Feszultseg osztokent mukodik. A lenyeg hogy ne legyen tul nagy terheles a stab. szamara. 1/4W 5k-100k kozott szerintem barmi jo oda.
(#) ZLED válasza zombee hozzászólására (») Jún 18, 2009 /
 
Nekem csak a szöveg átkonvertálása kéne, a megjelenítést értem, már csináltam is, csak azt nem értem hogy a szövegből a karaktereket hogy keresi ki, és hogy olvassa ki a táblából.
(#) zombee válasza ZLED hozzászólására (») Jún 18, 2009 /
 
Aha, értem, szóval a nagyjával tisztában vagy. Ez tökjó.

Nekem kb. fél napomba került mire rájöttem. Szóval ezidő alatt már... Na jó azért vagyok hogy segítsek, nem azér hogy alázzak!

Nem említetted hogy milyen kontrollerrel akarod megoldani. Gondolom TINY2313 biztos nem lehet, neki nagyon kevés(~12) hasznosítható portja van. Mikor ezeket a sorokat írom, csak ATMEGA8 és ATMEGA16 - ra tudok gondolni mint lehetséges vezérlő.

Az ATMEGA16 datasheet(csatolom) 300-adik oldalától kezdődnek az assembler utasítások, gondolom assemblerben szeretnéd leprogramozni(és nem C-ben), bár még ezt sem említetted. A módszerem C-ben is használható kisebb módosításokkal.

Először is létre kell hoznod egy bittérképet minden megjelenítendő karakterre. Ha 8x8 egy karakter mérete, akkor karakterenként 8 bájt kell. Gondolom nem akarod mind a 256-ot lekódolni(ez 2048 bájt volna 8x8-nál). Minden karakternek van egy kódja, pl. az "A"-nak 65, "d"-nek 100, szóköznek 32, "0"-nak 48, sztring végének jelzése: 0-s kód. Ez a karakterkód egy ofszet címet jelent, melyből ki kell vonni a legelső karakter kódját(pl. ha a 32-es szóközzel kezdesz, akkor 32-t). Ezt meg kell szorozni 8-al(ha 8 soros egy karakter), és ehhez hozzá kell adnod a legelső karaktered memóriacímét. C-ben természetesen erre nincs szükség, ott tömböt hozol létre, melyet (karakterkód-legelsőkarakter)*8 - al indexelsz, ezen belül pedig 0-7 - et kell hozzáadni az egyes sorok bittérképeinek lekérdezéséhez. A bittérkép közvetlenül (vagy negálva) kiküldhető a portra.
(#) ZLED válasza zombee hozzászólására (») Jún 18, 2009 /
 
Jelenleg ATMEGA8-al kísérletezgetek, de van itthon ATMEGA16 is. A programot C-ben írom rá.
(#) gtk válasza ZLED hozzászólására (») Jún 18, 2009 /
 
(Az emlitett kodok un. ASCII kodok.)
7x5, 8x5-os matrixokat szoktak karakternek hasznalni.
Minden karakternek meg kell csinalni a karaktermatrixat, olyan formara amilyenre akarod. Ez a karakter ROM, Flashben tarolod. Szerintem neten van is ilyen mar boven, pl Nokia kijelzokhoz stb gondolom hasznaltak mar ilyesmit. Erdemes csinalni (lefoglalni) egy Video ramot.
Egy idozitett ciklus folyamatosan adott frekvencian pakolja ki a Video rambol az adatokat a megfelelo portra. Mikor eppen nem olvassa a ciklus a video ramot, akkor irod bele a megfelelo karaktermatrixnak egy sorat vagy oszlopat. Attol fuggoen hogy soronkent jelzel ki, vagy oszlopokkent.Nagyjabol ennyi.Multiplex frekvenciat kell szamolni, kitoltest, ennek megfelelo aramot a LEDekre.De van LED Matrix topic is.
(#) zombee válasza gtk hozzászólására (») Jún 18, 2009 /
 
Az általad említett "video ram" egy tömb, a puffer amit az adatkapcsolati rétegnél leírtam. Egy ciklus/IRQ ebből olvas, és rakja ki a portokra folyamatosan.

A karakterek mátrixkódját pedig vagy letöltöd vagy lekódolod, lényeg hogy ez egy const tömb lesz.
(#) Grebi hozzászólása Jún 18, 2009 /
 
Helló mindenkinek!

Lehet hogy nagyon kezdő a kérdésem, de hogyan tudok a regiszterekbe adatokat írni, bitenként?
Tehát a lényege az lenne hogy sorosan bejön egy 4 bitet tartalmazó sorozat, amiről egy algoritmus dönti el hogy az egyes bitek értéke "0" vagy "1" és ezeket kellene nekem letárolni majd ezt egy 4 bites adatként kitenni a PB1-PB2-PB4-PB5 lábakra.
Sajnos nemrég foglalkozom AVR-el, ezelőtt csak gépen programoztam egyéb nyelveken, valmint mikro vezérlővel suliban ismerkedtünk (Intel i8035), és ezt programozgattuk papíron.
Választ előre is kösz
(#) zombee válasza Grebi hozzászólására (») Jún 18, 2009 /
 
shifteléssel.
fogod a regisztert(pl. r16). ha 1-est kell beletenni akkor "inc r16", ha nem teljesül akkor békénhagyod. a művelet végén shiftelsz balra: "lsl r16"
(#) Grebi válasza zombee hozzászólására (») Jún 18, 2009 /
 
Ahha értem köszönöm a választ
és ez a shiftelés pontosan azt takarja hogy az r16-os regiszter értékét egyel balra tolom(ebben nem vagyok biztos hogy jól vagyon informálva)?
Még egyszer köszi a választ
(#) zombee válasza Grebi hozzászólására (») Jún 18, 2009 /
 
igen, balra. bitenként. azaz mintha megszoroznád 2-vel.
Következő: »»   131 / 840
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