Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
STM32 generic board
#41
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
Reply
#42
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.
Reply
#43
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 Smile

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 Big Grin
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 Smile
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 Smile
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.
Reply
#44
Ja sam gledao, da kada god sam mogao koristim "multitread principe" na bare metalu :Smile  

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.
Reply
#45
@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$ Smile
Reply
#46
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..
Reply
#47
@yugaja
Smile Da otvorimo neki klub, nas što radimo sve od nule Smile
Reply
#48
Ne stajte mi na muku Confused  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.
Reply
#49
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
Reply
#50
(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!
Reply
#51
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 Big Grin) 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
Reply
#52
@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 Smile Smile 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.
Reply
#53
@gigabyte091
Pogledaj ovde za pocetak, ako imas nejasnoca otvori novu temu pa ce mo tu diskutovati:
http://www.elitesecurity.org/t494991-Bla...G-Debugger
Reply
#54
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 :-)
}
Reply
#55
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.
Reply
#56
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.
Reply
#57
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 :-)
Reply
#58
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.
Reply
#59
(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.
Reply
#60
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 ...
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)