Tag Archives: AVR

Dar karta galios matuoklis

Praėjo dešimt metų ir vėl prireikė elektros galios matuoklio… Va tai laikas bėga. Senąjį modelį aš vieną padovanojau, kitą pardaviau ir sau nepalikau. Buvo dar kelios PCB, keli dar skaitliukai. Bet va firmwarė man nepatiko. Norėjosi universalesnės, rimtesnės ir dar norėjosi kitokių funkcijų. Teko kiek pakrapštyti galvą ir gavosi nauja firmvarė, bet prietaiso konfiguravimas dar labiau užsikomplikavo. Teko parašyti ir konfiguravimo utilitą.

Va softo ekrano vaizdeliai:
ADE7758
Čia nešiojamas kompas pajungtas. Matosi kad galima rašyti į bet kurį ADE7758 registrą ar į EEPROMą. EEPROM laikomos visos registrų reikšmės ir dar kelios konstantos, kaip srovės trafo koeficientai ir įtampos daliklio parametrai.
Continue reading →

AVR103: Grafinis VFD GU140×16

Lietuvos oro uostai utilizavo biški technikos ir ten buvo prietaisiukai su VFD ekraniuku (patys prietaisiukai specifiniai, su ypač kreivu softu). Man bent jau atiteko VFD ekraniukai: Noritake Itron GU112x16G-7806A V3. Softas manau tinkamas visai šeimai, todėl pavadinime rašiau GU140x16G, nes pagal tokį datašytą rašiau. Pats VFD modulis kogero pilnai sutampa su LCD moduliu, tik papildomai turi grafinio modulio režimus. Todėl bet koks softas (ir hardwaras) kuris palaiko standartinį LCD modulį su 14 kontaktų jungtim puikiausiai veikia su VFD moduliu. Yra smulki bėda, kad modulis kiek lėčiau inicializuojasi, bet daugumas softo veikia.

Noritake Itron GU112x16G-7806A v3 VFD module AVR driver
Continue reading →

AVR100: Max7219 LED matricos iš kinų

Reikėjo padaryti LED eilutę. Kaip visada greitai ir pigiai. Labai prabangiai nereikėjo, todėl pasirinkau kiniškas 8×8 matricėles su MAX7219 valdymu. Viskas ko reikia tai tik maitinimas ir koks nors SPI. Kelios komandos leidžia reguliuoti šviesumą. Visas gerumas tame, kad kiniški modeliai agregatuojasi į ilgą eilutę ar panašiai. Pats eilutės valdymas vyksta per USB-COM portą.

MAX7219 LED matric control USB AVR

Jau toks senas ir nuvalkiotas projektas tikrai bus padarytas pas “arduinistus”. Tačiau trumpos paieškos parodė- kad taip nėra. Dalis projektų atsisijojo dėl visokių keistų “arduino” failų formatų. Kiti… neveikia. Net pačiuose straipsniuose parašyta- “I don’t know, but this example do not work”. Pradėjus nagrinėtis kodą, susidarė nuomonė, kad programos rašytojai net nabandė skaityti MAX datašyto arba tūpai kopy-pastino svetimą kodą. Netgi klasikinė nesamonė su soft SPI padaryta. Ir vėl teko viską perdaryti. Baisiausiai kas gadino projektą tai paprastas kiniškas laidelis su kištuku- tai buvo kontaktas, tai nebuvo. Ne veltui jau rašiau apie wire wrap.
Tačiau problemos buvo įveiktos ir projektas greitai sumestas į vieną vietą- vienam gale USB, kitam gale LED matricų “kirmelė” (aišku ir maitinimo šaltinis reikalingas. Demonstracijai užtenka ir USB). Softas kiek pakeistas- sudėtas ATARI fontas, dar keli pakitimai. Tačiau viskas veikia. Kad paleisti- reikia prijungti prie kompiuterio ir per naują COM portą pumpuoti tekstą. Tekstas rodomas ant LED matricos. Nėra teksto išvalymo komandos, todėl jei reikia pašalinti, naudokit probelus.

Kaip visada:
AVR USB serial LUFA MAX7219 LED Matrix source code (ATmega32U4).

Valdymui naudojamas COM portas leidžia duomenis rodyti iš daugelio šaltinių ir skriptų. Galima rodyti kokio nors saito lankytojų skaičius ar kiek kartų buvo atidarytas šaldytuvas. Rodyti kokius nors keistus tekstus ar siuntinėti pranešimus aplinkiniams. Ar paprasčiausiai rodyti laiką. Čia labiau nuo fantazijos priklauso.

AVR:99 GPS duomenų analizė ir LUFA USB su COM

Šiais laikais, kai kiniški GPS imtuvai visai atpigo, kilo noras panaudoti juos kaip RTC. Tačiau iškilo paprasčiausia problema- programinė įranga internete arba “arduino” arba “C++” arba velniai žino kokia. O man reikėjo kažko paprasto, grynam AVR GCC. Todėl, pasižvalgant į svetimą softą, iškilo mano NMEA teksto analizatorius. Jo dirbimo rezultatas- struktūra užpildyta duomenim, tuos duomenis galima ir parodyti per COM portą, o galima panaudoti savo programoms.

putty output
Mano paprogramės duomenys parodyti raudonai, o baltai matosi duomenys iš GPS imtuvo. Pastabesni žmonės gali surasti kur tuo metu buvo Levas.
Matosi, kad ne visi sakiniai analizuojami- man visiškai neįdomu, kiek ir kur kabo satelitai, ar judėjimo gretis. Nereikalingus sakinius galima išjungti su konfiguracine programa, tačiau čia eina “default” duomenų srautas.
Continue reading →

AVR97: Teletaipinis USB printeris

Pratesiant teletaipo temą, kilo mintis padaryti tikrą USB printerį, kad tiesiai iš kompiuterio būtų galima telegrafuoti tekstą. Kadangi su V-USB man nepavyko priversti veikti printerį, tai pasinaudojau kiek naujesnę mikroschemą iš aliekspreso, ATMEGA32U4. Su mažyte plokštele, už kokius 2€. Ši mikroschema turi šiokį tokį hardwarinį USB ir jai tinka kiek naujesnis softas- LUFA paketas.

atmega32u4 AVR USB printer TTY teletype
Elektriniai lygiai suderinami su mano PCB kurią jau aprašiau ankstesniam straipsnyje. Kadangi čia jau 16MHz ir dar USB neleidžia stabdyti procesoriuką, teko 50 bodų UARTą parašyti (tiksliau pasiskolinti iš interneto) programiškai. Tai taip vadinamas softuart.
Continue reading →

AVR97: Baudot kodas ir AVR

Mano turimas agregatas naudoja archaiškus greičius ir visiškai nesuprantamą Baudot (Bodo) kodą. Kodą sugalvojo toks Jean-Maurice-Émile Baudot, dar 19-tam amžiuje. Kai nebuvo jokių kompiuterių, megahercų ir tranzistorių. Tik geros patikimo rėlės ir visokios svirtys. Tačiau kaip sakoma- dėkui dėl backward compatibility, daugelis įrenginių palaiko nesamoningus formatus. Nes mūsų teletaipui reikia 50 bodų (čia irgi Baudot) ir 5 bitų perdavimo. Šį formatą palaiko AVR. Tačiau mano projektui reikėjo dviejų greičių: 115200 bitų/s ir 50 bitų/s. Kadangi AVR greičio daliklis turi ribotą bitų skaičių, tiesiogiai negalima turėtį abu greičius. Naudojant 3.6864 Mhz procesoriaus taktinį dažnį didžiausias greitis 115200 (su dalikliu lygiu 1) ir mažiausias 100 (su 2303 dalikliu). O reikia 50. Todėl prieš naudojant teletaipą, reikia mažinti procesoriaus dažnį du kartus, o bendraujant dideliu greičiu- vėl atstatyti greitį.

Elektriškai suderinti senovę ir naujovę galima taip:
TTY circuit diagram teletype
Continue reading →

AVR88: Lipdukų printeris ir svarstyklės

Užduotis: yra dvejos skirtingos senos svarstyklės ir vienas modernus Zebra lipdukų printeris. Reikia spausdinti gražius lipdukus su svoriu, data ir laiku. Reikia ir suregistruoti visus svėrimus į “nešmeną”.

Šiuolaikiniai lipdukų printeriai gana protingi, viduje netgi galima parašyti BASIC kalbos programą kuri apdoros duomenis ir paruoš lipduko dizainą. Tačiau papildomi punktai- operacijos data ir duomenų registravimas, neleidžiai viską padaryti pačiame printeryje. Kreipimasis į svarstyklių pardavėjus tik sukėlė neviltį- jie pradėjo klejoti apie naujų svarstyklių pirkimus ir visokių “priedelių” pirkimą. Nupirkti tai galima, bet custom sprendimai pas juos pasirodė labai jau brangūs ir sudėtingi. Todėl nusprendžiau kiek pažaisti su MCU ir moduliukais iš kinijos.

lipduku printeriukas ir svarstykles
Continue reading →

AVR93: Beveik savadarbis generatorius: AD9833

Jau minėjau, kad operacinius stiprintuvus tikrinau su beveik savadarbiu generatorium. “Beveik” dėl to, kad generatorius paremtas kinišku moduliu:

ad9833 sin generatorius
Generatorius skaitmeninis. Reikėtu skaityti datašytą, kaip tiksliai jis veikia, bet principas paprastas- ROM atmintis ir ADC. Du variantai- tiesiai adresas į ADC, tada išėjime trikampis, o jei duomenys iš ROM atminties- sinusas. Dar yra vienas režimas, kai išėjimas perjungiamas prie MSB bito, bet tada išėjimo įtampa stipriai užkyla ir neįsipaišo į bendrą stilių (vos ne Vcc išėjime). Ir dar šitas režimas man susvilo po kažkiektais laiko. Liko tik sinusoidė ir trikampis.
Continue reading →

AVR92: Kiniškas rotary encoder

Va kartais internetas nepadeda. Prireikė į vieną projektą sudėti valdymui rotary encoderį. Tą su sukiojama rankenėle. Projekto sąlygos, kad tas enkoderis bus pats prasčiausias kiniškas. Ir jokios papildomos hardwarės. Tingėjau programuoti pats, ir pamaniau, kad tikrai kas nor pridėjo visokiausių pavyzdukų AVR (ir ne tik) kontroleriams. Aha, pridėti kalnai, bet visi kopypaste vienas nuo kito.

Išsiskiria keli variantai:
1. Naudojamas INT ant MCU kojos (LH) ir patikrinama kita enkoderio koja. Ir tas pats su kita koja. Sunaudojami du INT. Galima ir INT nuo vienos kojos, bet reikia tikrinti LH ir HL variantus. Viskas gerai teoriškai arba naudojant optinius enkoderius. Naudojant kiniškus, mechaninius- daugybė trukšmo nuo persijunginėjimų ir rezultate kalnas pertraukimu ir falšyvi suveikimai. Praktikoje- enkoderis pavirsta atsitiktinių skaičių generatorium.
2. Naudojamas main loop amžinas ciklas ir daroma viską softwariškai. Kad apsisaugoti nuo kontaktų kibirkščiavimo dedami programiniai uždelsimai. Kas suėda procesoriaus ciklus.
3. Ir dar yra per taimerį, arduino bibliotekos kurios source supranta tik cpp fanatai ir šiaip vartojantys kokią žolę. Aišku, naudojant aukšto lygio arduino makro programavimą viskas tikriausiai veikia. Bet kai reikia daryti optimizuotą ir eksportuojamą kodą prasideda nesamonės.

Todėl susinervinau ir pasirašiau savo variantą. Veikimas supaprastintas visiškai ir eina per taimerį. Taimerio greitis kažkur 200Hz (0.005s). Toks greitis kaip tink tinka mano naudojamam enkoderiui ir protingam sukimo greičiui. Panaudojus per didelį sukimo greitį enkoderis dažniausiai praleidžia impulsus, gal net ir sustoja ir kartais pavaro ne į tą pusę. Tačiau sukant normaliai arba labai lėtai viskas gerai veikia.

ISR(TIMER1_COMPA_vect)
{
unsigned char d,a,b;

d=PIND & 0b00001100;
if(d != old_d)
{
a=0; b=0;
if(d & 0b00000100) a=1;
if(d & 0b00001000) b=1;

if(inta==0 && a==1) rotar=rotar+b;
if(intb==0 && b==1) rotar=rotar-a;

inta=a;
intb=b;
old_d=d;
}
}


Veikimas paprastas- pirmiausia pasitikrinam, ar kas nors iš esmės pakito (old_d) ir jei nieko nebuvo, tai tepam slides, nes reikia taupyti MCU. O jei jau pasikeitė, tai analizuojamės. Aišku reikėtu nenaudoti to “d & 0b00000100”, bet aš dar nenusprendžiau, kas bus toliau. Ir aišku, kintamieji “rotar”, “old_d”, “inta” ir “intb” yra globalūs ir “volatile”.

AVR89: ePaper modulis

Nusipirkau pabandymui iš kinų epaper (elektroninio popieriaus, e-ink) tipo ekraniuką. Pažymėtas jis waveshare logotipu, o kas gamintojas iš tikrųjų aš nežinau, nes ir datasheete nurodytas tik šis pavadinimas.

epaper waveshare AVR atmega

Yra dokumentacija pdf faile, kurios kaip ir neskaičiau, nes buvo pavyzdinis softas. Softas skirtas ARM, mini linux variantui ir aišku Arduino. Softas dalinai tinkamas ir mažiems kontroleriams, tačiau jis reikalauja “video RAM”. Čia iškilo problemėlė, nes ir mažiausiam ekraniukui reikia (200×200/8=5000) vos ne 5kB RAMo!
Savo softo variantą supaprastinau ir panaudojau paprastą senovišką ATMEGĄ. Konkrečiai ATMEGA162, tačiau tiks ir bet kuri kita. Tereikia tik keletos laisvų pinų ir aparatinio SPI.
Vėl eilinį karta teko pasibaisėti originalaus softo optimizavimu ir biški iš tikro optimizuoti. Mano variantas kiek greitesnis, dalis konstantų perrašyta į PROGMEM.

Dabar biški apie “elektroninio rašalo ir popieriaus” veikimo subtilybes. Tikriausiai daugelis matė, kad kartais elektroninės knygos “mirguliuoja ekranu” kai perpaišo vaizdelį. Taip daroma todėl, kad ekranas turi “burn-out” t.y. biški lieka seno vaizdo. Tačiau perpaišus vaizdą pilnai į juodą ir poto pilnai į baltą, senas vaizdelis išsivalo pilnai. Taip galima daryti automatiškai suprogramavus kontrolerį- tada pasiuntus naują vaizdą ekranas automatiškai persipaišys. O galima įjungti “rankinį režimą” ir tada ekranas neatsinaujina. Tada lieka seni vaizdeliai. Juos galima panaikinti lokaliai užtušavus ekrano dalį juodai ir poto baltai.
Dar viena ekrano įpatybė, kad ekranas turi du ekrano buferius- į vieną galima rašyti informaciją, o kitas tuo metu rodomas. Tačiau norint operatyviai parodyti naują informaciją tenka du kartus perduoti informaciją į ekraną.

Kadangi ekraniukas buvo nupirktas tik pabandymui, o ne kažkokiam projektui, tai softas surašytas tik pabandymui. Nėra nei grafinių operatorių nei didelių raidžių. Tėra tik dviejų tipų teksto rašymas ir paveiksliuko paišymas (čia vėl papuolė arklys ir jo klasika apie “resistance” ir “penis harder”). Beja, tik dabar pastebėjau, kad vaizdelis konvertavosi kaip veidrodinis.

Ekranas organizuotas baitais, todėl galima perpaišyti tik po mažiausiai vieną baitą. Kadangi nėra skaitymo iš ekrano, atsiranda problemos su grafikos primityvais. Dėl to kila ir šrifto naudojimo apribojimai.

Jei bus sugalvotas koks nors projektas, tada bus galima ir patobulinti visą softą. O dabar štai:
waveshare e-ink, e-paper software source code for clasic C and AVR ATMEGA .
Ten yra source kodas, +visokie niekai kaip “penis harder” paveiksliukas ir jo B/W versija C kalboje [penis.c]. Taip pat Atari ir ZX Spectrum šriftai. Taip pat proporcinis šriftas.

Ir dar neparašiau, kad vaizdas išlieka išjungus maitinimą. Tačiau ir taip aišku, nes čia e-ink’as.