Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
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
Lapozás: OK   424 / 840
(#) atideath válasza Ricsi89 hozzászólására (») Márc 15, 2012 /
 
Lehet hogy csak én nem tudok számolni de valami nem stimm azzal amit megírtam .

  1. MCUCR|=(1<<ISC01);  
  2.    GICR|=(1<<INT0);  
  3.    sei();
  4.  
  5. ISR(INT0_vect)
  6. {
  7. if(timer==0)
  8. {
  9. timer=1;
  10. TCCR1A=0X00;
  11.         TCCR1B=(1<<CS11); //eloosztas = Fcpu/8
  12.         TCNT1=0x00;
  13. }
  14. else
  15. {
  16. timer=0;
  17. count=TCNT1;
  18. TCCR1B=0x00;
  19. }
  20. }


A counter tárolja hogy két jel között mennyi idő telt el. Azt nem úgy kellene számolni hogy: 1Mhz AVR frekvenciánál, 1/8-as Timerrel:

Counter*1,5040mSec -nek kellene lennie az eltelt időnek? Mert valahogy nem jó. 500Hz-s jelnél a Counter:2000 értéket kap.
(#) zombee válasza atideath hozzászólására (») Márc 15, 2012 /
 
Ha a mérés ideje alatt körbefordul akkor olyan pontos lesz, amilyen pontosan méred az időt!
Ha azalatt nem fut körbe akkor még programozni kell vele egy keveset...
(#) atideath válasza zombee hozzászólására (») Márc 15, 2012 /
 
Ez a baj hogy szerintem a programban van valahol a hiba, a gond hogy nem találom hol. Azért tettem fel a kódot hátha valaki élből kiszúrja .
(#) vzoole válasza atideath hozzászólására (») Márc 15, 2012 /
 
Én valahogy így csinálnám... (ahogy már modta Ricsi89)

  1. ISR(INT0_vect) {
  2.     sebesség = (kerékméret * órajel) / TIMER; //ha kerék méretet m-ben adod meg, akkor itt m/s eredményt kapsz, amit már könnyen át tudsz számolni km/h-ba
  3.  
  4.     TIMER = 0; //lenullázod a timert, így minden megszakítás az előző megszakítás óta eltelt időt méri
  5. }


Persze kezelni kell még a timer tulcsordulását is, ami szintén nem nagy dolog, egy timer overflow megszakítással számolod, hogy hányszor fordult körbe, az előző megszakítás óta. Csak majd azt is nullázni kell minden megszakításnál.
(#) atideath válasza vzoole hozzászólására (») Márc 15, 2012 /
 
Ezt nemigazán tudom éretelmezni mire írtad.

Megszakítás lábra van kötve a bejövő jel. A kódomba látni hogy az első bejövő jelre elindítom a TIMER-t, a második bejövő jelre leállítom a TIMER-t. Timer pedig megvan az hogy a két jel között hány Timer-idő telt el. De utána vannak gondok az átváltással.

Tudtom szerint 1Mhz-es Órajel esetén a 1 Timer értéke=0.2560 mSec (1/8-as időosztásnál).

De hiába számolok ebből frekvenciát nem azt kapom ami a bejövő jel frekvenciája.
(#) vzoole válasza atideath hozzászólására (») Márc 15, 2012 /
 
A timert nem kell elindítani és leállítani, hanem folyamatosan fusson. Amikor jön a jel, hogy fordult egyet a kerék, akkor jön az INT1... ekkor megnézed mennyi idő telt el az előző megszakítás óta, és ebből ki tudod számolni a sebességet.

Írjak példát?
(#) zombee válasza atideath hozzászólására (») Márc 15, 2012 /
 
1MHz/8 = 125kHz, ennek egyetlen lépése mióta 0.2560mSec??? Nem inkább 0.008mSec?
De elmondom én hogy mi az a 0.2560mSec, ez akkor lenne ha 512 lenne az előosztó - ami nincs!

Szívesen leírnám - sokadszorra - az input capture-t, de én úgy látom hogy amíg az alapdolgokkal nem
vagy tisztába addig teljesen felesleges, elriasztani meg nem akarlak az AVR-ek csodálatos világától.

Időmérésre a legegyszerűbb ha valamelyik INT lábat figyeled. Az egyik felfutó élen indítasz, a következőn
pedig leállítod a mérést. A Timer inkább fusson folyamatosan, neked így jóval egyszerűbb lesz.
Csak arra figyelj hogy indítás előtt mibdig nullázd, és a túlcsordulásfigyelőt is(lásd lentebb).

Az már magánügy hogy milyen osztót használsz, ha 1/8 akkor 8us lesz egy lépés, és ~0.5 másodperc
alatt ér körbe a számlálód - azaz túlcsordul. A túlcsordulásra is tehetsz interruptot amiben
egy másik volatile változót növelsz, így szélesebb időtartományt fogsz lefedni vele.
(#) vzoole válasza zombee hozzászólására (») Márc 15, 2012 /
 
Szerintem felesleges leállítani a timer-t, mert úgy is tudsz vele számolni ha fut, és utána meg megint csak el kéne indítani.
(#) sikolymester válasza atideath hozzászólására (») Márc 15, 2012 /
 
Nos, a következők az észrevételeim:

Nem látjuk a következő deklarációkat:
timer
count

A TCCR1A -t miért piszkálod?

Egyáltalán milyen szenzor van bekötve? Nem lehet, hogy egy-egy interrupt nem zajlik le, mert eleve zavaros jel jön az érzékelő felől? Vagy sőt, hiszterézises a jel, így aztán gyakrabban van interruptod.
Hogyan dolgozod fel az adatot frekvenciára?
(#) atideath válasza sikolymester hozzászólására (») Márc 15, 2012 /
 
  1. volatile uint16_t count=0;
  2. volatile uint16_t timer=0;


Jelenleg négyszögjel 500Hz, 5V Amplitudo. Erre ad vissza az előbb írt példám 2000-et.

zombee: Nem riasztasz el mert nem az a tipus vagyok. Programozásból rendben van a tudásom, de az AVR-ekben mindig találok bőven hiányosságokat. Viszont ez a Timer részleget nemigazán értem teljesen.

vzoole: Megköszönném a példát ha nem nagy kérés.
(#) vzoole válasza atideath hozzászólására (») Márc 15, 2012 /
 
Ha jól értem, akkor nem a kerék minden körbefordulásánál kapsz egy jelet?! (mint a kerékpár sebesség mérőknél)
(#) atideath válasza vzoole hozzászólására (») Márc 15, 2012 /
 
Ha jól tudom egy körbefordulás alatt 4 jelet kapok (négyszögjel). De egyenlőre nem a motoron tesztelem, hanem fix HZ-kal asztalon.
(#) vzoole válasza atideath hozzászólására (») Márc 15, 2012 /
 
Még le tudnád írni a kerék külső kerületét?
Csak azért kéne, hogy valós számokkal tudjak számolni és példát írni.
(#) Reggie válasza atideath hozzászólására (») Márc 15, 2012 /
 
Nem az AVR-ben van a hianyossag...
(#) atideath válasza vzoole hozzászólására (») Márc 15, 2012 /
 
Ezeket a jeleket nem közvetlenül a kerékről veszem le hanem a gyári sebességmutatójáról. Nem tudom mit változtat addig az elektronika azon a jelen ami a keréktől jön.
(#) vzoole válasza Reggie hozzászólására (») Márc 15, 2012 /
 
Szerintem úgy értette, hogy az AVR tudásában talál mindig hiányosságot.

Egy kicsit számolgattam... de nem stimmel valami:
Írtad hogy:
100km/h sebességnél 1120Hz jelet kapsz.

Ez azt jelenti, hogy :
100km/h = 1020 jel másodpercenként
azaz:
27,7m/s = 1020 jel másodpercenként

Írtad, hogy 4 jel van egy körbefordulás alatt, ami:
27,7m/s = 280 körbefordulás másodpercenként

Ebből ki tudod számolni a kerületét a keréknek, ami:
sebesség/körök számával
27,7 / 280 = 0,0989m >> ~10cm a kerülete a keréknek
0,0989 / 3,14(pi) = 0,031 >> 3,1cm a kerék átmérő

jó kicsi motor lehet
(#) atideath válasza vzoole hozzászólására (») Márc 15, 2012 /
 
Annyit tudok konkrétan amit leírtam. Én nem számolgattam a kerékátmérőt meg ilyeneket .

Egy illető már megépítette ehhez a motorhoz ezt a dolgot, az ő oldaláról próbálok gyűjteni információkat és ott olvastam ezeket az adatokat. Bővebben: Link

Mert hát persze a forráskódot nem küldi el. Kérdeztem tőle. Csak felprogramozott AVR-t. Amivel nem tudok mit kezdeni mert változtatni akarok 1-2 dolgon benne.
(#) Reggie válasza vzoole hozzászólására (») Márc 15, 2012 /
 
Tudom, de ami neki kell siman megoldhato. Ezert mondtam amit mondtam. Csak hallgatnia kene zombee-ra.
(#) vzoole válasza atideath hozzászólására (») Márc 15, 2012 /
 
Na az a gond, hogy teljesen tisztában kéne lenni a motor gyári sebességmérő rendszerével.

Azért, mert ha tudod, hogy hol milyen jelet kapsz és miért, az nagyban elősegít, hogy megoldást találj a problémádra.

Jelen esetben van egy analóg sebességmérő műszer a motoron, amit szerintem nem tudsz frekvenciával befolyásolni. Tehát vagy kitöltési tényezővel, vagy feszültséggel vezérled a kilengését.

Viszont a mérő érzékelő valahol a sebességváltóban lesz az utolsó tengelyen. Ott pedig körbefordulásonként kapsz X jelet. Tehát ezzel a frekvenciával nem tudod az analóg műszert közvetlen meghajtani. Valahol lesz egy átalakítás.

Még az átalakítás előtti jelet kéne elcsípned valahol.
Ha ez megvan, máris tudod hogyan méri a sebességet és ebből el tudsz indulni.

Lehet enélkül is próbálkozni, lemásolni kész projekteket, de akkor minden apró hibánál el fogsz akadni.
Sokkal nehezebb mindent megérteni és átnézni, de akkor tudod mi miért történik.
(#) Tomi_Bp válasza zombee hozzászólására (») Márc 16, 2012 /
 
Idézet:
„Szívesen leírnám - sokadszorra - az input capture-t”


Igen sűrűn előjön ez a probléma... Mi lenne, ha valaki írna végre egy frekvencia mérő cikket, vagy valamit cikkben és akkor lehetne arra hivatkozni...

Tudom, anno nekem is kellett segítenetek, és én meg is írnám, de annyira nem vagyok penge... Ötlet? Vállalná valaki? Lehetne a bemeneten egy számláló és akkor tudna órajelnél magasabb frekit is mérni...
Lehetne akár km/h óra is pl. bringára, motorra (reed relé + mágnes), vagy fordulatszám mérő kocsiba...
Nem jó cikk ötlet? Nincs kedve valakinek megírni?
(#) zombee válasza Tomi_Bp hozzászólására (») Márc 16, 2012 /
 
Én speciel már jó ideje tervezek autóba kilométerórát, de csak nem akar összejönni. Főleg a jeladó része.
A reed relé szerintem nem valami jó mivel "receg", helyette Hall-generátorral kísérletezem.
(#) Fizikus válasza Tomi_Bp hozzászólására (») Márc 16, 2012 / 1
 
En az ultrahang erzekelos cikkemben ismertettem roviden az input capture-t. Ott a visszhangimpulzus hosszat mertem vele. Az a peldakod konnyen modosithato es felhasznalhato frekvenciameresre, vagy kitoltesi tenyezo meresre...
(#) Tomi_Bp válasza sikolymester hozzászólására (») Márc 16, 2012 /
 
Nem, nem JTAG-et hsználok.
AVR Studio 4.16.638 és AVR-Doper USB-s ISP programozót. Nem találtam, de mindegy, annyira nem fontos, csak jó lett volna...
(#) Tomi_Bp válasza Fizikus hozzászólására (») Márc 16, 2012 /
 
Ezt a cikkedet azt hiszem nem olvastam (elkerülte a figyelmem) ... Ez tényleg jó cikk
(#) Tomi_Bp válasza Tomi_Bp hozzászólására (») Márc 16, 2012 /
 
Mégiscsak olvastam... teljesen hülye vagyok
(#) Fizikus válasza zombee hozzászólására (») Márc 16, 2012 /
 
Nezzed meg az alabbi es az azt koveto hozzaszolast. A bennuk levo linkeket es a PDF fajlt is. Egy hazi keszitesu Hall-szenzoros enkoder leirasa van rajta.
Ezzel mar lehet sebessegmerot kesziteni...
Bővebben: Link
(#) norbiv8 hozzászólása Márc 16, 2012 /
 
Sziasztok,

a fleury féle I2C könyvtárat használnám AVR studio alatt, de valamiért nem megy, olyan, mintha nem címezné meg a kívánt regisztert, pl ha eepromból olvasok, akkor ezt jól látni, hogy csak sorban olvassa a tartalmát. Az i2cmaster.h és twimaster.c fájlokat linkeltem be a projektbe. Nem találom mit baltázok el...
(#) IMi válasza norbiv8 hozzászólására (») Márc 16, 2012 /
 
Szia!
Esetleg: Bővebben: Link
(#) norbiv8 válasza IMi hozzászólására (») Márc 16, 2012 /
 
Így csinálom, szépen le is fordul. HW-t átnéztem párszor, az rendben van, felhúzó ellenállások is megvannak. Proci órajel 8MHz, I2C órajel 100KHz, USART stb megy szépen, csak az I2C nem akar. A kódot leegyszerűsítettem csak olvasásra.
  1. i2c_start_wait(0xa0);
  2. i2c_write(0x05);
  3. i2c_rep_start(0xa1);
  4. ret = i2c_readNak();
  5. i2c_stop();
  6.  
  7. USART_Transmit(ret);
(#) BazsiBacsi hozzászólása Márc 16, 2012 /
 
Üdv mindenkinek!

Szükségem lenne egy olyan eszközre, ami 3-5V értékhatárok közt 0,1V skálával feszültséget állít nekem elő. Mivel van itthon felesleges M8-am, és HD44780-am, PWM-re gondoltam, és ADC-vel még a feszültséget is nyomon tudnám követni. Csak az a problémám, hogy a számolgatások után rájöttem, hogy elég magas lenne az áramerősség, 800mA.

Ti hogy oldanátok meg ezt a problémát?
Válaszotokat előre is köszönöm!

Üdvözlettel:
BazsiBácsi
Következő: »»   424 / 840
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem