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   679 / 840
(#) k3gy3tl3n válasza vzoole hozzászólására (») Júl 8, 2015 /
 
Köszi!
(#) csatti2 válasza k3gy3tl3n hozzászólására (») Júl 8, 2015 / 2
 
Ha elolvasod a kézikönyvet, akkor abból láthatod, hogy a PWM mindig eggyel indul (akkor is ha nullára állítod az OCRx regisztert). Az első ciklusban pedig törli azt (tehát egy tűimpulzust kapsz 0 esetén).
A helyes megoldás, hogy ha 0%-os kitöltési tényezőt akarsz, akkor kikapcsolod a PWM pint. Itt egy példa:
  1. void SetFanPWM(int PWM)
  2. {
  3.         if (PWM > MAX_FAN) PWM = MAX_FAN;
  4.         if (PWM < MIN_FAN)
  5.         {
  6.                 TCCR0A &= ~_BV(COM0B1); // Switch off PWM pin
  7.         }
  8.         else
  9.         {
  10.                 TCCR0A |= _BV(COM0B1)// Switch on PWM pin
  11.                 OCR0B = PWM;
  12.         }
  13. }
A hozzászólás módosítva: Júl 8, 2015
(#) k3gy3tl3n válasza csatti2 hozzászólására (») Júl 8, 2015 /
 
Szia, pedig én azt láttam, hogy folyamatosak voltak az impulzusok (villogott a led), nem csak egy volt, hanem végig amíg 0 volt az OCR0A és OCR0B. Amit kiszámoltam, hogy kb fél % volt a kitöltés az durván megfelel a ciklus 255-öd részének tehát mint ha végig 1 lett volna az OCR0A vagy OCR0B.
(#) Droot válasza vzoole hozzászólására (») Júl 9, 2015 /
 
Bocsánat, hogy csak úgy belevaú, de tapasztalataim szerint sok esetben nem jó a Phase Correct PWM, mert ilyenkor a rákötött FET vagy az AVR belső tranzisztora nem kapcsolóüzemben, hanem áteresztő üzemben működik, így elég szépen tud melegedni, tehát jó kis hűtés kell a FET-re, de Fast PWM-ben pedig néhány amperig semmi szükség hűtésre. A kérdés az, hogy csak LED-hez vagy nagyobb teljesítményhez használjuk-e fel?
Van szükség arra, hogy 0% kitöltési tényező mellett egy impulzus se jelenjen meg?
Én is találkoztam a hibával mg régen ATmega8-ban (azóta nem találkoztam), de nekem nem számított. Egy LED-nél látványos de én például fűtésre használtam.
(#) Droot válasza k3gy3tl3n hozzászólására (») Júl 9, 2015 /
 
A másik ötletem, hogy ne gy nullázd az OCR0A, OCR0B-t hogy OCR0A = 0x00 és OCR0B = 0x00. Hátha!
(#) Kovidivi válasza Droot hozzászólására (») Júl 9, 2015 / 1
 
Mindegy, hogy melyik számrendszerben adsz értéket egy regiszternek, a nulla az mindig nulla.
(#) Massawa válasza Droot hozzászólására (») Júl 9, 2015 /
 
Ha lépteted a progit (avr Studioban) látni kellene azt az helyet, amikor a port szintje változik. Nemrégen nekem is volt ilyen gondom, és direkt a portra tettem egy Stop pöttyöt és igy találtam meg, hogy miért változik a szint, ha elvben nem kellene.
(#) Droot válasza Kovidivi hozzászólására (») Júl 9, 2015 / 2
 
Megvan a megoldás!

Így kell kiszámolni a kitöltési tényezőt:
D=(OCRx+1)/(TOP+1) * 100%

Így ha OCRx=0 a kitöltési tényező 0,39%, ha TOP=0xFF. De ha OCRx=255, akkor D=100. Ergó invertáló módba kell tenni Fast PWM-en, így 255-nél 0% lesz a kitöltési tényező, 0-nál pedig 100-0,39 % lesz.
(#) Kovidivi hozzászólása Júl 9, 2015 /
 
Sziasztok! Amtega328 Timer2-re van forrasztva egy óra kvarc, ezidáig meglepően pontos volt. Bővítettem a programot ADC feszültség méréssel, hardverileg pedig bekerült a Lithium ion cella elé egy töltőáramkör. Ezen kívül lényegi változás nem történt a programban sem. Most úgy működik, hogy ha nem alszik az AVR, és figyelemmel követem a másodpercek múlását, akkor minden oké. Viszont ha elmegy alvóba, akkor gyorsabban számol, néha 1mp alatt ugrik 4-et is, pedig csak mp-ként ébred fel az AVR, növeli a mp változót, és megy aludni. A kvarccal kellene párhuzamosan kondenzátor (ha igen, mekkora értékű kb?) , esetleg a tápfeszültség rosszalkodhat (LIR2032-m van) ? Egyéb tipp esetleg? Köszönöm szépen.
(#) Droot válasza Kovidivi hozzászólására (») Júl 9, 2015 /
 
Nem hiszem, hogy ez a gond, de a kvarc két lába és a test közé 1-1 22pF-os kondenzátort kell bekötni. Ez benne van?
(#) Kovidivi válasza Droot hozzászólására (») Júl 9, 2015 /
 
Nincs bent most a kondi, mert rezeg a kvarc, inkább az lehet a baj, hogy vagy túl sokat rezeg, vagy összeszed valami zajt, vagy a timer interruptja túl sokszor hívódik meg. A zajt nem tartom valószínűleg, mert egy alvó módú AVR mindentől távol elég jól szeparált. Lehet a kondi hiánya lesz a ludas, mert egy másik órámban az áramkör zajait szedte össze a bemenet, és mindig gyorsabban számolt, itt viszont csak akkor számol gyorsabban, ha alvó állapotban van az AVR, ilyenkor pedig szinte semmi a zavarkibocsájtás... Esetleg amikor elmegyek alvóba, kikapcsolok minden perifériát, meg lecsökkentem a fényerőt fokozatosan 0-ra, ez zavarna be, aztán alvó módban már semmi gond nem történik. Köszi a javaslatot, innen már csak a harcmezőn fogok tudni továbbmenni, de már meg van az irány, hogy mit kell tesztelni. Remélem kondi nélkül is menni fog, mert nagyon kevés a hely . Köszi!
(#) Droot válasza Kovidivi hozzászólására (») Júl 9, 2015 /
 
A kondenzátort nem szabad kispórolni.
(#) csatti2 válasza k3gy3tl3n hozzászólására (») Júl 9, 2015 / 1
 
Persze, hogy folyamatosak voltak az impulzusok. A számláló két érték között számol (0 és egy tetszés szerint megadható között, ez határozza meg a PWM frekvenciát) majd amikor elérte a felső értéket visszaáll a kezdeti értékre és 1-be állítja a kimenetet (ez a fast pwm-re vonatkozott, a phase correct pwm picit más). A lényeg, hogy az érték ellenőrzés közvetlenül a következő értékre lépés előtt történik (ezért egyben van egy léptetésig a kimenet), ha nem így csinálna, akkor meg a 100%-os kitöltési tényező nem menne. Próbáld ki a kódot, amit adtam.

Idézet:
„The extreme values for the OCR0A Register represents special cases when generating a PWM
waveform output in the fast PWM mode. If the OCR0A is set equal to BOTTOM, the output will
be a narrow spike for each MAX+1 timer clock cycle. Setting the OCR0A equal to MAX will result
in a constantly high or low output (depending on the polarity of the output set by the COM0A1:0
bits.)”
(#) csatti2 válasza Droot hozzászólására (») Júl 9, 2015 /
 
A 22pF kicsit sok a 32.768kHz-es órakristályhoz. A kézikönyv 8-18pF-ot ajánl. (A 22pF-t inkább a 16MHz-es kristályhoz szokták használni). Én 18pF-t használtam egy projektben és a elég volt a szkóp pár pF-es kapacitása, hogy elszálljon a kristály (a 16MHz 22pF-nél nem volt ilyen gond).
(#) zombee válasza csatti2 hozzászólására (») Júl 9, 2015 /
 
Órakvarchoz - tudtommal - nem kell kondi, egyébként a kisebb frekihez dukálna a nagyobb és nem fordítva. Pl. 16MHz-es kristályhoz jó a 12pF, 1MHz-es mellé 27pF az ideális...
(#) csatti2 válasza zombee hozzászólására (») Júl 9, 2015 / 1
 
22pF a maximum javasolt.
Az alacsony órajelű kristály oszcillátor más paraméterekkel dolgozik mint a 400kHz feletti.
Ideális pedig nincs, mivel maguk a kristályok is különböznek (még ha ugyanaz is a frekvenciájuk). A helyes az lenne, ha a kristály saját kapacitását is ellenőriznénk az adatlapon, nem pedig hasraütésszerűen választanánk kondit.
(#) benjami válasza Kovidivi hozzászólására (») Júl 9, 2015 /
 
A kvarcoknak van egy úgynevezett load capacity paraméterük (órakvarcoknál 12,5pF a tipikus értéke, de nem minden esetben ennyi, az adatlapján kell megnézni). Ezt figyelembe véve kell kiszámolni a két rákötött kondi értékét az itt található képlet alapján. Mondjuk azt hogy egy másodperc alatt négyet számolna be, azt nem tartom valószínűnek hogy ez okozná, én is elsősorban a tápfeszproblémára, esetleg hibásan megírt programra tippelnék. Mondjuk egy próbát megér a kondik berakása. A kapacitások változtásával a kvarc frekvenciája is változni fog néhányszor 10ppm-el, ha az órát pontosítani szeretnénk lehet akár trimmerkondival is játszani.
(#) zsuscsinyo válasza Max26 hozzászólására (») Júl 10, 2015 /
 
Idézet:
„Hogyan módosíthatnám DDRx, PORTx, PINx-et egy betű átírásával?”


  1. #define M_DDR   DEF(B)  //Ezt a paramétert változtatod A,B,C,D,E...
  2. #define DEF(x)  DDR##x


Ahol pedig hivatkozni akarsz a DDRx-re ott az M_DDR-t használod.
(#) Gj hozzászólása Júl 10, 2015 /
 
Üdv!

Ezt a projektet akarom megvalósítani, de a baj az, hogy amikor AVR-8-OMat -tal be akarom tallózni az AVRdude.exe-t, nem találom sehol. WinAVR fel van telepítve, ha simán megnyitom intézőben a gyökérkönyvtárát, és rákeresek benne a kívánt .exe fájlra, akkor sincs meg. Már kétszer újratelepítettem WinAVR-t, de nincs meg az .exe.
Valakinek valami tipp? Innen van a telepítő WinAVR-hez.

Hozzáteszem, Atmel Studio (6.2 konkrétan) fordítója működik a WinAVR-rel.
A hozzászólás módosítva: Júl 10, 2015
(#) Ricsi89 válasza Gj hozzászólására (») Júl 10, 2015 /
 
Az avrdude az egy külön program, winavr-hez nem sok köze van.
(#) rolandgw válasza Ricsi89 hozzászólására (») Júl 10, 2015 /
 
/bin mappa...
(#) Gj válasza Ricsi89 hozzászólására (») Júl 10, 2015 /
 
Windowsnál a winavr tartalmazza az AVRdude-ot is.
(#) Gj válasza rolandgw hozzászólására (») Júl 10, 2015 /
 
Nincs ott...
(#) rolandgw válasza Gj hozzászólására (») Júl 10, 2015 /
 
(#) rolandgw válasza Gj hozzászólására (») Júl 10, 2015 /
 
Gondolom win8 vagy valami jópofa víruskereső.
(#) Gj válasza rolandgw hozzászólására (») Júl 10, 2015 /
 
Ez megy linuxra, nem?
(#) rolandgw válasza Gj hozzászólására (») Júl 10, 2015 /
 
Mingw32.zip-et próbáld ki.Nem ismerem az aurdino-t,de az nem telepíti ?
(#) Gj válasza rolandgw hozzászólására (») Júl 11, 2015 /
 
Megoldottam közben, YAC volt a hibás.
(#) yoman917 hozzászólása Júl 13, 2015 /
 
Sziasztok!

Van egy táblázatom az AVR programjában (volatile uint16_t tablazat[212]={23456,21344,12334,stb}, amit soros kommunikációval szeretnék módosítani, felülírni. Sajnos a string kezelésben nem vagyok túl jártas. Azt szeretném elérni, hogy az AVR a beérkező adatokat úgy fűzze össze, hogy vesszőnként szétválasztva új sorba rendez minden egyes számot, így tudnék hivatkozni az első és utolsó sorára is. Ráadásul a kész táblázatnak uint16_t formátumban kellene lennie. Tud valaki segíteni ebben, esetleg pár tippet/tanácsot adni?
(#) Zsolt2 válasza yoman917 hozzászólására (») Júl 13, 2015 /
 
A bemeno adatok ASCII karakter vagy hex? ASCII eseteben van string fuggveny, amivel megkeresheted a vesszoket (strchr) es ezutan at kell alakitani a bejovo karaktereket binaris szamma.
Következő: »»   679 / 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