Frekvencia mérés

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
HPMaster
Bitmanipulátor
Hozzászólások: 138
Csatlakozott: 2008. március 10. hétfő, 6:00
Tartózkodási hely: Budapest IX. ker

Frekvencia mérés

HozzászólásSzerző: HPMaster » 2010. december 23. csütörtök, 10:05

Tiszteletem Urak!

A kérdésen az lenne, (bár lehet, hogy volt már erről szó. de nem találom) hogy INT lábra érkező frekvenciának mekkora lehet a maximuma?
Hogyan tudom meghatározni?
Van ugyanis egy projektem. 16MHz-es kvarccal megy a proci, és pár kHz-es tartományt még mér. Viszonylag pontosan.
De jó lenne tudnom, úgy általánosságban, hogy adott kvarc mellett mekkora lehet az a bemenő freki, ami még nem terheli le teljesen a procit az INTERRUPT rutinhoz való folytonos ugrálgatással?

Avatar
winnerbt
Chipfüstölő
Hozzászólások: 894
Csatlakozott: 2007. március 25. vasárnap, 6:00
Tartózkodási hely: Kecskemét

HozzászólásSzerző: winnerbt » 2010. december 23. csütörtök, 12:26

Az az int rutinod hosszától is függ. INT-kor elpushol mindent, RETURN-nál meg vissza POPol, tehát 64 utasítás tuttira lefut (hacsak nem kérsz nopush-t), vagy Te kezeled a stack-et, akkor sporolhatsz. De ha van a uC-dben Timer-capture, azt is használhatod, az tud ÍNT-et is adni.
JAni

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3293
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2010. december 23. csütörtök, 12:52

Szerintem ne használj megszakítást! Ha frekvenciát akarsz mérni, közben ne akarj mást is csinálni!
Inkább:
1-ik Timert beállítod, mondjuk 1ms vagy 10ms megszakításra.

Írjál 1 ciklust (Lehetőleg ASM-ban), ami közvetlen figyeli a bemenet változását. És minden 0-1-0 változásra, növeli a periódusszámlálót. A ciklus elején indítod a timert Int engedélyezéssel.
Vagy használhatod a másik számlálót külső jelek számolására. Ez HW alapon még gyorsabb lesz.

Timer megszakításban: Kiolvasod a periódusszámlálót és kiszámolod belőle a frekvenciát.
Szerintem így lesz a leggyorsabb! Esetleg több mérés átlagát is veheted, a pontosság kedvéért!

Ui.: Közben volt 1 áramszünet, és megelöztek! De a tanács hasonló!
8)

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9970
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2010. december 23. csütörtök, 12:53

Én amit csinálnék:

Timer számláló bemenetére kötném a mérendő jelet. A timer 1 0...65535ig mér. Másik timerrel meg órajelalapot hozok létre. És két ilyen órajelalappal mérek. 0. órajelalap: timer1=0. 1. órajelalap: timer1 kiolvas.

Frekvencia:
Timer1 értéke/órajelalap hossza :)

NINCS állandó INT ami beterhel, tisztán HW alapú a mérés.

Avatar
winnerbt
Chipfüstölő
Hozzászólások: 894
Csatlakozott: 2007. március 25. vasárnap, 6:00
Tartózkodási hely: Kecskemét

HozzászólásSzerző: winnerbt » 2010. december 23. csütörtök, 13:05

Ha másik INT is a cuccban, felejtsd el a pontos frekimérést, mivel az AVR vackokban nincs prioritásos INT. Mondjuk legalább Capture esetén tudna reload-ot, de eddig nem akadtam rá, hogyan is kellene csinálnom. :(
JAni

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3293
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2010. december 23. csütörtök, 13:19

„mivel az AVR vackokban nincs prioritásos INT.”

Nincsen de megoldható ez is!
Mondjuk van 2 vagy több INT.
Mondjuk INT0 az elsődleges akkor a többi INTx elején engedélyezed az „Enable Interrupts”-ot. Esetleg még „Disable Intx”, hogy sajátmagát ne szakítsa meg.

Ezzel a trükkel már INT0 megszakíthatja bármely alacsonyabb szintű másikat.
Csak kicsit nagyobb verem kel hozzá!
8)
És a megszakítás hosszát is bele kel kalkulálni az idő alapba. A nagyobb pontosság elérése érdekébe
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2010. december 23. csütörtök, 13:41-kor.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9970
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2010. december 23. csütörtök, 13:36

Nem szakítja meg ekkor sem!

Kivéve, ha az INT rutinban figyeled, hogy a INT regiszterbe beesett-e egy kérés, és innen ugrasz _tovább_.

De hogy miről is beszélünk?

Timer1 - 65k-ig számol.
Timer0-val mintavétel beállít.

Az INT be/kilépés 25-25 órajel plusz belül a Timer 1 nulláz illetve változóba kiolvas. Ez legyen újabb 25. Azaz a teljes Timer0INT: 75 órajel. Ez 10 MHz esetén:
1 órajel 1 utasítás: 0.1 usec
75 órajel: 75 usec.
Így ha frekvenciában nézem, akkor 130kHz mérhető. DE: Minthogy CAPTURE-vel mérek, ami esetén a TIMR1 akkor is számol ha akár INTben vagyok, így a mérési pontosság csökken csak. Azaz a mérési pontatlanság lesz a 75usec!

Ha 100 kHz-t mérek, akkor 1 rezgés ideje: 10 usec!

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9970
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2010. december 23. csütörtök, 13:40

Még 1 trükk:

Enable Timer1 és Disable Timer1 (ill az órajelforrás mi legyen: bemeneti láb vagy NINCS). Ez ~ 5 órajelet vesz igénybe.

Az indítás és a leállítás vesz el időt, azaz ezalatt beeső impulus lehet macerás.

De ha hosszabb a mérési periódus, akkor ez az idő elenyésző....

Amúgy a Capture max frekvenciája: Órajel * 0.4. Azaz 20 MHz esetén 4 MHz mérhető.

Kiskapu: külső számláló CMOS alapon, vagy egy előosztót tessék berakni, így ez a frekvencia feltornászható.....

Szóval önálló AVRrel a mérés órajel 40%-a. Itt a SW az ami a feldolgozásért felel, azaz ez mondja meg hogy milyen pontosan akarsz mérni....

Avatar
winnerbt
Chipfüstölő
Hozzászólások: 894
Csatlakozott: 2007. március 25. vasárnap, 6:00
Tartózkodási hely: Kecskemét

HozzászólásSzerző: winnerbt » 2010. december 23. csütörtök, 13:53

A következő dolog jutott eszembe, kíváncsi vagyok, mit szóltok hozzá:
Van RTC a cuccban (lehet másik timer kimenő jele is persze, akinek van), az ad 1Hz-et. Ezt rákötöttem a capture bemenetre, lefuto élre. Sajnos nincs számlálás engedélyezés láb, így kivülről egy ÉS-kapu megy az 1Hz-re és a bejövő frekire. Az 1Hz=1, akkor freki be, Timer számol. 1Hz=lefut, capture megfogja a CT értékét és ad egy INT-et (ami persze vagy végrehajtódik, vagy nem), de van 0.5 sec arra, hogy kiolvassam a capture értékét és nullázzam a Timert. Az meg azért már menni fog. Így mindig 0-ról indul a Timer és az Fbe/2 értéket kapom.
Vélemény?
JAni

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9970
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2010. december 23. csütörtök, 14:12

Ez túl egyszerű:)

Avatar
winnerbt
Chipfüstölő
Hozzászólások: 894
Csatlakozott: 2007. március 25. vasárnap, 6:00
Tartózkodási hely: Kecskemét

HozzászólásSzerző: winnerbt » 2010. december 23. csütörtök, 14:28

Jaja. Főleg hogy a penel már kész. Asszem nem lesz AND-kapu, nemes egyszerűséggel egy FETtel testrezárom a freki bemenetet az 1Hz-el, úgy is OC-optoról jön. Egyszerűsödik és szépen nőnek a kismadzagok a panelen :)

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3293
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2010. december 23. csütörtök, 15:16

Ez lenne a leg 1*űbb! De „PRESCALE= 1” esetén hamar túlcsordul a számláló a hosszú minta vételezési idő „1Hz”-miat! 8)

Avatar
winnerbt
Chipfüstölő
Hozzászólások: 894
Csatlakozott: 2007. március 25. vasárnap, 6:00
Tartózkodási hely: Kecskemét

HozzászólásSzerző: winnerbt » 2010. december 23. csütörtök, 15:55

1/2Hz a mintaidő és 3600Hz-ig kell nekem most mérni (szerencsére). T1 és T3 mér, még nem mertem hozzáfogni, mára elég volt a szívásokból. :)
Mondjuk ez a megoldás erősen glitch-es, de 1-2Hz eltérés most nem számít.
(mondom én, csak a megrendelő meg ne tudja)
LONG-nál nagyobb számunk nincs? Legalább 40 bit kellene, de 48 már mégjobb lenne :)

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9970
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2010. december 23. csütörtök, 16:18

Mekkora számérték kellene?

Double: 64bites...


· Bit (1/8 byte). A bit can hold only the value 0 or 1. A group of 8 bits is called a byte.

· Byte (1 byte). Bytes are stores as unsigned 8-bit binary numbers ranging in value from 0 to 255.

· Integer (two bytes). Integers are stored as signed sixteen-bit binary numbers ranging in value from -32,768 to +32,767.

· Word (two bytes). Words are stored as unsigned sixteen-bit binary numbers ranging in value from 0 to 65535.

· Long (four bytes). Longs are stored as signed 32-bit binary numbers ranging in value from -2147483648 to 2147483647.

· Single. Singles are stored as signed 32 bit binary numbers. Ranging in value from 1.5 x 10^–45 to 3.4 x 10^38

· Double. Doubles are stored as signed 64 bit binary numbers. Ranging in value from 5.0 x 10^–324 to 1.7 x 10^308

· String (up to 254 bytes). Strings are stored as bytes and are terminated with a 0-byte. A string dimensioned with a length of 10 bytes will occupy 11 bytes.




3600 Hz.
Vegyél 10 mp-en át mintát. Így 1/10 Hz pontos leszel....
Esetleg 10 mp alatt másodpercenként, majd osztod 10-l. Így is megvan az 1/10 pontosság....

Avatar
winnerbt
Chipfüstölő
Hozzászólások: 894
Csatlakozott: 2007. március 25. vasárnap, 6:00
Tartózkodási hely: Kecskemét

HozzászólásSzerző: winnerbt » 2010. december 23. csütörtök, 17:16

Épp lebegőpontosra nem akartam áttérni. Olyan lökött a feladat, hogy egésszel számolok mindenütt, de "azért ha akarja, meg tudja már nézni 3 tizedesre is az eredményt" kérés beszaladt. A mért értékem 5 digit, a formátum mutatja meg, hogy ez hogyan oszlik meg egész/törtre. Mindig ezt az értéket teszem el, ezzel komparálok, ez megy a gyűjtőbe stb. Így a határértékek beállitása is egészként történik, az, hogy mit lát a kijelzőn, az csak formátum tili-toli. Kevés gomb miatt karakterenként kell beállítgatni minden számot és néha érdekes dolgokat tud művelni a Single (ugyebár jópár olyan szám van, ami "kettedes-végtelen tört", meg kerekítési hibák) és jártam úgy, hogy a beállított érték átalakítás/visszaalakítás után nem stimmelt és ez azért eléggé zavarja a kezelőt; no, ezért döntöttem a tiszta egész mellett. Viszont most meg elfogyott a 31bit :( De nagyon úgy látom, át kell írnom az egész aritmetikát double-re. Most 596.000 érték után negatívot kapok, ami logikus, mert a mértékegység "/óra", másodpercenként gyűjtök, szóval 596000*3600=2milliárd+ és elfogyott a 31bit. A hosszú mérés sajnos nem jó, 1 másodperc alatt be kell avatkozni a folyamatba. Ja, meg azért féltem a lebegőket használni, mert az egész cucc távvezérelhető és nem tudom, mit szól a belső konvertáló rutin pl. a 23..7c9 vagy 1.2.3 bejövő tört értékhez. Ilyenekre meg hibakezelést írni egy borzalom.
Az egész cuccnak van áram/fesz/freki bemenete (2x), szóval a pontos frekimérés csak egy részfeladat az egészből. A számábrázolási gondok végül is csak azért vannak, mert a kijelző kicsi és fix hosszon kell megjelenítenem mindenféle formátumot. Bocs a hosszú sirámokért.


Vissza: “Bascom-AVR nyelvű programozás (AVR programozásának lehetőségei)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég