Category Archives: MCU

ZX Spectrum sukištas į CPLD

Šiuo metu kiek tvarkau senų kompų kolekciją ir nutariau suremontuoti savo Santaką (baltik versija). Pirmiausia nurinkau visus laidus, pasilikau pliką PCB, atstačiau ROM čipus ir pajungiau. Aišku niekas neveikia. Todėl pradėjau nagrinėtis- pirmas stepas, nėra RESET signalo. Pašalinom rusišką mikroschemą К155ЛН1 nauja SN74LS04. Pradėjo veikti procesorius ir netgi bandė formuotis vaizdas. Bet jis dingo. Pastebėjau, kad dar kaista К555ИЕ10- kol šalta, signalai praeina. Poto pakaista ir signalai dingsta. Čia jau rankos kiek nusuleido- supratau, kad tarybinė kokybė man nepadės. PCB padaryta ant snarglių ir beveik negalima perlituoti. Net blogiau už kiniškas popierines PCB iš 1980-tųjų metų.

ZX Spectrum CPLD Altera
Užtenka tik ką nors pakaitinti ir takeliai atsiklijuoja.
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”.

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 →