Zdravo,
za potrebe projekta razvijam Motion controller sa PIC18F4431. Plan je da napravim kontroler koji ce moci da kontrolise kretanje DC motora po brzini, momentu i poziciji i omogucim simultano kretanje dva motora sa dva drajvera tako sto ce jedan od drajvera biti MASTER a drugi SLAVE. MASTERU ce se zadati parametri kretanja kao sto su brzina, momenat na vratilu i pozicija, a zadatak SLAVE drajvera je da sto vernije kopira kretanje MASTERA. Veza drajvera sa PC aplikacijom za monitoring ili nekom embeded aplikacijom je putem RS485 magistrale. Na ovu magistralu moguce je povezati vise drajvera. Veza izmedju dva drajvera radi ostvarivanja MASTER - SLAVE simultanog kretanja je putem I2C magistrale. Pozicija, brzina i ubrzanje estimira se sa enkodera HEDS 5540 koji je povezan da radi u kvadraturi. Ok ovo je ukratak uvod u prijekat, vreme je da se vratim na naslov teme, srad() i rand().
Naime s obzirom da je na RS485 half duplex magistralu moguce povezati vise drajvera zelim da napravim univerzalni algoritam za identifikaciju drajvera. PC softver ce u ovom slucaju biti MASTER uredjaj a drajveri SLAVE - ovi. Prilikom svakog paljenja adresa SLAVE uredjaja se menja. PC softver salje tkz. HELLO_ALL paket. Ovim paketom PC kaze svim SLAVE uredjajima (drajverima) da se identifikuju. Ideja je da kada SLAVE uredjaji prime HELLO_ALL paket generisu random broj u opsegu od 1 - 255, i posalju taj broj kao predlog za svoju adresu. Da ne bi doslo do kolizije tj. da vise SLAVE uredjaja predje u mod za slanje u istom trenutku predvideo sam pauzu pre slanja od N milisekundi, gde N predstavlja prethodno generisani radnom broj. Kada PC primi predlog adrese on odgovara potvrdno ili paketom za promenu adrese ukoliko je predlozena adresa zauzeta. Ukoliko se desi da dodje do kolizije, CRC primljenog paketa ce biti los tako da ce nakon isteka od 255ms sto je maksimalno vreme koje je potrebno da se svi slave uredjaji jave, PC ponovo poslati HELLO_ALL, cime ce SLAVE uredjaji koji nisu inicijalizovali svoju adresu ponovo generistai random broj i dati predlog itd. dok se svi uredjaji ne identifikuju.
Ono sto je problem u ovom trenutku je da svi SLAVE uredjaji imaju isti source code i da prilikom paljenja generisu isti random broj u zavisnosti od zadatog seed - a. Problem je sto funkcije srand() i rand() generisu pseudo random broj tako da ce pri paljenju uvek biti isti prvi broj. Moje pitalje je da li neko zna kako da generisem pravi random broj koji nece biti isti pri svakom paljenju?
Nadam se da sam bio jasan sta radim i sta mi predstavlja problem. Svaka sugestija ce mi koristiti.
za potrebe projekta razvijam Motion controller sa PIC18F4431. Plan je da napravim kontroler koji ce moci da kontrolise kretanje DC motora po brzini, momentu i poziciji i omogucim simultano kretanje dva motora sa dva drajvera tako sto ce jedan od drajvera biti MASTER a drugi SLAVE. MASTERU ce se zadati parametri kretanja kao sto su brzina, momenat na vratilu i pozicija, a zadatak SLAVE drajvera je da sto vernije kopira kretanje MASTERA. Veza drajvera sa PC aplikacijom za monitoring ili nekom embeded aplikacijom je putem RS485 magistrale. Na ovu magistralu moguce je povezati vise drajvera. Veza izmedju dva drajvera radi ostvarivanja MASTER - SLAVE simultanog kretanja je putem I2C magistrale. Pozicija, brzina i ubrzanje estimira se sa enkodera HEDS 5540 koji je povezan da radi u kvadraturi. Ok ovo je ukratak uvod u prijekat, vreme je da se vratim na naslov teme, srad() i rand().
Naime s obzirom da je na RS485 half duplex magistralu moguce povezati vise drajvera zelim da napravim univerzalni algoritam za identifikaciju drajvera. PC softver ce u ovom slucaju biti MASTER uredjaj a drajveri SLAVE - ovi. Prilikom svakog paljenja adresa SLAVE uredjaja se menja. PC softver salje tkz. HELLO_ALL paket. Ovim paketom PC kaze svim SLAVE uredjajima (drajverima) da se identifikuju. Ideja je da kada SLAVE uredjaji prime HELLO_ALL paket generisu random broj u opsegu od 1 - 255, i posalju taj broj kao predlog za svoju adresu. Da ne bi doslo do kolizije tj. da vise SLAVE uredjaja predje u mod za slanje u istom trenutku predvideo sam pauzu pre slanja od N milisekundi, gde N predstavlja prethodno generisani radnom broj. Kada PC primi predlog adrese on odgovara potvrdno ili paketom za promenu adrese ukoliko je predlozena adresa zauzeta. Ukoliko se desi da dodje do kolizije, CRC primljenog paketa ce biti los tako da ce nakon isteka od 255ms sto je maksimalno vreme koje je potrebno da se svi slave uredjaji jave, PC ponovo poslati HELLO_ALL, cime ce SLAVE uredjaji koji nisu inicijalizovali svoju adresu ponovo generistai random broj i dati predlog itd. dok se svi uredjaji ne identifikuju.
Ono sto je problem u ovom trenutku je da svi SLAVE uredjaji imaju isti source code i da prilikom paljenja generisu isti random broj u zavisnosti od zadatog seed - a. Problem je sto funkcije srand() i rand() generisu pseudo random broj tako da ce pri paljenju uvek biti isti prvi broj. Moje pitalje je da li neko zna kako da generisem pravi random broj koji nece biti isti pri svakom paljenju?
Nadam se da sam bio jasan sta radim i sta mi predstavlja problem. Svaka sugestija ce mi koristiti.