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
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)
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.
Volt mar ra pelda hogy tap nelkul felprogramoztak. Reset labon kap ilyenkor tapot.
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.
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
Ü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.
Kösz a választ. Már kezdtem pánikolni hogy kinyírtam, nem fog működni/nem lehet majd programozni.
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.
Gyárilag 1MHz van beállítva a belső oszcillátoron. Ez 8-szoros eltérés...
Akkor valamit elnéztem, és hogyan tudom beállítani magasabb frekvenciára?
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...
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
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.
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
1. használj windózt!
2. szobatársam MacBook - ján is AVRStudio van, onnan JTAG-el. 3. kétlem hogy ne lenne Linuxra...
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.
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
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?
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...
Ü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
Feszultseg osztokent mukodik. A lenyeg hogy ne legyen tul nagy terheles a stab. szamara. 1/4W 5k-100k kozott szerintem barmi jo oda.
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.
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.
(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.
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.
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
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"
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
igen, balra. bitenként. azaz mintha megszoroznád 2-vel.
|
Bejelentkezés
Hirdetés |