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
Belinkelnéd az adatlapját.
Én felcsaptam 2 Ramtron FRAM adatlapot, ahol 10^14 írás/olvasás ciklust adnak meg. Bővebben: Link Bővebben: Link Csak kíváncsi vagyok, mert szokatlan szóhasználatnak tűnik egy adatlapban. Főleg annak függvényében, hogy legjobb tudomásom szerint az FRAM tényleg véges élettartamú. update: Ne fáradj, megtaláltam googlival. Bővebben: Link A hozzászólás módosítva: Márc 12, 2013
Az EEPROM írásánál én a bájtonkénti keresést és a pozíciótárolást ötvözném:
- EEPROM-ban tárolsz mondjuk egy 1k-s címet - utána visszaolvasod az 1k adatból, hogy melyik volt az utolsó adat - amikor laphatárt lépsz át, növeled a címet (ritka) De lehet még szórakozni azzal, hogy ha a puffer végére érsz, akkor a számlálóba 0xFFFF-et írsz, ami azt jelenti: elhasználva. Ilyenkor a következő 2 byte-ot fogja használni számlálásra. Lehet trükközni a dologgal.
A merevlemezek is hasonló elven rögzítenek, aztán idővel mégis bad sectoros lesz.
És biztos hogy nem a csapágy miatt...
Én úgy oldanám meg a tárolást az EEPROM-ban, hogy minden adathoz hozzárendelnék egy 32 bites számlálót is. Ezt a számlálót minden rögzítésnél növelném, és tárolnám is a hőmérsékletek és a dátum/időponttal együtt. A program indulásakor megkeresném a legnagyobb értékű számlálót (bináris kereséssel nagyobb méretű memóriában is hamar meg lehet találni hová történt az utolsó adat rögzítése), az utána következő helyre már mehet is a rögzítés folytatása. Így a memória minden cellája kb. ugyanannyiszor kerülne írásra. További lehetőség, hogy minden memóriacella írása előtt megnézném a cella aktuális értékét. és csak akkor írnám ha az különbözik a beírandó értéktől (ha pl. a hőmérséklet nem változott az előző körben beírt hőmérséklethez képest akkor felesleges az adott memóriacellába ugyanazt az értéket még egyszer beírni).
Sziasztok!
Egy kis segítséget szeretnék kérni: Az alábbi program egy LEDet kapcsolna fél másodpercig be, aztán ki. Valójában a timer kezelés lenne a lényeg, sajnos nagyon pontatlan. A mC egy Attiny13, ami gyári beállításokkal 9,6 Mhz /8-al ketyeg (1,2Mhz). A timert úgy szeretném beállítani, hogy 125 us-enként adjon megszakítást. Jó e a számításom? 1/1200000/1000000=0,833333 azaz 0,833333 us alatt növekszik egyel a TCNT0 reg. 125/0,833333=150 azaz 150-el kell visszaállítani a TCNT0 reget. Ilyenkor 256 ból kell kivonni ezt az értéket vagy 255-ből? Miután a 125us-ból képezem a másodperces jelet így kis eltérés a végeredményt nagyon rontja. Köszönöm a választ!
Attiny13
Lapozz a 72. oldalra, ott látod a TIMER0 működési módjait. Neked olyan kell, ami 0-tól OCRA-ig számol, az OCRA meg legyen 150. Ezt Avr Studio-val érdemes kipróbálni.
Csabeszq kollégára ne hallgass. Amit csináltál az teljesen jó, csak azt nem vetted figyelembe, hogy az interruptod nem 0 órajel alatt hajtja végre a dolgokat.
Studio szimulátor megadja a választ a turpisságra, lásd a képen. A képen két interruptba ugrás eltelt idejét láthatod. Amit tehetsz, hogy beállítasz egy előosztást a timerre, ami miatt pontosabb lesz az egész, mivel most a timered elvileg 125us -et mér, az interrupt pedig csak amíg bepusholja a regisztereket, elmegy 18us. Ha a timered 500ms-et mérne, akkor ez a 18us szinte semekkora jitter lenne. Persze ha pró vagy, akkor teljesen kézben tarthatod az interrupt hosszát, de én a timer előosztót javasolnám. A hozzászólás módosítva: Márc 13, 2013
Köszönöm a hozzászólást!
Nekem a 125 us-os megszakítás fontos (egy csipogó miatt). Viszont az is fontos, hogy a másodpercet pontosan tudjam mérni, akkor ez azt jelenit, hogy 143 ms-nak kell számolni a megszakítás meghívását? Azaz nem 8000 lesz a másodperc letelte, hanem 1000000/143=6993?
Interruptban állítani a TCNT0-át és utána ezt "pontos" időnek venni marhaság, úgy ahogy van.
Egy cli() meghívása után a pontos idődet megeheted, arról ne is beszéljünk, hogy az utasítások 1-8 órajel között bármilyen hosszúak lehetnek. Ennél csak egy nagyobb marhaság van, az, hogy kidebuggolni AVR studioval, hogy a push/pop-ok mennyi időbe kerülnek és ezt felhasználni. Jön egy új gcc verzió és megint megeheted az egészet. Amit én írtam, abban a hardver elszámol OCRA-ig, interrupt és újrakezdi a számolást. Ennél kevés egyszerűbb dolgot tudok elképzelni. Állandóan ezt csinálom ATmega48 alatt. Ott kicsit jobbak a timerek, de sima ügy. Zenét úgy adok ki, hogy OCRB-t beállítom OCRA/2-re, OCRA-ig számol, így adja ki a négyszög jelet a PWM-en. Az egész LED villogtatást a hardver maga megoldaná, neked csak egy while(1); ciklus kellene. A hozzászólás módosítva: Márc 13, 2013
Idézet: „PWM with 2ms period and 10% duty Configure timer 0 to generate a 2ms period with a 10% duty cycle. The fast PWM mode where the period is controlled by OCRA has (WGM2,WGM1,WGM0) = (1,1,1). The compare match B output must be used and it should turn on at TOP and reset at match. This happens when (COM0B1,COM0B0) = (1,0). The prescaler is set to 64. TCCR0A = _BV(COM0B1) | _BV(WGM01) | _BV(WGM00); TCCR0B = _BV(WGM02) | _BV(CS01) | _BV(CS00); OCR0A = 250; The duty cycle (period the PWM is on) is controlled by OCR0B. The range of OCR0B is from 0 to OCR0A (or 250 in this case). If OCR0B exceeds OCR0A, then the PWM output will be always on. A duty cycle of 10% is set by: OCR0B = OCR0A * 10% = 250 * .1 = 25 The configuration is complete when OCR0B is assigned: OCR0B = 25; Changing the output compare control setting (COM0B1,COM0B0) = (0,1) inverts the waveframe (i.e., the output will be off for 10% and on for 90%).” A hozzászólás módosítva: Márc 13, 2013
Így bizony sokkal elegánsabb.
Skimen, tévedtem: halgass csibeszq -re. Az órajel tévedés hátterének rejtélye mindenesetre fel lett fedve.
Ha tud valaki segíteni atiyi45 ez a kis progi . Hogy kell át írni, hogy felváltva villogjanak a ledek ?
Csak a valtoztatast irom:
Hali mindenki!
Szívok egy kicsit (1.5 napja) mega8 és 2*16-os LCD-vel. Az alapgondolat az volt hogy átportolom az itteni enkóderres (2xdekodolás) cikket Tinyről megára, de kijelzőn csak "kockák" vannak. LCD bekötése ua. minta tinynél (PORB-re) Ezután elkezdtem nézegetni, tesztelni a HE-n fellelhető LCD drivereket és példaprogramokat. Mindegyikhez megcsináltam a portbeállítást, kicsipogtam hogy minden vezeték oda megy ahova kell. Mega belső 8MHz-ről megy, ezt is beállítottam a programban, de a kockák maradtak ! A kijelző tökéletesen megy az LCM3-ban, a mega is új, más hardver nincs is rajta csak a kijelző. Hol bukhat még el a projekt??
Szia!
Leggyakoribb a szoftver. Másik kérdéses dolog, hogy milyen kijelző? (44780 kompatibilis?) 4 vagy 8 bites üzemmódban használod? A nem bekötött lábakkal mit csináltál? Figyeled a kijelző foglaltságát vagy időzített az adatküldés? Kiborg A hozzászólás módosítva: Márc 14, 2013
Kijelző: DEM16216 természetesen hd44..kompatibilis, azért is írtam hogy működik LCM3 műszerben, 4bit módban (abból szedtem ki) 4 bites módban használnám a "maradék" láb a földre van kötve.
Köszönöm a válaszod!
Akkor nagy a valószínűsége, hogy mégis a programmal van valami. Lehet átnézni a programot és kitalálni a hibát. AZ AVR megy rendesen? Külső/belső órajel ? Megfelelő frekin megy? Időzítések rendben vannak?
Kiborg
Idézet: „AZ AVR megy rendesen?” Ez az amit ugye nem látok.. kellene a kódba szúrnom egy led villogtatást... Belső RC 8Mhz-en kellene neki ketyegnie, a programban megadtam az F_CPU-t, elvileg ettől az időzítésnek is jónak kellene lennie.
ATMEGA48 lehet-e pic kit 2 vel programozni , ha igen hogyan ?
Sziasztok
AVR studioban nem jelenik meg az 'external dependencies'-ben a külső fájlok, valaki esetleg tudna segíteni? Köszi
Idézet: Melyik ez a cikk ? Keresem, de nem találom..„Az alapgondolat az volt hogy átportolom az itteni enkóderres (2xdekodolás) cikket Tinyről megára,” Amúgy én is jártam már így és az LCD inicializálással volt gondom. Az időzítésekkel. Nálad is lehet mert nem éled fel az AVR.
Melyik verzióban?
Sziasztok!
Szeretnék készíteni egy olyan programot ami egy gomb megnyomására generál egy véletlenszerű számot 0 és 100 között majd ezt kiírja egy 7 szegmenes kijelzőre. AVR esetén ezt hogyan kell csinálni? Mert azzal a módszerrel amit itt olvastam azzal hibát jelez a fodító. Köszönök minden választ!
Sziasztok!
Atmega48 timer megszakítást szeretnék létrehozni, 8as előosztással, és a counter alapértékét 246 ra szeretném állítani, ezzel 80as előosztást elérve. Ennyire jutottam, de valami gond lehet a kódommal, mert nem pontos az osztás, mintha nagyobb lenne az előosztás...
Valaki tudna segíteni? Miért nem 80 az előosztás? Üdv.: Zoli
AVR Studio 4.18
Ezzel a véletlenszám dologgal nem vagy egyedül.
Több megoldás is van. ha pl gombnyomásra kell kiírnia, akkor a legegyszerűbb, ha pörgetsz gyorsan egy számlálót és gombnyomásra megállítod. (pl 100kHz es órajellel) ekkor esélytelen kiszámolni, hogy mi lesz az eredmény. De ha programozni akarod, akkor nehezebb a dolgod sajnos. Van hardveres random generátor, de az macerás. De az tuti. Szoftveresen még nem találtam meg az igazit. Kiborg
Én a szabadon lógó ADC bemenetet használom véletlen szám generálására. 10-szer beolvasom a mért értékét, aminek rendre az LSB bitjét beshiftelem balra egy kezdetben üres változóba. A végén lesz egy 10 bites, eléggé véletlenszerűnek tekinthető eredményem.
Majd egyszer loggolok pár 10 ezer mérést ezzel a módszerrel, és megnézem mennyire egyenletes az eloszlása.
Köszönöm az ötleteket, sikerült megoldanom!
A megoldás nálam ennyi:
Lehet, hogy nem a legtökéletesebb megoldás, de így is eléggé véletlenszerű. |
Bejelentkezés
Hirdetés |