(10-13-2016, 11:42 AM)mp3police Wrote: interapt (brojač prešao iz FF u 00) ;
;procesor obrađuje interapt, a imamo nepoznato vreme obrade, a pošto klok radi brojač broji
Ovo vreme je uglavnom poznato sve dok imas jedan interapt u programu.
Ulazak i izlazak iz interapt rutine je kod RISC procesora vrlo definisan, tacno se zna koliko clock ciklusa to oduzima.
To prakticno znaci da ces uvek u istom trenutku da udjes i izadjes iz interapta, ajd da kazemo da i to ne mora da bude tako zbog drugih interapta ali si i dalje sihronizovan sa realnim vremenom, nema akumuliranja greske. Recimo jednom ce da okine sa 5 ciklusa zadrske, drugi put za 10 i tako dalje ali se greska ne akumulira, jedino imas "jitter" koji moze a ne mora da ti pravi problem sto naravno zavisi sta konkretno program radi (kriticno je kod brojanja spoljnih impulsa ili merenja relativno visoke frekvencije).
Nisam se tačno izrazio. Poznato je vreme. U prvom sam postu (na prvu loptu) pomislio da se kumilira to vreme, ali sam shvatio gde grešim. Ako već moram da ubacujem ofset, zašto onda i ne ubacim to izmereno vreme, kad mogu tačno da odredim kolio je od početka interapta do komande 'zaustavi brojač' prošlo klokova. Ako mi recimo šeta od 3-5 ciklusa, ja u kodu mogu da stavim 4 ciklusa, a da se uzdam da će koliko toliko ravnomerno da ide 3-5. Onda je bolje da izmerim, da li je 3,4 ili 5, pa da ubacim taj broj. Ovo je samo radi poboljšanja, koje vrlo malo košta u programskim linijama. Dobro je što si napomenuo da je vreme definisano, jer kad se kaže od - do, to je definisano, a ako nije definisano onda...
Da li se neko igrao sa arduino+grbl+proteus ? Stinuo sam universal Gcode Sender i sve to lepo radi poveze se salje komande kao onom malom kontroleru za step motore A4988. Ucitava G-kode sve radi. E sad hocu da sve to simuliram u proteusu pa imam probrem sa virtuelnim portom. Skinuo sam Virtual Serial Port kad napravim konekciju izmedju COM3 ( na koji je povezan arduino) i COM4 ( na koji je povezan COMPIM Proteus) ne odvija se komunikacija tj Universal G-kode ne radi kako treba tj na bilo koju zadata funkciju nista se ne desava. Pa da li je neko imao ovakav problem bilo koja sugestija je dobrodosla.
10-13-2016, 11:54 PM (This post was last modified: 10-14-2016, 12:53 AM by me[R]a.)
Evo @Makso pa probaj ja sam kontrolisao 20-tak minuta brojanje i bilo je ok...
Jedino sto ne vidim kako se vrti ova 5 cifra jer mrzilo me da dodajem na ovu moju test skalameriju petu cifru..
"GND" Pin za tu petucifru stavio sam na A3 pin arduina
unsigned int integrator; //Will range from 0 to the specified MAXIMUM
int keyStart = 13; //deklarises i inicijalizujes globalnu promenljivu za taster
boolean toggleKey = false; //promenljiva za status tastera dali ako je stisnut menja vrednost START/PAUSA
int num = 0; //tvoja promenljiva za broj samo sto je sad inicijalizujemo
int aPin = 2; // A
int bPin = 3; // ________
int cPin = 4; // | |
int dPin = 5; // F | | B
int ePin = 6; // | G |
int fPin = 7; // |________|
int gPin = 8; // | |
int GND1 = 9; // | |
int GND2 = 10; // E | | C
int GND3 = 11; // |________|
int GND4 = 12; //
int GND5 = A3; // D
int dig1 = 0;
int dig2 = 0;
int dig3 = 0;
int dig4 = 0;
int dig5 = 0;
int DTime = 6;
int tmp = 0;
int sekunda=0;
int minuta=0;
void setup()
{
pinMode(keyStart, INPUT); // ovo stavis u void setup()
pinMode(aPin, OUTPUT);
pinMode(bPin, OUTPUT);
pinMode(cPin, OUTPUT);
pinMode(dPin, OUTPUT);
pinMode(ePin, OUTPUT);
pinMode(fPin, OUTPUT);
pinMode(gPin, OUTPUT);
pinMode(GND1, OUTPUT);
pinMode(GND2, OUTPUT);
pinMode(GND3, OUTPUT);
pinMode(GND4, OUTPUT);
pinMode(GND5, OUTPUT);
//set timer1 interrupt at 10Hz
cli(); // disable all interrupts
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0; // same for TCCR1B
TCNT1 = 0; //initialize counter value to 0
// set compare match register for 10hz increments
OCR1A = 1562; // = (16*10^6) / (10*1024) - 1 (must be <65536)
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS10 and CS12 bits for 1024 prescaler
TCCR1B |= (1 << CS12) | (1 << CS10);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
}
ISR(TIMER1_COMPA_vect){ //timer1 interrupt 10Hz
if (++num>9){
if (++sekunda>59){
if (++minuta>99){
minuta=0;
}
sekunda=0;
}
num=0;
}
dig5 = num;
dig4 = sekunda % 10;
dig3 = (sekunda/10);
dig2 = minuta % 10;
dig1 = (minuta/10);
}
if(taster == 1 ){ // Svaki put kad se pritisne taster menja se status START ili PAUSA
if (integrator > 0){
integrator--;
toggleKey = !toggleKey;
}
}
else if (integrator < MAXIMUM){
integrator++;
}
if(toggleKey){ //u zavisnosti ako je true(START) onda broj se uvecava i prikazuje novi
interrupts(); // enable all interrupts
}
else {
noInterrupts(); // disable all interrupts
TCNT1 = 0;//initialize counter value to 0
}
void pickNumber(int x){
switch(x){
case 0: zero(); break;
case 1: one(); break;
case 2: two(); break;
case 3: three(); break;
case 4: four(); break;
case 5: five(); break;
case 6: six(); break;
case 7: seven(); break;
case 8: eight(); break;
case 9: nine(); break;
default: break;
}
}
void clearLEDs()
{
digitalWrite( 2, LOW); // A
digitalWrite( 3, LOW); // B
digitalWrite( 4, LOW); // C
digitalWrite( 5, LOW); // D
digitalWrite( 6, LOW); // E
digitalWrite( 7, LOW); // F
digitalWrite( 8, LOW); // G
}
(10-14-2016, 12:19 AM)Makso Wrote: Probaću, pa javim sutra.
Kod mene ovde slabo da iko ima dunju, pretežno je šljiva 19 gradi i kruška 21 grad (bar kod mene), a ova kruška iz cipela baca...
Ovdje sam primjetio nešto:
digitalWrite( GND5, HIGH); //digit 5
pickNumber(dig4);
delay(DTime);
digitalWrite( GND5, LOW);
clearLEDs();
na pickNumber(dig4) trebalo bi da ide dig5 ako sam upravu?
Tako je eto vidis da se uvek potkrade neka greskica... Nemam tu petu cifru pa i neznam kako se menja...
Ispravit cu gore u kodu da ne kopiram ponovo celi kod
Savršeno radi, vrhunski, i peta cifra i sve ostale.
Samo sam morao smanjiti DTime na 3 jer su mi blinkale ledice kad broji i sad radi savršeno.
Samo ću probati još sa BC tranzistorima, što mi je @Macola rekao jer oni traže manje struje na bazi dok ovi 2N hoće više.
I da sklopim sve brojeve pa će biti slika.
Hvala od srca svima koji su mi pomogli, eh da smo bliže bilo bi veselja...
10-14-2016, 07:49 PM (This post was last modified: 10-14-2016, 07:55 PM by me[R]a.)
Eto drago nam je da si uspeo a hteo si da odustanes...
Jedino poradi na boljem hardveru sa max7219 ili sa HC595 jer na taj nacin ces dobiti veci ili pun intezitet svetlosti.
Ovako ti sad imas displej sa 5 cifara i svaka svetli 1/5 (petinom) svog inteziteta.
Stigli su mi shift registri 595, pa sam uhvatio vremena da ih testiram.
Probao samo primjer iz posta #90 što mi je preporučio @gorankg, i to sve radi, samo sad opet imam istu proceduru kao i sa prethodnim kodom, opet dodati taster pa petu cifru i da sam broji, jer se i u ovom kodu broj unosi u serialu, da li bi to bio veliki posao na ovom kodu ili tražiti drugi kod?
Pogledaj malo za pocetak ovaj link jer ce se ta funkcija koristiti ShiftOut. Moze se modifikovati postojeci program koji ce biti znatno manji nego ovaj. Sad trenutno nisam u mogucnosti da uradimo to odmah ali nastojacu u narednim danima da ti pomognem... Testiraj hardver po toj semi koju spominjes. Dodaj jednostavno u seriju jos jedan 595 po istom principu kao i ostali. Taster stavi kao i u onom starom programu.....
Razrađujem neki kod i sad imam potrebi za nekim da kažem multi-tasking-om, u kodu imam jedan program koji ima delay od nekoliko sekundi i tako njih nekoliko, ono što me interesuje da ubacim još jedan tajmer ili delay koji će raditi neovisno o prethodnom kodu tj. da oba delay-a rade istovremeno?
Code:
const int motor1 = 2; //Motor1 spojen na pin 2 -
const int motor2 = 3; //Motor2 spojen na pin 3 --
const int motor3 = 4; //Motor3 spojen na pin 4 -- Motori
const int motor4 = 5; //Motor4 spojen na pin 5 -
const int motor1uslov = 6; //Uslov motora1 pin 6 -
const int motor2uslov = 7; //Uslov motora2 pin 7 --
const int motor3uslov = 8; //Uslov motora3 pin 8 -- Prekidači Motora
const int motor4uslov = 9; //Uslov motora4 pin 9 -
int motor1uslovState = LOW; //Uslov motora1 (vrijednost nsika) -
int motor2uslovState = LOW; //Uslov motora2 (vrijednost nsika) --
int motor3uslovState = LOW; //Uslov motora3 (vrijednost nsika) -- Prekidači motora postavljeni niske vrijednosti
int motor4uslovState = LOW; //Uslov motora4 (vrijednost nsika) -
const int startstop = 10; //Glavni taster za pokretanje tajmera motora pin 10 - Taster Start/Stop
int startstopState = LOW;
void loop()
{
startstopState = digitalRead(startstop); //Dodjela vrijednosti
if (startstopState == HIGH) //Čitanje vrijednosti Start/Stop tastera, ako je tačan
{
motor1uslovState = digitalRead(motor1uslov); //Dodjela vrijednosti
if (startstopState == HIGH && motor1uslovState == HIGH) //Čitanje vrijednosti Sart/Stop tastera i uslova motora1, logičkim kolom AND
{
digitalWrite(motor1, HIGH); //Postaviti izlaz motora1 aktivnim
if (motor1uslovState == HIGH) //Čitanje vrijednosti uslova motora1, ako je tačan
{
delay(3000); //Čekati xxxx s
}
}
else //Čitanje vrijednosti uslova motora1, ako nije tačan
{
digitalWrite(motor1, LOW); //Postaviti izlaz motora1 neaktivnim
delay(100); //Čekati 100ms
}
motor2uslovState = digitalRead(motor2uslov); //Dodjela vrijednosti
if (startstopState == HIGH && motor2uslovState == HIGH) //Čitanje vrijednosti Sart/Stop tastera i uslova motora2, logičkim kolom AND
{
digitalWrite(motor2, HIGH); //Postaviti izlaz motora2 aktivnim
if (motor2uslovState == HIGH) //Čitanje vrijednosti uslova motora2, ako je tačan
delay(3000); //Čekati xxxx s
}
else //Čitanje vrijednosti uslova motora2, ako nije tačan
{
digitalWrite(motor2, LOW); //Postaviti izlaz motora2 neaktivnim
delay(100); //Čekati 100ms
}
motor3uslovState = digitalRead(motor3uslov);
if (motor3uslovState == HIGH && startstopState == HIGH) //Čitanje vrijednosti Sart/Stop tastera i uslova motora3, logičkim kolom AND
{
digitalWrite(motor3, HIGH); //Postaviti izlaz motora3 aktivnim
if (motor3uslovState == HIGH) //Čitanje vrijednosti uslova motora3, ako je tačan
delay(3000); //Čekati xxxx s
}
else //Čitanje vrijednosti uslova motora3, ako nije tačan
{
digitalWrite(motor3, LOW); //Postaviti izlaz motora3 neaktivnim
delay(100); //Čekati 100ms
}
motor4uslovState = digitalRead(motor4uslov);
if (motor4uslovState == HIGH && startstopState == HIGH) //Čitanje vrijednosti Sart/Stop tastera i uslova motora4, logičkim kolom AND
{
digitalWrite(motor4, HIGH); //Postaviti izlaz motora4 aktivnim
if (motor4uslovState == HIGH) //Čitanje vrijednosti uslova motora4, ako je tačan
delay(3000); //Čekati xxxx s
}
else //Čitanje vrijednosti uslova motora4, ako nije tačan
{
digitalWrite(motor4, LOW); //Postaviti izlaz motora4 neaktivnim
delay(100); //Čekati 100ms
}
}
else //Čitanje vrijednosti Start/Stop tastera, ako nije tačan
{
digitalWrite(motor1, LOW); //Postaviti izlaz motora1 neaktivnim
digitalWrite(motor2, LOW); //Postaviti izlaz motora2 neaktivnim
digitalWrite(motor3, LOW); //Postaviti izlaz motora3 neaktivnim
digitalWrite(motor4, LOW); //Postaviti izlaz motora4 neaktivnim
delay(100); //Čekati 100ms
}
}
Znači na kraju ovog koda da dodam još jedan delay koji bi jedan izlaz držao aktivan oko 60min i onda napravio pauzu nekih 10min i onda aktivirao drugi izlaz i opet držao 60min pa opet pauza 10min pa onda aktivan prvi izlaz i tako u krug (ciklično), da se dva izlaza smjenjuju na svakih 60min sa po 10min pauze, a da prethodni dio koda radi svoj posao?
Makso,
to se postize upotrebom interapta. Nemam pojma kako se to radi u arduinu. Znam u C - u da uradim. Treba ti samo jedan tajmer koji ce fenerise interapt na npr. svaku sekundu (ako je to moguce sa tip mcu) ili manje, a posle toga brojis ulaske u int dok ne dobijes odgovarajuce vreme.
Kod ti nije dobar iz razloga što vrednost START/STOP tastera čitaš samo jednom na početku petlje.
Code:
startstopState = digitalRead(startstop);
Ulaziš u problem ukoliko je aktiviran iz bilo kog razloga STOP, pre toga si uključio neki motor a tvoj se program vrti u delu programa koji radi delay(x) sekundi. Motor mora da se isključi odmah nakon što je aktiviran taster STOP a ne da čeka da prođe neki delay. Treba da program drugačije organizuješ i razmotriš ovo što je Vojin naveo. START/STOP taster odvedi na neki pin koji može da generiše spoljašnji prekid a kašnjenja reši preko prekida (interrupt) tajmera. Ne poznajem arduino platformu ali kreni sa nekim kodom pa ćemo ti pomoći.
@gorankg razumijem te na šta misliš u vezi koda da nisam dobro odradio, mada meni i ovako trenutno ne pravi nikakav problem, nije bitno da li će isključiti odmah ili nakon nekoliko sekundi dok ne istekne delay, ali volio bih kada bih to sredio da liči na nešto.
Stalno kopam po netu ali nikako ne kontam kako se to radi i kako napraviti interupt za ovaj moj slučaj, ima dosta nekih primjera po netu samo ja nisam skontao šta bi trebalo za moj slučaj?