Posts: 167
Threads: 6
Joined: Jul 2015
Reputation:
120
(03-06-2017, 08:15 PM)Macola Wrote: Neki banalizovan primer jednostavnog i ekstremno brzog multitaskinga:
/*sklonio kod*/
P.S.
Bare metal ili ti "plekano" pisanje, što bi rekle babe :-)
Taj rad gosn Macola!!
Samo da dodam iz mog ugla, i na osnovu najskupljeg iskustva, cesto mi je problem bio da se prisetim sta sam pametno programirao pre x meseci kada je potrebno nesto cacnuti u kodu popraviti - promeniti. Zato se sada trudim da pisem sto deskirptivnije pa makar i na ustrb brzine iako je to protivno nekim iskonskim principima koji su me vodili. Msm majao sam se po asembleru ranije, ne znam ni sam sto, i koliko dugo...
Tako da npr drzim svaku FSM u strukturi gde su neka od polja: trenutno stanje, sledece stanje, brojac vremena trenutnog stanja, onda niz komandi (obicno svaka FSM tj da kazemo task u ovoj konotaciji. mi reaguje na evente: time update, start, stop, onda akoje u pitanju GUI to su razni buttoni, i sta god treba u opstem slucaju a zbog sinhronizacije masina neretko zafali da svaka ima svoj queue sa komandama upucenim ka njoj - zna da pomogne onoliko...) Sve to stoji u strukturi.
Onda samu funkciju podelim, pa po prioritetima na pocetku npr obradjujem vreme (switch- case struktura) pa iza toga nova switch -case struktura sa istim ponovljenim stanjima (neoptimalno, ali lepo za citanje i snalazenje posle mnogo vremena zaboravljanja) sa procesiranjem events-a, pa onda npr obrada gresaka..
I na kraju tranzicija i akcije na tranzicije: if (Fsm.currentState !=Fsm.nextState) { switch (Fsm.nextState)...}
Nek se kompajler snalazi ako hoce i zna da optimizuje; bitnije mi je da mogu ja da se snadjem, kazem, posle puno vremena provedenih u nekim drugim projektima i drugim kodovima.
Sad dal je ova realizacija milova ili murova to se zaboravilo i kad je trebalo da se zna nije se znalo verovatno; ja sam zapoceo kao (analogni) elektronicar :
Ali iskustveno ovo zavrsava 99% poslova.
Inace offtopic je ne? mozda bi vredelo da otvorimo neku novu temu radi razmene best practice...
Posts: 6.315
Threads: 56
Joined: Mar 2013
Reputation:
3.085
03-07-2017, 05:34 PM
(This post was last modified: 03-07-2017, 05:36 PM by Macola.)
(03-07-2017, 03:09 PM)Milan94 Wrote: Posto ste akcenat stavili na LCD displeje da zauzimaju dosta resursa kakvo je stanje ukoliko koristimo PFC8574 modul za komunikacuju sa lcd.
Konkretno mislim na ovaj modul da li upotrebom njega povecavamo brzinu komunikacije izmedju MCU i LCD.
Tu bi možda došlo u obzir nešto ovakvo sa gotovom SPI, koja je poprilično brza.
http://www.digikey.ch/products/en/optoel...ageSize=25
Tu cene znaju biti solidno "vruće" (od 25-39$ na priloženom linku) ali je super kada se nema vremena za pravljenje sopstvenog SPI adapterčeta sa nekim jevtinijim MCU i upotrebom običnog alfanumeričkog displeja od reda cene nekoliko do desetak eura...
Tu bi mogao da se napiše SPI adapterčić u na primer jevtinom:
http://store.comet.rs/rs/Search/?keyword...NTE4In0%3D
Taj je poprilicno jevtin i sa sve pcb bi dodao nekih 2-3eura na cenu običnog alfanumeričkog LCD
Može tu i neki sličan Atmel (sa kojima nikad nisam radio).Samo je bitno da ima hardverski SPI modul unutra.
Zašto baš SPI?
Zato što tipična transakcija od na primer 2 bajta (adresa, data) traje oko 7,5uS pri 10MHz SPI.
To nije ni malo loše i ne davi mnogo procesorsko vreme. I2C je neuporedivo sporija komunikacija i prednost joj je jedino što koristi samo dve aktivne žice...
Pozz
P.S.
Naravno, kod zahtevnih aplikacija se gleda da se LCD ne osvežava bespotrebno već samo kad je nužno potrebno. Onda bude vremena za puno ostalog.
Posts: 6.315
Threads: 56
Joined: Mar 2013
Reputation:
3.085
@yugaja,
Svakako drugar. Iz pisanja u asm se stiče izvesno iskustvo sa preciznim baratanjem vremenskim instancama.
Bukvalno se čitanjem koda može izračunati vreme događaja do jednog takta.
Sada većina ljudi "beži" ka visokim nivoima pisanja, a tu se za kratka vremena događaja mora staviti neka "mečka" od MCU koja je baš brza i jaka i ima dobre hardverske resurse oko isr.
Doduše retko kad i treba neka visoka brzina. Tek za neke aplikacije poput merne tehnike ili kontrola servo motora i slično tome, a tu već mnogo novih MCU ima napravljenu jaku hardversku podršku (enkoderi, PWMs, autonomni ADC sa hw osrednjavanjem i tako dalje).
Mnogi ljudi nemaju živaca da rade stvari od početka i onda upotrebe masivnu mašinu od MCU gde ima mnogo gotovih primera i samo se lepi kod kao "lego" kockice.
Ti mi nešto ličiš na tipove slične meni, koji vole stvari od početka da rade.
Tu je Forth tata, samo nisam imao dovoljno strpljenja pored najboljih učitelja :-(
Tu su stvari pod potpunom kontrolom do poslednjeg bita u memorijskoj mapi, na bilo kojoj lokaciji.
Napravi se lepo sopstvena biblioteka potrebnih stvari.Troši jedan put mnogo vremena ali posle se lako radi.
Da sam ponovo mlad i da imam više vremena, bacio bih se svom snagom na Forth. Ali nažalost...
Pozz
Posts: 1.244
Threads: 10
Joined: Apr 2015
Reputation:
509
Nekada davno kada sam krenuo da ulazim u svet mikrokontrolera (stari PIC16C54-JW - hard core za izmenu jednog bita) krenuo sam od asemblera i sazvakao ga skroz. Posle sam presao na PIC16C84 gde sam naucio sta je interapt i kako radi. Posle toga sam prosao dosta razlicitih MCU-ova i uvek sam malo radio i u ASM.
Misljenja sam da ko tek krece da se upoznaje sa MCU-ovima, MORA, ali MORA da prodje kroz ASM, jer samo tako moze da nauci kako procesor radi. U bilo kom visem programskom jeziku ne moze da nauci kako u dusu radi MCU. Primera radi: sabiranje i oduzimanje. U ASM se uvek vrsi ispitivanj zero ili carry flag-a. Jos je zesca manipulacija sa registrima koji se koriste i u main loop i u int, gde odredjene stvari moraju da se cuvaju na steku. Npr. MCS51 arhitektura ima hardverski implementirane PUSH i POP instrukcije, dok se kod PIC-a to moralo raditi softverski, pazljivim izborom instrukcija koje nemaju uticaj na statusni registar.
Drugi primer su sofverska kasnjenja. U ASM se tacno zna koliko traje koja instrukcija i koliko traje petlja, pa cak i petlja u petlji. Ja glavu odsecem ako neko zna koliko traje u C-u na PIC18Fxx koji radi na 24MHz jedan krug for petlje.
Koliko god ASM bio tezak, izuzetno se isplati jer znacajno povecava programersku moc. Cim se bolje poznaje rad jezgra same masine, uvek ce se pisati i optimalni programi.
Posts: 1.244
Threads: 10
Joined: Apr 2015
Reputation:
509
@Macola
Pre jedno 20 godina sam koristio Forth, ali nikada nisam bio ljubitelj. Vise sam isao ka ASM i C. To je jednostavno tako bilo.
Imam jedno pitanje, posto stalno hvalis Forth, narocito brzinu, brzi od C (ili je neko drugi na forumu to napisao), pa me interesuje kako? Npr. ako hocu u Forth-u da saberem dva broja, npr. 3 i 5, ja prvo moram 3 da stavim na stack, pa 5 na stack, pa onda da izvrsim sabiranje nad stekom, pa onda rezultat da preuzmem sa steka i smestim gde zelim. Ako se ovo pogleda u ASM, to je prilican broj instrukcija, pogotovo zbog manipulacije sa stekom.
U ASM su to dve instrukcije ili tri, zavisi od MCU-a. Forth bi bio brz na nekom stek orjentisanom procesoru. Znam da je Mladja napravio na FPGA FROG - FoRth OrGanized procesor, koji je bio hardverski organizovan za to. Koliko znam CISC, RISC i ARM arhitekture nisu stek organizovane i zbog toga ne moze nikada Forth da radi bolje od C-a.
Ovo je samo moje zapazanje, pa me interesuje tvoj komentar.
Hvala i pozdrav
Posts: 8.743
Threads: 138
Joined: Apr 2013
Reputation:
3.629
03-07-2017, 11:21 PM
(This post was last modified: 03-08-2017, 12:14 PM by mikikg.)
Sve vas razumem, i Macolu sto mu je drag Forth, i yugaja koji voli bare metal, i Nebojsu sa PIC-evima, Vojina sa ASM, manje vise sam prosao kroz sve to, ja samo kazem da je mnogo velika pomoc ako imaju dobre i proverene biblioteke, nebitno u kom obliku, dali kao sherovani objekti koji praktikuju MCP i ST, bilo kao Arduino sa svojom abstrakcijom, u sustini to sve dodje na isto, pa isto bi trebalo i da ispadne pisao ga ja najbolje sto znam u ASM ili to pisali MCP i ST, stim sto je kod MCP periferialni lib zatvorenog code-a, nema sourse, kod ostalih ima sourse ...
Mnooogooo je neko ulozio truda da te biblioteke skocka i debagira, ovo sa Arduinom je jedino dobra prica sto te biblioteke koristi mnooogo ljudi pa vrlo lako isplivaju bugovi i u neka doba se to popravi pa na kraju ispadne to sve solidno, ne perfektno ali to radi u sustini dobro.
Programerski sat za MCU platformu nije jeftin, posebno za pisanje u ASM (to je najskuplje), klienti traze jeftina i brza resenja koja njima zavrsavaju posao, njega bas briga u cemu je to pisano ako zadovoljava trazenu specifikaciju i ako to ne pravi probleme i ako je odrzivo na definisan vremenski period (recimo 5-10 godina, extremno je dinamicno trzisto pa sve to dodatno komplikuje pricu).
Ozbiljne SW firme imaju gomile programera, imaju razvijenu metodologiju pisanja programa, imaju posebne timove koji pisu programe i posebne koji ih testiraju, imaju internu organizaciju celog razvojnog ciklusa od ideje do finalnog proizvoda sa strogom kontrolom kvaliteta u svim fazama, ali to koooooostaaaa debelo, idite kod njih pitajte da vam urade neki program za MCU koliko ce to da kosta?
Za low-budzete ili start-up projekte je preskupo razvijati software u ASM, cak i bare-metal C/C++ je pitanje isplatljivosti, zato su isplivale sve ove razne platforme za programiranje koje drasticno ubrzavaju razvoj sto naravno ima i svoje lose strane ali koliko para toliko muzike
Evo nekoliko pitanja za sve vas, ko od vas koristi test paterne i test frejmworkove (UnitTesting i slicno) za testiranje SW-a u fazi razvoja?
Ko od vas koristi JTAG i Boundary scan za testiranje na nivou "ozicenja" na PCB?
Ko je od vas zadnji put angazovao security experte da analiziraju vasu aplikaciju?
Kada ste zadnji put pisali kernel module za neku od vasih periferija?
Skupa je to igranka ...
Kolege iz firme trebaju da rade neki glomazan ERP sistem, ljudi znate koliko je slozen jedan takav sistem i sta sve tu mora da se odradi da bi to profunkcionisalo kako treba, tu se ASM i C/C++ ne spominje ni u snovima, vise se isplati uzeti rack nakrcan sa najboljim serverima i pisati to sve u uzasno sporoj Javi (u embeded svetu ekvivaletno snaznom kontroleru sa relativno sporim ali stabilnim framework-om) ...
Ili raditi sa Big Data sistemima ...
Ja vam samo prenosim moje iskustvo od ASM za MCU do recimo SAP-a i Oracla i gde je neka "mera" za dobar code po pristupacnoj ceni ...
Posts: 6.315
Threads: 56
Joined: Mar 2013
Reputation:
3.085
03-07-2017, 11:38 PM
(This post was last modified: 03-07-2017, 11:47 PM by Macola.)
Vojče,
To mu dođe kao rasprava o tome da li je bolja "Zvezda" ili "Partizan". Oba načina pisanja imaju svoje mane i prednosti, tj. prednosti nekog od njih su vezane za problematiku koja se rešava.
Za razliku od C, kvalitet napisanog u Forth daleko više zavisi od veštine programera i njegove dovitljivosti. Kod C je tu manja razlika.
Kod sabiranja dva broja u C, od arhitekture MCU i kompajlera zavisi da li će biti optimizovan bliže ili dalje brzini ASM. Kod Forth je to tik iznad ASM sa vrlo poznatom brzinom događaja. Ne tvrdim da se sabiranje dva broja ne može brže izvršiti u C nego u forth, posebno na nepredisponiranoj arhitekturi (jer se najčešće kod običnih MCU za Forth stack koristi i pravi stack, ali takođe i RAM), ali na žalost, programiranje se (kao što odlično znaš i sam) ne sastoji samo od sabiranja dva broja. Uostalom, u oba načina pisanja (u C jeziku i u Forth metajeziku) mogu se kritične stvari napisati direktno u ASM, te se tu ne može dati prednost ni jednom od njih. Jednostavno na taj način će se dobiti isto.
Čim se odmakne malo dalje od led-blink, gde stvari postaju složenije, uz veću veštinu programera, stvari u Forth mogu postati dosta brže i moćnije u određenim segmentima programiranja.
Pre nego što je Mlađa napravio pravi stack procesor Frog1 (mislim da ima sada već Frog4 ili možda Frog5, pitaću ga), radili smo sa Philips LPC2136 ARM7 u koji je bio implementiran Forth. Čim problem bude samo malo složeniji od najprostijih operacija, Forth je (sa vrlo veštim Mlađom u pozadini) pokazivao popriličnu moć u odnosu na C.
Nisam toliko duboko u tome da bih eksplicitno tvrdio nešto oko mikro detalja koji čine te prednosti, ali mislim da velika snaga Forth, osim interaktivnog rada koji omogućava neuporedivo brži i direktniji - trenutni test koda, počiva na maltene neograničenom broju i magnitudi povratnih vrednosti iz jedne REČI (nalik funkciji u C, za one koji nisu radili sa Forth, ne za tebe jer si radio u njemu).
C može imati samo jednu povratnu vrednost, što ga malo linearizuje i oslabljuje mogućnost veštih prečica u pisanju.
Postaviću ovde jedno parčence Mlađinog koda, pisanog u Forth, koji je bio implementiran na ARM7 (emulirana stack mašina), gde se na primer neki korisnički meni rešava sa tako elegantnim budućim korišćenjem, na nekoj mašini slične namene, da ti pamet stane!
U C-u bi bila potrebna opaka "kobasica" koda za tako efikasan konačni način korišćenja, ili pozadinske biblioteke sa gomilčinom funkcija koje "pojedu" vrlo masivan memorijski prostor.
A znam da je ta vrlo složena mašina napisana cela u 10,5 kilobajta svega, sa sve tih jako udobnih menija. Pokrenuli smo je 2007. i naravno da znam koliko je resursa potrošeno.
Evo jednog komada Mlađinog koda u Forth, pa ću naknadno objasniti šta to radi.
Code: parmenu[
item text" Temperatura 1,400,øC" \ 200
item text" K1,10.00" \ 21.12
item text" I1,1000.0" \ 124.4
item text" D1,100.0" \ 31.4
item text" Temperatura 2,400,øC" \ 195
item text" K2,10.00" \ 4.13
item text" I2,1000.0" \ 1304.9
item text" D2,100.0" \ 329.6
item text" Temperatura 3,400,øC" \ 192
item text" K3,10.00" \ 4.13
item text" I3,1000.0" \ 1304.9
item text" D3,100.0" \ 329.6
item text" Temperatura 4,400,øC" \ 190
item text" K4,10.00" \ 4.13
item text" I4,1000.0" \ 1304.9
item text" D4,100.0" \ 329.6
item text" Temperatura 5,400,øC" \ 187
item text" K5,10.00" \ 4.13
item text" I5,1000.0" \ 1304.9
item text" D5,100.0" \ 329.6
item text" Start auto-podesavanja PID-a,1" \ 0
item text" Kanal auto-podesavanja PID-a,3" \ 0
item text" Snaga pri auto-podesavanju,100,%" \ 80
]parmenu tparams
Ovo je neki korisnički meni zadavanja parametara, gde se kao tastatura koristi pet tastera. Kao skrol tasteri se koriste "gore" i "dole", dok kao + i - tasteri "desno" i "levo" i jedan multifunkcionalni u sredini, nazovimo ga "srednji". Tim srednjim se ulazi u parmetre, potom istim napušta i automatski memoriše.
Struktura drži: parametre i njihove lokacije na osnovu teksta, up-down limite, smerove tastera, stil ispisivanja cifara (pozicija zapete i float - no float) .
Ono što je iza nekih linija koda, kao < /neki_tekst > su komentari gde je zapisano neko poslednje stanje auto tjuninga višestrukog PID za termoregulaciju na 5 grejnih zona.
Ono što briljira je da kada je potrebno napisati za neku drugu mašinu set parametara, dovoljno je napisati potrebnim redom i potrebnu količinu ovih < item text" tekst, broj, broj, tekst"> i automatski će biti definisano:
-potreban broj memorijskih lokacija,
-potrebnih veličina,
-njihov redosled,
-float.point ili ne,
-stil ispisivanja,
-down_limit i up_limit tih vrednosti,
-tekst koji ispisuje jedinice u kojima se izražava broj,
- sva potrebna povezanost sa automatskim memorisanjem i usisavanjem parametara iz EEPROM,
-sva povezanost sa tasterima koji inkrementuju ili dekrementuju konkretnu vrednost,
-sva povezanost sa displejem,
- i tako dalje i tako dalje...
Pokušaj tako elegantno u C.
Naravno, Mlađa je jedan, ali moraš priznati da će se to veoma teško napraviti u 10,5 KB koda u C.
Pri čemu treba da znaš da je u toj količini memorije cela mašina sa 4 merne letve, 5 PID regulatora, 10 ADC kanala, 8 servoventila, oko 30-tak diskretnih ventila i oko 15-tak diskretnih ulaza.
Kompletan kontrolni algoritam čitave mašine (koja vrlo složeno radi) izgleda ovako (u celih 356 linija koda):
Code: \ ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
\ º Kontrolni algoritam za brizgaljku tipa Roveta M.Veselic 13Mar07 º
\ ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
\ Uredjaj montiran 27mar07
\
\ ÉÍÍÍÍÍÍÍÍÍÍÍ»
\ º Parametri º
\ ÈÍÍÍÍÍÍÍÍÍÍͼ
parmenu[
item text" Vreme odlaganja briz.,30.0,sek" \ .5
item text" Pritisak brizganja,100,%" \ 80
item text" Vreme ekstrudiranja,100,sek" \ 0
item text" Brzina brizganja 1,100,%" \ 70
item text" Pozicija brizganja 2,320,mm" \ 140
item text" Brzina brizganja 2,100,%" \ 70
item text" Pozicija brizganja 3,320,mm" \ 120
item text" Brzina brizganja 3,100,%" \ 70
item text" Sigurnosno vreme brizganja,100,sek" \ 20
item text" Pozicija naknadnog p.,320,mm" \ 110
item text" Naknadni pritisak,100,%" \ 50
item text" Vreme naknadnog p.,100,sek" \ 3
]parmenu par-briz
parmenu[
item text" Pozicija doze,320,mm" \ 160
item text" Brzina doziranja,60,%" \ 60
item text" Pritisak doziranja,100,%" \ 20
item text" Stojeci pritisak,100,%" \ 0
item text" Pozicija vakuuma,320,mm" \ 175
item text" Pritisak vakuuma,100,%" \ 50
item text" Sigurnosno vreme doziranja,300,sek" \ 100
]parmenu par-doze
parmenu[
item text" Vreme odvajanja agregata,1.0,sek" \ .5
item text" Pritisak odvajanja agregata,50,%" \ 15
]parmenu par-agr-naz
parmenu[
item text" Pritisak prilazenja agregata,50,%" \ 2
]parmenu par-agr-nap
parmenu[
item text" Upotreba: 0=ne 1=da,1"
item text" Pritisak levih kernova,100,%"
item text" Brzina levih kernova,100,%"
item text" Sklapanje: 0=pre 1=posle zatv.,1"
item text" Rasklapanje: 0=pre 1=posle otv.,1"
]parmenu par-ker-left
parmenu[
item text" Upotreba: 0=ne 1=da,1"
item text" Pritisak desnih kernova,100,%"
item text" Brzina desnih kernova,100,%"
item text" Sklapanje: 0=pre 1=posle zatv.,1"
item text" Rasklapanje: 0=pre 1=posle otv.,1"
]parmenu par-ker-right
parmenu[
item text" Pozicija izb. napred,300,mm" \ 180
item text" Pritisak izb. napred,100,%" \ 2
item text" Broj izbijanja,5" \ 2
]parmenu par-izb-right
parmenu[
item text" Pozicija izb. nazad,300,mm" \ 100
item text" Pritisak izb. nazad,100,%" \ 10
item text" Vreme vazduha 2,10,sek" \ 2
item text" Sigurnosno vreme izbijanja,100,sek" \ 10
]parmenu par-izb-left
parmenu[
item text" Pritisak odbravljivanja,100,%" \ 50
item text" Brzina otvaranja 1,50,%" \ 27
item text" Pozicija otvaranja 2,750" \ 200
item text" Brzina otvaranja 2,50,%" \ 35
item text" Pozicija otvaranja 3,750" \ 500
item text" Brzina otvaranja 3,50,%" \ 23
item text" Pozicija max otvoren,750" \ 600
item text" Sigurnosno vreme otvaranja,100,sek" \ 15
item text" Vreme pauze,10,sek" \ 2
item text" Vreme hladjenja,300,sek" \ 10
item text" Br. ciklusa do podmazivanja,1000" \ 10
]parmenu par-alat-left
parmenu[
item text" Pritisak hoda alata,100,%" \ 35
item text" Brzina zatvaranja 1,50,%" \ 25
item text" Pozicija zatvaranja 2,750" \ 450
item text" Brzina zatvaranja 2,50,%" \ 30
item text" Pozicija zatvaranja 3,750" \ 250
item text" Brzina zatvaranja 3,50,%" \ 22
item text" Sigurnosno vreme zatvaranja,100,sek" \ 15
item text" Pozicija osiguranja,750" \ 200
item text" Pritisak osiguranja,50,%" \ 25
item text" Brzina osiguranja,50,%" \ 24
item text" Sigurnosno vreme osiguranja,100,sek" \ 10
item text" Pozicija bravljenja,750" \ 125
item text" Pritisak bravljenja,100,%" \ 60
item text" Brzina bravljenja,50,%" \ 25
item text" Pozicija zabravljen,100" \ 28
]parmenu par-alat-right
parmenu[
item text" Pritisak podesavanja alata,100,%" \ 50
item text" Brzina podesavanja alata,50,%" \ 20
item text" Pritisak podesavanja sneke,100,%" \ 80
item text" Brzina podesavanja sneke,100,%" \ 70
item text" Pritisak podesavanja izb.,50,%" \ 20
]parmenu par-pod
parmenu[
item text" Temperatura 1,400,øC" \ 200
item text" K1,10.00" \ 21.12
item text" I1,1000.0" \ 124.4
item text" D1,100.0" \ 31.4
item text" Temperatura 2,400,øC" \ 195
item text" K2,10.00" \ 4.13
item text" I2,1000.0" \ 1304.9
item text" D2,100.0" \ 329.6
item text" Temperatura 3,400,øC" \ 192
item text" K3,10.00" \ 4.13
item text" I3,1000.0" \ 1304.9
item text" D3,100.0" \ 329.6
item text" Temperatura 4,400,øC" \ 190
item text" K4,10.00" \ 4.13
item text" I4,1000.0" \ 1304.9
item text" D4,100.0" \ 329.6
item text" Temperatura 5,400,øC" \ 187
item text" K5,10.00" \ 4.13
item text" I5,1000.0" \ 1304.9
item text" D5,100.0" \ 329.6
item text" Start auto-podesavanja PID-a,1" \ 0
item text" Kanal auto-podesavanja PID-a,3" \ 0
item text" Snaga pri auto-podesavanju,100,%" \ 80
]parmenu tparams
menu[
action par-briz text" <-sneka/brizganje ->"
action par-doze text" <-sneka/doziranje ->"
]menu m-sneke
menu[
action par-agr-nap text" <-agregat/napred ->"
action par-agr-naz text" <-agregat/nazad ->"
]menu m-agreg
menu[
action par-ker-left text" <-kern/levi ->"
action par-ker-right text" <-kern/desni ->"
]menu m-kerna
menu[
action par-izb-right text" <-izbijaci/napred ->"
action par-izb-left text" <-izbijaci/nazad ->"
]menu m-izbij
menu[
action par-alat-right text" <-alat/zatvaranje ->"
action par-alat-left text" <-alat/otvaranje ->"
]menu m-alata
menu[
action m-sneke text" <-Param. sneke ->"
action m-agreg text" <-Param. agregata ->"
action m-kerna text" <-Param. kernova ->"
action m-izbij text" <-Param. izbijaca ->"
action m-alata text" <-Param. alata ->"
action par-pod text" <-Param. meh. pod. ->"
]menu par-menu
endmenu[
action mp-korpa text" <-L Korpa D->"
action mp-alat text" <-L Hod alata D->"
action mp-brav text" <-L Bravljenje D->"
action mp-agr text" <-L Hod agregata D->"
action mp-b/d text" <-Brizgaj Doziraj->"
action mp-vak text" Vakuum->"
action mp-span text" Dozvola spanovanja->"
action mp-cp text" Podmazi->"
action mp-grej text" <-Is Grejanje Uk->"
action mp-vazd text" Vazduh->"
action mp-izb text" <-L Hod izbijaca D->"
]endmenu mpod
endmenu[
action mp-korpa text" <-L Korpa D->"
action rr-alat text" <-L Hod alata D->"
action rr-agr text" <-L Hod agreg. D->"
action rr-b/d text" <-Brizgaj Doziraj->"
action rr-izb text" Izbij->"
]endmenu mrucno
\ ---------------------------------------------------- Auto RAD
variable parent-adr variable brojkom variable cbroj
: zatvori-korpu
int? if inputs then
auto-rad @ korpa? and if exit then
0 #6 lcdxy s" Korpa!->" lcdtype
begin
pause
esc-key? if gesc throw then
right-key?
until
1 korpa outputs
['] timeout #10 [s] s-tmr
begin
pause int? if inputs then
esc-key? if gesc throw then
timeout? if gkorp throw then
korpa?
until p-tmr
#6 lcdclrn
;
: prikazikom
#0 #5 lcdxy s" Br.kom.=" lcdtype brojkom @ 76h lcd.
;
: izbrojkom
brojkom @ #100000 >= if 0 brojkom ! else 1 brojkom +! prikazikom then
;
: ohladi
['] timeout vr.hladj @ [s] s-tmr
begin
pause
esc-key? if gesc throw then
timeout?
until p-tmr
;
: izbijaj
n.izb @ 0= if exit then
n.izb @ 0 do izbij loop
;
: pauziraj
pauto-rad @ if exit then
['] timeout vr.pauze @ [s] s-tmr
begin
pause
esc-key? if gesc throw then
timeout?
until p-tmr
;
: podmazi
cbroj @ br.cp @ < if 1 cbroj +! exit then
0 cbroj ! 1 cpodmazi outputs
['] timeout #10 [s] s-tmr
begin
pause int? if inputs then
esc-key? if gesc throw then
timeout? if gcp throw then
ppodmaz?
until p-tmr
['] timeout #5 [s] s-tmr
begin
esc-key? if gesc throw then
timeout?
until p-tmr
0 cpodmazi outputs
;
: auto-seq ( -- )
zatvori-korpu
alat-pos po.motv.al @ < if galat throw then
prikazikom
right-alat
left-agr
#1000 ms
rrbriz
#500 ms
rrdozi
right-agr
ohladi
left-alat
pauto-rad @ if 0 korpa outputs then
izbijaj
izbrojkom
pauziraj
podmazi
;
: disp-pa ( -- )
menuclr #0 #7 lcdxy s" Poluautomatski rad" lcdtype
;
: disp-a ( -- )
menuclr #0 #7 lcdxy s" Automatski rad" lcdtype
;
: pauto ( key parent-adress -- )
nip parent-adr ! true pauto-rad !
disp-pa wreleased #5 lcdclrn
begin
['] auto-seq catch do-errors pauto-rad @ not
until
parent-adr @ menu-repaint
;
: auto ( key parent-adress -- )
nip parent-adr ! true auto-rad !
disp-a wreleased #5 lcdclrn
begin
['] auto-seq catch do-errors auto-rad @ not
until
parent-adr @ menu-repaint
;
menu[
action par-menu text" Parametri masine ->"
action tparams text" Parametri t. reg. ->"
action mpod text" Mehanicka podes. ->"
action mrucno text" Rucni rad ->"
action pauto text" Poluauto. rad ->"
action auto text" Automatski rad ->"
]menu menu
task ui
: startui
0 0 menu restore-params spbinit outputs inputs pwminit 0 pwm1 0 pwm2 0 pwm3 0 pwm4
ui start: begin kp dup nokey <> if 0 menu else drop then again
;
\ -------------------------------------------------------------------------------- APID
variable at-active variable oldtb
: ats ( -- )
at-active @ not if true at-active ! pd @ ptemp pautoch @ atinit mpwminit then
;
: atp ( -- )
at-active @ if false at-active ! atcls then
;
: pidinit ( -- )
ptemp par> pautop @ 0<> if ats else atp then
;
: do-at ( -- )
newch @ auto-ch @ =
if newch @ results f@ auto-tune 0<>
if false at-active ! atcls 0 pautop ! then newch @ pwmouts !
then
;
: newsample? ( -- t|f )
newres @ if newch @ channels < if false newres ! true then
else false
then
;
: report ( -- )
oldtb @ #8 = 10tb @ 9 = and if pidinit check-h then
10tb @ oldtb !
;
task pid
: startpid ( -- )
pid start:
decimal pidinit 4 places !
begin
negrej @ not if
newsample? if at-active @ if do-at else pidctr then then
report
else mpwminit then
pause
again
;
: run startad startui startpid startpots ;
\ ' run turnkey
run
Kompaktnost je savršena i za neku drugu sličnu mašinu se veoma malo toga menja.
Tako to izgleda kada se piše u Forth i kada to radi Mlađa (2007. a može se zamisliti šta sada radi jer i dalje koristi Forth).
Pozdrav Vojče
P.S.
Znam da se Mlađa neće ljutiti što sam postavio deo koda koji je u njegovom intelektualnom vlasništvu. Razumeće da je u edukativne svrhe.
Posts: 8.743
Threads: 138
Joined: Apr 2013
Reputation:
3.629
Posts: 1.853
Threads: 25
Joined: Nov 2013
Reputation:
790
Posts: 8.743
Threads: 138
Joined: Apr 2013
Reputation:
3.629
Samo da vam javim da ovaj STM32duino sa BMP kombinacijom radi predobro!
Probao sam i na nesto boljim PC (i7), Arduino IDE odradi kompajliranje programa i upload istog u kontroler za 1 sekundu, nesto sto je nezamisljivo sa npr MplabX i PicKit3/IDC3 koji to rade oko 10-ak sekundi i usput se zaglupe svaki 4-5 put kada se uploduje program!
Posts: 8.743
Threads: 138
Joined: Apr 2013
Reputation:
3.629
03-10-2017, 10:19 AM
(This post was last modified: 03-10-2017, 11:14 AM by mikikg.)
Inace kada se malo dublje zadje u Arduino IDE, videcete da je ostavljena potpuna sloboda da se po programu pise sta hocete, nije moranje da se koriste predefinisane Arduino funkcije, moze da se u sred programa direktno pistupi nekim registrima koristeci low-level C/C++ funkcije ili ASM ako imate potrebe. Takodje sve je tu sto treba i sto je podrzano sa GCC kompajlerima, #define, #pragma i ostali macroi i direktive samih kompajlera.
Arduino IDE i cela ta postavka daje ogromnu pomoc recimo oko inicializacije periferija, to se svodi na jednu funkciju sa par argumenata.
Kada se te funkcije pogledaju kako su inace napisane, napisane su upravo onako kako mora da budu napisane i kako stoji u svim ST-ov primerima, vezi clock, izaberi bus itd, i inace se te funkcije uglavnom jednokratno pozivaju prilikom startovanja programa tako da se brzina njihovog izvrsavanja bukvalno uopste ne razlikuje u poredjenju sa pisanjem svega toga na neki treci nacin ...
Ostale logicke funkcije, If, Then, While i ostale se prevode 1:1, nema nikakav overhead preko toga.
Setup() i Loop() funkcije videcete da su ustvari placeholderi koji se prilikom kompajliranja (tacnije pre samog kompajliranja, pre-procesor) samo umetnu u standardnu Main(), vrlo vrlo je mali overhead preko toga ako ga uopste ima.
Posts: 433
Threads: 30
Joined: Sep 2014
Reputation:
71
Napokon je došao blue pill prvi program sam napisao u arduinu, sada sam probao dobit iščitanje na serijski port, spojio sam usb na ttl konverter, rxd led svijetli na njemu ali arduino serial monitor baca random karaktere... I ima li kakav library za SSD1306 OLED ekrane da ga upogonim
Posts: 1.108
Threads: 17
Joined: Jul 2015
Reputation:
550
07-13-2017, 04:49 PM
(This post was last modified: 07-13-2017, 05:45 PM by progster.)
Da li vredi da se pišu biblioteke za periferije od 0, u cilju boljeg razumevanja rada periferije (da zanemarimo optimizaciju veličine programa itd.)?
Konkretno (radim sa Blue Pill), u Keil IDE, ja sam krenuo sa tim da uvezem stm32f10x.h, CMSIS Core, da ne bih ručno morao memorijske lokacije da određujem, i onda krenuo prema reference manual-u i po ugledu na njihov .h fajl da pišem definicije i funkcije za inicijalizaciju pinova itd. Znači direktno baratam raspoloživim registrima u periferiji i čitam/menjam sadržaj. A to da bih kasnije mogao da ih koristim kao gotove funkcije, i da ne moram iz main-a da pristupam direktno registrima i radim sa bitskim operacijama, već samo pozovem svoju funkciju. Znači bukvalno implementiram svoju biblioteku, samo na svoj način.
Verovatno mnogi misle da je to Sizifov posao, ja probao na početku da radim sa CubeMX, super je to, dodele se pinovi, periferije, on generiše sve što treba, samo se popuni kod, ali mi se to ne sviđa, ne tera me da zađem dublje u arhitekturu mikrokontrolera. Naravno, mogu ja to da pročitam kad mi zatreba, ali mislim da se mnogo bolje uči kad to prođe kroz ruke. Kasnije mogu opušteno da pređem na gotove biblioteke ako bude potrebno, mislim da će tranzicija biti mnogo lakša.
Šta mislite?
Posts: 8.743
Threads: 138
Joined: Apr 2013
Reputation:
3.629
07-13-2017, 06:37 PM
(This post was last modified: 07-13-2017, 06:42 PM by mikikg.)
@progster
Pogledaj ovo, mozda ti posluzi, to su korisnicke biblioteke za ST32F4 bez HAL i CMSIS, ne znam da li ih ima za druge MCU, probao sam ih svojevremeno i dobro rade ...
https://stm32f4-discovery.net/2014/05/al...one-place/
Moze da ti posluze kao primeri kako se treba to odraditi a verovatno i gro code-a mozes iskoristiti ...
Posts: 6.315
Threads: 56
Joined: Mar 2013
Reputation:
3.085
(07-13-2017, 04:49 PM)progster Wrote: Da li vredi da se pišu biblioteke za periferije od 0, u cilju boljeg razumevanja rada periferije (da zanemarimo optimizaciju veličine programa itd.)?
Konkretno (radim sa Blue Pill), u Keil IDE, ja sam krenuo sa tim da uvezem stm32f10x.h, CMSIS Core, da ne bih ručno morao memorijske lokacije da određujem, i onda krenuo prema reference manual-u i po ugledu na njihov .h fajl da pišem definicije i funkcije za inicijalizaciju pinova itd. Znači direktno baratam raspoloživim registrima u periferiji i čitam/menjam sadržaj. A to da bih kasnije mogao da ih koristim kao gotove funkcije, i da ne moram iz main-a da pristupam direktno registrima i radim sa bitskim operacijama, već samo pozovem svoju funkciju. Znači bukvalno implementiram svoju biblioteku, samo na svoj način.
Verovatno mnogi misle da je to Sizifov posao, ja probao na početku da radim sa CubeMX, super je to, dodele se pinovi, periferije, on generiše sve što treba, samo se popuni kod, ali mi se to ne sviđa, ne tera me da zađem dublje u arhitekturu mikrokontrolera. Naravno, mogu ja to da pročitam kad mi zatreba, ali mislim da se mnogo bolje uči kad to prođe kroz ruke. Kasnije mogu opušteno da pređem na gotove biblioteke ako bude potrebno, mislim da će tranzicija biti mnogo lakša.
Šta mislite?
Moj čovek!
Definitivno mi se najviše sviđa takva kontrola. Upravo se patim sa odvratnim HAL bibliotekama, da bih polako stigao do surovog bare metal za koji ti ponajviše treba samo stm32f1xx.h
Nego, čak i ovaj maleni blue pill je "mečka" za 8 bit mcu i neuporedivo mu je veći broj registara i daleko složenije mogućnosti periferija.
Kada dovoljno razgazim nizak nivo, Cube i dalje može poslužiti kao dobra alatka za pregled zauzetosti nekih periferija i pinova. Ipak je koristan alat. Skoro sam nešto razgovarao sa Bogdanom Kecmanom (naš član) i poslao mi je ovaj link o HAL lib. :-)
https://www.ipetitions.com/petition/SPLReinstatement
Vidim da ćemo lešo sarađivati sa novim iskustvima ovde. Već sam imao prvi problem oko uart1 na blue pill. Kada radi u ISR zakuca se posle oko 1.5mS, bez obzira na baudrate. Uart2 i 3 to ne rade. Verovatno ja negde grešim mada je to sve fino izgenerisao Cube :-). Probao sam u Keil5, U AC6(sw4stm32 pod eclipse), CoIDE V2 beta, sa hal lib, sa cmsis lib, sa ETR lib, a usart1 zakucava li zakucava. 5 dana se bakćem sa njim. Usart2 i 3 rade u bilo čemu od tog. Nešto verujem da je to blisko povezano sa nekim timeout koji je skriven negde a povezan sa proširenim pogućnostima uart1: LIN, CAN, DMA, IrDa, i još pun k.. toga...
Lepo ćemo izgleda ovde sarađivati.
Evo jednog linka kao to radi neki lik na niskom nivou:
http://en.radzio.dxp.pl/stm32vldiscovery/
Pozz
Posts: 1.108
Threads: 17
Joined: Jul 2015
Reputation:
550
@Miki
Hvala, ovo će dosta pomoći oko okvira za pisanje, a i može dosta stvari da se iskoristi.
@Macola
Drago mi je da delimo isto mišljenje. Meni je ovaj STM32 prvi MCU, ranije sam jedino malo radio sa Arduino, ali sam sad rešio da idem malo dublje. Motivacija mi je bila da napravim frequency counter/generator funkcija sa AD9850, verovatno da bih mogao da jednostavno iskopiram kod, ali hoću da izučim ovaj STM32 "u dušu", pošto su meni ovo uglavnom španska sela. I ja mislim da Cube može dosta da pomogne, ali kad stignem do ozbiljnijih projekata, trenutko ga koristim da vidim šta sve generiše, i šta je sve potrebno da se pokrene nešto. Planirao sam da idem periferiju po periferiju, da izučavam, i pišem biblioteku.
Za UART1 nemam pojma, teško da ja tu mogu da pomognem, ali možda ima ko može.
Hvala na linkovima. Pozdrav.
Posts: 1.244
Threads: 10
Joined: Apr 2015
Reputation:
509
@Macola
Maki, koju verziju CubeMX-a koristis? Pogledaj da li je posledjna i uradi update ako nije. Ja sam imao problem sa eksternim kristalom i nasao gresku u HAL-u. Svaki put kada mi CubeMX izgenerise kod, prebrise moji dodatak na HAL.
Sto se tice licnih podesavanja, uvek sam za to. Pre 5 godina sam radio sa Stellaris-om. Sve sam rucno podesavao. Tada naucis sta stvarno znace 32bita i kompletnu arhitekturu mcu-a. Kao sto Macola rece, CubeMX je izuzetan alat za projektovanje seme i stampe jer direktno kaze gde se sta povezuje. Kod koji napravi ne tera programera da poznaje arhitekturu.
Posts: 1.108
Threads: 17
Joined: Jul 2015
Reputation:
550
Imam jedno jako glupo pitanje, nešto me zeza a ne vidim šta, do danas radilo sve kako treba, a sad neće:
Code: int main() {
//enable clock GPIOB & GPIOC
RCC->APB2ENR |= ((1<<4) | (1<<3));
//initialize GPIOC_pin13 as OUTPUT PP at 2MHZ
GPIOC->CRH |= ((1<<21));
GPIOC->CRH &= ~(1<<20);
GPIOC->CRH &= ~((1<<22) | (1<<23));
while(1) {
GPIOC->BSRR = (1<<13);
}
}
Znači običan kod koji treba da upali LED na PC13 (integrisan na Blue Pill). Postavio pinove na izlaz, push-pull, 2Mhz, ali mi kolo radi invertovano. Za ovaj while(1), dioda ne svetli, a kada se umesto 1<<13 stavi 1<<29, dioda svetli. Šta je problem?
Ja sam ubeđen da je ovo radilo kako treba juče, zar ne bi trebalo da se u prvih 16bit setuje vrednost, a u drugi 16 vrši reset?
Evo isečka iz reference manual-a vezanog za CRH:
A evo i BSRR:
Posts: 556
Threads: 11
Joined: Apr 2014
Reputation:
150
Na tim Blue Pill plocicama sam primetio da dioda svetli samo u slucaju kada je pin PC13 postavljen na logickoj nuli a ukoliko je postavljen na 1 dioda je ugasena.
Posts: 1.108
Threads: 17
Joined: Jul 2015
Reputation:
550
Hvala Milane, ispostavilo se da je to.
Znam da sam juče celog dana testirao biblioteku sa LED, i sve je radilo, danas me mrzelo da povezujem eksterni LED i reko da probam sa ovom njigovom, kad ono ništa ne radi kako treba. Sad povežem LED ono radi, tako da je to bio problem. Hvala.
|