Category Archives: MCU

ZX LCD

Besitvarkant daiktus (čia retas reiškinys), radau savo seną eksperimentą su FPGA/CPLD ir LCD (tik ekranas jau buvo kitas). Tas eksperimentas buvo nedabaigtas dėl žinių, noro ir kantrybės stokos. Dabar visko kiek daugiau, tai nudraskiau nereikalingas detales ir pridėjau naujų:
ZX Spectrum in CPLD LCD mode
Tai labai panaši sistema kaip ir paprastam ZX Spectrum CPLD/VGA. Tik pasikeitė keletas esminių koncepcijų:
Senesnėje versijoje atmintis buvo bendra- procesorius ir VGA buferis naudojosi ta pačia atminties mikroschemą, todėl CPLD stengėsi atlikti atminties arbitro (MMU) darbą ir laiko rėžiais (time slot) prileisdavo tai CPU tai VGA prie tos pačios atminties. Ši schema kiek kitokia- pirmiausia, naudojama atskira atmintis procesoriui- Toshiba TC551001BPL-85. Tai žymiai lėtesnė atmintis, tačiau ji skirta tik procesoriui. VGA ar LCD kontroleris visiškai nesikreipia į ją. LCD/VGA kontroleris tik sėdi ant duomenų ir adreso linijų ir stebi jam reikiamas kombinacijas- jei pastebimas rašymas į video atminties plotą, duomenys dubliuojami ir LCD/VGA atmintyje. Taip pat stebim Z80 IN/OUT veiksmus, nes mums reikia vaizduoti pajungta klavietūrą, magnetofoną ir garsiakalbį.

ZX Spectrum in CPLD LCD mode
Tačiau tai vienspalvis LCD monitorius, 320 x 240 taškelių. Duomenys pumpuojami po 4 bitus iš karto, todėl sistemos dažnis netgi kiek lėtesnis. Tačiau labai lėtinti negalima, nes kažkur prie 40Hz kadrų dažnio labai matosi vaizdo mirgėjimas. Dabar LCD veikia virš 60Hz dažniu. Deja, jis labai inertiškas- “border” efektai susilieja…

ZX Spectrum in CPLD LCD mode
O judantys objektai beveik nesimato.

Aišku šiame variante visiškai ignoruojami spalvų atributai (“flash” veikia), todėl žaidimų vaizdeliai keistoki. O borderį padariau dryžuota, kad kiek nors skirtusi “spalvos”.

Šis antras maketas buvo surinktas ne dėl ZX spectrum. Aš galvoju čia sudėti kokį nors kitą retro kompiuterį, bet ZX yra vienas iš paprasčiausių, tai testavimui suėjo.
Schemotechnika visiškai paprasta- adresų šyna po stiprintuvo 2x SN74HCT541N (nelabai jis reikalingas) eina į CPLD, ROM, RAM. Tas pats, tik be buferio, padaryta su duomenų šyna. Viskas “sumontuota” CPLD mikroschemoje. Ten aišku tebeliko keletas klaidų, tačiau sistema veikia.

Ir aišku visi failai:
Intel-Altera Quartus CPLD source code for ZX Spectrum LCD version.

Jei jums nepasileido, tai atminkite, kad kai kurie Z80 CPU reikalauja, kad jų clock būtų 5Vpp, o ne TTL lygio.

LCD ekranas iš senoviško dauginimo aparato: EDMMPU3BDF, jo pinout:


1. ON/OFF
2. n.c.
3. VS
4. HS
5. pix CLK
6. Vcc, +5V
7. GND
8. Vee, -25V
9. D3, pixel data
10. D2
11. D1
12. D0
13. Vee, same as 8.
14. contrast.

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