Maxima Gaidelis

August 17th, 2022

O viskas prasidėjo taip prabangiai: “30 metų", “gimtadienių gimtadienis", “melionas prizų". O poto pasidarė “3000 gaidelių" :)

Va ir man pasisekė… gal.
maxima gaidelis

Aš kai nelabai žiūrau reklamas, netgi toje info-kasoje sudvejojau kai gavau gaidelį. O poto šyptelėjau ir net gal pusę valandos masčiau apie maksimos marketologus. Tačiau gal žmonėm patinka gauti koki reklaminį lipduką, gaidelį- svarbu dykai.

Liko dar viena paslaptis- pakalikai. Ar jie visi vienodos formos? Ką su jais daryti? Nors vienas proanūkis tai griebė juos, bet tėvai atkalbėjo- matyt stengiasi atriboti nuo to gėrio ir auklėti vaikus.

:)

P.S. įtariu, kad ten man pardavė negerą silkę vietinio ruošimo. Nes žolines praleidau garbindamas baltojo porceliano dievus.

ARM38: soft PWM pertraukimas

August 10th, 2022

Pratesiant HUB08 temą. Rašiau, kad OE signalo ilgis reguliuoja visos matricos šviesumą. Ir tokiam reguliavimui labai gerai naudoti “single shot" PWM pertraukimą. T.y. paleidžiam taimerį kuris vieną kartą sugeneruoja PWM signalą kurio ilgis nusistato harwariškai. Toliau galimi du variantai- tiesiogiai naudoti PWM signalą OE valdymui arba naudoti PWM signalo pasibaigimo pertraukimą.
Pasinagrinėjam antrą variantą (pirmas variantas skiriasi tik vienu parametru ir laidelio prijungimu prie dedikuotos kojelės).

Čia kubiko ekrano vaizdas. Šiam eksperimentui pasinaudojam laisvu, trečiu taimeriu:
CubeMX
Taimeris dirba nuo 72MHz bazinio clock. Todėl ir tas prescaller toks: 720-1, t.y. 72000kHz/720=100kHz (10μs) žingsniukais reguliuojasi impulso ilgis.

Prie kubiko generuoto kodo prisideda svetimas kodas. Kiek suprantu paleisti pertraukimą negalima tiesiogiai, nes paleidimo metu susigeneruoja pertraukimas iškarto. Todėl pertraukimas iškarto “išvalomas".

/* USER CODE BEGIN TIM3_Init 2 */
//svetimas kodas
TIM_CCxChannelCmd(htim3.Instance, TIM_CHANNEL_3, TIM_CCx_ENABLE);
__HAL_TIM_CLEAR_IT(&htim3,TIM_IT_UPDATE);
__HAL_TIM_ENABLE_IT(&htim3,TIM_IT_UPDATE);
//end svetimas kodas
/* USER CODE END TIM3_Init 2 */

Kai tik pabaigiam derinti visas kojeles ir įjungiam OE signalą, paleidžiam taimerį:

//svetimas kodas. single shot timer3
htim3.Instance->ARR=1; //OE ilgis. 72MHz/(720-1)*4=~51μS; 8=~90μs; 10=~109μs.
__HAL_TIM_ENABLE(&htim3);

ir baigiam pertraukimo kodą. Impulso ilgis (o tiksliau, pauzės tarp pertraukimų ilgis) reguliuojasi ARR registru (Auto Reload Register). Dėl to, kad naudojam programinį kojos valdymą, kojos perjungimui ir softo suveikimui reikia kažkiek laiko. Mano netobulas, fazendos oscilografas parodė pauzės ilgius parašytus komentare- apie 10μs susinaudoja softiniam perjungimui. Jei naudoti PWM dedikuotą kojelę, impulso ilgis bus tikslus.

Naudojant programinį valdymą, OE kojelę perjungiam programiškai globliam taimerių pertraukime (aišku reikia tai įjungti):
cubemx int

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim4){ .... }
if(htim==&htim3){ OE_HI } //Cia galima isjungti OE
}

ARM38: HUB08 ir STM32F1 hardware

August 1st, 2022

Šiais laikais dažnai galima rasti kiniškų LED matricų- ar tai išmestos, ar defektuotos arba nusipirkti pas pačius kinus. Tokias matricas valdo kiniški kontroleriai kurie viską ir atlieka, jei užtenka nervų suprasti kiniško softo kreivumą. Tačiau kartais atsiranda noras sukurti kažką savo ir paaiškėja, kad nelabai yra informacijos apie tas matricas- yra įvairios bibliotekos (gana kreivos) ar šiaip keisti sprendimai, bet pačio aprašymo nėra.
Šiame straipsnelyje pasinagrinėsim vienspalves (vieno ryškumo lygio) LED matricas su HUB08 jungtimi. Šios matricos maitinamos dažniausiai nuo 5V per atskirą jungtį, o informacija perduodama per 16 kontaktų jungtį su užrašu Hub08. Hub08 leidžia jungti matricas į grandinėles (daisy chain) ir kiniški moduliai ir jų softas automatiškai viską sutvarko. Mane domino kiek žemesnio lygio informacija.
hub08 protocol pinout
Kartais vietoje raudonų LED pajungiami ir mėlyni, taip gaunas RGB spalvos ar panašiai.

Hub08 leidžia perduoti vienu metu keturis duomenų kanalus su tuo pačiu clock (SPI). Dar yra ABCD kontaktai- tai 16 LED eilučių. Paprastai duomenų kanalai pavadinami R1,R2,G1,G2. T.y. dvi raudonos spalvos ir dvi žalios. Kodėl po dvi? Todėl, kad matrica dažniausiai buna 32 LEDų “aukščio" ir panašiai arba daugiau ilgio.

EN tai esamo buferio ir eilutės “rodymas" t.y. LED tuo metu šviečia. LAT (kartais STB) tai trumpas impulsas kuris perkelia duomenis iš SPI buferio į vidinį mikroschemos (74HC595) registrą. Teoriškai galima vienu metu rodyti vaizdą ir tuo pat metu krauti sekančios eilutės duomenis. Tačiau mano turimas kiniškas kontroleris to nedarė.
Matricų LEDai dirba impulsiniu režimu, todėl per juos teka didelė srovė, kuri statiniam režime tikriausiai sudegintu pačius LEDus. O ir nenorima rodyti visokias mirguliacijas jei pastringa kontroleris ar matrica, todėl LED matricoje yra hardwarinis kintamo signalo jutiklis- kol nėra impulsų, tol neveikia išėjimas. Matrica statiniam režime išsijungia.

Pažiūrim į kiniško kontrolerio signalą:
hub08 protocol line frame
(paveiksliukai dideli, naudokit zoom arba žiūrėkit kitame lange)
Beja, mano testuojama matrica uždega šviesos diodus kai duomenys lygus nuliui. Kai duomenys 1- LED nešviečia. Kiek stebina L (LAT, latch) signalo ir ABCD pokytis beveik vienu metu. Rekomenduočiau eilučių numerį keisti prieš ar po L signalo, o ne jo metu. Šis signalas yra “rising edge" tai kogero užtenka laiko duomenim pasikeisti. Kiniškos matricos CLK (paveikslėlyje S) buvo ~1.13MHz, eilučių dažnis apie 11kHz, bet tai priklauso nuo pačios matricos dydžio ir konfiguracijos. EN ilgumas duoda matricos šviesumą.

hub08 protocol data clock
Čia kiek geriau matosi SPI clock ir duomenų santykis. Ir kiek geriau matosi, kad ABCD ir L kinta ne vienu metu.

Eksperimentui paėmiau dvi matricas (32×64) ir susukau, kad gautusi kvadratas- 64×64. Viso 4096 šviesos diodai. (naudojau tik raudonus diodus, nes viena matrica buvo dvispalvė, kita vienspalvė). Kontroleris bus pats labiausiai prieinamas, STM32F103c8t6 (Bluepill) kiniškas padirbinys (gal dėlto man neveikia DMA). Deja, šis kontroleris turi paprastą SPI kuris turi tik vieną kanalą, todėl nutariau pagudrauti: duomenys ateina į pirmos matricos R2, pirmos matricos R2 išėjimas vel eina į tos pačios matrios R1 įėjimą. Pirmos matricos R1 išėjimas patenka į antros matricos R2. Antros matricos R2 OUT eina į R1 IN. Taip gaunasi, kad fiziškai ir logiškai visi, vienos eilutės, raudoni šviesos diodai susijungia į vieną SPI pliūpsnį. Reikia perduoti 32 baitus informacijos (32*8=256 šviesos diodai, 4 eilutės) “vienai, sujungtai eilutei", viso 16 eilučių. Aišku, po tokio sujungimo LEDų numeracija bus kiek sudėtingesnė, bet gi skaičiuoja ARM kontroleris, jis moka matematiką.

Toliau galimi du sprendimai kaip organizuoti visko veikimą- dinaminis vaizdo kurimas “on the fly" kaip pas ATARI 2600 kai nereikia “daug" RAM arba naudoti video RAM variantą (512 baitų RAM). Pirmas variantas taupo atmintį, bet labai komplikuoja vartotojo programą- ten labai svarbus taimingas ir viso video vaizdo generavimas. Variantas su video atmintim žymiai lengvesnis- visą matricos valdymą galima užkrauti per pertraukimus (ir DMA, kuris man kažko neveikia), o vartotojo programa gali veikti pagrindiniam cikle be jokio vargo su SPI duomenų perdavimu ir GPIO perjunginėjimu. Manau iš esamų 20kbaitų, pusę kilobaito galima paaukoti video atminčiai.

Pačios matricos valdymas daromas per pertraukimus. Pirmiausia pasinaudojam taimerių ir generuojama “eilutės" pertraukimą- kelis šimtus hercų, kad visa matrica (eilutės/16) nemirgėtu. Šis pertraukimas paruošia signalus, pasiskaičiuoja RAM adresą, išjungia vaizdą ir per SPI persiunčia duomenis. Tuom jis baigia darbą. Jei veiktu DMA, tai net ir procesorius per daug nedirbtu.
Toliau SPI generuoja savo darbo pabaigos pertraukimą. Čia pasirenkam rodomą eilutę, įjungiam ekraną ir baigiam darbą- atiduodam procesoriaus resursus vartotojo programai iki sekančio taimerio ciklo. Teoriškai čia dar galima būtų iššaukti dar vieną taimerį kad reguliuoti matricos šviesumą, bet deja aš to daryti dar nemoku (kitam straipsnyje jau moku). Todėl dabar matrica šviečia pilnu šviesumu. Pertraukimai dar generuoja taip vadinamas vėliavas (flag)- kintamuosius kurie leidžia asinchroniškai pagrindinei programai žinoti kas šiuo metu vyksta. Tai ir kadro numeris ir VS “impulsas". Tai leidžia vartotojo programai sinchronizuotis su matrica ir jos taimeriu.

Kaip visada programinė įranga:
LED matrix HUB08 demo program for STM32F103 with source code and hex file.

Faile “hub8.c" surašytas visas matricos interfeisas. Ir bazinės komandos plot, point ir teksto paišymas. Papildomai yra bendrinis linijos algoritmas (line.c). Pradėjau pilnai iškėlinėtį vartotojo programas į “user.c" failą- pagrindinima faile “main.c" lieka tik STM32CubeMX generuotas kodas ir kelios eilutės komandų. Taip paprasčiau perkelti programas iš vieno projekto į kitą.

64x64 RED LED

Demo programa nupaišo tekstą ir paleidžia taškelį kuris laksto po matricą ir “atsimuša" į jos kraštus. Kiek keistai paišosi taškelis- tai tik dėl float->int supaprastino konvertavimo. Reikia įvertinti 0,5 apvalinimą, o aš to nepadariau. Tačiau taškelis laksto, mano šuniukui tai labai patiko. Jis net užlipo ant stalo ir numetė tą matricą žemyn…

Uher report 4000 ir 4200

July 31st, 2022

Tai grynas 1966 metų produktas. Tačiau jau gryni tranzistoriai. Tai Uher Report 4000 serijos reporterių magnetofonai. Blogos būklės tokie magiukai parduodami už metalo laužo kainą, geri- artėja prie 500€. Visi magnetofonai turi vieną nemalonų defektą- greičių perjungimas ir ryšis su capstan'ų atliekamas frikcionu. O per tiek metų guma suakmenėja ir nebėra gero kontakto. O dar papildomai atsiranda visokie ūžesiai ir braškėjimai. Kiti dirželiai perkami internetuose ir lengvai keičiami.

Uher report 4200
Čia “stereo" versija. Tačiau tai ne tas stereo kur visi naudoja, o “vienpusis", nes magiukas turi galvą tik su dviem takeliais per visą juostą.
“Rankinė greičių dėžė" dešinėje aparato iš tikro ir yra rankinė greičių dėžė, čia persijungia juostos traukimo greitis ir įsijungia motoriukas.

They had four speeds: 7½ inches per second (i.p.s. or in/s), 3¾ i.p.s., 1⅞ i.p.s., and 15/16 i.p.s. [19 cm per second (cm/s), 9.5 cm/s, 4.75 cm/s, and 2.38 cm/s].

Read the rest of this entry »

Čipų trūkumas 2

July 24th, 2022

Seniau lupinėdavau iš šroto (Husqvarnos žoliapjovės) STM32F103 čipus. Ne tiek jau daug rasdavau, nes dažniausiai čipai užlakuoti. Dabar vėl parvežė, matau keletą nelakuotu, čiumpu ir namie matau klastą:
STM32F103 clone
Tai kinietiškas analogas- ne toks “ekologiškas", bet sako kad greitesnis. Čipo viduje yra du kristalai- atskirai ROMas ir atskirai MCU. Čipo paleidimo metu programa perrašoma į RAM ir veikia iš ten. Teoriškai gaunasi lėtesnis boot, bet greitesnis kontroleris.
Lygtai pilnai suderinamas su STM produktu, bet tikriausiai yra savų prigulnybių. Čipas užnumeruotas kaip 303, bet čia tikrai ne trečia serija.
Seniau visi čipai buvo STM. Matyt arba taupo pinigus arba tikrai nėra kur pirkti naujų STM (nereikia barstyti).
Read the rest of this entry »

Dar vienas beveik lavonas- topcast

July 11th, 2022

Staiga bac! ir neveikia.
topcast mainboard
Tropinis klimatas Lietuvoje, priverstinis šaldymas ir nelakuota PCB (!). Keli lašai kondensato ir nešvarumai. Ko pasekoje biški neveikia. Nauja kainuoja 1600€ plius siuntimas, tai kaip ir verta nagrinėtis. Juolab, kad technologija antikinė. Svarbiausia, kad procesoriukas (NEC/Renesas H8S/2357) veikia. Veikia ir rodo vėjus, nes analoginėje dalyje atsirado papildomi laidumai.
Read the rest of this entry »

Nauja power elektronika

June 28th, 2022

Bandysim paleisti.

power
Bendras maitblokiuko vaizdas.
Read the rest of this entry »

ARM37: zuikis ir vėžliukas

June 26th, 2022

Kas nesidomi mikroprocesorių programavimų, gali ir neskaityti. Bus nelabai įdomu… :)

Klasikinė bėda- yra du procesai, kurių veikimo greičiai labai skiriasi. Šiam variante: USB ir UART. Kaip suderinti jų bendrą veikimą? Štai imat kokį source code iš interneto platybėse publikuotos pamokėlės, viskas kaip ir veikia kol spaudžiojat duomenis iš klaviatūros, o jei pabandot “copy-paste" ir staiga tekstas pradeda nebepersiduoti, raidės prapuola ir procesoriukas pastringa. Kodėl? Todėl, kad reikia suderinti skirtingo greičio ir veikimo principo procesus:
Pirmas procesas, USB, tai paketinis duomenų perdavimas su galimybe pristabdyti duomenis ar net paprašyti juos pakartoti. Viskas vyksta gana greitai.
Antras procesas, UART, tai nuoseklus, lėtas duomenų perdavimas. Ir pats perdavimas pririštas prie laiko. Jei nenaudojam kontrolinių linijų, procesą negalime sustabdyti. Kai duomenų per daug, jie prarandami.

Taip atrodo iš žmogaus pusės, iš kontrolerio pusės tai jau keturi procesai: USB TX, USB RX, UART TX, UART RX.

Kad suvaldyti šį chaosą, reikia procesus paleisti nepriklausomai, per pertraukimus. Arba, kai siunčiam, tai galima ir pastabdyti pagrindinį ciklą (bent jau šiame eksperimente). Gaunais taip:

  1. UART RX, per pertraukima ir net DMA. Tačiau nežinom kiek baitų gausim, tai visas mūsų DMA/IRQ tvarko tik vieną baitą.
  2. UART TX, siuntimas blokuojant procesoriaus darbą. Mūsų programa nieko protingo nedaro, tai galima blokuoti.
  3. USB RX, tikriausiai per pertraukimą, naudojam HAL biblioteką.
  4. USB TX, blokuojamas ar tai IRQ, naudojam HAL biblioteką*.

Visi procesai per pertraukimą daro tik vieną darbą- jei gaunam duomenis, įrašom duomenis į buferį (jei yra vietos). Buferis vadinasi “circle" nes tai kaip ir cirkuliarinis buferis**, tik aš jo neperpildau, prarandu duomenis jei buffer overflow. O pats smagumas vyksta pagrindiniam, amžinam cikle:

 while(1)
	{
	HAL_IWDG_Refresh(&hiwdg); //watchdogas
	
	while(circle_available(&cc)>0) //ar yra duomenu gautu is UART?
		{
		i=circle_available(&cc);
		for(j=0;j<i;j++)
			{
			tmp[j]=circle_pull(&cc); //viska persikopijuojam ir issiunciam
			}
		CDC_Transmit_FS(tmp, i); //siuntimas per USB (blocking?. gal ne)
		}
	
	while(circle_available(&cu)>0) //ar yra duomenu gautu is USB?
		{
		i=circle_available(&cu);
		for(j=0;j<i;j++)
			{
			tmp[j]=circle_pull(&cu); //viska persikopijuojam ir issiunciam
			}
		send_uart((char *) tmp,i); //siunciam per UART (blocking)
		}
	}
}

Tikriausiai senas Wordpresas nenusiaubė programos teksto.

Iš principo programa veikia taip: yra ką perduoti? perduodam! ir vėl iš naujo.

Tačiau galima dar labiau viską užkomplikuoti- TX padaryti su atskirais buferiais ir siuntimo procesą irgi padaryti asinchroninį. Tada procesoriuje išsilaisvintu dar šiek tiek resursų kokiai nors pagrindinei programai.
Dar viena bėda- nenumatytas atvejis, kai trumpuose momentuose, kol ištraukiami duomenys į buferį, kas nors įrašytu naujus duomenis. Teoriškai circle buferis apsaugo nuo tokių nemalonumų… Praktiškai, buitiniams reikalams viskas veikia.

Šis straipsniukas skirtas man pačiam prisiminti, nes reikėjo ir neatsiminiau. Teko kiek parašinėti.

*) HAL USB biblioteka netikrina ar duomenys išėjo. Jei reikalingi TIKRAI gerai daryti, reikia tikrinti USB būklę. Tada jau geriau nagrinėtis ATARI disko emuliatoriaus kodą (rodos ten padariau viską)
**) circular buffer, cirkuliarinis buferis leidžia rašyti ir skaityti duomenis iš buferio. T.y duomenys kaip gyvatėlė Uroboras, nauji duomenys prisideda prie galvos, o seni nusiima prie uodegos. Viskas gerai, kol galva nepasiekia uodegos ir gyvatėlė neįsikanda. Tada prarandam duomenis.
P.S. source kodas neoptimizuotas dėl aiškesnio vaizdavimo.

ARM36: Burbuliniai LED

June 15th, 2022

Antikvarinis LED indikatorius, tikriausiai iš kokio nors tarybinio kalkuliatoriaus. Žavi savo netobulumu:

burbulinis LED
АЛС318

Simboliai mažyčiai (todėl ir plastikinės linzės), šviesumas mizernas (prie tausojančių srovių). Bet savotiškai žavingas.
Tokiam indikatoriui pajungti reikia gana daug laidų ir dinaminės indikacijos. Demonstracijai panaudojau breadboard ir “bluepill" plokštę (STM32F103C8t)- mikroschema mažoka, beveik visos kojos sunaudojamos indikatoriui. Prie anodų (pliusinių elektrodų) reikia prikabinti kokius nors rezistorius, kad apriboti srovę per LED, tik 3mA statiniam režime per vieną segmentą. Naudojant dinaminę indikaciją leistina srovė 40mA, bet jei indikacija sustos, tai atia LEDams.
Read the rest of this entry »

Švilpiko dienos radija

June 2nd, 2022

Nu gal ne visai, originale tai Panasonic RC-6025, o pas mane Sanyo Sterocast RM5320, tikriausiai 1972 metų gamybos (gali būti ir su kitu brendu, kad ir Siemens alpha). Tikrai japoniška, nes visur tik “made in Japan", ant garsiakalbio Sanyo ir panašiai.
Sanyo sterocast
Kodėl žinau, kad yra kitu brendų? Ogi todėl, kad pirmoji radija kur pirkau buvo Siemens. Bet ji ne tik su sugadintu motoriuku (plastikinis dantratis be dantų), bet ją man dar ir stiprokai sudaužė- 70-tųjų plastikas labai trapus.
Read the rest of this entry »

Unhappy Tikbalang