Category Archives: MCU

Randominizatorius

Vienoje vietoje prireikė nepriklausomo “randominizatoriaus”. T.y. prietaisiuko, kuris su žinoma matematine tikimybe pasako “True” arba “False”.

Random

Veikia taip- paspaudi mygtuką ir su maždaug 8% tikimybe užsidega raudona spalva, kitu atveju užsidega žalia spalva. Spalva šviečia maždaug 3 sekundes. Dar kas kažkiek sekundžiu 3 milisekundėm mirkteli mėlyna spalva- čia kad priminti, kad prietaisas veikia.
Nežinau kaip bus toliau, bet teoriškai prie randominizatoriaus jungsis kažkokia periferija. Tačiau čia tik prototipas.
Viskas padaryta ant Atmelio minimalistinės mikroschemos – AT90S2343. Panaudojom mano PCB47415.
Softas labai paprastas- pagrindiniam cikle sukasi skaitliukas 0-255. Jis sukasi visada ir ant pilno greičio. Kiek jis ten sukasi nežinau, bet MCU taktinis dažnis artimas 1MHz.
Tuo tarpu kiek letesniu greičiu taimeris tikrina mygtuko būseną. Jei nuspaustas, lygina random skaičių su konstanta. Pagal tai ir sprendžia kokia spalvą užžiebti. Gal ir nėra gerai, dėl atsitiktinių skaičių mygtuko apklausos naudoti taimerį- jis gi susijęs su procesoriuko dažniu ir gal gaunasi kokia matematinė priklausomybė? Tačiau per tą patį pertraukimą dar kartais užžiebiamas mėlynas LEDas ir šiaip. Žodžiu, lygtai skaičiai ir atsitiktiniai gavosi.
Būtent atsitiktimumą apsprendžia žmogus paspaudęs mygtuką.

Softo source code ir kompiuliuotas failas:
Source code and hex for Atmel MCU.

ARM:0005 arba paprastas PIO kojų pertraukimas

Gali kas nors paklausti, kam aš rašau šituos trumpus straipsnius. Ogi pirmiausia, čia yra mano “brain dump” -papildoma atmintis. O antriausia, pilnas internetas tų pačių straisnių apie šitą reikalą… bet visi arba rašo apie tą patį pavyzdį nuo atmelio arba jau šneka apie labai advanced versijas.
Ir net pavyzdys nagrinėja iškarto keletą pertraukimų, o norisi suprasti kur kas eina kiekvienam atskirai. Taigi pertraukimas (interrup) pagal PIO. Nu tipo pagal kojas bendrai.

PIO Int handling in ARM MCU
Viskas iš pradžių pasirodė paprasta, bet neveikė :). Todėl ilgai ir nuobodžiai guglinau ir bandžiau. LCD ekraniukas rodo minimalistinę informaciją: pirmoje eilutėje šiaip pavadinimas. Antroja, kur “STATUS”, rodo kintamojo reikšmę kuri keičiasi tik pertraukime. Trečioje eilutėje- širdelė. Tai pagrindiniam cikle, po įvairiausiu skaičiavimu paišomos mažesnės ir didesnės širdelės. Jei širdelė pulsuoja, reiškia, kad pagrindinis ciklas dar dirba ir softas neužstrigo.
Ir paskutinė eilutė, kur “INFO”. Čia paprasčiausiai nuskaitoma informacija iš visų MCU kojų ir parodoma. Kaip diagnostika.

Softas paprastas- pagrindiniam cikle sukasi daug pauzių, pulsuojama širdelė, nuskaitoma porto būklė ir parodoma per LCD ekraniuką, ir rodoma kintamojo reikšmė.
Tuo tarpu, trys kontrolerio kojos suprogramuotos kaip mygtukai į žemę kai nuspausta. Normalioje būklėje daroma pull-up. SW0 didina skaičiaus reikšmę, SW1 mažina reikšmę, o SW3 nulina.
Nuspaudus bet kurį iš SW mygtukų, iššaukiamas pertraukimas kuris ir atlieką darbą. Puikiausiai skaičiuoja kontaktų drebėjimo skaičių. Todėl nenustebkit, kad paspaudus mygtuką skaičius pasikeičia keliais vienetais ar šimtais- čia taip turi būti.

Pagrindiniai atradimai šioje programoje- kad negalima pasirinkti bet kokio pertraukimo tipo. Nes nuo “edge” trigerių kažkodėl pertraukimo softas užspringsta.
Ir dar sužinota, kad LCD paprogrames reikia patobulinti… ir jos patobulintos. Dabar teoriškai lygtai LCD veikimas nebeiškraipo kitų MCU kojų konfiguracijų. Čia ypač liečia “direct drive” ir “pull-up”.

ARM PIO INT testo source code ir hex failas, hexas aišku sukompiliuotas Atmel AT91SAM7S256AU čipui.

ARM:0004 arba paprastas serial

Trumpas papildymas- kiek pataisyta LCD biblioteka (ir senam poste pataisyta: pakeista pauzės formavimas, kai kurie parametrai, inicializacija. Dabar LCD ekranas pasileidžia iš karto).
O šiaip šitas postas apie patį primityviausią serial duomenų perdavimą naudojant UARTą. Čia nenaudojami jokie interuptai ir panašiai. Paprasčiausiai tiesiogiai surašomi duomenys į reikiamus portus, ir jei reikia nuskaitomi.

ARM serial testas LCD
Visa informacija rodoma per LCD ekraniuką. Antroje eilutėje matosi ką tik išsiustas baitas, kiek dešiniau paskutinis priimtas baitas. Užtenka pirštu sujungti IN su OUT ir atsikartoja informacija- gaunasi kaip ir loop-back testas.

Ta CPU clock eilutė grynai informacinė. Kažkur radau internete, kad taip galima sužinoti esamą CPU taktinį dažnį. Tai va kažką ir rodo. Tiesa dažnis kartais keičiasi.

ARM serial test ir LCD source code ir hex, hexas aišku sukompiliuotas Atmel AT91SAM7S256AU čipui.

ARM:0003 arba LCD ekraniukas

Čia toks greitas pranešimas. Kai būna noras ir laikas, kartais paspaudžioju savo ARM devboardą. Kadangi ten viskas nuo nulio, tai visiškai įdomu. Ypač low-level bibliotekų rašymas. Pažiūrėjęs į savo ARM eksperimentus, nutariau parašyti tekstinio LCD ekraniuko biblioteka. Jos rašymui, kaip pagrindą panaudojau jau visam internetui žinomą Peter Fleury darbą. Tik reikėjo viską adaptuoti AT91F serijos ARM procesoriukui. T.y. perrašyti visą hardwarinę dalį. Taip pat kiek supaprastinau opcijas- dabar prie LCD ekrano galima jungtis tik 4 bitais.
Kadandingi pas šitą (AT91SAM7S256) nėra jokių kojų bankų, o visos PIO eina iš eilės, teko pedaryti iš esmės duomenų perdavimą. Užtat dabar galima jungti prie bet kurio PIO.

ARM SAM7 text LCD library

Prie bibliotekos eina paprasta testinė programa. Ji nekorektiška, nes LCD ekranas pajungtas grynai skaitmeniškai ir kontrastas (Ve) padarytas grubiu PWM ciklu. Gal ateityje, kai skaitysit kitus postus, bus atskiras straipsniukas apie PWM ir ekranas valdysis kitaip. ARMas yra 3V, tuo tarpu LCD 5V, bet puikiausiai veikia- vadinasi IO yra suderinamas įvairiom įtampom.

Biški apie biblioteką. Ji daug maž suderinta su Peterio darbu, pagrindiniai nustatymai faile “lcd.h”. Ten reikia aprašyti LCD displėjų, jo dydį. Svarbiausia aprašyti kokia koja kur eina- tai daroma, kaip įprasta pas mano matytus SAMų projektus hardware faile “board.h”.

#define LCD_RS (1 < < 17) //PA17 #define LCD_RW (1 << 18) //PA18 #define LCD_E (1 << 19) //PA19 #define LCD_D4 (1 << 20) //PA20 #define LCD_D5 (1 << 21) //PA21 #define LCD_D6 (1 << 22) //PA22 #define LCD_D7 (1 << 23) //PA23

Čia matosi, kad LCD pajungtas prie 18- 23 PIO kojos.
Dar paminėsiu, kad softas turi veikti prie bet kurio SAM7 serijos ARM procesoriuko, tik kad aš išbandyti galėjau tik su savo AT91SAM7S256.

Nu ir aišku:text LCD library for ARM source code and compiled hex file, hexas aišku sukompiliuotas Atmel AT91SAM7S256AU čipui.

P.S. prie “standartinių” paprogramių, LCD.C turi ir “user defined symbol” paprogramę. Peteris ją užmiršo.

Biški softo CNC motoriukams

Tai rezervinė kopija mano ala “cnc” projektui- AVR source kodas bei sukompiliuoti hex failai. Taip pat exe failas windowsams kuris valdo visą šitą mašineriją. Tiesa nežinau ar tai 32 ar tai 64 bitų versija.

Vienas AVR soursas skirtas valdyti steperius per paprastus mosfet raktus. Antra versija naudoja du Freescale/Motorola čipus MC34922. Teoriškai abi versijos turi veikti vienodai, viena skirta unipoliariniams motoriukams, kita bipoliariniam. Senesnė versija išbandyta praktiškai, tuo tarpu naujesnė tik prie palaido motoriuko.
Softas kiek skiriasi- nauja versija turi srovės nustatymo komandas. Tačiau senesnis softas paprasčiausiai ignoruoja šias komandas.

Softas.

Tai negalutinė versija, todėl skirta tik eksperimentams.

Sincgars Nokia SMS terminalas

Čia toks karinis kriptoterminalas kurį naudojo amerikonai ir NATO kariai (Nokia PARSA – Partiosanomalaite). Šitas SMS aparatas jungiasi prie SINCGARS racijų (komentaruose parašyta kad tokią turiu) ir ten galima siuntinėti koduotas žinutes. Dar yra ir maži printeriukai, kad atspausdinti čekutį. O pati racija dargi dirba šokinėjančio dažnio režimu. Kad dar sumažinti galimybę nuskaityti informaciją, ji siunčiama “burst” režimu. T.y. piršteli tuos kelis baitus vienam dažnyje, kelis kitame ir išsijungia.

NOKIA SINCGARS crypto terminal
Toks teoriškai nieko nebijantis korpusas. Maitinimui reikia net 6 AA tipo batareikų arba gali maitintis iš racijos.
Continue reading →

ARM:0002 arba Hello World aka mirksiukas

Pirmas darbas programuojant bet kokia programavimo kalba kompiuteryje yra parašyti “Hello World” programą. Visokiuose mikrokontroleriuose tai mirksiukas. T.y. kažkokia koja turi mirksėti kažkokiu priimtinu ir detektuojamu dažniu. Nu koja nemirksi, bet koks nors šviesos diodas tai tikrai. Labiau “advanced mirksiukas” tai mirksiukas kuris reaguoja į kokį nors išorinį vaiksmą. Šiuo atveju į kitos kojos būklę.

SAM7 mikrokontroleris turi gana daug kojų. Kai kurios turi ne vieną paskirtį. Tačiau męs čia giliai nekapstysim- PA1 koją panaudosim kaip išėjimą, o PA2 kaip įėjimą. Mano PCB visos kojos išestos į standartinio (0.1″) žingsnio skylutes. Pačios skylutės kiek didesnio diametro, tai ten puikiausiai laikosi oscilografo čiupiklis.
Kol kas nesinagrinėjau aš to MCU hardwarės, tai nieko protingo nepadariau- tik užprogramavau vieną koją išėjimui. Kitos tikriausiai pagal nutylėjima pasidaro kaip įėjimai. Kaip ten organizuojami pull-up aš nežinau, bet po standartinės inicializacijos viskas veikia.

Kuo šitas skiriasi nuo paprastos ATMEGOS iš softo pusės? Dar nežinau daug, bet pirmas bugas kuris man pasirodė nesuprantamas, tai kad reikia paprogrames daryti STATIC. Jei neparašai, viskas susikompiliuojasi, bet kažkaip neveikia. Čia jau aš dar nesupratau. Dar klaustukas dėl VOLATILE kintamųjų. Bet kadangi viskas nudrožta nuo oficialaus Atmelio pavyzduko, tai matyt taip turi būti.

ARM mirksiukas
Softas veikia taip- amžinam cikle sėdi kitas ciklas kuris skaičiuoja pauzės dydį. Nuo minimalios iki kiek didesnės. Nuo PIN2 reikšmės priklauso pauzė vienokia ar didesnė 10 kartų.
T.y. kai nenuspaustas (kaip foto) pauzė keičiasi nuo 0 iki 9*5 tuščių ciklų. Pauzė ir mygtuko tikrinimas daromas prieš kiekvieną signalo pokytį.

Per nuotraukoje apibrėžtas 800ns įvyksta: signalo pakeitimas iš 0 iki 1, mygtuko reikšmės nuskaitymas per paprogramę, pauzės skaičiavimas =0*5*1, pačios pauzės paprogramės iškvietimas ir nepavykęs for ciklas, važiavimas atgal iš paprogramės ir signalo pakeitimas iš 1 į 0.

Taktinis procesoriuko dažnis kažkoks defaultinis skirtas USB. Kažkur apie 48MHz. Bent jau toks turi būti. Čia jau labiau patyrę turi pakomentuoti ar gerai man gavosi.

Ir aišku: Source code ir hex.

ARM:0001, softas

Jau praėjo kelios dienos nuo pirmo bandymo. Iki tol aš net neieškojau softo, nes tikėjausi, kad gamintojas turi pilną free paketą. Deja aš klydau.
Teko biški pasukti galvą… Prie J-Link, kinai pridėjo warezų kompaktą, kuriame buvo Segger programinė įranga kuri dar dirba su mano padirbta hardware. Kiek supratau iš visokių forumų, naujausias softas jau žino, kad tai kiniškas reikalas ir užsilenkia. Todėl J-Linkas dirba su senu softu- versija tikriausiai ARM V4.64a.
Dar tame kompakte buvo crackai, serial generatoriai visokiems komerciniams ARM kompiliatoriams ir toolchainams. Buvo mintis tai daryti, bet kažkai užsimiršau aš apie tą kompaktą ir pradėjau guglinti. Keli rusiški forumai ir pats guglė išmetė tokį dalyką kaip YAGARTO, sprendžiant iš to, kad softas guli sourceforge, tai jis tikrai free. O last update stovi 2013-04-24 , tai vadinasi kažkas dar dirba su šiuo paketu. Ir dar gerai, kad šitas paketus turi kažkokį installerį kuris viską sumetą į windows kietą diską.
Tačiau tai plikas command line įrankis. Tačiau gal man tai ir patiko, nes man kiek nepatinka eclipsė (ypač prisiminus kaip ji gliučino ant seno kompo). Kaip gi tada tuom paketu naudotis? Ogi pas mane yra suinstaliuotas WinAVR paketus, kuriam buvo susiinstaliuotas “make” ir man jau įprastas “programmers notepad”. Vadinasi teoriškai “make” turi veikti. Nusikroviau “mirksiuko” projektą iš interneto. Ten rodos oficialus pavyzdinis projektas SAM7S64 procesoriukui.
Pasileidžiam make ir … vaje neranda mano gcc tinkamo. Reikia pakeisti biški makefile:

Iš:

# Define programs and commands.
SHELL = sh
CC = arm-elf-gcc
CPP = arm-elf-g++
OBJCOPY = arm-elf-objcopy
OBJDUMP = arm-elf-objdump
SIZE = arm-elf-size
NM = arm-elf-nm

Į:

# Define programs and commands.
SHELL = sh
CC = arm-none-eabi-gcc
CPP = arm-none-eabi-g++
OBJCOPY = arm-none-eabi-objcopy
OBJDUMP = arm-none-eabi-objdump
SIZE = arm-none-eabi-size
NM = arm-none-eabi-nm

Dabar padarius make, atsiranda hex failas. Valio.
Bet čia 64 kilobaitų procesoriukui. Maniškis šrotas turi kiek daugiau- 256kb.
Iš visokių oficialių ir neoficialių puslapių ir projektų susirankiojau reikalingus failus:

AT91SAM7S256-RAM.ld, AT91SAM7S256-ROM.ld, at91sam7s256.h, lib_AT91SAM7S256.h. Tuo tarpu Cstartup.S ir Cstartup_SAM7.c tiko iš mažesnio procesoriuko. Nu dar make file ir dar kažkur reikia pakeisti 64 į 256 failų ir MCU pavadinimuose. Ir mirksiukas vėl susikompiliavo.
O minėtą hex failą sumaitino J-Linkas į mikroschemą ir oscilografas parodė, kad tikrai kojos kaitaliojasi pagal mano norus. Tiesa ne iš karto.

Tai tiek buvo sugalvota per tuos du ar trys vakarus. Tiesa paskutinis vakaras buvo tūpai praleistas debuginant ir krapštant galą. Tiesiog ten kažkaip nesigavo ir manau tai aprašysiu sekančiam poste, kur busi minima pirma programa.

ARM:0000?

Viskas prasidėjo, kai mano labai labai senas pažįstamas vardu Edvardas paskambino ir be kitų šnekų pasiūlė “įdomių daikčiukų” paardymui. Tai buvo šie keisti USB gadžetai:

ARM
Tai yra siuntos monitoringo aparačiukai. Kiek supratau šitas aparačiukas monitorino tiktai temperatūrą. Įjungus į USB jis paprašė instaliuoti draiverius, tai toliau aš nevargau. Edvardas sakė, kad su specialia programa sugeneruojamas Excel failas su temperatūros grafiku.
Continue reading →

AVR 43: knyga, liion, led, laikrodis…

Čia tokia kompiliacija. Kažkada dariau rezervinį USB pakrovėją kurį galima maitinti kad ir iš saulės elementų, poto kažkada rašiau apie labai gražius LED indikatorius ir daug kartų rašiau apie savo universalią ATMEGA plokštę.
Kadangi nelabai kaip man ir reikia to rezervinio šaltinio, nutariau viską sujungti į vieną vietą. Ir dar pridėjau biškutį…

Viskas prasidėjo nuo to, kad pastebėjau, kad jei blogai miegu, tai atsibundu kažkodėl lygiom valandom. Tai buvo labai keistas reikalas. Arba ufonautai įsiuvo į mano galvą kokį RTC su batareika, arba veikė kažkoks išorinis reiškinys. Blaivesne galvą pagalvojus dašuto, kad tas išorinis reiškinys yra … didelis LED laikrodis. Jis kiekvieną valandą pradeda su nedidele animacija kol persivartalioja visi skaičiai. Tos šviesos mirgėjimo matyt užtenka, kad smegenys užfiksuotu ir prabudintu. Juolab, kad raudona spalva gana lengvai praeina ir per užmerktus vokus. Teko laikrodį pašalinti.
Bet reikia gi laikrodžio. Todėl tarp Eridano knygų, savadarbėse lentynose atsirado kažkokia ne knyga:
RED LED clock mini
(dizainas dar nebaigtas, reikia padažyti ir dar apsaugines plėveles nuplėšti)
Continue reading →