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
Hello.
Mielőtt HV-progizót építesz, érdemes külső oszcillátorral meghajtani, ha a külső kvarc nem lenne elég az induláshoz. OSC-in lábra 1-8Mhz külső jelforrást kapcsolni, mert lehet, hogy Ext-osct sikerült konfigurálni. Ez még így mindig kevesebb meló, mint egy HV progizó, bár egy fusebit - doktor mindig jó ha van a házánál.
Annak ellenére, hogy van rajta külső oszcillátor?
Mármint kvarc? Mert azt önmagában nem rezgeti, akkor, ha ext-osc van beállítva, egyszerűen várja az órajelet. Az ext osc, és a külső kvarc közötti annyi a különbség, hogy utóbbinál van rezgéskeltő áramkör a konfigban, míg ext oszcillátornál nincsen.
ext osc, ext xt nem ugyanaz. Ha tényleg külső oszcillátorral sem indul, akkor pasz, kell a fusebit doktor. A hozzászólás módosítva: Dec 22, 2014
Feltételezem,
Idézet: "External Clock"-ra gondoltál, ami CKSEL=0000. „ha ext-osc van beállítva, egyszerűen várja az órajelet” Ext. Crystal/Resonator esetén megy a kvarc + 2x12-22pF kondi a GND-re.
Igen, sajnos, most néztem meg az avr-studioban, mert mint kiderült félreérthetően fogalmaztam meg. Ott is így írják, ext. Crystal Osc alatt valójában csak a kvarcot értik a kondikkal. ext. clock meg külső órajel, amit valójában egyszerűbben külső oszcillátor kvarcal, mint jelforrás adhat.
Sziasztok
EEPROM-ba szeretnék kimenteni pár adatot két percenként. Ez megy gond nélkül, és a kiolvasás is, csak a 100.000-es írási limittel ez hamar elhasználja azt a pár cellát amiben vannak. Olvastam wear-leveling technikáról (ahol "vándoroltatják" a cellákat), de nem találtam számomra értelmezhető mintapéldákat. Ha valaki használja ezt a technikát, az tudna velem osztani egy mintakódot, amiben átlátom mit és hogy kéne? (Atmega328p)
Sziasztok.
A napokban építettem két avr égetőt: Bővebben: Link és Bővebben: Link Mindegyiknél ugyan az a hiba: a céleszköz nem válaszol. Szerintetek ez miért lehet, én már kezdek a számítógép lpt portjára gyanakodni. (Operációs rendszer: Windows XP) A válaszokat előre is köszönöm.
Szia!
Ugye kap tápot a cél az avr? Az első linken lévő égetőnek is kell táp!
Sziasztok!
Bővebben: Link 1perc40-től van az első videóban egy forgó animáció a számok váltására. Mit gondoltok, hogyan lehetne ezt könnyen megoldani? Van egy tömb, ami 30 elemből áll, a 0. elem az első oszlopot jelenti, és így tovább. Ahogy módosítom a tömböt, az szinte azonnal kikerül a kijelzőre megszakításból, azzal nem kell törődni. Én arra gondoltam, hogy létre kell hozni ennek a forgó animációnak minden képkockáját, és azzal kell bitművelettel módosítani a tömböt, esetleg egy ideiglenes tömbben létrehozni a megfelelő képkockát, és bemásolni az eredeti helyére. A másik kérdésem, hogy most delay-ekkel oldottam meg az animációjaimat, így olyankor semmi más nem történik. Ezt hogyan lehetne interrupt-tal megoldani? Két animációm van jelenleg, másodpercenként megtörténő, amikor a mp megváltozik, a másik pedig fix időnként átváltok időről hőmérsékletre. Ami zavar, pl. mikor a másodperc animálódik, akkor ha változik a perc, akkor megvárja az egész, amíg kész a másodperc animáció, majd vált a perc is. Köszönöm.
Köszi. Bővebben: Link
Hol van itt video? Itt csak ket kep van es 1-2 link, de videohoz egyiks sem visz. Pedig izgalmas tema lenne.
Egy egyszeru modszer: Egy strukturaba szervezed adatkupacodat, amit ket percenkent el akarsz menteni. A strukturahoz hozzateszel meg egy szorszam mezot (24 bit) meg egy checksum mezot. Felosztod a rendelkezesre allo EEPROM teruletet n darab ilyen struktura tarolasara alkalmas reszre. Ahanyszor ki kell irni az adatokat, a szamlalot eggyel noveled, kiszamolod a checksum-ot, es kiirod az egesz strukturat a soron kovetkezo helyre az EEPROM-ban. Ha a vegere ertel az EEPROM-nak, akkor kezded az elejerol. Ettol ugye szetszorva van az adat az EEPROM-ban, egy-egy cellara kevesebb iras jut. Amikor szukseg van a legutolso adatra, akkor vegigmesz az EEPROM-on, es megkeresed a legnagyobb sorszamu, hibatlan checksum-u bejegyzest. A 24 bites szamlalo ~63 ev alatt fordul korbe. Meg lehet csinalni 8 vagy 16 bites szamlaloval is, de akkor az utolso bejegyzes megkeresese lenyegesen bonyolultabb. A cheksum-ot a strukturara szamolod beleertve a sorszamot is. A checksum maga lehet egy 8 bites CRC. Lehet mas check is, de a CRC eleg biztosnsagos es nem nehez szamolni.
Idézet: Ezt nem interrupttal kellene megoldani, mert az nem erre valo. De ha azzal is oldod meg, a megoldas kulcsa mindenkeppen a state machine-ben van, amit állapotgépnek is hivnak. Ennek az a lenyege, hogy pl. a te esetedben tarolod, hogy az animacioban eppen hol tartasz. Ahanyszor meghivod a state machine fuggvenyt, az mindig tudja, hogy eppen most mit kell csinalnia, es mindig valtoztatja a sajat allapotat a kovetkezo lepesre. Magat a fuggvenyt csak x idonkent hivod meg, praktikusan az animacio sebessegenek megfeleloen. Ha tobb ilyen allapotleirod is van, akkor ezzel tudsz egyszerre tobb animaciot is csinalni. Maga a fuggveny gyorsan lefut, nincs benne semmifele delay.„A másik kérdésem, hogy most delay-ekkel oldottam meg az animációjaimat, így olyankor semmi más nem történik. Ezt hogyan lehetne interrupt-tal megoldani?” A korbeanimaciot en ugy oldanam meg, hogy letarolnam egy tombben a pixelek 5x7 matrixon beluli koordinatait olyan sorrendben, ahogy modositani akarom oket. Tehat bal felso saroktol indulva lefele, aztan kanyarodik jobbra, majd fel, aztan balra, egy sorral beljebb lefele, stb. Tehat azt a csigavonalat. Azert tarolnam le, mert egyszerubb letarolni, mint menet kozben kiszamolni. Meg ezzel a modszerrel akarmilyen utvonalat is bejarhat az animaciod, csak a tablazat hatarozza meg, a programot nem kell modositani. Szoval az allapotgep meg minden meghivasnal a soron kovetkezo pixel erteket az uj szamjegynek megfeleloen ki- ill bekapcsolna. Az allapotgep strukturajaba meg tarolni kell, hogy: - a kijelzon melyik karaktert animalod (0..5) - mi az uj karakter, amit ki kell irni - a tablazat cimet, ami az animacio utvonalat mutatja - hanyadik pixelnel tartunk az animacioban. Igy ugyanazzal a fuggvennyel egyszerre tobb karaktert is tudsz animalni, akar kulonbozo modon, csak tobb allapotleiro struktura kell hozza. Elsore talan bonyolultnak tunik, de nem az.
HC595/4953-al van megoldva az interfész ? Van valahol kapcsolási rajz is ?
Szia. Van egy LED mátrix téma, nemrég nyílt egy, ott fent van minden dokumentáció! Ha nem találod, szólj! Egyébként igen, 595tel van megoldva a kijelző meghajtás.
Sziasztok!
Kérhetnék egy pici segítséget? Írtam egy hőmérő programot, LM35DZ-vel. Szépen működik is viszont, amikor nől vagy csökken a hőmérséklet, akkor az egyesek helyiértékén a szám villogva vált. Ezt valamilyen átlagszámítással tudom kiküszöbölni? De ha átlagot számolok, akkor a kijelzésbe nem fog bezavarni? Ez lenne a kód.
Ha a Timer0_ovf-be rakom a kijelzést...
Amikor az túlcsordul, akkor 16Mhz / 1024-es osztással, akkor ki rakom a kijelzőre a számokat. Így az a baj, hogy nem halandó csak az első mérés eredményét kijelezni. Hmm valamit nagyon megbonyolítok.
Jajj de buta vagyok.
Már értem. Na szóval, a kijelzést rakam a fő programba. A mérés meg megy ISR-ben. Ha a timer0 255-nél tovább csordul, akkor mér az ADC. Ez így megint gyors változást jelentene. Azt mondom az ISR-ben, hogy ha a timer0 túlcsordul, akkor egy változóhoz adjon hozzá 1et. Ha a változó értéke nagyobb mint 61, akkor mér ADC-t majd nullázza a változót. (16Mhz/1024/255 = 61Hz) Szóval, ha jól gondolom akkor most 1 másodpercenként mérek ugye?
A hozzászólás módosítva: Dec 29, 2014
Én ennyit javítanák a munkádon:
A hozzászólás módosítva: Dec 29, 2014
Értem a lényegét a változtatásnak. Viszont annyi a problémám vele, hogy nem tudok akkora frekvenciát belőni a két digit váltásához, hogy villódzásmentes legyen.
A megoldás most az, hogy a timer0-nak nem 1024-es osztott jelet adok hanem mondjuk 256-ot? up1: (Oh, igen. 16Mhz/256/255= 245Hz-el lépeget a timer0. Frankó. Megértettem. Köszi szépen!) A hozzászólás módosítva: Dec 30, 2014
Még ezen a „ADC*2 mert” kijelentéseden gondolkozunk keveset!
A mérés közben keletkezett rövidebb tüskék kiszűrésére szoktuk alkalmazni, az egymásután többszörös mérést és átlagolást. Ez a te rutinodban hiányosnak tűnik! (Hol az átlagolás?)
Megmondom őszintén azért nem raktam bele, mert nem jöttem rá magamtól még, hogy tudnék átlagot számolni. Gondolom for ciklus kell. Tudnál segíteni picit?
![]() ![]()
x mintavételt összeadsz és elosztod x-el.
Átlag érték=A mért eredmények összege, osztva a mérések számával.
A osztás művelet helyett a könnyebb jobbra shiftet használunk. Ezért a mérések számát 2 valamelyik legkisebb hatványának vesszük, amely már megfelelő eredményt hoz.
A hozzászólás módosítva: Dec 30, 2014
Értem már. Működik is szépen.
Viszont az ADC méréssel kapcsolatban: Az ADC értékét azért úgy számolom mert... (lehet rosszul gondolom) Szóval az érzékelőm felbontása 10mV/C°. Hogy ne mV-okat kelljen mérnem, raktam be egy műv.erősítőt. 10x-es erősítéssel. Ha az ADC felső 8 bitjét veszem figyelembe, az ADC felbontása 1 ADC = kb 20mV. (Ha 4°C van, akkor az LM35-ből 40mV jön ki. Mivel az ADC-m 20mV-os pontossággal dolgozik, ezért a mért eredményt szorzom 2-vel és így kapom vissza a mért adatot. Mivel én szorzom 10-el műv.erősítővel, lesz ugye 400mV belőle. De ezt osztanom kell 10-el a szofverben. Na már most, ha szorzok 2-vel és aztán osztok 10-el, az ugyanaz mint ha 5-el osztanék. ) Így ha 10°C van akkor: 1000 / 20 = 50 ADC. Ezt osztom 5el és megkapom a hőmérsékletet. Lehet, hogy ez így nagy badarság. Szóljatok, ha hülye vagyok! ![]()
Ez a levezetésed szerintem OK!
Én a mérőpont és a feldolgozó ADC között levő jelvezetéken létrejövő zaj okozta, gyors értékváltozás miatt fellépő, kijelzett érték villogásának kiszűrését próbáltam megoldani. Bár szerintem külső ADCREF szűréssel, és a jelvezeték HW. L-C-tag szűréssel töbre mennél! A hozzászólás módosítva: Dec 30, 2014
Egy kérdés:
Adva van egy logikai bemenet. Ugyanez a port visszajelzést is ad ( ilyenkor kimenet), hogy milyen állapotban van. Azaz ha a bementre 0 V megy, amikor az impulzus megszünik ugyanazon a csatlakozon egy 0, vagy 5 V jelenik meg jelezve, hogy milyen állapotban van a berendezés. Ezt kellene kezelnem egy AVR-rel, azaz elöször el kell olvasni a port állapotát, és ez alapján dönteni, hogy át-e kell kapcsolni vagy sem. Mi lenne a legjobb algoritmus erre? Kösz. |
Bejelentkezés
Hirdetés |