Category Archives: MCU

Futaba VFD GU112x16G (ARM)

Dar biški VFD temos. Turiu kelis mažesnius grafinius VFD modulius: Futaba GU112x16G-7806A. Tai darvienas modulis suderinamas su standartiniu LCD moduliu. Tačiau tai kartu ir grafinis modulis.

Šiame eksperimente aš nejungiau modulio prie standartinio paralelinio interfeiso, o pabandžiau su alternatyvinius metodus: SPI ir su papildoma plokštele- I2C (PCF8574). I2C variantas lėtokas. SPI variantas gretas, jei naudoti papildomą MB laidą per pertraukima. Šis MCU tikrai per greitas šiam moduliui ir buvo bėdų. O jei naudoti su hardcoded užvėlinimu, papildomo laido nereikia. Per i2c ir taip viskas veikia lėtai, todėl nereikia nieko stebėti.

Kairėje SPI, dešinėje su papildomu kinišku moduliu, I2C.

Atkreipkite dėmesį, kad šis modulis naudoja visai kitokį SPI variantą nei didesnis modulis.

Demonstracinis source kodas SPI ir I2C variantams. STM32F103 procesoriui, cubeMX skeletas.

Futaba VFD GP9002A01A (ARM)

Nors realiai tai GP9002A02A. Man patinka VFD technologija. Keista spalva, didelis šviesumas ir kažkoks lempinis vaizdas. Todėl jei matau kur nors palaidą VFD ekraniuką, stengiuosi prigriebti. Aišku aš kalbu apie panaudojamus modulius, o ne kažkokius “custom made” iš senoviškų magnetofonų. O kiek kartų mačiau milžiniškus grafinius modulius kurie buvo sudaužyti- stiklinis korpusas neduoda tvirtumo. O šis modulis nukentėjo kitaip- jo trafukas su plonučiais laideliais atitrūko nuo transformatoriaus korpuso. Teko klijuoti ir užsiimti mikrochirurgija- trafukas visgi smd.

Tai grafinis ir tekstinis modulis. Galima pumpuoti binarinę informaciją arba galima naudotis integruotais šriftais ir kiek keistokais šrifto dydžiais. Ekranas kaip ir “grayscale”, bet man nepavyko. Gali būti, kad yra skirtumas tarp “01A” ir “02A”.

Futaba moduliai dažnai būna ne tik lygiagretaus interfeiso, kaip LCD moduliai, bet turi slaptus papildomus interfeisus: asinchroninis nuoseklusis (kaip RS232, tik TTL lygiai) ir SPI (synchronious serial). Asinchroninis dažnai būna per lėtas, net prie 115kbit matosi kaip formuojasi vaizdas. Paralelinis naudoja labai daug laidų, tačiau labai greitas. O štai SPI kaip ir kompromisas. Pas šį VFD maksimalus greitis kažkur 2Mbit. Nauji moduliai dažnai būna USB/HID- tokių dar nečiupinau.

Su STM32CubeMX sugeneruojam programos griaučius. Aš pasirinkau kojeles iš eilės. Procesoriukas- bet koks. Čia konkrečiai STM32F103VBT6. Kur kibirą turiu.

Mums be SPI, reikia CD (command/data), CS (chip select) ir jei norime gražiai animuoti: VFD_INT (čia kadrų sinchroimpulsas). CS – programinis, nes yra biški triukų. Net porą vakarų turėjau praleisti, kol pradėjo teisingai veikti. Trumpai- CS, CD ir SPI sekos svarbios!

Iš datašyto matom, kad SPI nėra defaultinis. Pirmiausia LSB, antriausia netipiniai CLK. Dar žiūrom į C/D.

VFD datasheet SPI

Labai padeda susigaudyti settinguose šis vogtas iš interneto paveikslėlis. Renkam tą kuris panašiausias:

Beveik visos komandos surašytos į programą. Aišku kiek užknisa ekrano atminties organizavimas, bet viską galima apeiti naudojant galingus MCU.

Ir aišku VFD ekrano valdymo source code STM32F103 procesoriui. (ARM-0053).

Darbo Vietos

Kartais nėra apie ką rašyti, tai nutariau aprašyti savo sėdimas/gulimas darbo vietas.

Čia mažiausiai su darbu susijusi darbo vieta. Čia kartais vyksta intelektualiniai pokalbiai, ieškoma internete ar šiaip. Šis kompiuterius iš šiukšlyno ir pagrinde groja muziką. Klaviatūra aprašyta mano bloge– tai iš aero uosto terminalo.

Pereinam į kitą pastatą:

Čia naujausia darbo vieta. Tipo “sysadmino” urvas. Laidų chaosas 19″ spintoje ne mano nuopelnas.

Pereinam į kitą pastatą:

Čia praleidžiama gana daug laiko. Tik nesimato XRF, jis kažkur išneštas fotografavimo metu. Dešinėje- mikrobanginis mineralizatorius. Reikėtu jį išmesti, bet ranka nekyla- veikiantis daiGtas. Viršuje centre savadarbis “darbo laiko” laikrodis, plastikinių kortelių printeris, lipdukų printeris. Šiaip lipdukų printerių daug. Paprasčiau daryti taip, jei reikia spausdinti skirtingo dydžio lipdukus nei kaitalioti popierį.

O dabar kito tipo patalpa:

Meditacinis akvariumas. Ten tikrai ne rūkas viduje. Paprasčiausiai radau kalną smilkalų kurie supelijo. Todėl juos visus susmilkinau. 🙂

Kita patalpa:

Pagrindinė litavimo ir kompiuterinių žaidimų vieta. Iš chaoso ant stalo- nei lituoju nei žaidžiu paskutiniu metu.

Ta pati patalpa, kitas kambarys:

Čia pagrindinė degradacijos ir programavimo vieta. Programavimo konsultantas pasiruošęs. O apačioje mėtosi gabalai dar nepublikuoto projekto su kodiniu pavadinimu “Trimix“. Jei bendraautorius ir sponsorius leis, bus daugiau informacijos.

Šiaip yra dar viena vieta kur galiu pasislėpti. Todėl jei kartais nerandat manęs, tai aš kažkur esu čia.

Blogas GCC arba x86 bėdos

Papuolė į rankas tokia maža ISA PCB su keliais čipais. Su magišku užrašu “Y2000”. Ir iškarto trenkė nostalgija, apie tai, kaip visi panikavo, kad kompiuteriai 2000-taisiais metais išprotės, nes metai tik dviženklis skaičius. Aišku buvo bėdų su tais metais, bet daugelis panikuotojų nepagalvojo, kad technologija smarkiai tobulėja ir kompai pradėjo labai greitai morališkai senti.

O tiems, kurie strigo su sena technika, atsirado visokie BIOS pataisymai. O jei nėra BIOS pataisymo, va jums papildoma plokštė su ROM. (Kitos mikroschemos tik supaprastina ROM pajungimą prie ISA linijų)

Nutariau pažiūrėti, kas tos mikroschemos viduje. Viduje labai mažai kodo, tai buvo kaip tik, kad pasimokinti Hidros (GHIDRA) programos vartojimo.

ISA PCB yra 8 bitų. Vadinasi suderinama su pačiais primityviausiais x86 procesoriais. Vadinasi kiek rimtesni procesoriai turi veikti “REAL MODE” režime. x86 procesoriaus kodas vos vos panašus į Z80 ir tikrai panašus į 8086. Hidra išardė kodą. O internetai padėjo atpažinti- pirmi trys baitai tai 55 AA 10. “55AA” tai signatūra, o 10 tai programos ROM dydis (kart 512 baitų, h100). O nuo 4 baito prasideda pati programa.

Konkreti Y2K PCB darė šitą: išvalo ekraną (rodos), parašo užrašą, nuskaito dalį RAM ir kažką paskaičiuoją ir jei nepavyko, sako error ir išeina, nuskaito RTC per BIOS, nuskaito RTC tiesiogai, palygina, ir jei kažkas gaunasi arba rašo, kad kompas suderinamas su Y2K arba bando (?) pačinti BIOSą. Čia jau spėlioju, nes mano žinio gana trumpos čia.

Kilo mintis padaryti va taip:

Copy-paste kažkiek asemblerio mnemonikų… ir kaip sukompiliuoti? Internetai sako, kad standartinis GCC, su raktažodžiais tipo “-m16 -nostdlib -ffreestanding” turi gaminti x86, 16bitų, REAL kodą. Ir tikrai, kopijuotas kodas iš Hidros susikompiliavo. Toliau teko kankintis su LD.exe ir visokiais loaderiais, kad gautųsi ROM image, o ne exe failas. Tai irgi buvo pilnas nuotykių žaidimas kuris nepavyko iki galo.

Tačiau kodas neveikė realiuose kompiuteriuose.

Ir pasirodo, kad JOKS GCC nesugeba generuoti teisingą 16 bitų, REAL MODE kodą. Iš principo. Binarinių failų palyginimas parodė, kad CALL, RETF ir gal kitokios instrukcijos generuojamas 32 bitų. Tas 32 bitų kodas “kaip ir suderinamas”, bet kai paleidi iš BIOSo, tai tikrai nesuderinamas. Ir nesvarbu koks procesorius- 486DX irgi nesuprato.

Rašyti softą be CALL kaip ir sunkoka. Gerai, kad čia tik kelios eilutės- išvalyti ekraną, per BIOSą (TTY režime) išspjauti tekstą ir nuskaityti ANYKEY iš klaviatūros. Teko viską perrašyti tiesiogiai. Ir rankutėmis įkelti “RETF” teisingą kodą programos gale. Kodu nesidalinu, nes jis baisus, nesuprantamas ir ten per daug POP/PUSH (kopijavau iš tikrų paprogramių, kur išsaugoja registrus). Svarbu veikia.

ROMas turi primityviausią kontrolinę, 8 bitų, sumą. Todėl reikią paskutinį baitą ROMe kaitalioti tol, kol suma nepasidaro 00.

O dar radau keistą PCI plokštę iš Izraelio- kažkoks tipo “security”. Pati PCB tai kastruota tinklo plokštė su BOOT ROM. Jei bus azarto, bus galima pasinagrinėti šitą kodą.

Taigi, be normalaus asemblerio, koduoti ROMą labai sunku. O tiek turėjau planų- panaudoti C kalbą ROMe ir PC kompiuterį panaudoti kaip mikrokontrolerį. Kam? Ogi smalsu. Nebent PCI kompiuteriai jau tikrai valgo 32 bitus ROMe.

O grynai asembleris tai NASM. Jam puikiausiai kompiliuojasi. Tikriausiai komentaruose bus pilnas komplektas NASM kompiliatoriui.

P.S. Originalus Y2000 ROMas.

Spalis 24

Spalio mėnesio fotopostas. Biški nėra ką rašyti.

makefile (užrašai sau)

Makefile tai specifinis instrukcijų rinkinys kuris gali pats paleisti kitas instrukcijas ir pats save ir panašiai. Naudojamas automatizuoti programų kūrybą ir gal dar ką nors. Ši žinutė skirta man pačiam, nes atmintis labai blogai dirba. O jei kitiems tiks, ar bus kokių nors patarimų- welcome.

  1. PROJECT = $(notdir $(CURDIR))
  2. SRC = $(wildcard *.c)
  3. BDIR = build
  4. OBJ = $(patsubst %.c, $(BDIR)/%.o, $(SRC))
  5. .PHONY: clean all hex
  6. #phony - komandos (jei netycia sutaptu su failo pavadinimu)
  7. all:
  8. @echo "all" $(PROJECT)
  9. #all pasileidzia kai paleidziamas make be komandu
  10. levas:
  11. @echo $(SRC) $(OBJ)
  12. #pirmas iki: objektas komanda arba failas, antras -kokiems failams galioja
  13. $(BDIR)/%.o: %.c
  14. echo $@
  15. mkdir -p $(BDIR)
  16. cp $< $@
  17. objects: $(OBJ)
  18. elf: $(BDIR)/$(PROJECT).elf
  19. #sutrumpinta komanda, kad nereiketu ivesti pilno failo pavadinimo
  20. $(BDIR)/$(PROJECT).elf: $(OBJ)
  21. cat $(OBJ) > $(BDIR)/$(PROJECT).elf
  22. clean:
  23. rm -f $(BDIR)/*.o $(BDIR)/*.hex $(BDIR)/*.bin $(BDIR)/*.elf

Komentarai:
Eilutės 1-4: paprasčiausi kintamieji ir kelios operacijos su jais. 1) kintamasis “PROJECT” pasidaro naudojamo folderio pavadinimu, 2) “SRC” – visų failų su išplėtimu masyvas. 3) paprasčiausias priskyrimas. 4) vieno masyvo konvertavimas į kitokį.
Eilutė 8: make visiškai nesvarbu ar dirbama su failais, komandomis ar “kažkokiais objektais”. Jei folderyje bus failas “clean” ir jis nekis, make pasitikrins tai ir nebevykdys komandos. Phony pasako, kad čia ne failas.
Eilutė 11: “all” pasileidžia, kai make paleidžiamas be parametrų, čia kaip “main()” funkcija.
Eilutė 15: komanda gali vadintis bet kaip. Tik turi užsibaigti dvitaškių. O jos atliekamos komandos turi būti “atitrauktos” per tabą.
Eilutė 20: komanda gali būti failo pavadinimas, kad ir iš komentaro, o antras žodis po dvitaškio kaip ir filtras kokius failus galima naudoti. Čia biški nesuprantu.
Eilutė 25: komanda “daryk objektus” pasiima visus būsimus “O” failus ir generuoja pagal 20 eilutę iš “C” failų. Jei “O” failai jau sugeneruoti ir jų “šaltinis” toks pats, failai ignoruojami.
Eilutė 27: Kad nereikėtų nurodyti kokį “ELF” failą generuojam, čia parašom supaprastinimą.
Eilutė 30: Kai reikia generuoti kokį “ELF“, kad ir iš 27 eilutės, naudojam tokią instrukciją ir gaminam iš “O” failų. Savo ruožtu, jei nėra “O” failų, tai juos generuojam iš “C” failų (20 eilutė). Ir kartu stebim, ar kas nepasikeitė
Eilutė 33: Paprasčiausiai ištrinam viską ką sugeneruojam.

Atrodo viskas siaubingai ir keistai. Ir net nesuprantu kaip tai veikia. Tačiau teisingai parašytas makefile viską labai palengvina, nes nebereikia galvoti, kas ten su kuo jungiasi ir kas iš ko darosi. Iš principo tai gana specifinė “skripto” kalba.

P.S. Jei dirbat su windows ir jus užkniso, kad kiekvieną kartą paspaudus ant “makefile” windows klausia su kokia programa ją atidaryti, darykite taip:

assoc .="No_Extension"
ftype "No_Extension"="C:\WinAVR\pn\pn.exe" "%1"

Tiktai “path” iki savo redaktoriaus pasikeiskit.

Pareigūnų sirena

Toks beveik vandalizacinis straipsnis. Tarp utilizuojamos technikos pasitaikė sirenos generatorius. Dar prie jo reikėtu ir aukštavolčio garsiakalbio, bet jo neturim.

Tokias sirenas naudoja įvairių šalių pareigūnai. Musiškiai naudoja tokią- dviejų melodijų ir beep-beep (air horn) imitacija.

Schemos nesinagrinėjau, bet spėju, kad tai bus gryna skaitmena stiprintuve- nemanau, kad du tranzistoriai su tokiu mažu aušinimu dirba kokiam nors kitokiam režime nei D. Trafukas švelniai groja sirenas, prie išėjimo pabandžiau paprastą gasiakalbį ir kelių šimtų omų rezistorių. Iškarto rezistorius pakaito- galios turi daug.

Tik trys mikroschemos. PICas lizdelyje- “operatyviai” galima keisti melodijas. Dar viduje turi būti kažkoks ADC keitimas, nes galima šnekėti per tą “gavarilką”– “vairuotojas, prašom sustoti” 🙂

Jokio panaudojimo nesurandu, nes negalima naudoti. Nebent kaip signalizacijos triukšmo šaltinį.

27C400 arba Amiga Kickstart readeris

Biški gliučino mano remontuojamos Amigos, tai teko greituoju būdu pasidaryti 27C400 skaitytuvą nes pasirodo, nei vienas mano turimas EPROM skaitytuvas 256Kb x16 nevirškina. Nutariau pasinaudoti eiline STM32F103VGT plokšte. Dėmesio! Čipas VGT turi 96kb RAM, kiti gali netikti, nes programa naudoja 64K buferį mikroschemos skaitymui. Ir dar kažkiek užima USB procedūros.

STM32F103 yra tolerantiška 5V logikai, o šios ROM mikroschemos visiškai tolerantiškos kiek žemesnio potencialo logikai. Gal, jei šitą plokštę perdaryti iki programatoriaus, tai Vcc ten 6V (Vpp-12.5V). Jei tie 6V nutekės iki kojyčių, tai STM gali ir nugeibti.

Net ir naudojant GPIO valdymą, STM labai greitai nuskaito informaciją. O va greičio USB perdavimui tai labai labai trūksta. Kažkur skaičiau, kad STM32F1 gali iki 700kbit/s greitį pasiekti. Man kogero nepavyko- pagal LED matosi, kad iš čipo skaito gal ketvirtį sekundės, o poto ilgai ir nuobodžiai pumpuoja informaciją.

Viduje žalių laidelių žarnynas. Bet viskas veikia. Palaidas kondensatorius reikalingas- pasirodo, mano kompiuterio USB maitinimas visiškai blogas ir duomenų skaitymas labai jau matosi ant Vusb linijos.

Pasitikrinau visus Kickstartus, ir visi buvo geri.

Programinėje įrangoje daug nesąmonių. Bet gal kam nors bus įdomu. Yra tikras CRC32 skaičiavimas, hardwarinis CDC valdymas, IntelHex duomenų skaitymas ir rašymas. Viską galima valdyti per terminalinę programą. Savo reikmėm pasirašiau VB.NET programą, bet ja nesidalinsiu, nes ten viskas labai baisu ir vienintelė iki galo padaryta funkcija- nuskaityti čipą, paskaičiuoti CRC32 ir įrašyti čipo turinį į failą.

Visas STM32F103 27C400 ar Amiga Kickstart čipų skaitymo įrankio (ROM READER) source code ir CubeMX darbinis failas.

P.S. programa daro “byte swap”, nes visi Amiga kickstartai internete taip surašyti. O čipuose baitai sukeisti vietomis. Nedarašytas šios funkcijos valdymas ( reikia išjungti n = __builtin_bswap16(n); ). Sukeitimas tikriausiai susijęs su 68000 ir Intel MSB-LSB ar panašiai ideologija…

ARM48: USB HID host

Jei naudojamas STM32 čipas palaiko USB HOST režimą, tai prijungti USB įrenginį labai paprasta. Mano hardwarė labai paprasta- čipas ir dvi USB jungtys. Viena jungtis suprogramuota kaip virtualus COM portas skirta peržiūrėti rezultatus, o kita USB jungtis tai USB host. Čia galima prijungti pelę ir klavietūrą. Kiti HID įrenginiai nepalaikomi.
Primenu, kad HID klavietūra palaiko iki 6 klavišų nuspaudimus (neįskaitant modifikatorius: shift, control, alt…) ir atskirai siunčiami klavišų paspaudimai ir atleidimai.
Kad viskas veiktu, tereikia savo programoje pasirašyti callbacką:

  1. void USBH_HID_EventCallback(USBH_HandleTypeDef *phost)
  2. {
  3. char txt_buf[100];
  4. char t[4];
  5.  
  6. strcpy(t,"[x]");
  7. if(USBH_HID_GetDeviceType(phost) == HID_MOUSE) // if the HID is Mouse
  8. {
  9. HID_MOUSE_Info_TypeDef *Mouse_Info;
  10. Mouse_Info = USBH_HID_GetMouseInfo(phost); // Get the info
  11. int8_t dX_Val = Mouse_Info->x; // get the delta x value (note unsigned - signed conversion)
  12. int8_t dY_Val = Mouse_Info->y; // get the delta y value
  13.  
  14. int len = sprintf (txt_buf, "dX=%d, dY=%d, Button1=%d, Button2=%d, Button3=%d\r\n", dX_Val, dY_Val, Mouse_Info->buttons[0],Mouse_Info->buttons[1], Mouse_Info->buttons[2]);
  15. user_usb_tx((uint8_t *) txt_buf,len);
  16. }
  17. if(USBH_HID_GetDeviceType(phost) == HID_KEYBOARD)
  18. {
  19.  
  20. HID_KEYBD_Info_TypeDef *Keyboard_Info;
  21. Keyboard_Info = USBH_HID_GetKeybdInfo(phost); // get the info
  22. txt_buf[0]=0;
  23. unsigned char i;
  24. for(i=0;i<6;i++)
  25. {
  26. if(Keyboard_Info->keys[i] != OLDKEYS[i] )
  27. {
  28. if (Keyboard_Info->keys[i]==0) {strcat(txt_buf,"UPKEY:"); hex8(txt_buf,OLDKEYS[i]);t[1]=Scan2Char(OLDKEYS[i]); strcat(txt_buf,t);}
  29. else if (OLDKEYS[i]==0) {strcat(txt_buf,"DOWNKEY:"); hex8(txt_buf,Keyboard_Info->keys[i]);t[1]=Scan2Char(Keyboard_Info->keys[i]); strcat(txt_buf,t);}
  30. else {strcat(txt_buf,"ERR:"); hex8(txt_buf,Keyboard_Info->keys[i]); strcat(txt_buf,"-");hex8(txt_buf,OLDKEYS[i]);}
  31. }
  32. OLDKEYS[i]=Keyboard_Info->keys[i];
  33. }
  34. strcat(txt_buf,"\r\n");
  35. user_print_usb( txt_buf);
  36. }
  37. }

Pačiam HID reporte visada transliuojami visi nuspausti klavišai, todėl, jei reikia susiderinti su PS2 ar senesniu standartu, reikia tikrinti, koks klavišas nuspaustas ir koks paleistas. Ta daro ciklas 24-33 eilutėse.
Rezultatas:


UPKEY:12[o]
DOWNKEY:13[p]
UPKEY:13[p]
DOWNKEY:2F[[]
UPKEY:2F[[]
DOWNKEY:30[]]
UPKEY:30[]]
DOWNKEY:31[\]
UPKEY:31[\]
DOWNKEY:04[q]
DOWNKEY:16[s]
DOWNKEY:07[d]
DOWNKEY:09[f]


DOWNKEY:2C[ ]
UPKEY:16[s]
UPKEY:07[d]
UPKEY:09[f]
UPKEY:04[q]
UPKEY:2C[ ]
DOWNKEY:0B[h]
UPKEY:0B[h]

Visas demo softo source code čia: STM32CubeMX USB host HID demo source code.

Su Naujais, 2024 metais!

Sveikinu visus su Naujais Metais!

(Nu nepatinka mano telefonui ta bjauri mėlyna spalva. Pakeisti negaliu, o nenaudoti irgi negaliu, nes turiu ekraniukų gal 100 vienetų.)

Ką čia palinkėti? Kaip senas diedas- laimės ir sveikatos! Kaip elektronikos megėjas- mažiau magiškų dūmų, ir nepaimti lituoklio už ne to galo. Kaip kompiuteristas- kad mažiau reikėtu migruoti visą softą į kitos kartos OS. Kaip chemikas- kad nusėstu kai reikia nusodinti, kad ištirptu kai reikia ištirpinti. Kaip megėjas statybininkas- kad nereikėtu bendrauti su tikrais statybininkais.