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
Ha már szóba kerültek a 32k-s kristályok
![]() Egy órát építek, attiny25-tel, ami 32khz-en jár. Ehhez milyen kapacitást kell mellé kötni, hogy pontos legyen? Most 2x15pF van berakva, de így eléggé pontatlan az óra (napi kb 1 perc) A doksi azt mondja, hogy nézzem meg a kristály adatlapján, de ott csak a saját kapacitása szerepel. Ebből hogy lehet meghatározni a szükséges értéket?
A napi 1 perc, az csakugyan elég nagy hiba. De felhívom a figyelmed, hogy vannak egyéb fontos kritériumok is.
Rakd minél közelebb a kvarcot a lábakhoz, illetve a kondenzátor az AVR lába és a kvarc között legyen. Egy adatlapot nem linkelsz esetleg a kvarcodról?
Nem igazán van adatlapja, olyan, mint egy bárhol kapható 32,768 kHz kristyál
![]() Próbáltam közel rakni a kristályt, mondjuk a kapacitások mellé kerültek. Az ilyen tervezési dolgok mennyire számítanak? És magyaráznának napi egy perc pontatlanságot?
Nem tudom, hogyan néz ki a kapcsolásod. Próbapanelen van, vagy magad mart nyákon?
De ez a hiba óriási amúgy. A szokásos ppm mutatóval számolva ez 694ppm (a ppm ugye parts per million, vagyis milliomod). Egy 50ppm-es kristállyal, aminél hirtelen rosszabbat nem is találtam a Farnellnál, ~4,3 mp hibát kellene kapnod egy nap alatt. Nem lehet, hogy valami szoftveres bibid van? Mutasd meg nekünk, hogy hogyan oldottad meg az időkezelést, hátha talál valaki hibát benne.
32.768kHz-es kristálynál vajon kell kondi? Az AVR adatlapjában nincs benne, csak a nagy kristályoknál!
Ez alapján akkor nem kell, hogyha van RTC modul az AVR-ben, márpedig a tiny25-ben nincsen.
AVR134: Real Time Clock (RTC) using the Asynchronous Timer Ez persze felveti a kérdést, hogy mennyire pontos vajon a sima óra bemenete az AVR-nek ilyen lassan oszcilláló kristállyal. Lehet hogy innen van a hiba? Valami rémlik nekem az egyik AVR adatlapból, amiben van RTC perfiéria, hogy pont ezért érdemes azt használni RTC bemenetnek, hiszen az direkt a lassú kristályokra van kiélezve. Érdemes átolvasni ezt az app note-ot, illetve egy RTC periféria leírást teszem azt az atmega8 adatlapjában.
Ezt a pontosság részt nem turom követni: ha a kristály pontosan 32768Hz-cel ketyeg, akkor azt az avr nem tudja "elrontani", nem? Legfeljebb az oszcillátorlábak kapacitása/ellenállása befolyásolják a tényleges frekvenciát.
A doksi alapján nekem sem egyértelmű, hogy kell-e kondi oda, a Low-Frequency Crystal Oscillator részben azt írja, hogy "To find suitable load capacitance for a 32.768 kHz crysal, please consult the manufacturer?s datasheet". Ráadásul a következő fejezetbe a 0.4-0.9Mhz-s kristályokhoz expliciten nem ír kondenzátort, ez alapján szerintem 32kHz-hez sem kellene. Ő például nem használ. Nekem viszont nem indult el nélküle. Az application note szerintem más konfigurációról szól, nekem a 32k-s kristály adja az órajelet is. A programot kicsit leegyszerűsítettem, remélem, nem a hibát okozó részt vettem ki (ha van benne egyáltalán ilyen ![]()
Atmega8 adatlapjából idézve a TOSC1 és TOSC2 lábakra vonatkozóan:
Idézet: „The Oscillator is optimized for use with a 32.768 kHz crystal. Apply-ing an external clock source to TOSC1 is not recommended.” Maradjunk annyiban, hogy egy kvarc rezonálása erősen nemlineáris viselkedésű. Egyáltalán nem mindegy, hogy milyen terhelést teszel rá. A terhelés jelen esetben ugye az AVR órabemenete. Én tehát el tudom képzelni, hogy kevésbé pontosan képes csak működni egy 32kHz kvarc ott, ahol nem ő lett volna szánva elsősorban. A legkisebb kvarc az ~1MHz körül van, amit úgy normálisan használni szoktak, a legnagyobb ~25MHz ez ~1 nagyságrend különbség. A 32kHz ehhez képest ~2 nagyságrend. Kérdés, hogy egy megfelelő kondi ezt képes-e pozitívan befolyásolni?
kösz a választ,már csak 1 kérdésem lenne:
az Mfile-ban rámegyek a "Enable editing of Makefile" parancsra, és ekkor hova ,melyik sorba másoljam be az utasítást amit megadtál. kösz ![]()
Hát nem vagyok nagy makefile guru. Szerintem azt a parancsot futtasd le a command promptban, és akkor behányja neked oda válaszként a .asm tartalmát.
A jó kérdés az az, hogy command promptban ezt hogyan lehet egy file-ba irányítani. Linux alatt ugye | -val átpipeolod bárhova. Ha más nem, akkor a cmd opcióiban beállítod, hogy a puffer teszem azt 20000 sor legyen és kimásolod copy paste-tel.
Az idézet első fele szerintem pont azt mondja, hogy a 32-s kristályhoz van optimailázva a bemenet.
De találtam egy application note-ot, ami alapján úgy tűnik, hogy ha egy proci fel van készítve az alacsonyfrekvenciás krisályokra (ami a 32kHz-t jelenti), akkor van hozzá belső kapacitás is, így külső nem szükséges. Az attiny25-nél viszont nekem marha furcsa, hogy a két lábhoz különöző értékek vannak megadva belső kapacitásnak (16 és 6 pF). Ráadásul azt mondja, hogy "The crystal should be connected as shown in Figure 6-5", és az ábrán ott vannak a külső kondik. ![]() Viszont kipróbáltam, és tényleg elindul kondik nélkül. Mondjuk várni kell 2-3 mp-et (nagyjából jogosan, mert a leghosszabb indulási várakozást állítottam be), lehet, hogy csak türelmetlen voltam a múltkor ![]() Most már csak a pontosságot kell ellenőrizni ![]()
Az idézet első fele tényleg azt állítja amit írsz, csak az atmega8-nak van dedikált 32kHz kvarc bemenete a TOSC1 és TOSC2 lábakon, az idézet pedig ezekre vonatkozik, nem pedig a XTAL lábakra.
Amúgy remélem nő majd a pontosságod.
Végtelenül egyszerű a megoldás, bár ez a leghosszadalmasabb is. Addig-addig állítod timer-ben az értékeket, amíg nem lesz pontos
![]()
Szoftverből nem oldható meg egy ilyen hiba. Ha tényleg igaz, hogy ~700ppm a pontossága így a rendszernek, akkor az pontatlan és kész.
Mert a hiba természetesen +-700ppm-ként értendő. Könnyű is lenne atomórát építeni máskülönben. Persze, ha kiderülne, hogy mégiscsak a szoftver volt rossz, akkor orvosolható kódból, de egyszerű, mint egy faék, amit linkelt a kérdező, én hibát nem találtam benne. Igazából egy dolog miatt lehet érdekes a kód. a 32kHz-ről jár a rendszer is. Valamiért olyan beállítása volt, hogy nem mp-ként ébred fel, hanem 4Hz -ként. Mivel lassú az órajele, ezért sokáig tart, amíg levezérli az interruptot (már ugye lépésben ugyanannyi, mint bármilyen frekvencián, csak éppen 32kHz-en ketyeg a rendszerórajel is), nem lehet, hogy emiatt akkumulálódik fel nagy hiba? Ennek mondjuk ellentmond az, hogy a szimulátorban megnéztem és azt állítja, hogy amint beugrik interruptba, kezdi elölről a számolást a timer. Én mondjuk úgy emlékeztem, hogy az interrupt végén csinálja ezt meg. Tehát ez a nagy kérdés: Az overflow interrupt meddig várakoztatja az számláló újraindítását 0-ról? Mivel mp-ként négyszer lép be ide, ez egy nap alatt 345600 alkalom, ha csak 1 lépésig tart, amíg a számláló újraindul, akkor az 10,5 mp-nyi idő az alacsony rendszerórajel miatt (32.768kHz pontosan). Az 1 perc simán összejöhet, hogyha 6 órajelet vacakol addig, amíg az számláló újraindul. Ha egy szokásos órajelen járna, mondjuk 1MHz-en, akkor a 6 lépés miatt a kiesett idő csak 2mp lenne, ami már egy sima 50ppm-es kristály hibatűrése körül van. Lehet, hogy itt van elásva a kutya? Könnyű kipróbálni: állítsd át az előosztót úgy, hogy 1Hz legyen az overflow ideje és vedd ki a feleslegessé vált részt akkor az overflow interruptból, hogyha 1/4-re csökken a hiba, akkor tádám ![]() Ez viszont akkor tényleg javítható szoftverből, hiszen ez egy kalkulálható fix hiba.
Interruptban is ugyanúgy fut a timer, próbáld ki.
Tudom, mint írtam is kipróbáltam szimulátorban.
Véleményem szerint az overflow interrupt csakugyan úgy játszódik le, hogy a számláló pörög körbe és alkalomadtán bedob egy interrupt flaget. A gondolatkísérlet csak próbálta megmagyarázni a szokatlanul nagy hibát. Az egész könnyen igazolható/cáfolható majd a módosításokkal, amiket mondtam. Habár most nem is tudom, hogy honnan vettem, hogy a rendszer órajel is 32kHz?
A rendszerórajel is 32kHz, szóval jó a gondolatmenet.
Lassan egy napja megy az óra, és pár másodpercen belül van a hiba (ami nagyjából megegyzik a mérési hibával, szóval mondatjuk azt, hogy egyelőre pontos) Az a baj a kisérletezéssel (mármint jelen esetben), hogy sokáig tart. Mert jó, hogy átírom, de sok óra (akár nap), amig kiderül, hogy javított vagy rontott a kód. De szerintem annyi azért kiderült, hogy ilyenkor nem kell külső kapacitás, mert a proci megoldja a dolgot.
és ez a command promt a mfile-ből,vagy a programmers notepadból jön elő?
Start menü, futtatás, majd beírod, hogy cmd , és entert ütsz rá.
Az oké hogy 700 ppm a hiba, de az rendszeres vagy véletlen? Ha rendszeres akkor lásd amit írtam korábban (és a leírásodból ítélve erről van szó), ha véletlen akkor pedig csere az egész, mert arra nincs gyógyír.
Hali! kicsit túlvásároltam magam ATMega8 16PU-ból így egy pártól megvállnék 750Ft-s áron. Ha valakit érdekel keressen meg privátban.
Sziasztok!
Egy atmega8 PORT lábra egy IRFZ 48N-t vagy IRFZ24N-t rá szabad kötni "direktben"? (persze a gate lábat, és az AVR el vezérelném, hogy ki vagy be legyen kapcsolva) Ha jól olvastam, akkor ezeknek a bemeneti ellenállása közel "végtelen", mivel feszültségvezéreltek... Vagy esetleg kell közbeiktatni valami kondit, vagy ellenállást a gnd-re kötve? Előre is köszönet! Zoltán
Én a helyedben nem adogatnám el, sok-sok érdekes cucc van a hálón amit ATMega8-al építettek meg.
A másik hogy szerintem egy kicsit drága helyen vehetted...
Soros ellenállást azért szoktak tenni hogy védje az AVR lábát. Párhuzamosat meg pont a végtelen bemenő
ellenállás miatt: azért, hogy "lebegő" módban ne kapcsolja be véletlenül sem!
Mekkora ellenállást ajánlasz? vagy gyakorlatilag mind1? Jobban megérné egy optocsatolóval elválasztani az AVR-től?
Leválasztani általában felesleges. Az AVR lábára egy 4.7kOhm lehúzó és egy 100Ohm soros ellenállás kb. jó.
Sziasztok. Meg szeretném építeni a főoldalon található 500Mhz-es frekimérőt, csak az a baj hogy véletlenül smd-ben rendeltem meg az ATMEGA48-at, és abban szeretnék segítséget kérni hogy valakinek nincs-e véletlen ehez a tokozáshoz nyákrajza?És hogy milyen progival lehet programozni ezt. Segítséget előre is köszönöm.
Elsőre azt mondom hogy cumi van, egyrészt át kell tervezni az egész áramkört(pl. Eagle),
másrészt még pluszba bele kell tervezni a programozólábak kivezetéseit is. De használhatsz ATMega8-at is, ha a forrás rendelkezésre áll akkor egyszerűen újrafordítod m8-ra! Felprogramozásra AVR Studio vagy PonyProg, attól függ hogy milyen programozóadaptert használsz. A legegyszerűbb és legolcsóbb ha nyomtatóportosat építesz és PonyProg-al égeted fel a kódot.
Sziasztok...Egy kérdésem lenne. Az AVR Doper kimeneti csatlakozóján a Miso, Mosi, Sck, Reset kimeneteket használjuk égetésre. Mellette van van még egy RXD, TXD, CLK....
Ezek tulajdonképpen AVR-nél mire használhatók ? És miért vannak kivezetve, gondolom valami oka van... A másik, hogy van egy USB-HID nevü jumper vagy kivezetés nem tudom... Ez mire jó....? Fery |
Bejelentkezés
Hirdetés |