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
Ahogy Kovidivi is írta, úgy elég szemléletes a kapcsolgatás. A kedvedért elrondítottam azt a kódot tessék:
A hozzászólás módosítva: Szept 25, 2015
Sziasztok!
Végső elkeseredésemre szeretnék egy kis segítséget kérni tőletek. AVR Atmega32-őt használok. Szeretném megoldani, hogy a sleep módból felkeljen a proci több perc alvás után. Külső interruptról már szépen működik, de a timer2-őt nem tudom úgy be konfigolni, hogy felébredjen magától egy idő elteltével. Watch Dog-ot nem szeretnék erre használni mert számolnia kell egy felfutó élt, tehát nem jó ha újraindul a proci. Rengeteg mintakódot néztem. Valaki csinált már ilyet? Segítsen valaki legyen szíves. ![]()
A Watchdog ha jól tudom, nem csak resetelni tud, hanem simán interruptot hív meg, és ha kell, resetel is utána. Nézd meg az adatlapban, hogy melyik alvási módból tud a timer2 interrupt ébreszteni, mert vannak olyan lehetőségek, amikor nem ébreszt.
Idle mód jöhet szóba és a power-save mód,de ez utóbbi csak akkor,ha a timer2 aszinkron módban van.
Szia!
A Timer2-ről csak aszinkron módban ébred fel, de ekkor 32,768kHzes kvarc kell a bemenetre és belső oszcillátorról kell járjon az eszköz. Ekkor max 8sec lehet az alvási periódus, mert 1024-es osztót lehet beállítani és az OVF miatt van még 256-os osztás. A uC leírásában nézd meg mire kell figyelni, mert elég háklis üzemmód, csak figyelni kell pár dologra. . Az alábbi kód mutatja mit kell beállítani a timer beállításánál.
Köszönöm a sok infót mindenkinek! A PWR_SAVE módot szeretném használni mert nagyon lényeges a fogyasztás. A 8sec az még nekem kevés lenne, legalább egy percig kéne, hogy aludjon, majd utána felébredne mérne uart-on küldene adatokat és visszaaludna. Nem lehet, egy számlálóval valahogyan túllépni azt a 8sec-et?
Akkor felejtsd el a 8 Bites AVRt!
Használj inkább 32 Bites ARMot.
Növelsz egy számlálót, utána egy if, ha nem igaz a feltétel, akkor alvás, ha igaz, akkor furhat a főprogram. Az a pár órajel nem fogyaszt sokat.
Máris kipróbálom a számlálót! De előtte felvázolom, hogy mi ez tulajdonképpen, és akkor jobban képbe lesz mindenki. Ez egy időjárás állomás lelke lesz ami méri a szélsebességet, szélirányt, esőmennyiséget, relatív páratartalmat, légköri nyomást, levegő hőmérsékletet, talajhőmérsékletet, és megvilágítást ir és látható tartományban. Ezeket az adatokat leméri a proci aztán alszik egy percet. Eközben a szélsebesség és az esőmennyiség mérőktől ha jön jel akkor az külső megszakításként kezelném felkelne növelne egy változót és visszaaludna. Hiszen ha alvás közben fúj a szél akkor is kell mérni. Ezeket az infókat vezeték nélkül elküldi egy ARM-nak (STM32F4 Discovery Board) ami színes érintős TFT-vel velfegyverkezve várja az adatokat, hogy szépen kirajzolhasson karakterisztikákat és egyéb dolgokat "jósoljon"
![]() Az AVR egyszerűsége miatt (és azért mert a lux-mérőn kívül minden szenzor kész kb.) használnám egy kis napelemes akkumulátoros modullal. Csak tényleg altatni kéne a procit mert akkor 6uA-t eszik méréseim szerint. Vezeték nélküli modulnak is egy 3,3V-os RFM modult használok ami pár 10mA-t vesz fel csak küldésnél egy pillanatra. Szóval máris tesztelem először a 8sec-es felébredést, aztán majd bővítjük. Először csak szép lssan ahogy írtátok megpróbálom megcsinálni. Először is a 20MHz-s kvarcot levettem, helyére raktam egy órakvarcot. Átállítottam a FUSE biteket gyári állapotra. (belső 1MHz 64ms-os indulási késleltetéssel). Ezek után ha asszinkron módba állítom stb.. akkor működni fog a kód amit Istvanpisti bemásolt. Remélem. Hamarosan jelentkezem, remélem jó hírekkel ![]()
Egyelőre nem túl sok siker élményem van. Az xtal1 és xtal2-re most egy órakvarcot tettem, fuse bitek jól vannak beállítva szerintem. Mellékeltem egy képet amin mutatom, hogy van beállítva. (csak szimulátor de meg tudom nézni a hex-ből hogy mit takar). A LED nem villog szerintem az a gond hogy más regiszterek vannak ebben a prociban.
Próbáltam másképpen is, hogy több mindent beállítok pl sei(); cli(); látom sok mintakódban de akkor sem jó. :/ Szerintetek?
Szia!
Az F_CPU=1000000 legyen, mert a kontroller 1 MHz-ről jár. A sleep_mode(); sor után kellene valami kis késleltetés, mert a leírás írja, hogy legalább egy órajelnyi időnek (a TIMER2 órajeléről van szó, ami 32,768kHz) el kell telni a felébredés és az újra elalvás után, különben sosem ébred fel. Erre írtam, hogy egy kicsit háklis üzemmód. Ez lehet pl._delay_ms(10);, vagy ez a három sor a sleep_mode(); sor után.
A hozzászólás módosítva: Szept 26, 2015
Ha kikapcsolom a sleep-et és a while-t ahol írtam, akkor fut csak a főprogram while-ja. Mellékeltem egy mérést amin látszik a PORTD0 és PORTD1.
A TCCR2A és TCCR2B regiszterek nincsenek meg ebben az avr-ben ahelyett TCCR2-őt írtam. Szerintem ez is lehet probléma.
Én ezt úgy küszöböltem ki, hogy várok, amíg a TCNT2=0. Amint átvált, már megyek is aludni. Előtte mindent elvégzek, amit kell.
A set_sleep_mode nem biztos, hogy elküldi aludni a procit, az csak beállítja az alvás módját. Az igazi altató parancs a sleep_mode(); . Kikapcsolni sem kell a sleep_disable(); -vel, ez automatikusan megtörténik, amint lefut egy interrupt. Tehát minden mp-ben, amikor a Timer2 felébreszti. Én így altatok a leggyorsabban:
A hozzászólás módosítva: Szept 26, 2015
Értem amit mondasz de sajnos a ISR(TIMER2_OVF_vect) sem fut már le ha kikapcsolom a sleep dolgokat akkor se. Van valami a timer beállításánál amit kifelejtek de nem jövök rá hogy mit..
Ha sikerül elindítanom sleep nélkül akkor kipróbálom ahogy mondtad. A hozzászólás módosítva: Szept 26, 2015
Lehet, hogy nem megy az órakvarccal a TIMER2. Én is jártam már így, kipróbáltam többet, míg megoldódott.
Raktál-e rá kondenzátorokat a kvarc ás a föld közé?
Igen van két 22pF-os kondi. És nem próbapanelen csinálom hanem, egy saját minimum board-on szóval az érintkezési hiba is kizárva. Viszont gyanús hogy a kvarc lábain nem mérek frekit. Viszont ha ugyan azt a kvarcot átteszem egy elemes gyári rtc modulra akkor ott simán mérhető a 32kHz. Nem hiszem hogy a 22pF sok lenne. A legvalószínűbbnek én is azt látom, hogy nem megy a kvarc miatt, hiszen nincs órajele. Ugyan úgy kell rákötni mintha egy normál kvarcot kötnék?
Azt írja a doksi, hogy nem szükséges ilyenkor külső kapacitás.
Emiatt be sem indul a rezgés. Így van.
Leforrasztottam a kondikat, és direktbe ráforrasztottam a kvarcot a panelre (eddig precíziós tüske volt hogy cserélhető legyen, de most nem bíztam Mörfire). Az eredmény egyelőre ugyan az. Arra jöttem még rá, hogy ha assinkron módba van a proci akkor a timer2 megáll. Ha nem kapcsolom át assinkronra akkor megy mindkét timer és a while-is szépen fut.
Találtam még valamit. Bár ettől csak az interrupttal lesz baj, de az oszcillátornak menni kellene.
Ezt érdemes lenne kipróbálni,csak pár regiszternevet kell módosítani.
Üdv!
PIC írta: Idézet: „Sziasztok! Végső elkeseredésemre szeretnék egy kis segítséget kérni tőletek. AVR Atmega32-őt használok.” Idézet: „Az xtal1 és xtal2-re most egy órakvarcot tettem,” Ha atmega32-ről van szó, akkor a 32,768Hz-es kristálynak az xtal1/2 helyett nem a TOSC1/2 lábakon kellene lennie? A hozzászólás módosítva: Szept 26, 2015
PIC:
Idézet: „Arra jöttem még rá, hogy ha assinkron módba van a proci akkor a timer2 megáll. Ha nem kapcsolom át assinkronra akkor megy mindkét timer és a while-is szépen fut.” Ez is erősíti a gyanúmat, hogy rossz helyen van a kristály.
Kijött a studio 7.Jól gurul,szelektív lett a telepítés ,érdemes váltani.
Igazad van, ez lehet a baj.
Jó híreim vannak. Átraktam a kvarcot és a kvarc lábán gyönyörűen ott van az órajel
![]() Még jobb ezek után működött egyből a kód sleep-móddal együtt... Úgyh mindenkinek nagyon köszönöm a segítséget, most nagyon örülök ![]() ![]() Szép napot mindenkinek!
Sziasztok.
Van 1 mápna pc , 1 atmega 328-pu . 3.3v kap a málnáról. És 1 höérzékelő , ami valamiért többet mér mint kellene. Ha 5 v kötöm az avr-t. Uart ugyanúgy 3,3 v fog komunikálni? ( Txd Rxd ) Vagy ellenálásozni kell? |
Bejelentkezés
Hirdetés |