Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino - Remote control (RF-TX)
Opet sam malo čačkao oko harvderskog UART-a, nisam se mogao smiriti, dodam ostatak komponenti diodu, kondenzator i otpornike, opet testiram na softverski UART radi fino, napravim kombinaciju softverski i hardverski UART radi opet sa malim kašnjenjem, prebacim oba Arduina na hardverski UART i opet neće. Dok sam onako dirao po breadboard-u odjednom se pojavi prijem pa izgubi i skontam da me je malo bredboard zezao (bili slabi kontakti), riješim to, ali opet nije kako treba i kada sam na prijemnoj strani, moram izbaciti otpornik između TX (HC) -- RX (Arduino) da bih primao poruke preko otpornika neće. Kada sam izbacio otpornik dobio sam prijem ali opet sa zakašnjenjem, onda sam dodao delay(20) na Arduino koji šalje podatke i kašnjenje je nestalo.
Tako sam skontao da je hardver ispravan i da cijelo vrijeme imam problem u kodu, možda mi i ovo pravi problem što neće preko otpornika pa sumnjam da su poruke preduge ili prekratke ili neispravno napisane.? Probao sam i ona dva stara Arduina i oni su ispravni.
Sada sam razgraničio do čega je problem, trebam kod da sređujem, a Vama se od srca zahvaljujem na neiscrpnoj pomoći. Smile
Reply
Sad daj ceo kod da vidimo.
Koliko si vreme osvezavanja stavio za interapt?
Jesi li dodao one ispravke oko stopiranja interapta dok se ne izvrsi postojeci...

kasnije moras da prepravis taj interapt jer sve si nagurao u njega a to nije potrebno i verovatno vreme izvrsavanja koda premasuje vreme do ponovnog interapta i tu ti verovatno lezi najveci deo problema...
Reply
Nisam sad koristio interrupt.
Code:
int LED = 12;
int taster1 = 8;
int taster2 = 9;

void setup() {
 pinMode(LED, OUTPUT);
 pinMode(taster1, INPUT);
 pinMode(taster2, INPUT);
 Serial.begin(9600);
}

void loop() {
       if(digitalRead(8) == HIGH){
       digitalWrite(LED, HIGH);
       Serial.println(1111);
      }
      else{
       Serial.println(0000);
       digitalWrite(LED, LOW);
      }
      if(digitalRead(9) == HIGH){
       Serial.println(2222);
      }
      else{
       taster2test = 0;
       Serial.println(3333);
      }
      delay(20);
}

Prijem.
Code:
int ledPin = 13;
int ledPin2 = A1;

void setup() {
 Serial.begin(9600);
 pinMode(ledPin, OUTPUT);
 pinMode(ledPin2, OUTPUT);
}

void loop() {
 
 if(Serial.available() > 0){
   int input = Serial.parseInt();//read serial input and convert to integer (-32,768 to 32,767)    
   if(input == 1111){//if on code is received
     digitalWrite(ledPin, HIGH);//turn LED on
   }
   if(input == 0000){//if off code is received
     digitalWrite(ledPin, LOW);//turn LED off
   }
   if(input == 2222){
     digitalWrite(ledPin2, HIGH);
   }
   if(input == 3333){
     digitalWrite(ledPin2, LOW);
   }
 }
}

EDIT

Kada sam dodao interrupt sa onim dodacima stopiranja interrupt-a onda opet dobijam ono kašnjenje, tako da nisam dobro interrupt odradio.
Reply
(01-23-2018, 03:18 PM)YuMERA Wrote: Sad daj ceo kod da vidimo.
Koliko si vreme osvezavanja stavio za interapt?
Jesi li dodao one ispravke oko stopiranja interapta dok se ne izvrsi postojeci...

kasnije moras da prepravis taj interapt jer sve si nagurao u njega a to nije potrebno i verovatno vreme izvrsavanja koda premasuje vreme do ponovnog interapta i tu ti verovatno lezi najveci deo problema...

Stopiranje izvrsavanja interapta ne treba nikada raditi. Kao prvo on ima samo jedan izvor interapta, a kao drugo atmega ima vektorske interapte, tako da je prioritet definisan fizicki najnizim adresom. Davno je bilo, pa se ne secam da li bese postoji priority registar gde se definisu. Za zmega znam tacno. Ako zabranis int u toku izvrsenja int-a, onda gubis informaciju o interaptu nizeg prioriteta koji se desio za vreme izvrsavanja interapta viseg prioriteta. Nema fizickog smisla nikakvog.
Reply
(01-23-2018, 05:10 PM)vojinilic Wrote: Stopiranje izvrsavanja interapta ne treba nikada raditi. Kao prvo on ima samo jedan izvor interapta, a kao drugo atmega ima vektorske interapte, tako da je prioritet definisan fizicki najnizim adresom. Davno je bilo, pa se ne secam da li bese postoji priority registar gde se definisu. Za zmega znam tacno. Ako zabranis int u toku izvrsenja int-a, onda gubis informaciju o interaptu nizeg prioriteta koji se desio za vreme izvrsavanja interapta viseg prioriteta. Nema fizickog smisla nikakvog.

Znam ja za to Vojine ali onaj jedan interapt koji je on dao u kome izmedju ostalog salje podatke serijskim putem pomislio sam da vremensko trajanej samog koda u interaptu prevazilazi vreme posle kojeg nastupa novi interapt pa da zbog toga ima preklapanje na ne izvrsenim komandama...Hteo sam time samo da otklonimo i otkrijemo problem oko "kasnjenja" koje spominje.

Ali tvoj info svakako je dobar...
Reply
(01-23-2018, 05:10 PM)vojinilic Wrote: Ako zabranis int u toku izvrsenja int-a, onda gubis informaciju o interaptu nizeg prioriteta koji se desio za vreme izvrsavanja interapta viseg prioriteta. Nema fizickog smisla nikakvog.

Ne bi trebalo da je ovako. Fleg za prekid koji je postavljen nekim događajem ostaje podignut, samo je unutrašnjom logikom onemogućen prekid. Kad ponovo u kodu omogućiš, taj prekid će se i dogoditi. Zato se kod inicijalizacije prekida obično prvo obriše odgovarajući fleg pa se potom omogući i sam prekid da ne bi došlo do lažnog prekida. E sad ja sam Atmele koristio davno, još AVR seriju, pa nisam siguran. Možeš li Vojine ovo da proveriš nekako?
A istina je da nema nekog smisla onemogućavati prekide ako se koriste.
Znam samo da Microchip ima preporuku da se prilikom upisa u interni EEPROM onemoguće svi prekidi brisanjem globalnog interrupt flega ali to je već druga priča.
Reply
Gorane,
u pravu si. Interapt flag ostaje setovan sve dok se ne izvrsi odgovarajuci interapt, ili se rucno ne ocisti. Kod AVR-ova se cisti upisom logicke jedinice na taj flag.
Microchip-ova preporuka za EEPROM je da ne bi doslo do prekida tokom upisa podatka u EEPROM. Mislim da su i ostali proizvodjaci MCU-ova krenuli da preporucuju istu proceduru.
Reply
(01-23-2018, 07:20 PM)YuMERA Wrote: za to Vojine ali onaj jedan interapt koji je on dao u kome izmedju ostalog salje podatke serijskim putem pomislio sam da vremensko trajanej samog koda u interaptu prevazilazi vreme posle kojeg nastupa novi interapt pa da zbog toga ima preklapanje na ne izvrsenim komandama...Hteo sam time samo da otklonimo i otkrijemo problem oko "kasnjenja" koje spominje.

Ali tvoj info svakako je dobar...

@Makso,

ovo sto je YuMERA napisao treba da ti bude vodic za pisanje programa upotrebom interapta.
Moras da definises neki flag koji je inicijalno ociscen. Kada se taster pritisne i izvrsi debounce, onda setujes ovaj flag. U main-u testiras flag i ako je setovan, onda prvo ocistis flag i posaljes podatak .
Reply
@vojinilic

Ovako nešto (ovo pišem brzinski, čisto informativno):
ISR {
if(taster == HIGH){
flag = 1;
}
else{
flag = 0;
}
}

void loop{
if(flag = 1){
Serial.println("poruka/komanda");
}
if(flag = 0){
Serial.println("poruka/komanda");
}
}.
Reply
Makso,

nije ti to bas dobro. flag ce ti uvek biti false i ti ces stalno da saljes komandu. Ovako:

ISR
{TMR_Reload;

if(Taster)
{ if((DebounceCounter++) > 10)
{Flag = TRUE;}
}
else
{DebounceCounter = 0;}
}

void main(void)
{
while(1)
{if(Flag)
{ Flag = FALSE;
Serial.println("Poruka");
}
}
}


Mozda je neka zagrada preskocena. Ovo je samo pokazno.
Reply
To bi trebalo biti ovako:
Code:
int LED = 12;
int taster1 = 8;
int taster2 = 9;
unsigned char taster1test = 0;
unsigned char taster2test = 0;
boolean flag1 = false;

void setup() {
 pinMode(LED, OUTPUT);
 pinMode(taster1, INPUT);
 pinMode(taster2, INPUT);
 Serial.begin(9600);

 // initialize Timer1
 noInterrupts(); // disable all interrupts
 TCCR1A = 0;
 TCCR1B = 0;
 
 TCNT1 = 62535;//49536;//62437;//34286; // preload timer 65536-16MHz/256/2Hz
 TCCR1B |= (0 << CS10 ) | (0 << CS11) | (1 << CS12); //256
 TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt
 interrupts(); // enable all interrupts
}

 ISR(TIMER1_OVF_vect) // interrupt service routine that wraps a user defined function supplied by attachInterrupt
   {
      TCNT1 = 62535; // preload timer
      if(digitalRead(8) == HIGH){
       taster1test++;
        if(taster1test > 3){
         flag1 = true;
         digitalWrite(LED, HIGH);
        }
      }
      else{
       taster1test = 0;
      }
   }

void loop() {
 while(1){
   if(flag1){
     flag1 = false;
     Serial.println(1111);
   }
 }
}
samo nešto sam promašio, jer mi odmah zakuca u while petlju i svijetli mi ledica što sam ja dodao da znam kad je taster aktivan ali ne šalje podatke (ne svijetli mi TX lampica)?
Reply
Nisi nigde pozvao setup() funkciju gde inicijalizujes tmr.
Reply
Stalno gledam u kod i tražim grešku, ali ništa (sad sam ispao glup), timer se inicijalzuje u setup() ako si na to mislio, a po ovome sada on meni samo prihvati da je taster aktivan i ništa se više ne dešava, tu se upali ledica i više se ne gasi?
Reply
A da te pitam, gde si u kodu stavio da se gasi!?! Probaj da je zamolis da se ugasi :-)
Reply
Ako zelis neku promenu na led pri svakom pritisku, onda nipisi led^=1;
Reply
Evo ovako:
else{
taster1test = 0;
digitalWrite(LED, LOW);
}.
Meni ne radi TX, tj, uopšte ne radi Serial koji se nalazu u "if" petlji koja je u "while" petlji, tamo gdje se testira stanje flag1-a?
Reply
Da li se setup funkcija setup nekada pozove? Ne znam kako radi arduino kod. U svim normalnim jezicima moras da pozoves funkciju inicijalizacije. U c-u je to npr.
void main(void)
{setup();
while(1)
{
...
}
}
Reply
Kod Arduina setup() se čita na početku programa i onda prelazi na loop(), bar ja nikad nisam imao potrebe da upisujem setup() u loop(). Kada izbacim while petlju a ostavim samo if petlju onda je radilo?
Reply
Ja stvarno ne znam arduino nacin izvrsavanja programa. Ono sto sam ja pisao je c sintaksa. Moras da budes nacisto sa nacinom izvrsavanja programa na toj platformi.
Reply
Proradilo je. Smile
Umjesto while(1) napišem while(flag1) i radi kako je napisano.
Probaću sa i drugim tasterom.
Da li bi trebao prepraviti nešto na prijemnoj strani ili dodati uz ovu while(flag1) petlju dodati još jednu while() petlju da šalje poruku kada taster nije aktivan, jer iako mi prvi Arduino prestane slati poruku na drugom Arduinu se ledica ugasi nakon 2-3s, ali kada treba aktivirati ledicu nema kašnjenja, radi momentalno?
Reply


Forum Jump:


Users browsing this thread: 7 Guest(s)