Category Archives: MCU

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”.

ARM:0007 versija B, I2C ir OLED

Pratesiant ARM seriją su pačia pigiausia plokštele iš kinijos. Plokštelėje tik STM32F103C8 ir keli papildomi elementai. Sekantis reikalas kurį reikia įvaldyti tai I2C. Kol kas tik rašymas ir tik po kelis baitus ir be jokių DMA ir IRQ. Visiškai taip pat, kaip ir su AVR. Tačiau šį kartą naudojam patį pigiausią ekraniuką iš kinijos su SSD1306 kontroleriu, aštriai mėlynos spalvos:

STM32 OLED 0.91 inch
Dalis softo mano, dalis vogto ir supaprastinto. Vienintelis pastebėjimas dėl hardwarės- gal dėl sujungimo (per laidelius), o gal dėl kiniškos kilmės, pastebėta, kad kelis kartus ekraniukas nepasileido.

Ir aišku visas source code, bei sukompiliuotas hex hardvarės testavimui. Kompiliavosi ir su 6 ir su 7 gcc.
SSD1306 OLED on ARM STM32F103C.

ARM:0006 versija B, SPI ir waveshare e-Paper

Čia miksas tarp kiniško e-Paper straipsnio, ARM su pamažintu procesoriuku ir ST-Link programeriu. Ir aišku biški nostalgijos apie 8 bitus ir mano pirmus bandymus programuoti C. Gavosi toks kaip ir mini straipsniukas.

Kai tik buvo laisvo laiko nuo statybų, pasinagrinėjau apie STM32 procesoriuko kinišką moduliuką už kelis eurus. Čia jau gal net 64kb atminties, ir jau be vargo galima ką nors vizuališkesnio suprogramuoti nei su aštunta atmega. Užduotis buvo SPI ir ekraniukas. O kad nebūtu labai tuščias ekraniukas, sudėjau seno 8 bitų žaidimo “game engine” dalį. Daugiau programuoti aš jau patingėjau, bet vistiek bent jau matosi kas gaunasi jei nenaudojamas pilnas ekrano atnaujinimas.

STM32 ir waveshare e-paper
Hardwarė be modifikacijų- tiesiai iš kino. Šiaip, vienas pastebėjimas- arba kažkokia klaida softe (bibliotekose), bet sukonfiguravus MCU dirbti ant 48MHz, softas rodo 72MHz. Dabar softas rodo 96MHz, bet ant tokio greičio šis MCU negali dirbti. Gal čia koks kiniškas fuflo MCU?
Continue reading →

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.

Biški vėl apie ARM ir STM32

Kažkaip nusipirkau pas kinus porelę ST-Link adapterių ir panorėjau juos išbandyti. Deja pirmiausia po ranka nebuvo mano pagrindinio kompiuterio, o tik nešiojamas vasarinis. Jame nieko nebuvo susijusio su ARM programavimu. Tai nutariau atburti kaip tai daroma ir tik tada paaiškėjo, kad niekur neužrašiau, kaip visdėlto nuo nulio paruošti kompiuterį (windows) darbui su STM32 čipukų programinimui.
Dar priedo, mano darbinis kompas jau turėjo dalinai suinstaliuotus softus, ir perėjimas iš Atmelio į ST buvo labai kažkaip paprastas.
Gaila, bet nieko vėl neužsirašiau, bet parašysiu maždaug iš akies, kaip tai buvo. Kaip ir minėjau anskčiau, aš kaip heiteris ir oldskūlinis hardcoras nemėgstu visokių IDE ir eklipsniu, tik command line, tik hardcore, tik make. Todėl viskas gavosi keistai.

ST-Link STM32F103

Darom taip- iš ARM pagrindinio puslapio nusikraunam gcc windozei. Ten kažkur yra installas. Vadinasi maždaug “GNU Tools ARM Embedded” ir versija kažkokia pagal datą. Nusikrovus šitą reikalą, nuėjau į savo puslapius (nugi šituos) ir nusikroviau pirmą source. Kažkodėl suveikė komanda “make”, bet neteisingai. Pasirodo, šitam kompe yra kažkas kuris vadinasi make, tik labai senoviškas. Tai buvo WinAVR paketas kurį kažkada suinstaliavau. Gal net instaliavau tam, kad kompe būtu “programmers notepad 2”. Bandžiau gadinti makefile, kad priversti veikti, bet nieko nesigavo, net paprasčiausia komanda “rm” veikė su klaidom ir net netrynė failų.
Netgi pradėjau krauti paskirai failiukus “make”, “rm” iš internetų ir GNUwin, bet ten viskas senai nenaudojama. Kol netyčia kažkur radau make sukompiliuota kažkokių geriečių. Nes kartais užknisa tas linuxinis bajeris- reikia kokios utelės, tai tipo susikompiliuok pats. O kad tą padaryti reikia prisiinstaliuoti visą kalną kitokio softo. Sunku jiems ir binarius padėti? Arba sukompiliuoja 30kb programą, kurį reikalauja kokio nors suknisto dll. Bet jo neprideda. O statinė tos pačios programos versija gal 100kb ilgesnė.

Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.

C:\Users\User>make -v
GNU Make 4.2
This program is built by Equation Solution.
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http ://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

C:\Users\User>

O poto prisiminiau, kad yra toks reikalas kaip CygWin. Po jo instaliavimo ir path prioritetų nustatymo (kad windows žinotu kur guli cygwin visokie failiukai) sistema pradėjo veikti.

Nueini į archyvo folderį, kur yra failas “makefile” ir ten rašai “make all”, o jei reikia viską perkompiliuoti iš naujo, tai “make clean” ir viskas.

Dėl hardwarinio programino, prie kiniško ST-Link puikiausiai tiko originalus ST softas kuris atpažino kiniškus donglus ir net pasiūlė atnaujinti firmware.

Pačios kiniškos plokštelės LED diodo (kabančio ant C13 kojos) pamirksėjimo softas čia:
STM32F103C8T6 blinky source ir sukompiliuotas failas.
O patiems nekantriausiams kurie nori patikrinti kiniška PCB dedu ir hex failą atskirai.
HEX failas testavimui.

Beja kiniškas plokšteles reikia vizualiai apžiūrėti ir ištaisyti defektus. Vienoje plokštelėje reikėjo per naudo prilituoti kvarcą, kitoje padėti teisingą rezistorių.

Kaip ne keista, va ant linuxu to pačio padaryti nepavyko. Nu neveikia man make. Jaučiu problemos su failų lokacijos nurodymu makefile faile. Beja, visokie IDE kuria baisias failu nuorodas. Nors pavyzdžiui viename eclipse tutorial saite pilna nesmonių kaip šita:
failo nuoroda.

Nu ir kas per nesamonė su tais ../..//././.././/././. !? Suprantu, kad galima vieną sluoksnį ar du palipti į viršų, bet tiek privaryti? Šitos nesamonės tikriausiai sugeneruotos pačios eklipsės, kai vartotojas išmėto projekto failus visur. Bet kai reikia tai atsiburti… ojojoj.

Poto gaunasi maždaug taip ir taip. 🙂. Paskutinė klaida tikriausiai dėl to, kad yra komandinės eilutės ilgio ribojimas.

AVR87: TXC101 UHF siustuvėlis

Tai mano pirmas eksperimentas radio dažnių generavime. Todėl labai jau nekritikuokite. Viskas prasidėjo nuo signalizacijos siustuvėlio, kurio nesugebėjau paleisti. Poto iš kinijos nusipirkau pirmą pasitaikiusi mikroscheminą kuris generuoja aukštus dažnius. Tai buvo TXC101, 300-1000MHz transmitter. Kuris gali veikti kaip savarankiškas prietaisas, o gali veikti valdomas mikrokontrolerio. Poto vėl buvo viskas užmiršta, kol kitame projekte liko vietos PCB (nes jos dabar didelės). Taip ir gimė šis visiškai žalias projektas su klaidom.
Schema paprasta- MCU (ATMEGA8), sintezatorius TXC101, biški pasyvių element ir dviejų tranzų stiprintuvas. Mažesnis tranzistorius tai kažkas su užrašu “7Y 1”, kas savo ruožtu gali būti: MMBR941, MMBR951 kas visai tinkama (arba ten visai ne tokia detalė, nors lupau iš kažko aukštadažnio), o didesnis buvo BLT50, kas gerai 470MHz, bet tikriausiai negerai prie 900MHz. Tačiau visiškai tranzo patikrinti prie aukštesnio dažnio nepavyko, nes traukiojant laidus ir jungiant visokiausias apkrovas tranzistorius biški užkaito ir jau nebeveikė. Toliau eksperimentus dariau be galinio tranzo…
TXC101 transmitter and AVR ATMEGA8
(foto pasididina)
Continue reading →