Guruja läsnä? 32kHz Atmelin 328P:hen

Ihan simppeli juttu. Arduinossa (tai nyt jo breadbordiassa) oleva 328 potkii
16 MHz kiteellä. Halusaisin pistää siihen virran säästämiseksi 32kHz kiteen.
Vaan enpä osaa.

Eli mitä temppuja tarvitsee tehdä? Vaihtaa kide, selvä.
Käyvätkö 18pF konkat yhä yksiin 32kHz kiteen kanssa, vai
pitääkö vaihtaa/poistaa?

Tarvitaanko ohjelmallisia asetuksia (jotain Fuseja?)

Jos joku on tämmöistä tehnyt, niin vastaa ihmeessä, kaipaan
käytännön neuvoja, en teoriaa. MCU:t eivät ole minulle kovin
tuttuja, mutta kolvi pysyy jotenkuten kädessä.

-kari

Mitähän sä oot nyt oikeen tekemässä?
Kerro enemmän projektista!
Kaikkein paras tapa säästää sähköä AVR:n kanssa on ajaa systeemiä matalamalla jännitteellä.

Olen tekemässä laitetta, joka pääasiassa “nukkuu”, kunnes se ulkoisesti liipaistaa käyntiin.
Laitteen toimiessa naksutellaan paria relettä, kunnes minuutin-parin päästä mennään taas sleep modeen. Tämä kaikki toimii, ja virrankulutus on nyt noin 1.4 milliampeeria nukkumoodissa.

Boardilla on nyt 16MHz prosessori, sinänsä kaikki siis toimii. En keksi muuta keinoa vähentää virrankulutusta kuin pienentää kellotusta. Ajan laitetta 5 voltilla. Jännitteen pudottaminen vaikkapa 4 volttiin näkyy vain kosmeettisena virrankulutuksen laskuna. Sitä paitsi releet ovat 5V, enkä lähtisi askastelemaan niille omia ohjaimia, koska 5V -> 4V ei tosiaan auta juuri mitään.

Joku mainitsi mahdollisuudesta käyttää 328:n sisäistä kelloa (128kHz?), tämäkin kävisi ihan hyvin, koska en tarvitse tarkkuusajastinta. Mutta mutta… toimiiko sleep mode sisäisellä oskillaattorilla? Ja toiseksi, en osaa tehdä sis. kellon vaatimia asetuksia. Osaamattomuuteni on tässä pääongelma!

32kHz kiteen käyttö ei ole mikään pakkomielle: voin ihan hyvin laittaa 8, 4, tai 2 MHz:n kiteen nykyisen 16 tilalle, jos se olisi helpompi ratkaisu, ja jos virrankulutus laskisi tällä tempulla vaikkapa tuonne 300-500 mikroampeeriin.

Nykyiset asetukset ovat alla. Ihmettelen hiukka fuse-arvoja, tekeekö “safe mode” jotain jäynää? Nämä lukemat ovat Arduinon boardilta, eivät breadbordilta, mutta MCU on se, jota käytän breadbordilla.

avrdude -v -p m328p -c stk500v1 -b57600 -P COM3: -U lfuse:r:-:i -U hfuse:r:-:i -U ef
use:r:-:i

avrdude: Version 5.4-arduino, compiled on Oct 11 2007 at 19:12:32
Copyright © 2000-2005 Brian Dean, bdmicro.com/

     System wide configuration file is "C:\Documents and Settings\User1\Desk

top\arduino-0022\hardware\tools\avr\bin\avrdude.conf"

     Using Port            : COM3:
     Using Programmer      : stk500v1
     Overriding Baud Rate  : 57600
     AVR Part              : ATMEGA328P
     Chip Erase delay      : 9000 us
     PAGEL                 : PD7
     BS2                   : PC2
     RESET disposition     : dedicated
     RETRY pulse           : SCK
     serial program mode   : yes
     parallel program mode : yes
     Timeout               : 200
     StabDelay             : 100
     CmdexeDelay           : 25
     SyncLoops             : 32
     ByteDelay             : 0
     PollIndex             : 3
     PollValue             : 0x53
     Memory Detail         :

                              Block Poll               Page
  Polled
       Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  Max

W ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 5 4 0 no 1024 4 0 3600 3600 0xff 0xff
flash 65 6 128 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00

     Programmer Type : STK500
     Description     : Atmel STK500 Version 1.x firmware
     Hardware Version: 2
     Firmware Version: 1.16
     Vtarget         : 0.0 V
     Varef           : 0.0 V
     Oscillator      : Off
     SCK period      : 0.1 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e950f
avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: reading lfuse memory:

Reading | ################################################## | 100% 0.02s

avrdude: writing output file “”
:0100000000FF
:00000001FF
avrdude: reading hfuse memory:

Reading | ################################################## | 100% 0.02s

avrdude: writing output file “”
:0100000000FF
:00000001FF
avrdude: reading efuse memory:

Reading | ################################################## | 100% 0.02s

avrdude: writing output file “”
:0100000000FF
:00000001FF

avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: safemode: Fuses OK

avrdude done. Thank you.

Toi 16 MHz kiteen käyttökin on ihan ok, jos hoitaa sleep tilat oikealla lailla.

Esim toi 32kHz kide voisi olla timerille, jolla laskeskella seuraavia herätyksiä ja sleep modeksi se että se sammuttaa pää kellon. Sitte toiminnan jälkeen laittaa sleep modeksi joko kaikki kellot kiinni ja interruptilla heräys tai katkaista kaikki sähköt pois ja tehdä heräämiseen oma “logiikka”

Muistelen tota 32 kHz kiteen käyttöä ATMega 128 kokemuksista.

Kiitos limba

Sammutan komennolla set_sleep_mode(SLEEP_MODE_PWR_DOWN);
ja siis käytän (mielestäni) maksimaalista powerin säästöä, mutta pitäisi päästä puoleen nykyisestä 1.3 mA standby-kulutuksesta. Herätys on nastasta PD2 (pinni 4 piirillä).

Erillinen herätys"logiikka" olisi tietty mahdollista rakentaa, mutta en tarvitse sitä, jos saisin kulutuksen jollain konstilla tuonne 300-500 mikroampeeriin.

En kai toista itseäni, mutta datsheet sivu 39 ja sen taulukko…

Laita 32k kide TOSC pinneihin, sisäinen kellotaajuus johonkin pieneen niin Timer2 voi heräättää. Fuseista sitten sisäinen kello päälle. Oletuksena on sisäinen kello megalla. Kelloa voi sitten ohjelmallisesti heilutella. Tällöin on myös syytä olla tarkkana, että ainoa oikeasti aikaa laskeva laskuri on TC2, joka on kellotettu ulkoisella kiteellä.

Taikabitit ovat CKDIV8 =jaetaan 8M kello 8:lla CKSEL3…0 = Kellolähde ja SUT= start up time. Muita jänniä asioita ovat BODLEVEL2…0 BODia tuskin tarvitset, mutta sillä voisi havaita patterin kyykähtämisen. Sen havaitsee sitten rekisteristä, joka kertoo mistä resetti lähti tulemaan. Kokonaisesta virtakatkoksesta, BODista, WDT:sta vaiko reset karvasta.

Käyttöjännitettä laskiessa, on syytä myös tutustua datasheetin Electronic characteristics osioon ja siellä olevaan kuvaajaan, millaisia kellotaajuuksia laite voi ajaa milläkin käyttöjäniksellä.

Hei

ja kiitos vastauksestasi.

Johtopäätöksenä tähän keskustelufoorumiin (ei mitenkään Sinulle, Vuokko) vedän, että en saa täältä
sellaisia neuvoja, joita kysyin.

Kysymykseni kuului, että miten vaihdetaan pienempitaajuinen kide Atmelin 328p:hen, ja mitä ohjelma-asetuksia se vaatii. Näihin en ole saanut vastausta, ainoastaan “katso sitä, katso tätä, tässä tommonen” jne. suoraan sanoen paskaa.

Minulla ei ole kokemusta MCU:sta eikä sen ohjelmoinnista, mutta aika tavalla isompien systeemien pyörittämisestä (Oraclen ERPit). Joten tunnistan kyllä “hyväntahtoisen” paskanjauhannan. Mutta ei siinä mitään. Pitäkää salattu tietonne, sen verran tiedän, että muutaman tavun arvoa pitäisi muuttaa, mutta kukaan ei suostu kertomaan miten, ja mihin arvoon.

Olen sanalla sanoen aika pettynyt. Pitäkää hauskaa.

-kari

Ei tieto ole salattua.

Tottakai voin kertoa hFusen olevan 0xD9 ja lfusen 0x62. Nykaäsin nuo AVR-Burn-o-Matista. Silloin käytetään sisäistä kelloa jaettuna 8:lla. SPI päällä ja boottisektori on isoin tai pienin. Lisäksi käynnistyksessä odotetaan pitkään. Näin minä ainakin tulkitsen tuota ohjelmaa. Jos haluatkin konfiguroida tuon laitteen nopeasti käynnistyväksi kysyt uudelleen.

Vielä alemmkasi saat kellotaajuutta
CLKPR |= (1 << CLKPCE)| (1 << CLKPS1)|(1<<CLKPS0); 125 kHz. Voi olla ettei toimi, koska CLKio tulee olla 4x CLKasy, jotta timeri pelittää. Jätä CLKPS0 tuosta ylempää pois ja saat 250kHz.

Onko siis väärin ohjata tiedon lähteelle, jossa kerrotaan nämä asiat ja pystyt sen jälkeen itsekin toimimaan? Kide tarvitsee kaksi konkkaa ehkä. Noin 10pF riippuen kiteen kapasitanssista.

ASSR |=(1 <<AS2); Ja loput timer2 konffauksesta saat keksiä itse.

Nukkumatilaksi tulee valita idle, power-save tai extended standby.

Nämä ovat nyt minun kristallipallon antamia arvoja ja en voi tosiaankaan taata, että sopivat juuri sinun projektiisi. Itse menisin tuolla sisäisellä kiteellä, olemattomalla kellotaajuudella ja alhaisella käyttöjännitteelä vain nukkuessa Idle tilassa. Tosin taulukko sivulla 316 antaa oikeasti mitä sinun tulisi saada virransäästötilassa.

Siksi toivon ihmisten aina lukevan asian datalehdestä ja hahmottamaan järjestelmän. Se ei ole mitään piruilua vaan ihan työkalujen tarjoamista. Toivon ja uskon, että et ole puljannut päättömästi Oraakkelin kanssa pelkkien tee näin ohjeiden kanssa vaan lukenut dokumentaatiota ja selvittänyt mitä muutoksesi juuri tekivätkään. Tämä on ihan sama asia.

Nyt olen saanut Finrexinin hörpittyä ja painun takaiisin peiton alle flunssastamaan.

Vuokko,

Kiitos vastauksestasi. Edellinen kommenttini oli kirjoitettu itkupotkuraivarin siivittämänä, joskus ns. turhauttaa…

Yrittelen 8,4, ja 2 Mhz kiteellä, ja katson, mitä virranviennille tapahtuu.

Suurin ongelmani on, kuten sanoinkin, OSAAAMATTOMUUTENI näissä MCU-asioissa.

-kari

Moro,

Tuosta virrankulutuksesta tuli mieleen, niin ajaako sulla jotain pulldownii ylös tai jotain tilaa aktiivisesti, mikä kuluttaa virtaa.
Ei toi virran kulutus sais sleep modessa olla noin korkea olla. Tuosta tuli mieleen, että onko tuo korkea Icc virta IO virtojen aikaansaama. Sleep modeen mentäessä pitää miettiä, että ei ole tuota IO nastojen virrankulutusta.

Edit:
Onko tuo sleeppiin meno tän tyylinen. Aikasempi komento aikutti arduinosta otetulta, josta itellä ei ole kokemusta.

set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable(); // ainakin kertaalleen pitäisi asettaa bootin jälkeen.
sleep_mode();  
sleep_disable(); // tätä ei välttämättä tartte

Sleep Mode on koodattu kuvailemallasi tavalla (aika lailla copy-paste Arduinolta).

Resetin PC 1 olen vetänyt plussaan 10k vastuksen kautta; samoin pinnit PD2 ja PD3 10k kautta miinukseen, pinni PD2 herättää sleep modesta, kun avataan PD2 ja plus väli. PD3 luetaan setupin yhteydessä, ja sen auki/kiinniolo määrittää erilaisia viiveitä. Mielestäni PD3 kytkentä nostaa virrankulutusta hetimiten 70uA, auttaisikohan vastuksen (10k) pienentäminen pinnin ja maan välillä?

Kellotusta pitäisi saada alemmas, sain eilen 8, 4 ja 2 Mhz kiteet, joilla voin kokeilla. Jos saan noi pirun fuset ym. jutut pelaamaan :smiling_imp:

Kiitokset tähän mennessä kaikille vastanneille, vaikka käämini paloivat välillä. Käsi sydämelle: kuka ei ole itse polttanut joskus korviensa välistä pururataa näiden juttujen kanssa? :wink:

-kari

Taisin vihdoin löytää etsimäni.

Täältä voi latailla LowPower -kirjaston, tehty Arduino-yhteensopivaksi. Kirjasto on sellainen, että jopa minä osasin käyttää sitä.

github.com/rocketscream/Low-Power

16MHz kiteellä koekytkentälevyllä 328p:n virrankulutus 5 voltilla on 450uA, kun käyttää hardware-herätystä. Jos käyttää ohjelmallista herätystä (ks. linkin sample) niin mittasin lepovirraksi 6.4uA. Nämä arvot riittävät minulle mainiosti, ja jos viitsin jatkaa askartelua kiteiden kanssa, niin ehkä pääsee vielä pienempiin kulutusarvoihin.

Kiitos vastanneille.

Täältä tähän. Kari

Periaatteessa tuo kiteen vaihto vaikuttaa vain toiminnallisen ajan virrankulutukseen.

Sillon kun sleep toimii syvimmässä moodissa, niin kaikki oskillaattorit sammutetaan. Joskus kasvanu virrankulutus myös voi johtua ESD:stä eli komponentti on ottanu osumaa. Esim tulee esiin vasta sleep tilan virrankulutuksissa.

Edit:
Tuossa rupes ihmetyttää miksi HW herätys vei enemmän virtaa, jos se trigataan ulkoisella tasoaktiivisella keskeytyksellä

Moi,

Täällä tinaamisen Tonava ja kytkentöjen Karpaatti.

Protoon oli jäänyt piikkiriman liittimeen 10k alasvetovastus. Myöhemmin tinasin piikkiriman käyttämättä oleviin nastoihin 1M vastukset alasvetoa varten. Megasella alasvedolla toimii ihan hyvin ja häiriöttä.

Sitten vain käänsin piikkirimaliitintä (4 pinniä) 90 astetta, ja sittenhän mulla olikin IC-pinni 7 (VCC) kiinteästi kytkettynä 10k kautta maahan… OMG! Ihme etten ole sohlatessani onnistunut käräyttämään koko piiriä…

Poistin turhat romppeet kytkennästä, ja nyt sleep-kulutus on noin 14uA viidellä voltilla. Tämä hyvä.

Kari

Eipä tuossa onneksi mitään vakavaa sattunut, virtaa vain palaa vastuksessa n. 500uA, joten saahan sitä miettiä miksi univirrankulutus on liian iso :wink:

Jäipä tässä vähän mietityttämään että entä jos ei käytä sleeppiä vaan haluaa ohjelmallisen virran kultuksen alemmas? sittenkö pudotetaan kidettä? ja miten se nyt sitten taas tapahtuu?

Periaatteessa kellojen tiputus minimiin, millä voidaan ajaa ohjelma tavittavalla vasteajalla. Tämän jälkeen katsoa mikä on minimi käyttöjännite tuolle taajuudelle ja käyttää sitä. Virtalähteeksi vielä DC/DC konvertteri, eikä mikään lineari ratkaisu.

ahaa… nykyiseltään LM317 schemassa ja käyttöjännite säädetty 3,3v sekä 8Mhz kide… pitänee vielä muutella kuvia ennen levyn tilausta…

edit: mitäs mieltä tästä? http://www.digikey.com/product-detail/en/XCL206B333AR-G/893-1161-1-ND/2510702