Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino - tutorijali, pitanja, primjeri i projekti
(05-08-2021, 08:07 PM)enaB Wrote: Moze da se koristi return u void funkcijama Smile

return;

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 Big Grin

//--------------------------------------------------------
//------------------------ 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
}
Reply
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);
}
}
Reply
Zagrade.
Takodje, ako ti je funkcija koju pozivas napravljena ispod mesta poziva, treba ti prototip funkcije.
Reply
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.
Reply
Ma nevredjam se ni najmanje samo sad nevidim zasto nece a onaj prethodni je na isti nacin i on radi.
Reply
(05-09-2021, 07:09 PM)vojinilic Wrote: Zagrade.
Takodje, ako ti je funkcija koju pozivas napravljena ispod mesta poziva, treba ti prototip funkcije.

(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 Smile
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)!
Reply
Greska sigurno ima.Jedino je nejasno zasto u prethodnom primeru radi a isto je ovako definisano
Reply
@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 Smile
Reply
(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(){
//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(void) {
  digitalWrite(ledPin1,LOW);
  delay(500);
  digitalWrite(ledPin1,HIGH);
  delay(500);
}
Reply
Hvala Gorane.Setio sam se da treba void sad(void) { ali na zagrau nisam obratio paznju.
Reply
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
Reply
#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
Reply
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.
Reply
(05-09-2021, 09:33 PM)MILANNN Wrote: 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.

Procitaj za pocetak ovo
https://blog.jetbrains.com/clion/2020/08...o-prof-p1/
Reply
(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.
Reply
Code:
const int buttonPin = 8;
const int buttonPin1 = 9;
int ledPin = 13;
int ledPin1 = 12;

/*
  Dogovori se sam sa sobom kako ćeš da deklarišeš pinove

  Ja to radim ovako:
 
  #define Pin1    62
  #define Pin2    63
  #define Pin3    64
  #define Pin4    65
  #define Pin5    66
  #define Pin6    67
  #define Pin7    68
  #define Pin8    69
  #define Pin9    22
  #define Pin10  24
  #define Pin11  26
  #define Pin12  28
  #define Pin13  30
  #define Pin14  32
  #define Pin15  34
  #define Pin16  36
*/

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; // Zašto si ovo duplirao?
}



void loop() {
  //buttonState1 = digitalRead(buttonPin1);
  buttonState = digitalRead(buttonPin);



  flag = true;

  //  if (digitalRead(buttonPin1) == LOW) {
  if (!digitalRead(buttonPin1)) {
    sad(); // --------------------------------- ovde je greska :D (Nije, samo ti je funkcija bila na pogre[nom mestu.)
  }

  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);
}
Arduino IDE-u ne fali mnogo toga, ne treba pljuckati po alatkama koje su namenjene početnicima, a i ne samo njima.

Komentari u kodu.
Make no mistake between my personality and my attitude.
My personality is who I am.
My attitude depends on who you are.

塞爾維亞文
Reply
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 "
Reply
@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.
Reply
@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;
}
Reply
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;
}
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)