Posts: 1.853
Threads: 25
Joined: Nov 2013
Reputation:
790
Pogledaj ovde imaš alat koji će ti olakšati celu postavku:
http://www.st.com/en/development-tools/stm32cubemx.html
Ovde su HAL biblioteke za sve STM32 mikrokontrolere:
http://www.st.com/en/embedded-software/s...tId=LN1897
Posts: 8.743
Threads: 138
Joined: Apr 2013
Reputation:
3.629
Nebojsa je objasnio kako to uraditi sa tajmerima, evo jos jedan primer blinkanja LED ali bez upotrebe tajmera i blokirajucih petlji:
Code: void loop() {
//some counter
cnt++;
if (cnt > 65535) {
cnt = 0;
toggleLED();
}
//ostatak programa ...
}
Primer je abstraktan (za Arduino) ali samo da pokazem koncept.
Dakle u glavnoj petlji koja vrti nas progam imamo jedan brojac koji inkrementujemo svaki put kada program tu prodje, kada se stigne do 65536 program tu promenljivu vraca na 0.
U tom trenutlu kada smo stigli do max vrednosti se izvrsi toggleLED() funkcija (pali/gasi LED), nema blokirajuceg code-a, nista se ne ceka jednostavno svaki 65636-ti put prolaza toglujemo LED.
Bas za takve stvari postoji SysTick tajmer i na slican nacin se koristi, stim sto je on vezan bas za interne tajmere a u primeru sam vezao na prolaze petlje.
Moj primer ima dve osobine, jedna je da nije blokirajuci code a druga je da ce frekvencija blinkanja zavisiti od ostalog opterecenja procesora i funkcija tako da moze da daje nekakvu indikaciju koliko smo vremena potrosili u glavnoj petlji. Ako se zahteva striktno frekventno blinkanje onda mora da se koriste tajmeri ili PWM modul.
Posts: 8.743
Threads: 138
Joined: Apr 2013
Reputation:
3.629
03-05-2017, 02:21 PM
(This post was last modified: 03-05-2017, 04:34 PM by mikikg.)
Ovaj primer sa LED sam iskoristio za step/dir<>pwm konverter, imao sam dve iste plocice i dve USB konekcije i uradio sam samo ovo u programu:
Code: if(MySerial.isConnected() && (MySerial.getDTR() || MySerial.getRTS())) {
//flash led faster if USBserial is connected
cnt++;cnt++;
}
Kada preko USB dobije signale za DTR ili RTS tj da je terminal prikljucen u glavnoj petlji sam samo ubrzao malo povecavanje cnt promenljive sto je dovelo da blinkanje bude brze i tako sam mogao da tamo u nekoj shumi kablova prepoznam na koju sam se plocicu ukacio
Na ovaj nacin se takodje dobije malo bolji utisak kako program radi (ili ako ne blinka znamo da je zaglavio), ako bi stavili toglovanje LED na svaki prolaz bilo bi prebrzo, videli bi samo neki osrednji intenzitet svetla od LED ali kada se podeli sa brojacem na neku vrednost oko 10Hz tacno se vidi sta je program uradio za taj jedan kratak blink (recimo prosao 20.000 puta kroz loop kada se saberu svi oni ++).
Dok tako blinka u sustini je sve OK, 20.000 nasih operacija u petlji u sekundi je vise nego dovoljno za sve moguce potrebe logike.
Medjutim, ako stavimo LCD 2x16 u tu petlju i pratimo blinkanje ove LED, posle ukljucivanja uredjaja sledeci blink LED ce se desiti prekosutra
Sta to znaci, to znaci da je taj LCD pojeo neverovatno mnogo procesorskog vremena jer koristi delay() funkcije neophodne za komunikaciju sa tom relativno sporom periferijom i vise nema 20.000 prolaza kroz petlju u sekundi nego ako stignemo do 20-50 bice super
Mnogo je korisnije na primer potrositi to raspolozivo vreme na usrednjavanje prilikom A/D konverzije (oversampling) da dobijemo finije merenje i filtriranje od smetnji, manijacio sam se sa STM32F4 jednom prilikom i radio 8192x oversampling, dobijao sam merenje napona sa A/D jos malo pa kao kod Sanwa-e
Resenje je naravno da se ta LCD komunikacija prebaci na nekog drugog, bilo koriscenjem I2C prostih modula (sa PCF chipovima) sto je polovicno resenje ili koristiti jos jedan MCU koji je uvezan sa drasticno brzim komunikacijama poput SPI i gde mi iz nase glavne petlje brzinski mozemo da prenesemo poruku za LCD i da nastavimo dalje da izvrsavamo program a drugi MCU to lagano isprica LCD-u sta da crta! Naravno postoje dosta napredniji graficki moduli koji vecinu ovih problema resavaju.
Posts: 167
Threads: 6
Joined: Jul 2015
Reputation:
120
Ja sam gledao, da kada god sam mogao koristim "multitread principe" na bare metalu :
Sve funkcije koje trose puno vremena (npr neka I2C sw implementacija, ili taj smart LCD) sam pisao kao FSMasine, tako da ako moraju da cekaju 20mS, nece blokirati ostatak programa, vec ce x puta prolaziti kroz stanje masine X_WAIT_20MS npr... Problem se prebacuje na sinhronizaciju gomile FSMova (nekad ih imam > 20) ali negde mora da se zapne.
Posts: 1.853
Threads: 25
Joined: Nov 2013
Reputation:
790
@yugaja
Da, takva postavka je jedino moguća u kompleksnijim uređajima... protočnost, nikako drugačije.
Nikako da se rešim da krenem sa konkretnim RTOS-om kojih danas ima u free varijantama i prilično su dobri. Dosta se koristi recimo FreeRTOS, a i STM ga ima u svojim template-ovima kao podržan. Takođe ruski OSA, itd...
Inače, zanimljivo je da RTOS-ovi za profi namene koji su komercijalnog tipa mogu da koštaju 3000-4000$, a znam da su recimo QNX RTOS-ovi koštali svojevremeno i do 30000$
Posts: 167
Threads: 6
Joined: Jul 2015
Reputation:
120
Ma ista stvar i kod mene, sve se neckam da krenem, ali nikako da se sve sredi. Uvek je neka frka sa vremenom, a do sada sam nakupio funkcija i resenja pa je cesto dovoljno da se samo poslozi...
Ali kad vidim kako Miki resi problem sa arduinom npr, pomislim koji sam ja loodak sto sve radim iz nule..
Posts: 1.853
Threads: 25
Joined: Nov 2013
Reputation:
790
@yugaja
Da otvorimo neki klub, nas što radimo sve od nule
Posts: 1.157
Threads: 27
Joined: Oct 2014
Reputation:
313
Ne stajte mi na muku Ajde neko ko prodaje svoje uredjaje bazirane ne mikrokontrolerima pa da radi sve iznova (PCB, hardver, softver...). Ja to ne radim pa se opet zezam sa glupostima. Kao krenuo bih sa necim laksim sto moze brze da se odradi a onda zaglavim i zavrsim sa nekim PIC16.
Misljenja sam da neko kome cena mikrokontrolera nije presudna (radi manji broj uredjaja po projektu ili se igra kao ja) treba da odabere MCU ubicu sa svim I svacim na sebi I sve nadalje radi sa njim. Cak I kad je ocigledno overkill nema veze, guras taj MCU.
Posts: 8.743
Threads: 138
Joined: Apr 2013
Reputation:
3.629
03-06-2017, 02:54 PM
(This post was last modified: 03-06-2017, 03:37 PM by mikikg.)
Upravo isto zagovaram, mnogo je laksi razvoj, jos sa ovom Black Magic Probe sam prezadovoljan kako radi, recimo za dan sam iscukao program koji mi treba preko Arduino IDE, brzo se upucava program (merio, treba mu 2 sekunde od stiskanja upload dugmeta do resetovanog i spremnog MCU za rad!!!), brzo proveris, ne resetuje ti se terminal seriske veze, USB sam u novoj verziji zaobisao pa sam dobio dodatne memorije i procesorko vreme i isto zagovaram maksimalnu upotrebu HW modula, nista SOFT I2C/Serial i slicno, radi bolje i brze sve, zato i postoje ti moduli, A/D recimo kod STM32 je 12bitni i prilicno brz, uz osrednjavanje (bez DSP instrukcija) radi ko bombona ...
Ove Blue Pill STM32 plocice su toliko jeftine da mi se isplati da kupim na oglasima i odlemim MCU ako pravim custom PCB, lakse to nego da se mlatim sa uvoznicima i kupujem klot MCU, a cak ima i fora koju cu proveriti, kazu da ovi MCU imaju 128kB FLASH memorije umesto 64KB koliko bi trebao da ima po DS!
Jedino cekam da se kinezi izbace sa STM32F4 jeftinim plocicama poput 1Bitsy, meni jaci MCU od toga ne treba niti vise I/O, ako treba vise I/O stavim dve plocice, ako treba i jace od toga onda se ide na RPi ili Beagle Bone Black koje inace razmatram cak i za "bare metal" programiranje (tu cekam RPi i BBB podrsku za BMP koju su najavili):
https://www.kickstarter.com/projects/esd...g-arm-prog
Posts: 8.743
Threads: 138
Joined: Apr 2013
Reputation:
3.629
(03-06-2017, 11:31 AM)npejcic Wrote: Da, takva postavka je jedino moguća u kompleksnijim uređajima... protočnost, nikako drugačije.
Za "protocnost", sve ovo sa MCU je igracka kakvu protocnost moze da dobijes sa FPGA ili CPLD, samo zamisli da se ona nasa loop() ne izvrsava u hiljade i hiljade CLOCK taktova, nego u 1 ili 2 CLOCK takta, masivni paralelizam, to je prava stvar za extremno brzu logiku! Moze da se desi da ce mi trebati nesto tako jer cu imati potrebe za merenjem rastojanja preko ultra zvuka (neki specificni linearni davaci) pa cu morati da arbittriram vrlo precicno i sa vrlo kratkim porcijama vremena, FPGA/CPLD je "rodjen" za takve potrebe!
Posts: 433
Threads: 30
Joined: Sep 2014
Reputation:
71
03-06-2017, 04:21 PM
(This post was last modified: 03-06-2017, 04:24 PM by gigabyte091.)
Pločice su u Amsterdamu... sve je spremno samo se ona glavna stvar još čeka... Nego meni je frend koji ide na elektrotehniku jučer pokazivao MBED online IDE, čak smo našli i library da taj IDE može funkcionirati sa običnom pločicom, a ne nekom razvojnom pločom od ST-a (Jedino moraš imat ST-Link ) I moram priznat da to zgleda jako lijepo, ima dosta i primjera i više je na razini arduina. Jedini minus po meni je to što je online..
Miki kako si pločicu onu pretvorio u BMP ? imaš kakav tutorijal
Posts: 1.853
Threads: 25
Joined: Nov 2013
Reputation:
790
@gorankg
U pravu si apsolutno... ko može i ko radi manje količine nemoj da štedi na MCU-u.
Međutim, često viđam da su neki od početnika u zabludi da je dovoljno odabrati neki veoma moćan MCU i time rešiti problem "protočnosti"... Recimo koristim u jednom od projekata STM32F429 koji je svakako moćan, ali ako se kod zaglavi pri ispisu nekih stvari na displeju ili čekajući neku periferiju ostatak koda "trpi".
Zato često dosađujem da se Delay funkcije trebaju izbaciti iz koda kompletno ili svesti se na DelayUs (mikrosekunde).
@mikikg
Da, ali opet ponavljam, ako imamo recimo sledeće stvari koje opslužuje "običan" MCU: LAN konekcija, GSM modul, senzorika (temperature, vlažnost itd...), FLASH memorija za log, LCD prikaz, tasteri, I2C RTC i još par stvari pride za to nam ne treba FPGA/CPLD ali main petlja MORA biti dovoljo protočna. Nikako ne meriti recimo senzor temperature po principu pokreni merenje, čekaj da završi koristeći DelayMs(100) pa onda idemo dalje... Nego, sve mora kroz state-machine i onda proveravati recimo na 1ms da li je završen taj-i-taj task/periferija. Na taj način sve radi sekvencijalno i protočno da se ne oseća gomila taskova ili bilo kakvo kočenje.
Kod FPGA je latencija od ulaza do izlaza reda ns Ali nikako da se poigram sa tim. Kupio sam pre godinu dana neki razvojni sistem ali pored LEDice da vidim da li je ispravan nisam ni korak dalje napravio... nikako da nađem vremena.
Posts: 8.743
Threads: 138
Joined: Apr 2013
Reputation:
3.629
@gigabyte091
Pogledaj ovde za pocetak, ako imas nejasnoca otvori novu temu pa ce mo tu diskutovati:
http://www.elitesecurity.org/t494991-Bla...G-Debugger
Posts: 6.315
Threads: 56
Joined: Mar 2013
Reputation:
3.085
03-06-2017, 07:22 PM
(This post was last modified: 03-06-2017, 07:24 PM by Macola.)
Evo primera neke jednostavne, ekstra brze, stejt masine na prostom 8 bit MCU. Iskomentarisao sam edukativno.
Možda nekom bude korisno...
Code: /*
Neki X primer ekstra brze stejt masine za pogon automatskog ili poluautomatskog rada neke jednostavnije
masine za brizganje plasticnih proizvoda. Ispisuje se samo brojac komada na displeju. I to u nekriticnom
trenutku.
Van ispisivanja brojaca stejt masina je ekstremno brza.
Na nekim mestima mora da se utrpa delay kada je nuzno potrebno da se uspori, jer se sve vrti sa desetinama
ili stotinama KHz sa obicnim 8-bit MCU na 40MHz takta.
Sva potrebna vremena, bilo WDT ili neki drugi tajmer, obavljaju se brojanjem nekog od interrupt tickera.
*/
void autom_rad(void)
{
if(op_status==autom){
lcd_clear();
lcd_puts("AUTOMATSKI RAD");
}
if(op_status==poluautom){
lcd_clear();
lcd_puts("POLUAUTOM. RAD");
}
///////////////////////////////PREDUSLOVI/////////////////////////////////////////
seq_no=0; seq_jump=0; //prekondicioniranje sekvence u koju se prvi put "uskace"
////////////////////////////WHILE AUTOMATSKI////////////////////////////////////////////////////
while((op_status==autom)||(op_status==poluautom)&&(!exit_autom)){ //uslovi koji drze neki mod rada
switch(seq_no){ //switch funkcija koja arbitrira sekvencama
case 0: //cekaj korpu, u ovoj sekvenci se nuzno ceka korpa. Potrebno da se uspori.
if(pauto_flag){ //uslov za poluautomatski rad u svakom ciklusu, za automatki samo prvi put.
while((!korpa)&&(!err_no)){ //testiranje prethodnog stanja sigurnosne korpe i potencijalne greske
if(esc_test())err_no=err_n_aus;//u slucaju da je sve-stop
}
while((korpa)&&(!err_no)){ //uredno zatvaranje sigurnosne korpe
if(esc_test())err_no=err_n_aus;
}
delay_ms(10); //namerno usporenje
seq_jump=1; seq_no=1;//skoci u prvu sekvencu i namesti uslov za jednokratni dogadjaj
}
else{ //automatski rad, obnavljanje ciklusa bez uslova korpe
seq_jump=1; seq_no=1;
}
break;
case 1: //zatvori alat
if(seq_jump){ //jednokratni dogadjaj
if(!izb_je_naz){ //kontrola pocetne pozicije
if(!al_je_otv){//kontrola pocetne pozicije
sysp=1; zatv_alat=1; izbijac=0;//aktiviranje potrebnih hidraulicnih ventila
}
else err_no=err_alat;//setovanje greske i njeno markiranje za info na displeju
}
else err_no=err_izbij; //setovanje greske i njeno markiranje za info na displeju
timer=100; timeout=0; // navijanje WDT i start isr tajmera
seq_jump=0; //ne ponovi
}
else{ //vrti se superbrzo ovde dok se ne steknu uslovi za neku drugu sekvencu ili err
if(korpa)err_no=err_korpa; //test sigurnosne korpe, abort
if(esc_test())err_no=err_n_aus; //test sigurnosne sve-stop "pecurke",abort
if(timeout)err_no=err_alat; //istekao WDT, dakle fizicka prepreka kretanju alata, abort
if(!al_je_zatv){ //uspesno zatvoren alat, idi dalje. Senzori sa invert. logikom
seq_jump=1; seq_no=3;
}
if(!osiguranje){ //prepreka na kraju hoda alata. Idi na akciju osiguraj
seq_jump=1; seq_no=2;
}
}
break;
case 2: //osiguraj
if(seq_jump){//jednokratno
sysp=1; zatv_alat=0; otv_alat=1;//potrebni ventili
timer=50; timeout=0; //navijanje WDT za otvaranje u slucaju osiguranja
seq_jump=0; //ne ponovi
}
else{ //vrti se superbrzo ovde dok se ne steknu uslovi za neku drugu sekvencu ili err
if(korpa)err_no=err_korpa;
if(esc_test())err_no=err_n_aus;
if(timeout)err_no=err_alat;//prepreka u otvaranju
if(!al_je_otv){ //ok, vrati se na pocetak da bi se pokiusalo opet
seq_jump=0; seq_no=0;
err_no=err_osigur; //info err
}
}
break;
case 3: //zabravi sa XX tona ako je sve uspesno proslo
if(seq_jump){
timer=5; timeout=0; //ostaju ventili iz seq 1, sada je ovo obican tajmer
seq_jump=0;
}
else{
if(korpa)err_no=err_korpa;
if(esc_test())err_no=err_n_aus;
if(timeout){ seq_jump=1; seq_no=4; } //istekao tajmer, idi dalje
}
break;
case 4: //primakni AGREGAT
if(seq_jump){
sysp=1; agr_napred=1;
timer=100; timeout=0;
seq_jump=0;
}
else{
if(korpa)err_no=err_korpa;
if(esc_test())err_no=err_n_aus;
if(timeout)err_no=err_agreg;
if(!agr_je_napr){
seq_jump=1; seq_no=5;
}
}
break;
case 5: //ekstrudiranje
if(seq_jump){
if(timer=params.holder.wparam[t_ekstr]>0){ //ukoliko je neko zadao vreme, inace ne.
sysp=0; doziraj=1;
timer=params.holder.wparam[t_ekstr]; timeout=0; //navij tajmer na zadato vreme
seq_jump=0;
}
else{ seq_jump=1; seq_no=6; } //ako nije zadato vreme skoci ovde
}
else{ //inace se brzo vrti ovde dok se ne steknu uslovi za dalje
if(korpa)err_no=err_korpa;
if(esc_test())err_no=err_n_aus;
if(timeout){seq_jump=1; seq_no=6; }
}
break;
case 6: //brizgaj
if(seq_jump){
doziraj=0; brizgaj=1; sysp=1;
timer=300; timeout=0;
seq_jump=0;
}
else{
if(korpa)err_no=err_korpa;
if(esc_test())err_no=err_n_aus;
if(timeout)err_no=err_brizg; //ovde WDT
if(!naknadni){ seq_jump=1; seq_no=7; }
}
break;
case 7: //naknadni
if(seq_jump){
naknadni=1;
timer=params.holder.wparam[t_nakn]; timeout=0;
seq_jump=0;
}
else{
if(korpa)err_no=err_korpa;
if(esc_test())err_no=err_n_aus;
if(timeout){ //ovde samo tajmer i tako dalje bla bla
seq_jump=1; seq_no=8;
}
}
break;
case 8: //doziraj
if(seq_jump){
sysp=0; brizgaj=0; naknadni=0; doziraj=1;
timer=600; timeout=0;int_temp=0;
seq_jump=0;
}
else{
if(korpa)err_no=err_korpa;
if(esc_test())err_no=err_n_aus;
if(timeout)err_no=err_dozir;
if(kraj_doziranja){
doziraj=0;
seq_jump=1; seq_no=9;
}
}
break;
case 9: //vakuum
if(seq_jump){
if(timer=params.holder.wparam[t_vak]>0){
sysp=1; vakuum=1;
timer=params.holder.wparam[t_vak]; timeout=0;
seq_jump=0;
}
else{ seq_jump=1; seq_no=10; }
}
else{
if(korpa)err_no=err_korpa;
if(esc_test())err_no=err_n_aus;
if(timeout){ seq_jump=1; seq_no=10; }
}
break;
case 10: //hladi
if(seq_jump){
sysp=0; vakuum=0; zatv_alat=0;
timer=params.holder.wparam[t_hladj]; timeout=0;
seq_jump=0;
}
else{
if(korpa)err_no=err_korpa;
if(esc_test())err_no=err_n_aus;
if(timeout){seq_jump=1; seq_no=11; }
}
break;
case 11: //otvori alat
if(seq_jump){
sysp=1;zatv_alat=0; otv_alat=1;
timer=200; timeout=0;
seq_jump=0;
}
else{
if(korpa)err_no=err_korpa;
if(esc_test())err_no=err_n_aus;
if(timeout)err_no=err_alat;
if(!al_je_otv){
sysp=0; otv_alat=0;
seq_jump=1; seq_no=12;
}
}
break;
case 12: //IZBIJ
if(seq_jump){
flag_endizb=0;
delay_ms(100); //uspori sve dok opadnu pritisci
mp_izbij(); //spoljna funkcija visestrukog rada izbijaca
seq_jump=0;
}
else{
if(flag_endizb){ //spoljna funkcija obavila posao
seq_jump=1; seq_no=13;
}
}
break;
case 13://pauziraj i izbroj kom
if(seq_jump){ //jednokratno
sysp=0;
brojac_vars.cuvar_br.brojac_l++;
if(brojac_vars.cuvar_br.brojac_l>9999){
brojac_vars.cuvar_br.brojac_l=0;
brojac_vars.cuvar_br.brojac_h++;n++;//brojac sa 9 cifara + brojac za potencijalne neplatise
}
disp_brojac(); //pljucni ga jednokratno na displej
if(op_status==autom){
timer=timer=params.holder.wparam[t_pauze]; timeout=0;//navij pauzu ako je automatski
pauto_flag=0; //daj dozvolu za samostalno obnavljanje celog ciklusa
}
else {pauto_flag=1; timer=5; timeout=0; }//stavi uslov korpe za poluautom. i neku malenu pauzicu
seq_jump=0; //ne ponovi
}
else{ //vrti se ovde dok ne isteknu mala ili velika pauza, potom idi na pocetak
if(korpa)err_no=err_korpa;
if(esc_test())err_no=err_n_aus;
if(timeout){ seq_jump=0; seq_no=0; }
}
break;
} //////////////////end switch autom/////////////////////////////
if(err_no){ //err test u svakom prolazu (dosta KHz je u pitanju kad je bitno).
exit_autom=1; //ponisti uslov za auto ili poluauto
memo_brojac(PISI); //memorisi broj komada u EEPROM
op_status=bazni; //namesti status masine u bazni
if(err_no==err_n_aus)iskljuci_izlaze(urgent);
else iskljuci_izlaze(normal);
}
} //end while autom. rada
////////////////////////////////////////END WHILE AUTOMATSKI///////////////////////////////////
//vrati se odakle si i dosao, kao Lesi :-)
}
Posts: 6.315
Threads: 56
Joined: Mar 2013
Reputation:
3.085
To je jednostavan i vrlo brz način jer se koriste samo if else skretnice koje se obavljaju u jednom ili dva sistemska takta + ono što se dogodi u isr.
Zavisno od kompajlera while troši prilično taktova (mereno).
Brže može samo u Forth ili još brže u asm.
Posts: 6.315
Threads: 56
Joined: Mar 2013
Reputation:
3.085
Na isti način može da se napravi multitasking mašina, gde je jedna switch master stejt mašina a ostale switch drže pojedinačne taskove.
Vezne niti se obavljaju flagovima ili posmatranjem trenutnih sevenci pojedinačnih taskova, iz master switch.
Posts: 6.315
Threads: 56
Joined: Mar 2013
Reputation:
3.085
03-06-2017, 08:15 PM
(This post was last modified: 03-06-2017, 08:20 PM by Macola.)
Neki banalizovan primer jednostavnog i ekstremno brzog multitaskinga:
Code: //prekondicioniranje
master_seq=n_task; //pokreni zeljen task
master_jump=x; //obezbedi ili ne obezbedi jednokratan dogadjaj u masteru
err_no=0; //ponisti greske
while(uslov_bez_err){
switch(master_seq){ //master masina
case 0:
if(master_jump){ //jednokratni dogadjaj u master masini
task1_seq=start; //na primer startuj task 1
task1_jump=1; //na primer omoguci neki jednokratni dogadjaj u njemu
master_jump=0; //ne ponovi
}
else{ //vrti se jako brzo i cekaj potrebne taskove, potom arbitriraj sa njihovim rezultatima
if(task1_seq==end){ uradi_nesto; task1_seq=iddle; } //cekaj kraj 1. taska idi negde i
//prebaci ga na "ler"
if(taskX_seq==end){uradi_nesto_drugo; taskX_seq=iddle;} //cekaj neki drugi task mozda
}
break;
case n:
//... neka druga sekvenca master masine
break;
}
switch(task1_seq){ //jedan od taskova
case iddle:
//dogadjaji gde se ne radi nista ili nesto vezano za iddle stanje konkretnog taska
break;
case start: //poslat ovde iz master masine, kao start
//prekondicioniranje samostalnog taska
break;
case radi_nesto: //sam nesto obavlja
//nesto sto radi samostalni task1
break;
case end: //zavrsio ili obezbedio potrebne uslove
//ono sto treba kad se sve obavi i indikacija za master masinu koja "posmatra" task1_seq
break;
}
if(err){
//zajednicka obrada gresaka i abort potrebnih stvari
}
}
P.S.
Bare metal ili ti "plekano" pisanje, što bi rekle babe :-)
Posts: 556
Threads: 11
Joined: Apr 2014
Reputation:
150
03-07-2017, 03:09 PM
(This post was last modified: 03-07-2017, 03:11 PM by Milan94.)
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.
Posts: 1.244
Threads: 10
Joined: Apr 2015
Reputation:
509
(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.
Taj IC je obican I/O expander. Brzina se nikako ne povecava sa njim, vec se smanjuje, a dodatno se komplikuje program zbog dosta I2C transakcija. Najbrze je koristiti MCU sa gotovim drajverima za displej ili GPIO.
Posts: 8.743
Threads: 138
Joined: Apr 2013
Reputation:
3.629
03-07-2017, 03:23 PM
(This post was last modified: 03-07-2017, 03:25 PM by mikikg.)
Da upravo to, taj PCF je obican expander, i dalje sa njim mora da se ispostuje tajming za komunikaciju sa LCD, vec smo diskutovali oko toga, nema mnogo opcija, ili da se koristi delay() (najlosija opcija), ili koristiti neke multitasking cake ili RTOS ili najbolja opcija po meni je dodatan MCU koji bi bio uvezan sa SPI komunikacijom sa glavnim procesorom.
Sto se cene tice, taj PFC8574 kosta skoro ako ne i vise nego neki MCU!
PS: Ja sam mislio na standardne LCD module 2x16 karaktera, oni su spori ...
|