Category Archives: MCU

ARM:0002 versija B, TXT LCD

Kol kas visiškai neapsisprendžiau kokia “baze” remtis programuojant STM32 mikroschemą. Dabar tik eksperimentuoju ir paprasčiausiai pakartojau senesnį ARM projektą su tekstiniu LCD ekranėliu. Kol kas nebraidžiojau optimizacijos pinklėse ir naudojausi kažkieno sukurtais primityvais, kurie gana griozdiški viduje. Tačiau šaip – ne taip pavyko paleisti.

STM32 LCD tXT
(dešinėje skaičiukas kur neaiškus tai fotikas pagavo momentą kai keičiasi reikšmė)

Kokios iškilo bėdos? Pagrindinė bėda buvo suvokti kaip galima duomenų pinus operatyviai perprogramuoti iš OUTPUT į INPUT. Pas mano naudojamas bibliotekas ten naudojamos griozdiškos struktūros. Ir aišku tingėjau skaityti instrukcijas.
Pradinė užduotis buvo, kad LCD gali būti prijungtas prie bet kurios kojos, bet poto teko supaprastinti, kad visdėlto jungiasi prie to pačio banko. Čia išlindo pirmas skirtumas tarp atmelio SAM7 ir STM32. Pas atmelį PIO kojos bent jau 32, priklauso vienam bankui. Gana logiška- CPU tai 32 bitų ir vienu smūgiu galima pakeisti 32 kojas. Pas STM32 kojos suskirstytos po 16 kiekvienam bankui. Kas baisiau, rodos viduje ten dar suskirstyta po 8 bitus ir išmaukyti tie bitai kažkokia tvarka. Aišku, gal galima skirtingus bankus valdyti skirtingais laikrodukais, o gal taupyti elektrą ir gal juos išjunginėti? Tačiau dingsta paprastumas… Kodėl taip padaryta aš nežinau. Bet man nepatiko.

A! dar kažkaip užmiršau, kad mano LCD tai 5V technologija, o STM32 tai 3V. Tai vieną vakarą prasikankinau be reikalo. Kažkaip galvojau, kad mano testinis ekranėlis veikia su 3V maitinimu.

ARM STM32F103 TXT LCD source code.

ARM:0001 versija B arba STM32

Kažkada gavau Atmelio ARM šroto. O dabar gavau ST produkcijos beveik šroto. Tiksliau pamačiau, kai metė į šiukšlyną “paletėlę”* su STM32 čipais. Dalis čipų nukrito neatgaunamai, o keliasdešimt buvo sugauta ir parkeliavo namo. Tai buvo STM32F103RET6 – 512kB flash ROM, 64kB RAM ir 64 plonos kojos (gana daug kojų palinko gelbėjimo operacijos metu) … LEDų mirkčiojimui pats tas čipukas. 🙂

STM32F103RE
Gryni čipai neveikia, todėl sukurpiau savo PCB. Ji gavosi kraupiai raudona. Dar pakeliui nupirkau kinišką dev boarduką su mažesniu čipuku. Bet PCB iš kinijos atėjo greičiau. Į tą UNIBUS dalį nereikia kreipti dėmesio, čia eksperimentai- ten nebesiekia Eagle free softas ir ta dalis PCB kaip ir nesinaudojasi. Ten “menas” gerberiuose.
Aišku padariau kaip minimum dvi klaidas. Abi gana lengvai pataisomos- užmiršau RESET liniją patempti į pliusą. Ir panašus patempimas reikalingas prie USB jei jį naudoti. Ten reikėtu statyti gal net tranzu valdomą pull-up.

Apie softą kita šneka. Kažkaip seniokiškai piktybiškai nenorėjau jokio IDE. Man užteko tų “user friendly” nesamonių. Tik oldskūlas, tik hardkoras. Žodžiu dabar kompiliuojasi iš to pačio notepado- ir AVR ir STM ir atmelio ARMas. Ir iš ten pat ir programuojasi.

Kad ir ką nešnekėtu vartotojai- nėra labai patogaus softo. Kažkaip eina tendencija, kad jei reikia pamirksėti LEDą, tai reikia į čipuką supusti visa operacinę sistemą ir krūvas pričindalų… Aišku periferiją reikia suprogramuoti ir kuo toliau, ji sudėtingesnė. Bet dėti šimtus eilučių chaotiško kodo? ST išleido gerą įdėją- grafinį periferijos konfiguratorių STM Cube, ten aš jo sugeneruoto kodo nesugebėjau netik suprasti, bet ir sukompiliuoti su gcc. Poto skaičiau nemūsiškus forumus ir atsiliepimai buvo ne kokie… Matyt tokie oldfagai rašė.

Todėl teko pažaisti kokius trys vakarus ir pavyko visdėlto paleisti MCU kojas taip, kad jos duotu kažkokius signalus.
Deja, nepavyko svetimų bibliotekų privesti tiek, kad nerodytu nei vieno warning. Man nepatinka warningai…


gcc version 5.4.1 20160919 (release) [ARM/embedded-5-branch revision 240496] (GNU Tools for ARM Embedded Processors)
Building file: stm32f10x_vector.o
Invoking: MCU C Compiler
arm-none-eabi-gcc -Os -Wall -fno-strict-aliasing -fmessage-length=0 -fno-builtin -mthumb -mcpu=cortex-m3 -MMD -MP -ffunction-sections -fdata-sections -I ../src -I ../src/includes -I ../libSTM32F103 -I ../libSTM32F103/inc -MF objs/stm32f10x_vector.d -MT objs/stm32f10x_vector.d -c ../src/includes/stm32f10x_vector.c -o objs/stm32f10x_vector.o
../src/includes/stm32f10x_vector.c:114:4: warning: taking address of expression of type 'void'
&_estack, // The initial stack pointer
^
Finished building: stm32f10x_vector.o

Building target: blinky_stm32f103.elf
Invoking: MCU Linker
arm-none-eabi-gcc -Wl,--gc-sections,-Map=blinky_stm32f103.map -Os -Wall -fno-strict-aliasing -fmessage-length=0 -fno-builtin -mthumb -mcpu=cortex-m3 -MMD -MP -ffunction-sections -fdata-sections -L ../ -T ../loaders/stm32.ld -I ../src -I ../src/includes -I ../libSTM32F103 -I ../libSTM32F103/inc objs/main.o objs/stm32f10x_it.o objs/stm32f10x_vector.o ../libSTM32F103/Release/libstm32f103.a -oblinky_stm32f103.elf
Finished building target: blinky_stm32f103.elf

Visas source kodas čia, su visom bibliotekom.

*) jei kas nesuprato, “paletelė” tai toks plastikinis laikiklis mikroschemom. Kaip šitas iš to pačio šaltinio:
STM32F205ZGT6
Tik čia daugiau kojų turinti mikroschema STM32F205ZGT6 (1M flash, 132kb RAM ir 144 kojos…) biški per daug.

Vieno nixio laikrodis

Per naujų metų sveikinimą panaudojau šią iliustraciją:

2017 year nixie in-18

Tai vieno nixio laikrodis. Visos detalės tipinės, hardwarėje nieko specifinio. Vienintelė naujovė- viskas valdoma vienu mygtuku. Kadangi reikia daugiau funkcijų, tai mygtukas atskiria “trumpą” ir “ilgą” paspaudimą.
Dar vienas skirtumas- RTC panaudotas iš kažkokio DVRo. Tai Dallas Semiconductors/Maxim čipas DS1338. Jis turi “tick” išėjimą kuris užprogramuotas 1s impulsams ir aktyviai naudojamas programos. Dar naudojama IPS511G mikroschema- smart switch, kuri tik reikiamu metu įjungia aukštos įtampos šaltinį. Lempa didoka, o ir keitiklis nėra labai ekonomiškas. Todėl kai nenaudojama lempa, iš ~7V maitblokio srebia apie 14mA srovės, tačiau kai užsikuria lemputė, srovė užkyla iki maždaug 290mA. Jei neišjunginėti maitinimo, tai raktinis FETas kiek kaista ir jaučiasi šiluma per korpusą. Naudojant atjungimą viskas spėja ataušti.

Laikrodis kokias 7 sekundes nieko nerodo, poto parodo valandas ir minutes nuosekliai. Kiekvienas skaičius rodomas vieną sekundę.Daromos nedidelės pauzelės, kad matytusi kaip keičiasi skaičiai net tada, kai laikrodis turi rodyti tą patį skaitmenį.
Norint iš karto pažiūrėti laiką, reikia nuspausti trumpam mygtuką, tada laikrodis pradeda skaičių rodymo ciklą. Jei niekas neliečiama, skaičiai atsiranda savaime.
Norint nustatyti laiką, reikia spausti ir palaikyti mygtuką. Tada laikrodis rodo visus skaičius iš eilės ir nesiblaško tarp jų. Tada trumpu nuspausdimu galima padidinti skaičius. Penktas ilgas nuspaudimas išjungia nustatymo režimą. Tai indikuojama “vaiduoklišku” švytėjimu (ne visos nixies tai padaro)- visa lempa truputi švyti, bet konkrečių skaičių nerodo. Tai gaunama paduodant aukštą įtampą, bet nejungiant jokio segmento. Per parazitines talpas ir rezistorius yra įtampos nutekėjimas ir lempa švyti.

Kiek apie softą: naudojami trys darbiniai algoritmai vienu metu:
Pirmas- sekundinis “tick” iš RTC mikroschemos per INT0 koją. Čia beveik viskas ir atliekama: nuskaitomas RTC, pagal mygtuko reikšmę atliekamos funkcijos, rodomas laikas.
Antras- taimeris. Čia, neatsimenu kokiu intervalu dirba, bet čia pagal mygtuko rezultatą persijungia režimai. Taip pat generuojama “kintama” įtampa nixio uždegimui per kondensatorių. Taip uždegiamas indikatorius, nes išjungiant aukštos įtampos šaltinį įtampa “pasibaigia” ne iškarto, o poto, kai išsikrauna kondensatorius. O dar, čia galima reguliuoti nixio švietimo ryškumą.
Trečias- pagrindinis ciklas. Čia tikriausiai reikėtu irgi panaudoti kitą taimerį, bet šioje softo versijoje daromas sisteminis mygtukų būklės apklausimas kas 10ms.

Ir aišku:
Single nixie RTC clock with single button control. Source code and hex.

Kiniškas niekaliukas arba 4×4 LED kubas

Kažkada vasaros metu užsakiau kinišką rinkinuką surinkti 4×4 LED kubą. Rinkinukas nėra brangus, kažkur puspenkto dolerio su atsiuntimu. Už tai gaunam PCB, kalną mėlynu (gal yra ir ne mėlynu) LEDu, kelis rezistorius, dvi mikroschemos 74HC595, visokios jungtys… Ir labai labai kiniškos instrukcijos kurios nieko nerodo. Todėl litavau pagal save ir padariau kiek atvirkščiai- LEDus pastačiau kita kryptim ir jie kitaip užsidega (softe teko invertuoti). Kaip konstruktorius pradedančiajam tinkamas, tačiau reikia žmogaus kuris turi kantrybę- lituoti ore tuos LEDus tikrai reikia nervų. Dabar mano nervai pašliję (nuo buitinio triukšmo), tai teko lituoti net dvi dienas.

LED 4x4 cube AVR atmega

Kai viską sulitavau, pakuičiau savo lobynus. Deja nei vienos “arduino” PCB neturiu, o kur turiu nesusiderina pinais su šituo rinkinuku. Kad reikia originalaus arduino rodo debilna 0,1″ jungtis pastumpta per pusę žingsnio.
Softas pridedamas prie konstruktoriau irgi ne fontanai… ypač patiko ši optimizacija:

if(value > 19) return;
if(charge != LOW && charge != HIGH) return;
if(charge == LOW)
{
switch (value)
{
case 0: HC_595_Temp &=~_BV(15); break;
case 1: HC_595_Temp &=~_BV(14); break;
case 2: HC_595_Temp &=~_BV(13); break;
case 3: HC_595_Temp &=~_BV(12); break;
case 4: HC_595_Temp &=~_BV(11); break;
case 5: HC_595_Temp &=~_BV(10); break;
case 6: HC_595_Temp &=~_BV(9); break;
case 7: HC_595_Temp &=~_BV(8); break;
case 8: HC_595_Temp &=~_BV(7); break;
case 9: HC_595_Temp &=~_BV(6); break;
case 10: HC_595_Temp &=~_BV(5); break;
case 11: HC_595_Temp &=~_BV(4); break;
case 12: HC_595_Temp &=~_BV(3); break;
case 13: HC_595_Temp &=~_BV(2); break;
case 14: HC_595_Temp &=~_BV(1); break;
case 15: HC_595_Temp &=~_BV(0); break;
case 16: digitalWrite(LED_Pin16,LOW); break;
case 17: digitalWrite(LED_Pin17,LOW); break;
...

ir panašiai. Iš esmės kiniškam softe kiekvienas LED aprašytas atskirai ir daromas 16×4 ciklas užpildyti tuos aštuonis baitus informacijos reikalingus displėjui. Ir dar visokio monstriško softo. Ką jau pasakyti, kad “raštai” surašyti į paprastą masyvą. Nutariau nesikankinti ir pasirašyti savo softą grynam C.
Mano variantas kiek paprastesnis ir kartu sudėtingesnis jei reikia suprogramuoti animaciją. Animacija saugoma baituose. Po du baitus vienam sluoksniui. Kiekvienas bitas atitinka vieną LED. Pati animacija saugoma progmem.
Visas softas sukasi per pertraukimą, pati serial out procedūra klasikinė, netikrinau ar tikrai reikalingos visos komandos (kad ir priverstinis CLK LOW įjungimas po ciklo). Tačiau viskas veikia.

4×4 LED Cube ATMEGA source kodas ir sukompiliuotas hex.

Dar vienas bambesys- dabar jau harwarėje. Kinai pataupė balastinius rezistorius. Suprojektavo tik po vieną rezistorių visam sluoksniui (nors į rinkinuką įdėjo daugiau rezistorių), todėl kai dega visas sluoksnis, LEDai dega silpniau nei tada, kai dega vos keli LEDukai.

LED 4x4 cube AVR atmega
Kairėje kaip padarė kinai, dešinėje kaip daryti geriau. Aišku dešinė schema irgi ne pyragai- viso sluoksnio LEDai teoriškai duoda sakysim 16x20mA=0.32A. O tiek tikrai neina per ATMEGOS vieną koją… ko pasekoje mikroschema dirba nekorektiškam režime. Gerai, kad ji tokia “fool proof” ir veikia, o ne susvyla. Šiaip, kam tada iš viso varginosi su tais rezistoriais… O jei norisi daryti teisingai, čia reikia pakabinti tranzistorių su leistina srove 0,5A ar daugiau ir viskas šviestu tolygiai. Pačios 74HC mikroschemos dirba daugmaž normaliu režimu, nes veikimo metu viena koja “draivina” tik vieną diodą.

AVR80: OLED displėjukas ir SD kortelė

Jau daug metų norėjau ir pagaliau padariau SD kortelės rašymo eksperimentą su ATMEGA16 mikroschema. Man kažkodėl visiškai viskas neveikė ir teko kankintis su vos vos veikiančiu LCD ekraniuku debuginimui. Vėliau nusprendžiau panaudoti maža nereikalingą OLED displėjuką iš kinijos. Ekraniukas veikia nuo 3V todėl nereikėjo vargti su signalo lygiai ir panašiai. Ekraniukas kabo ant tų pačių SPI laidų kaip ir SD kortelė, aišku CS/SS signalas skirtingas. Labai ilgai kažkodėl neveikė. O šiandien, vakare bet kaip sujungiau laidelius ant savo mega-dev-boardo ir viskas suveikė.

OLED is SD

Failas gavosi ir 1G standartinėje SD kortelėje ir kogero toje mažesnėje, 64Mb multimedia card.

OLED is SD
Kadangi nenaudojam RTC modulio, tai failo sukurimo data hardcodinta programoje.

Šioje konstrukcijoje panaudojau FatFs modulius iš elm-chan.org puslapių, o OLED displėjau modulio paprogramės irgi paremtos svetimu darbu, tiesa ten kiek daugiau padirbėjau. Visa šita sistema suėdė beveik visą ATMEGA16 atmintį:

AVR Memory Usage
----------------
Device: atmega16

Program: 13700 bytes (83.6% Full)
(.text + .data + .bootloader)

Data: 227 bytes (22.2% Full)
(.data + .bss + .noinit)

Todėl, jei norima konstruoti kažka protingesnio, deja teks imti “storesnį” mikroprocesoriuką.

Ir visas source kodas bei sukompiliuota programa tiems žmonėms kurie jau neturės rankioti gabaliukais ir kankintis kol kodas pradeda veikti:SD kortele ir OLED displejaus source code / ATMEGA and SDcard source code.
Apie hardwarę- SD kortelė pajungta prie MISO/MOSI/SCK/SS kojų, OLED ekraniukas prie tų pačių MOSI/SCK, o kiti specialūs OLED signalai paimami iš C porto (3 laidai: CS, C/D, RESET).

AVR79: WS2812 RBG LED juostelė

Trumpas eksperimentas su kiniškais, individualiai kontroliuojamai (addressable) RBG LEDais. T.y. tai kaip ir ilga juostele su RGB LEDais kuriuose sumontuota maža mikroschema kuri leidžia užprogramuoti trijų RGB šviesos diodų intensivumą. Šviesos diodai (ir pati juostelė) valdosi tik per vieną duomenų laidą, t.y. protokolas asinchroninis ir jo veikimas priklauso nuo teisingo taimingo.

WS2812 individually addressable RGB LED control AVR

Pradžioje galvojau rašyti viską nuo nulio, bet poto nutariau ne vargti ir pasiieškojau source code internete. Radau kažkokį universalų, AVR procesoriukams. Nors pats kodas kaip ir universalus, ir turėtu duoti ispėjimus, kai makrosai nesuskaičiuoja, tačiau net kokią valandą kankinausi su kodu, nes signalai nesigavo su teisingais intervalais. Pasirodo, kad mano turimas ATMEGA162, grojantis ant 3,686MHz (cominis) yra kaip tik ant tos ribos, kada softas dar mano, kad sugebės taimingus suformuoti, bet WS2812 mikroschema visiškai su tuom nesutinka. Pakeitus kvarcą į 12MHz (USBinis), viskas iškarto pradėjo veikti.

Tavo vamzdyje arba tu vamzdis (Youtube) pilna filmukų, kur iš tokių LED eilučių pasidaro ištisus ekranus. Tačiau, norint pasidaryti normalios raiškos LED ekraną reikia investuoti į gana daug tokių LED eilučių. Gaunasi brangokas projektas. O ir tada su paprasta ATMEGA neprasisuksi, nes reikia organizuoti video informacijos apdorojimą ir video buferį atmintyje.

Ir aišku: WS2812 AVR ATMEGA source code ir kompiliuotas hex failas.

P.S. Vienas bugas WS2812 juostelėje- kažkodėl neteisingai veikia kai maitinimo įtampa daugiau kaip ~4V. Pradeda fušeruoti. Gal dėl to, kad sujungtas Vcc ir Vled juostelėje, muša stiprius trigdžius? Nes teoriškai, turi veikti net ir nuo 7V…

Elektrinis dviratis: PWM kontroleris

Taigis, kiek parašysiu kaip padarytas PWM kontroleris. Jis buvo kuriamas su kaikokiom įdėjom, bet tos įdėjos nebuvo realizuotos arba nebuvo reikalingos vėliau. Pirma mintis buvo, kad sistema bus skirta 24V sistemai, vėliau ji buvo naudojama 12V sistemoje, dabar Liion 4 celės. Buvo sugalvota analoginė per didelės srovės atkirta (šuntas, įtampos nuėmimas ir komparatorius), bet vėliau to buvo atsisakyta. Ir ta schemos dalis perdaryta į filtra ir buferį.

dviracio kontrolerio schema PWM
Schema kurią radau kompe. Ji kiek skiriasi nuo galutinės versijos. Pradžioje buvo dviejų pakopų stabilizatorius (IC2-IC3)+IC1. Mintis buvo tokia, kad borto 24V numušami iki 15V ir ši įtampa naudojama MOSFET draiveriui. Pakeliui, 15V mažinama iki 5V kuri skirta mikroprocesoriui (TINY138) ir “gazo pedalui”. Išėjimo mikroschema LM358 buvo maitinama iš 15V.
Po eksperimentų ir perdegimų liko tik 7805.

Veikimas toks- įtampa iš akumuliatoriaus, per dioda D1 (400V, 3A) eina į droselį L1. Neteisingos įtampos spaikai suvalgomi transilo D2 (kažkoks ~52V). Čia stovi elektrolitai ir pajungtas 7805 stabilizatorius bei LM358.
Iš 7805 penki voltai užglaistomi kelių elektrolitų patenka į MCU ir į “gazo” jungtį. Pradžioje ten stovėjo rezistorinis daliklis, dabar kiniškas holo variantas. Signalas per filtrą C2 ir R1, bei apsaugą D3 patenka į MCU.
MCU generuoja PWM signalą kuris per filtrą R6C patenka į LM358 buferį. Nes pernelyg “aštrus” signalas iš MCU kėlė problemas tolimesnėse grandinėse. R7 patempia signalą žemyn tada kai MCU dar nepasiruošęs darbui. Dabar signalas “be aukštų” eina į kitą plokštelę kuri išpjauta iš pramoninio įrenginio. Ten stovi UC3710T tikriausiai pagal tipinę schemą, įėjimo signalas irgi turi savo R daliklį, stovi keli kondensatoriai, diodas ir gana didelis transilas.
Signalas iš draiverio išsiskirsto į keturius mosfetus, kiekvieno mosfeto gate turi savo kelių omų buferį ir kelių kiloomų pull-down.

Programinė įranga “hard coded” konkrečiam holo davikliui. Nes holo daviklio dinaminis diapazonas gana mažas. Programinėje įrangoje numatytas “išėjimo kreivės” panaudojimas. Dabar kreivė naudoja linijinį dėsnį.
Dar kelios subtilybės- nėra visiškai mažų ir didelių PWM reikšmių. Per mažos reikšmės nepasuka motoro, tik cypia. O per dideliose nėra jaučiamo skirtumo. Todėl prie maksimalio reikšmės PWM išjungiamas ir MOSFETai atidaromi iki galo.

Source code ir sukompiliuoti failai: DC motoro variklio kontroleris.

Elektrinis dviratis

Che, jau rugsšėjo mėnuo. Ir nuo vasaros pabaigos dar didesnė depresija. Tačiau reikia rašyti… Aprašysiu kiek svetimą projektą. Aš prie jo prisidėjau tik konstruodamas ir programuodamas elektroniką ir dovanodamas reduktorių.
Projektas vadinasi “elektrinis dviratis” be kiniškų išmonių. T.y. kiek galima mažiau pirktinių elementų. Tiesa, į projekto galą atsirado gazo mygtukas iš kinijos ir akumuliatorių krovikas- balansuoklis. Tačiau pastarieji kaip ir ne dviračio elementai.

elektrinis dviratis
Continue reading →

AVR76: unlock ir bambesiai

Iš kažkokio šroto pririnkau gal kokį pusę šimto ATMEGA162v procesoriukų. Buvo tiesiog gaila išmesti. Praėjo neskubant virš metų laiko, pasidarė testinė PCB ir buvo prilituoti keli. Pasirodė, kad jie užlokinti. Bent jau nuoseklus (serial) programavimas neveikė. Nėra didelė bėda ir ne pirmas kartas. Į rankas datašytą, biški programinimo ir … neveikia.

Dvidešimt tris kartus perpatikrinau schemą:
AVR fuse bit unlocking circuit and software
Continue reading →

Dvigubas maitinimo šaltinis: softas

Straipsnį apie Dvigubo maitinimo šaltinio konstravimą parašiau, o štai paviešinti softą ir jo source code visiškai užmiršau.

dvigubas maitinimo saltinis su grafiniu LCD ekranu

Trumpai apie hardwarę. Konstrukcijoje stovi du identiški reguliuojami maitinimo šaltiniai (linear), nepriklausomos trafo apvijos, srovės matavimas “high side” su srovės šuntu (problemos su mažom įtampom), grafinis LCD ekranas valdomas kiek stipresnio ARM SAM7 procesoriuko, kuris dar ir matuoja vienos pusės parametrus bei priima signalus per UARTą per optinį atrišimą iš kitos pusės. Kitą pusę kontroliuoja nedidelis AVR ATMEGA8 procesoriukas. ARMas dar matuoja įrenginio vidaus temperatūrą. Mikroprocesoriai nieko nevaldo, tik indikuoja.

Source (ir kompiliuotas hex failas):
ARM AT91SAM7 procesoriukui.
AVR ATMEGA8 procesoriukui.