Arduino - tutorijali, pitanja, primjeri i projekti - Printable Version +- DIY Electronic projects (https://forum.yu3ma.net) +-- Forum: Mikrokontroleri (https://forum.yu3ma.net/forumdisplay.php?fid=52) +--- Forum: Razvojni sistemi i moduli (https://forum.yu3ma.net/forumdisplay.php?fid=56) +--- Thread: Arduino - tutorijali, pitanja, primjeri i projekti (/showthread.php?tid=718) |
RE: Arduino - tutorijali, pitanja, primjeri i projekti - mikikg - 05-08-2021 (05-08-2021, 08:07 PM)enaB Wrote: Moze da se koristi return u void funkcijama Ma moze naravno i tako, poenta je bila za izlazenje iz switch/case/if/for uslova, tu ne moze return, nego moze jedino break a ako ti je to ugnjezdeno tamo u vise nivoa onda pocinje da bude naporno jer ne postoji na primer "break 3" kao u nekim jezicima da prekine 3 nivoa ili koliko vec treba pa bude problem, stavis lepo GOTO i skaci gde oces ako znas tacno gde treba. Evo konkretan primer tamo sa druge teme, bas mi je cucnuo GOTO vise nego bilo koja druga logika //-------------------------------------------------------- //------------------------ RELAYS ------------------------ //-------------------------------------------------------- void Handle_Relays() { if (vol_change_flag) { if (SW_timers[7] == 1) { //prvi prolaz postavljamo sve koje trebaju if (bitmask1 != 0) GPIOA->BSRR = RY1_on; //PA3 -1dB if (bitmask2 != 0) GPIOA->BSRR = RY2_on; //PA4 -2dB if (bitmask3 != 0) GPIOA->BSRR = RY3_on; //PA5 -4dB if (bitmask4 != 0) GPIOA->BSRR = RY4_on; //PA6 -8dB if (bitmask5 != 0) GPIOA->BSRR = RY5_on; //PA7 -16dB if (bitmask6 != 0) GPIOB->BSRR = RY6_on; //PB0 -32dB if (MyData[DELAY]==0) goto odradi_ostalo; //nema delay odradi i ostalo } else if (SW_timers[7] >= (MyData[DELAY]+1)) {//kada istekne gasimo koje trebaju odradi_ostalo: SW_timers[7] = 0; vol_change_flag = 0; if (bitmask1 == 0) GPIOA->BSRR = RY1_off; //PA3 -1dB if (bitmask2 == 0) GPIOA->BSRR = RY2_off; //PA4 -2dB if (bitmask3 == 0) GPIOA->BSRR = RY3_off; //PA5 -4dB if (bitmask4 == 0) GPIOA->BSRR = RY4_off; //PA6 -8dB if (bitmask5 == 0) GPIOA->BSRR = RY5_off; //PA7 -16dB if (bitmask6 == 0) GPIOB->BSRR = RY6_off; //PB0 -32dB } } } // Konfiguracija (72000) za SysTick da radi kao 1kHz (1ms) timer // Iskoriscen SysTick HW tajmer za jos X SW tajmera + Handle_relays() void SysTick_Handler (void) { if (SW_timers_enable[0] == 1) SW_timers[0] ++; SW_timers[1] ++; SW_timers[2] ++; SW_timers[3] ++; SW_timers[4] ++; SW_timers[5] ++; SW_timers[6] ++; SW_timers[7] ++; Handle_Relays(); //Function call every 1ms } RE: Arduino - tutorijali, pitanja, primjeri i projekti - MILANNN - 05-09-2021 Ponovo se igram nesto i primer jeskoro isti kao onaj prethodni,sve isto u tom delu napisamo i izbacuje gresku. Zasto je ovo sad(); ovde greska a u prethodnom primeru radi? Drugi deo koda radi kad sklonim ovo vezano za sad(); const int buttonPin = 8; const int buttonPin1 = 9; int ledPin = 13; int ledPin1 = 12; boolean flag = 0; int buttonState = HIGH; int buttonState1 = HIGH; int i; void setup() { pinMode(ledPin,OUTPUT); pinMode(buttonPin, INPUT); pinMode(buttonPin1,INPUT); //int buttonState1 = HIGH; int buttonState = HIGH; } void loop(){ //buttonState1 = digitalRead(buttonPin1); buttonState = digitalRead(buttonPin); flag = true; if (digitalRead(buttonPin1) == LOW) { sad(); // --------------------------------- ovde je greska } if (buttonState == false) { digitalWrite(ledPin, LOW); delay(500); } else { digitalWrite(ledPin, HIGH); delay(500); } void sad() { digitalWrite(ledPin1,LOW); delay(500); digitalWrite(ledPin1,HIGH); delay(500); } } RE: Arduino - tutorijali, pitanja, primjeri i projekti - vojinilic - 05-09-2021 Zagrade. Takodje, ako ti je funkcija koju pozivas napravljena ispod mesta poziva, treba ti prototip funkcije. RE: Arduino - tutorijali, pitanja, primjeri i projekti - vojinilic - 05-09-2021 Jos jedna veoma bitna stvar. Kod ti je napisan katastrofalno. Bez uvrede. Nigde ne koristis tabove. Pogledaj Mikijev kod kako je lepo napisan i kako se tacno vidi blok naredbi pod zagradama. To je citljivost koda i veoma je bitna radi lakseg otklanjanja sintaksnih gresaka. RE: Arduino - tutorijali, pitanja, primjeri i projekti - MILANNN - 05-09-2021 Ma nevredjam se ni najmanje samo sad nevidim zasto nece a onaj prethodni je na isti nacin i on radi. RE: Arduino - tutorijali, pitanja, primjeri i projekti - mikikg - 05-09-2021 (05-09-2021, 07:09 PM)vojinilic Wrote: Zagrade. (05-09-2021, 07:11 PM)vojinilic Wrote: Jos jedna veoma bitna stvar. Kod ti je napisan katastrofalno. Bez uvrede. Nigde ne koristis tabove. Pogledaj Mikijev kod kako je lepo napisan i kako se tacno vidi blok naredbi pod zagradama. To je citljivost koda i veoma je bitna radi lakseg otklanjanja sintaksnih gresaka. U sustini sve gore greske bi trebao jedan "pametan IDE" da resi pre nego sto uopste dodje korisnik da ovde pejstuje primer sa greskom Arduino IDE je bez uvrede "retardiran" po tom pitanju ... Pametan IDE ti kaze "Sine gde ti je prototip? Hoces da napravim umesto tebe?" i pocrveni tako da ne mozes dalje da kuckas dok to ne resis, u startu je sve bolje i lakse za pisanje programa, bez obzira na iskustvo, IDE cekira ceo source-code kako stisnes jedan taster i kuva u pozadini i poredi sa goooooomilom pravila i daje razne savete pre nego sto si uoste stisnuo COMPILE (Build)! RE: Arduino - tutorijali, pitanja, primjeri i projekti - MILANNN - 05-09-2021 Greska sigurno ima.Jedino je nejasno zasto u prethodnom primeru radi a isto je ovako definisano RE: Arduino - tutorijali, pitanja, primjeri i projekti - mikikg - 05-09-2021 @vojinilic Moramo po neki put da se stavimo i u poziciju pocetnika, posebno kada pricamo o C (tek C++) da je to u sustini prost jezik ali ima stvarno veliki broj pravila i caka i tehnika kako jednu istu stvar mozes da napravis, ima stvarno mnogo pravila koja se primenjuju za pisanje ispravnog i optimizovanog programa, ne mozemo da ocekujemo od pocetnika sve da ih zna ali zato je bitno da i pocetnici koriste dobre i kvalitetne IDE i da "uce zajedno", da ti IDE stvarno pomogne (koliko je to moguce) u raznim situacijama i savetuje sa konkretnim akcijama i parcicima code-a koje napise umesto tebe i to sto ti je pomogao je ihaaaaa vredelo i korisno i ustedelo vreme, jer kada to nema onda imamo kao gore spomenut primer sa greskom i vrtecemo se tako dok MILANNN ne nauci ispravnu sintaksu i pravila C jezika ili dok ne promeni IDE RE: Arduino - tutorijali, pitanja, primjeri i projekti - gorankg - 05-09-2021 (05-09-2021, 08:10 PM)MILANNN Wrote: Greska sigurno ima.Jedino je nejasno zasto u prethodnom primeru radi a isto je ovako definisano Zagrade. Već si dobio odgovor. I kod ti nije formatiran tako da možeš lakše da uočiš grešku. Ti si sad() ubacio u loop() Code: void loop(){ RE: Arduino - tutorijali, pitanja, primjeri i projekti - MILANNN - 05-09-2021 Hvala Gorane.Setio sam se da treba void sad(void) { ali na zagrau nisam obratio paznju. RE: Arduino - tutorijali, pitanja, primjeri i projekti - Macola - 05-09-2021 Miki, Vojin i Goran su ti ukazali na greške, a ja ću malo da dopunim i objasnim ti oko prototipova. Prototip svih funkcija koje će ti kasnije trebati, osim loop(), se pravi ovako i najbolje je to uraditi negde na vrhu, tamo gde su ti definicije varijabli, konstanti itd: void sad(void); Kad kompajler "vidi" na vrhu koda prototip, on "zna" da će funkcija sa tim imenom kasnije biti korišćena negde ispod i automatski prvo kompajlira te funkcije pa posle loop(). U tom slučaju će sad(); kog pozivaš u loop() biti normalno upotrebljeno. Ako nemaš prototip za sad() onda, ukoliko kreiraš tu funkciju ispod loop() onda kompajler nema pojma o njenom postojanju. Odnosno, ako kreiraš neku funkciju bez prototipa na vrhu, onda je možeš koristiti samo u kodu ispod nje, nikako iznad. Ako imaš prototip, onda je možeš kreirati bilo gde, tj. probaj da stekneš naviku da čim napraviš neku funkciju da odmah iskopiraš njen prototip negde na vrhu koda i posle te ne boli glava da li si je napisao iznad ili ispod mesta njene upotrebe. Drugo, možeš uštedeti na kodu i memorijskom prostoru ako umesto const int upotrebiš #define, npr ovako: //const int buttonPin = 8; //const int buttonPin1 = 9; #define buttonPin 8 #define buttonPin1 9 RE: Arduino - tutorijali, pitanja, primjeri i projekti - Macola - 05-09-2021 #define je ekstremno moćna direktiva u C i može se upotrebiti za mnogo toga. Na primer, brojevi koje vežeš za neko ime pomoću #define nisu rezervisani samo za to ime. Recimo možeš glatko napraviti ovako: #define pera 1 #define žika 1 #define đorđe 1 Negde dole u kodu, pozvao ti peru, žiku ili đorđa, program će to videti kao 1. Praktičnost je u tome što je lakše pamtiti imena nego brojeve. Define direktiva može sadržati i jako složene stvari koje dobiju jedno ime. #define zoran (pera + žika - đorđe) Ako negde napišeš zoran, to će biti shvaćeno kao (1+1-1) tj. opet kao 1 na primer... Ili možda ovako: #define lcd_home() lcd_cmd(0x02); delay_lcd_us(500) Vidiš, ovde je direktiva define kreirala funkciju koja poziva i upotrebljava neke druge dve funkcije, ili možda i ovako: #define lcd_cursor(x) lcd_cmd(((x)&0x7F)|0x80) Upoznaj mogućnosti define direktive jer je jako moćna i može puno olakšati pisanje. Pozdrav RE: Arduino - tutorijali, pitanja, primjeri i projekti - MILANNN - 05-09-2021 Hvala drugar.Svako objasnjenje je korisno i dobrodoslo.To za kreiranje na vrhu sam znao i tako sam prvo postavio: int buttonPin = 8; int buttonPin1 = 9; int ledPin = 13; int ledPin1 = 12; boolean flag = 0; int buttonState = HIGH; int buttonState1 = HIGH; int i; void sad(void); ----------- ovo ovde void setup() { // pa ovde dole tad moze i ovako : void sad() { bez void u zagradi digitalWrite(ledPin1,LOW); delay(500); digitalWrite(ledPin1,HIGH); delay(500); } ali zbog zagrade nije vredelo gde god da definisem sad(); Da iskoristim priliku pa da pitam na osnovu ovoga sto je Miki napisao "dok MILANNN ne nauci ispravnu sintaksu i pravila C jezika ili ne dok promeni IDE" Koji je najbolje IDE skinuti ? Meni bi stvarno koristio neki takav kao sto je Miki predlozio. RE: Arduino - tutorijali, pitanja, primjeri i projekti - mikikg - 05-09-2021 (05-09-2021, 09:33 PM)MILANNN Wrote: Da iskoristim priliku pa da pitam na osnovu ovoga sto je Miki napisao Procitaj za pocetak ovo https://blog.jetbrains.com/clion/2020/08/arduino-from-hobby-to-prof-p1/ RE: Arduino - tutorijali, pitanja, primjeri i projekti - me[R]a - 05-09-2021 (05-09-2021, 09:33 PM)MILANNN Wrote: Koji je najbolje IDE skinuti ? Meni bi stvarno koristio neki takav kao sto je Miki predlozio. https://code.visualstudio.com/ Uz razlicite extenzije vrlo mocan editor. RE: Arduino - tutorijali, pitanja, primjeri i projekti - ZASto - 05-10-2021 Code: const int buttonPin = 8; Komentari u kodu. RE: Arduino - tutorijali, pitanja, primjeri i projekti - Macola - 05-10-2021 ZASto, #define je pretprocesorska direktiva i ne stavlja konstantu u ROM čipa. Kod MCU "male zapremine" programske memorije zna da uštedi prostor, posebno ako treba dosta konstanti. Izbor je na njemu. Citiraću sebe: "Drugo, možeš uštedeti na kodu i memorijskom prostoru ako umesto const int upotrebiš #define, npr ovako: //const int buttonPin = 8; //const int buttonPin1 = 9; #define buttonPin 8 #define buttonPin1 9 " RE: Arduino - tutorijali, pitanja, primjeri i projekti - mikikg - 05-10-2021 @Macola #define ne stedi tek tako prostor, u sustini sve sto napises i upotrebis negde u programu to MORA negde da se smesti, prvo u programsku (FLASH) memoriju jer mora odnekud da pocne a posle dodatno i u RAM memoriju ako je to promenljiva tj nije konstanta. Generalno #define i const sluze u cilju ustede RAM memorije a FLASH ne moze da se stedi tek tako, mora negde/nesto da se zabelezi ... To je poznata stvar, zato svi MCU uglavnom imaju daleko vise FLASH nego RAM memorije. RE: Arduino - tutorijali, pitanja, primjeri i projekti - mikikg - 05-10-2021 @Macola evo konkretan primer gde se vidi da je #define i const ustvari isto, isti FLASH prostor zauzima, ne utice uopste na RAM. //Ovo je isto kao i const definicija //#define neki_32bit_broj1 0x70000001 //#define neki_32bit_broj2 0x70000002 //#define neki_32bit_broj3 0x70000003 //#define neki_32bit_broj4 0x70000004 const int32_t neki_32bit_broj1 = 0x70000001; const int32_t neki_32bit_broj2 = 0x70000002; const int32_t neki_32bit_broj3 = 0x70000003; const int32_t neki_32bit_broj4 = 0x70000004; int main(void) { //proba, upotrebljavamo konstante (da ne optimizuje prevodilac ako ne koristimo) cnt = neki_32bit_broj1; cnt = neki_32bit_broj2; cnt = neki_32bit_broj3; cnt = neki_32bit_broj4; } RE: Arduino - tutorijali, pitanja, primjeri i projekti - mikikg - 05-10-2021 Na primer cak i ovaj code zauzima isti FLASH prostor (ne dira RAM) jer je prevodilac bio pametan da skonta da iako smo definisali variablu ali je "nismo cackali/menjali" on to pretvori u konstantu i ustedi RAM! //Ovo je isto kao i const definicija //#define neki_32bit_broj1 0x70000001 //#define neki_32bit_broj2 0x70000002 //#define neki_32bit_broj3 0x70000003 //#define neki_32bit_broj4 0x70000004 //const int32_t neki_32bit_broj1 = 0x70000001; //const int32_t neki_32bit_broj2 = 0x70000002; //const int32_t neki_32bit_broj3 = 0x70000003; //const int32_t neki_32bit_broj4 = 0x70000004; int main(void) { int32_t neki_32bit_broj1 = 0x70000001; int32_t neki_32bit_broj2 = 0x70000002; int32_t neki_32bit_broj3 = 0x70000003; int32_t neki_32bit_broj4 = 0x70000004; //proba, upotrebljavamo konstante (da ne optimizuje prevodilac ako ne koristimo) cnt = neki_32bit_broj1; cnt = neki_32bit_broj2; cnt = neki_32bit_broj3; cnt = neki_32bit_broj4; } |