Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino - tutorijali, pitanja, primjeri i projekti
(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).
Reply
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...
Reply
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.


Attached Files
.bmp   Port.bmp (Size: 1.018,02 KB / Downloads: 4)
Reply
Da dodam da sam probao sa nekoliko verzija Universal G-kode sender i razlicitim vrednostima Baud i nece.
Reply
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
Code:
#define DEBOUNCE_TIME    0.3
#define SAMPLE_FREQUENCY  10
#define MAXIMUM     (DEBOUNCE_TIME * SAMPLE_FREQUENCY)

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);
 }

void loop()
{
 digitalWrite( GND1, LOW);
 digitalWrite( GND2, LOW);
 digitalWrite( GND3, LOW);
 digitalWrite( GND4, LOW);
 digitalWrite( GND5, LOW);
 int taster = digitalRead(keyStart);
 
 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
   }
     
 digitalWrite( GND5, HIGH);    //digit 5
 pickNumber(dig5);
 delay(DTime);
 digitalWrite( GND5, LOW);
 clearLEDs();
 
 digitalWrite( GND4, HIGH);    //digit 4
 pickNumber(dig4);
 delay(DTime);
 digitalWrite( GND4, LOW);
 clearLEDs();

 digitalWrite( GND3, HIGH);    //digit 3
 pickNumber(dig3);
 delay(DTime);
 digitalWrite( GND3, LOW);
 clearLEDs();

 digitalWrite( GND2, HIGH);   //digit 2
 pickNumber(dig2);
 delay(DTime);
 digitalWrite( GND2, LOW);
 clearLEDs();

 digitalWrite( GND1, HIGH);   //digit 1
 pickNumber(dig1);
 delay(DTime);
 digitalWrite( GND1, LOW);
 clearLEDs();
 
}

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
}

void one()
{
digitalWrite( aPin, LOW);
digitalWrite( bPin, HIGH);
digitalWrite( cPin, HIGH);
digitalWrite( dPin, LOW);
digitalWrite( ePin, LOW);
digitalWrite( fPin, LOW);
digitalWrite( gPin, LOW);
}

void two()
{
digitalWrite( aPin, HIGH);
digitalWrite( bPin, HIGH);
digitalWrite( cPin, LOW);
digitalWrite( dPin, HIGH);
digitalWrite( ePin, HIGH);
digitalWrite( fPin, LOW);
digitalWrite( gPin, HIGH);
}

void three()
{
digitalWrite( aPin, HIGH);
digitalWrite( bPin, HIGH);
digitalWrite( cPin, HIGH);
digitalWrite( dPin, HIGH);
digitalWrite( ePin, LOW);
digitalWrite( fPin, LOW);
digitalWrite( gPin, HIGH);
}

void four()
{
digitalWrite( aPin, LOW);
digitalWrite( bPin, HIGH);
digitalWrite( cPin, HIGH);
digitalWrite( dPin, LOW);
digitalWrite( ePin, LOW);
digitalWrite( fPin, HIGH);
digitalWrite( gPin, HIGH);
}

void five()
{
digitalWrite( aPin, HIGH);
digitalWrite( bPin, LOW);
digitalWrite( cPin, HIGH);
digitalWrite( dPin, HIGH);
digitalWrite( ePin, LOW);
digitalWrite( fPin, HIGH);
digitalWrite( gPin, HIGH);
}

void six()
{
digitalWrite( aPin, HIGH);
digitalWrite( bPin, LOW);
digitalWrite( cPin, HIGH);
digitalWrite( dPin, HIGH);
digitalWrite( ePin, HIGH);
digitalWrite( fPin, HIGH);
digitalWrite( gPin, HIGH);
}

void seven()
{
digitalWrite( aPin, HIGH);
digitalWrite( bPin, HIGH);
digitalWrite( cPin, HIGH);
digitalWrite( dPin, LOW);
digitalWrite( ePin, LOW);
digitalWrite( fPin, LOW);
digitalWrite( gPin, LOW);
}

void eight()
{
digitalWrite( aPin, HIGH);
digitalWrite( bPin, HIGH);
digitalWrite( cPin, HIGH);
digitalWrite( dPin, HIGH);
digitalWrite( ePin, HIGH);
digitalWrite( fPin, HIGH);
digitalWrite( gPin, HIGH);
}

void nine()
{
digitalWrite( aPin, HIGH);
digitalWrite( bPin, HIGH);
digitalWrite( cPin, HIGH);
digitalWrite( dPin, HIGH);
digitalWrite( ePin, LOW);
digitalWrite( fPin, HIGH);
digitalWrite( gPin, HIGH);
}

void zero()
{
digitalWrite( aPin, HIGH);
digitalWrite( bPin, HIGH);
digitalWrite( cPin, HIGH);
digitalWrite( dPin, HIGH);
digitalWrite( ePin, HIGH);
digitalWrite( fPin, HIGH);
digitalWrite( gPin, LOW);
}

Nisam stigo ranije da uradim kod, zadrzala me jedna Dunja od 19 gradi.. Smile
Pa ako se i podkrade kakva greska ne zameri...
Reply
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... Big Grin

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?
Reply
(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... Big Grin

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
Reply
Savršeno radi, vrhunski, i peta cifra i sve ostale. Smile

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... Big Grin Big Grin Big Grin
Reply
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.
Reply
Ipak ste me Vi vratili na pravi put, a ja navalio skrenuti i gotovo. Smile

Poručio sam HC595 pa ću se poigrati i sa njim.
Reply
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?
Reply
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.....
Reply
Ok. Probaću ovo što budem mogao, pa ću javiti šta sam uspjeo.
Reply
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 setup()
{
 pinMode(motor1, OUTPUT);                  //Motor1 izlaz pin 2                                        -    
 pinMode(motor2, OUTPUT);                  //Motor2 izlaz pin 3                                        --
 pinMode(motor3, OUTPUT);                  //Motor3 izlaz pin 4                                        --    Konfigurisanje izlaznih pinova
 pinMode(motor4, OUTPUT);                  //Motor4 izlaz pin 5                                        -

 pinMode(motor1uslov, INPUT);              //Uslov motora1 ulaz pin 6                                  -
 pinMode(motor2uslov, INPUT);              //Uslov motora2 ulaz pin 7                                  --
 pinMode(motor3uslov, INPUT);              //Uslov motora3 ulaz pin 8                                  --    Konfigurisanje ulaznih pinova
 pinMode(motor4uslov, INPUT);              //Uslov motora4 ulaz pin 9                                  -

 pinMode(startstop, INPUT);                //Taster Start/Stop ulaz pin 10                             -     Konfigurisanje ulaznog pina

}

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?
Reply
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.
Reply
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.
Reply
@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?
Reply
Koji ti je mcu na tom arduinuvi na kojoj freq radi? Napisacu ti C program, pa ti vidi kako da pretabas na arduino logiku.
Reply
MCU je ATMega328P a čini mi se da radi na 16MHz.
Reply
Sutra ti postavljam program.
Reply


Forum Jump:


Users browsing this thread: 9 Guest(s)