AVR mikrovaldiklių taktinio generatoriaus nustatymas

Tikriausiai nemažai pradedančiųjų AVR programuotojų susidūrė su AVR mikrovaldiklių „fuse“ bitų nustatymo pinklėmis. Labai dažna frazė pastaruoju metu yra: „Užprogramavau Atmega8 bet jis neveikia ir nebegaliu daugiau su juo nieko padaryti“. Taigi dažniausia problema yra netinkamas saugiklių – fuse nustatymas. Viena didžiausių problemų yra tai, kad čia užprogramuota reiškia „0“ o ne „1“ kaip esame įpratę.

Pažvelkim į viską atidžiau. Saugiklių nustatymo pavyzdžiuose naudojama PonyProg programa. Fuse bitų nustatymo langas konkrečiai Atmega8 mikrovaldikliui:

Atmega8Fuzes.JPG

Pirmiausia dėmesys krypta į taktinio dažnio šaltinio parinkimo nustatymus: CKSEL0, CKSEL1, CKSEL2, CKSEL3. Tikriausiai jums yra žinoma, jog Atmega8 ir kiti Mega serijos valdikliai gali turėti keturių tipų taktiniu generatorius:

  • Išorinį kvarcinį kristalą arba rezonatorių;

  • Išorinį žemo dažnio kristalą;

  • Išorinį RC generatorių arba kalibruotą vidinį RC generatorių;

  • Atskirą išorinį signalų generatorių.

Lentelėje matote visus generatorių pasirinkimus atitinkančius CKSEL0..3 nustatymus:

Visi_AVR_generatoriai.png

kaip matote kiekvienam taktinio dažnio generatoriui yra duotas tam tikras nustatymų intervalas apie kuriuos skaitykit toliau.

Išorinis kvarcinis rezonatorius

Išorinis kvarcinis rezonatorius arba tiesiog rezonatorius yra tikriausiai dažniausiai naudojamas formuojant taktinį dažnį. Jis gali būti nustatomas pasirenkant saugiklių reikšmes nuo 1010 iki 1111 (nepamirškit kad „0“ reiškia užprogramuota, o „1“ – ne). Šitos intervalas yra paliktas tam, kad būtų galima pasirinkti atitinkamus generatoriaus startavimo laikus, kol generatorius pradeda stabiliai veikti iki pradedama vykdyti pirma komanda.

Išorinis kvarcinis rezonatorius jungiamas prie AVR mikrovaldiklio XTAL1 ir XTAL2 kojų:

Kvarco_pajungimas.png

Kai naudojamas išorinis kvarcinis rezonatorius CKOPT bitas nustato du skirtingus generatoriaus stiprintuvo režimus. Jeigu CKOPT yra užprogramuotas (nužymėtas), tada generatoriaus amplitudė artima maitinimo įtampos reikšmei (rail-to-rail). Šitas režimas yra naudojamas kai aplinka yra „triukšminga“ arba atšaka nuo XTAL2 yra naudojama kito mikrokontrolerio sinchronizavimui. Šis režimas naudoja daugiau energijos. Normaliomis sąlygom CKOPT turėtų būti užžymėtas (neužprogramuotas), tam, kad būtų naudojama mažiau energijos. Paprastai esant rezonatoriau dažniui iki 8MHz CKOPT bitas yra neužprogramuotas (PonyProg -„užžymėtas“), ir užprogramuotas („nužymėtas“), kai dažnis yra virš 8MHz.

Lentelėje pavaizduoti fuse bitų nustatymai esant skirtingiems rezonatoriaus dažniams:

kvarco_dazniai.png

CKSEL0, SUT0 ir SUT1 bitai nustato mikrokontrolerio startavimo laiką, t.y. Kiek taktų turi praeiti iki pirmos komandos vykdymo. Šie nustatymai yra tam, kad garantuoti valdiklio stabilią darbo pradžią. Sekančioj lentelėj matyti CKSEL0, SUT0 ir SUT1 bitų nustatymus atitinkantys pasirinkimai:

kvarco_startup_laikai.png

Nustatymai pažymėti (1) – atitinka greitas pradžias – nerekomenduojami kvarciniams rezonatoriams;

Nustatymai pažymėti (2) – dažniausiai naudojami keraminiams rezonatoriams kad garantuoti stabilią darbo pradžią.

Paprastas patarimas, jeigu bet kokiu atveju norisi stabilios darbo pradžios, geriausia palikti CKSEL0, SUT0 ir SUT1 užprogramuotus (nepažymėtus), kas atitinka apie 65ms laiką iki pirmos komandos vykdymo.

Žemo dažnio generatorius

Žemo dažnio generatoriaus CKSEL0, CKSEL1, CKSEL2, CKSEL3 nustatymas yra tik vienas – 1001 (PonyProg – pažymėtas, nepažymėtas, nepažymėtas, pažymėtas). Žemo dažnio generatorius dažniausia būna tipinis 32768kHz kvarcinis rezonatorius naudojamas laikrodžiuose. Pagrindiniai nustatymai šiam režimui yra startup laikas nustatomas SUT0 ir SUT1 bitais:

low_freq.png

Nustatymas pažymėtas (1) – atitinka mažiau stabilią pradžią

Išorinis RC generatorius

Iš tikro ne visada būtina kabinti kvarcą prie kiekvieno mokrokontrolerio. Jeigu jis atlieka tam tikras valdymo operacijas ir nereikalauja didelio tikslumo tai pakanka naudoti RC generatorių. RC generatoriaus dažnis gali būti apskaičiuotas pagal formulę f=1/(3RC) , kur C – turi būti mažiausiai 22pF. Jeigu CKOPT yra užprogramuotas(nužymėtas), tuomet yra įjungtas vidinis 36pF kondensatorius tarp XTAL1 ir GND, tuomet išorėje tereikia prijungti rezistorių:

RC_RC.pngRC_R.png

Na ir žinoma darbo režimai:

RC_CKSEL.png

Bei startup laikai:

RC_startup.png

Nustatymas pažymėtas (1) – nerekomenduojama naudoti prie maksimalių dažnio reikšmių

Kalibruotas vidinis RC generatorius

Kalibruotas vidinis generatorius yra dažnai naudojamas dėl jo paprastumo, nes nereikia papildomų išorinių komponentų. Šis generatorius gali generuoti fiksuotas 1, 2, 4 ir 8MHz dažnius. Šitas režimas pasirenkamas užprogramuojant fuse bitus intervale 0001 iki 0100 (nepamirškit kad „0“ reiškia užprogramuota, o „1“ – ne). Šitam režimui CKOPT bitas turi būti neužprogramuotas (pažymėtas).

Darbo režimai:

InternalRC_dazniai.png

Nustatymas pažymėtas (1) – gamyklinis nustatymas Atmega8 mikrovaldikliui

Startup laikai:

internal_startups.png

Nustatymas pažymėtas (1) – gamyklinis nustatymas Atmega8 mikrovaldikliui

Apie vidinio RC generatoriaus kalibravimą skaitykite datasheet.

Išorinis generatorius

Manau šita vieta slidžiausia daugeliui pradedančiųjų AVR programuotojų. Nes CKSEL bitai žymimi priešingai nei kvarciniam generatoriui. Todėl dažnas atvejis kai visi CKSEL bitai sužymimi galvojant kad įjungiamas kvarcinis rezonatorius(o reikėtų juo nužymėti). Vienintelis kelias atstatyti toki mikrovaldiklį yra prijungti prie XTAL1 kojos išorinį generatorių, kad ir nuo kito AVR XTAL2 kojos:

isorinis_generatorius.png

Kaip ir minėjau, kad įjungti išorinį generatorių reikia palikti CKSEL0, CKSEL1, CKSEL2, CKSEL3 bitus neužprogramuotus(pažymėtus). Startup laikai pasirenkami atitinkamai iš lentelės(SUT0 ir SUT1):

isorinio_startup.png

Pavyzdžiai

Pabaigai pateikiu keletą pavyzdžių. Nustatymai parodyti naudojantis Ponyprog programa:

  • 8MHz kvarcinis generatorius, lėtas startas:

8MHz_kvarcinis.png

  • 2MHz keraminis rezonatorius greitas startas:

2MHz_ceramic.png

  • 32768kHz rezonatorius:

32768kHz.png

  • Išorinis RC 4MHz osciliatorius su su vidiniu kondesatoriumi:

4MHz.png

  • Na maksimali galia 16MHz kvarcas greitas startas:

16MHz.png

Kaip sakoma nieko naujo aš čia neparodžiau – viskas yra data-sheet, tik kartais juos pamirštama paskaitinėti. Jeigu yra klausimų arba netikslumų nesidrovėkit – klauskit.

Skelbta Elektronika Pažymėti: , ,
13 comments on “AVR mikrovaldiklių taktinio generatoriaus nustatymas
  1. X-log parašė:

    labai geras dalykas yra fuse bitu skaiciuokle, nereik knistis po datasheeta http://palmavr.sourceforge.net/cgi-bin/fc.cgi

  2. Anonymous parašė:

    labai geras dalykas yra fuse bitu skaiciuokle, nereik nieko ieskot datasheete, o ir klaidas padaryti mazesne tikimybe
    http://palmavr.sourceforge.net/cgi-bin/fc.cgi

  3. kosmius parašė:

    kokius nustatymus man reiktu padaryti usb programatoriui http://drpage.bartuva.lt/e107_plugins/content/content.php?content.54 ?

  4. mantas parašė:

    nustaciau atmegai8 bitus pagal tavo pavyzdi ir uzsilokino :/
    teko naudoti atskira schema „nulauzimui“, tai ar tikrai ten tikslus duomenys?

  5. Tomas parašė:

    Beieskodamas info uzklydau i sita svetaine. Perskaiciau straipsniuka, bet iki galo neisprendziu savo problemos. Padariau jau ne viena projektuka su 90s2313, o dabar teko imtis attiny2313. Tik niekaip fuse bits neiseina iki galo sustyguot. Bent jau tame problema yra, taip galvoju. Nes identiska programa(holo daviklis ir dinamine indikacija) 90s2313 veike be priekaistu. O attiny dingo signalu skenavimo tikslumas( holo siunciama signala kontroleris uzskaito kaip uz 3, tiesiog programoje gaunasi nestabilumas).
    programuoju su avreal, komandos eiluteje rasau
    E:\avr\avreal\avreal32.exe +tiny2313 -! -p1 -fCKSEL=f,CKDIV8=1,SUT=1 -ab -o10 -ew output\hexfile.hex -n
    pause=null
    Naudoju isorini 10mhz kvarca. Kur mano klaidos?

  6. Tomas parašė:

    Perskaiciau straipsniuka, bet iki galo neisprendziu savo problemos. Padariau jau ne viena projektuka su 90s2313, o dabar teko imtis attiny2313. Tik niekaip fuse bits neiseina iki galo sustyguot. Bent jau tame problema yra, taip galvoju. Nes identiska programa(holo daviklis ir dinamine indikacija) 90s2313 veike be priekaistu. O attiny dingo signalu skenavimo tikslumas( holo siunciama signala kontroleris uzskaito kaip uz 3, tiesiog programoje gaunasi nestabilumas).
    programuoju su avreal, komandos eiluteje rasau
    E:\avr\avreal\avreal32.exe +tiny2313 -! -p1 -fCKSEL=f,CKDIV8=1,SUT=1 -ab -o10 -ew output\hexfile.hex -n
    pause=null
    Naudoju isorini 10mhz kvarca. Kur mano klaidos?

  7. atMEGOS PROBLEMA parašė:

    Sveikas man nesigauna uzprogramuoti atmegis 8 sitai schemai http://cxema.at.ua/publ/10_ti_polosnyj_svetodiodnyj_analizator_spektra/1-1-0-34 viena karta isirase ir uzsiblokavo kokius nustatymus reiketu daryti ? 🙁

  8. atMEGOS PROBLEMA parašė:

    Dariau pagal rusu nustatymus ir uzsiblokavo

  9. admin parašė:

    Veikiausiai busi nustates kad Atmega veiktu nuo isorinio taktinio generatoriaus. bandyk paduoti kokia 1MHz i XTAL koja ir perstatyk fuses kad veiktu nuo kvarco.

Parašykite komentarą