www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Težava pri povečevanju delaya

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
zan95
Član
Član



Pridružen-a: Čet 28 Feb 2013 0:36
Prispevkov: 89
Aktiv.: 0.66
Kraj: Grosuplje

PrispevekObjavljeno: Pon Jul 04, 2016 2:12 am    Naslov sporočila:  Težava pri povečevanju delaya Odgovori s citatom

Pozdravljeni!

Zadnje čase sem se začel malce bolj ukvarjati s C-jem (popoln začetnik) oz. se ga predvsem dobro naučiti, pa se mi je ustavilo pri povečevanju delaya. Zaporedoma prižigam posamezne barve na RGB traku z določenim zamikom. Ta zamik pa želim z vsakim novim štetjem zanke povečati za n-krat oz. za n milisekund. Poskušal sem z novo funkcijo in for zanko pa nikakor ni šlo. Če dam break ali return, ostane delay na 100ms, če pa ne pa se zanka zvrti in imam 1 sekundo. Poskušal sem tudi s for zanko v main kodi, pa sem dobil enak rezultat. Ne razumem, kako bi ohranil prejšnjo vrednost delaya in ji prištel novo? Sad
Ali ima for zanka v funkciji sploh učinek, da povečuje delay ali samo šteje in delay ostaja enak? Vrednosti v funkciji _delay_ms pa morajo na mojo žalost biti samo konstante.

Prosil bi za pomoč. Hvala! Smile

Moja funkcija
void delay_cont ()
{ int f;
for(f=0; f<10; f++)
{
_delay_ms(100);
break;
}
}

Tole je v main funkciji:
for(i=0;i<11;i++)
{
PORTA =0;
//PORTA = 0xC0; // PA6/7
PORTA = 0x40;
delay_cont();
PORTA =0;
PORTA = 0x80;
delay_cont();
PORTA =0;
PORTB = 0x04;// PB2
delay_cont();
PORTB =0;

}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
elektronik1982
Član
Član



Pridružen-a: Pet 18 Maj 2012 5:53
Prispevkov: 101
Aktiv.: 0.70
Kraj: Maribor

PrispevekObjavljeno: Pon Jul 04, 2016 6:59 am    Naslov sporočila:   Odgovori s citatom

Tako, kot imaš sedaj for zanka v delay funkciji ne opravlja velikega dela, saj se ti pri prvi iteraciji zaključi z ukazom break.

Če bi želel povečevati delay, na vsakem koraku for zanke v main funkciji, lahko delay funkcijo definiras kot:
- void delay_cont (unsigned char x) , potem pa v for zanki uporabis argument x:
for(f=0; f<x; f++)

V main funkciji nato delay_cont kličeš z argumentom i:
delay_cont(i)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
zan95
Član
Član



Pridružen-a: Čet 28 Feb 2013 0:36
Prispevkov: 89
Aktiv.: 0.66
Kraj: Grosuplje

PrispevekObjavljeno: Pon Jul 04, 2016 12:50 pm    Naslov sporočila:   Odgovori s citatom

@elektronik1982

Če želim, da se zanka ne ponavlja vnedogled, moram določiti x? Ga določim kot notranjo spremenljivko?
Zakaj kličem funkcijo z argumentom i?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
elektronik1982
Član
Član



Pridružen-a: Pet 18 Maj 2012 5:53
Prispevkov: 101
Aktiv.: 0.70
Kraj: Maribor

PrispevekObjavljeno: Pon Jul 04, 2016 2:48 pm    Naslov sporočila:   Odgovori s citatom

@zan95: Z x-om določiš dolžino tvoje zakasnitve (se pravi x*_delay_ms(100)), ampak moras odstraniti break. Ker je x podan kot argument funkcije delay_cont pomeni, da je že lokalno definiran, njegova vrednost pa je vrednost argumenta, ki ga podaš v for zanki main funkcije. Pseudo koda bi izgledala takole:

Koda:

delay_cont(x)
  for i=0; i<x; i++
    delay_ms(100);

main()
  for i=0; i<10; i++
    vklopi RGB
    delay_cont(i)
    izklopi RGB
    delay_cont(i)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
zan95
Član
Član



Pridružen-a: Čet 28 Feb 2013 0:36
Prispevkov: 89
Aktiv.: 0.66
Kraj: Grosuplje

PrispevekObjavljeno: Pon Jul 04, 2016 3:14 pm    Naslov sporočila:   Odgovori s citatom

@elektronik1982

Hvala, koda deluje, kaj pa v obratni smeri, da bi delay zmanjševal? Nekje moram potem določiti prvotno vrednost delaya in od nje odštevati?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
zan95
Član
Član



Pridružen-a: Čet 28 Feb 2013 0:36
Prispevkov: 89
Aktiv.: 0.66
Kraj: Grosuplje

PrispevekObjavljeno: Pon Jul 04, 2016 3:19 pm    Naslov sporočila:   Odgovori s citatom

Bi lahko potem naredil takole?

Koda:

delay_cont(x)
  for i=10; i>x; i--
    delay_ms(100);

main()
  for i=0; i<10; i++
    vklopi RGB
    _delay_ms(1000)
    delay_cont(i)
    izklopi RGB
    _delay_ms(1000)
    delay_cont(i)
 
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
elektronik1982
Član
Član



Pridružen-a: Pet 18 Maj 2012 5:53
Prispevkov: 101
Aktiv.: 0.70
Kraj: Maribor

PrispevekObjavljeno: Pon Jul 04, 2016 3:22 pm    Naslov sporočila:   Odgovori s citatom

Ne bo delalo. Vsaj ne tako, kot bi ti zelel. Poskusi iti po korakih vsako iteracijo for zanke ...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
zan95
Član
Član



Pridružen-a: Čet 28 Feb 2013 0:36
Prispevkov: 89
Aktiv.: 0.66
Kraj: Grosuplje

PrispevekObjavljeno: Pon Jul 04, 2016 3:55 pm    Naslov sporočila:   Odgovori s citatom

Ja v bistvu je tisti dodani delay totalna bedarija. Sem naredil takole, pa deluje:
Upam, da nisem preveč zahteven in da je to eno izmed zadnjih vprašanj glede tega. V tem primeru lahko operiram le z delayem, ki sem ga podal 100ms. Kako bi podal delay, ki ni večkratnik mojega 100 milisekundnega. Recimo, da bi začel z delayem 1 sekunde in s korakom 30ms odšteval do željene vrednosti. Recimo da bi zanko zavrtel 30x in bi prišel na delay 100ms.

Koda:

main()
  for i=10; i>0; i--
    vklopi RGB
    delay_cont(i)
    izklopi RGB
    delay_cont(i)



Koda:

delay_cont(x)
  for i=0; i<x; i++
    delay_ms(100);
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
elektronik1982
Član
Član



Pridružen-a: Pet 18 Maj 2012 5:53
Prispevkov: 101
Aktiv.: 0.70
Kraj: Maribor

PrispevekObjavljeno: Pon Jul 04, 2016 4:23 pm    Naslov sporočila:   Odgovori s citatom

Načeloma, če bi samo rad rešil ta problem in to ni kakšna šolska naloga pri kateri moraš uporabiti funkcije lahko problem rešiš takole:

Koda:

main()
  for i=0; i<30; i++
    vklopi RGB
    delay_ms(1000 - (30*i))
    izklopi RGB
    delay_ms(1000 - (30*i))


Če pa je šolska naloga pa upam, da ti uspe.


Nazadnje urejal/a elektronik1982 Pon Jul 04, 2016 6:53 pm; skupaj popravljeno 2 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
zan95
Član
Član



Pridružen-a: Čet 28 Feb 2013 0:36
Prispevkov: 89
Aktiv.: 0.66
Kraj: Grosuplje

PrispevekObjavljeno: Pon Jul 04, 2016 4:56 pm    Naslov sporočila:   Odgovori s citatom

V bistvu bi rad razrešil ta problem in se nekaj naučil iz tega. Postopoma bi se naučil C skozi svoje ideje. Trenutno se igram z rgb trakom, zdaj, ko sem razrešil ta vprašanja grem počasi na pwm.
Za šolski projekt bom delal AD pretvorbo s fft-jem in naslovljivimi LEDicami (VU meter), tako da tole ne bo prišlo v poštev Smile
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
zan95
Član
Član



Pridružen-a: Čet 28 Feb 2013 0:36
Prispevkov: 89
Aktiv.: 0.66
Kraj: Grosuplje

PrispevekObjavljeno: Pon Jul 04, 2016 4:59 pm    Naslov sporočila:   Odgovori s citatom

Kako to, da se lahko odšteva pri delayu, glede na to, da naj bi bila načeloma samo konstanta OK?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
elektronik1982
Član
Član



Pridružen-a: Pet 18 Maj 2012 5:53
Prispevkov: 101
Aktiv.: 0.70
Kraj: Maribor

PrispevekObjavljeno: Pon Jul 04, 2016 6:50 pm    Naslov sporočila:   Odgovori s citatom

Kateri compiler uporabljas?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
zan95
Član
Član



Pridružen-a: Čet 28 Feb 2013 0:36
Prispevkov: 89
Aktiv.: 0.66
Kraj: Grosuplje

PrispevekObjavljeno: Pon Jul 04, 2016 7:14 pm    Naslov sporočila:   Odgovori s citatom

Uporabljam Atmel Studio 7.0 z vgrajenim compilerjem.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1712
Aktiv.: 7.71
Kraj: Ig

PrispevekObjavljeno: Pon Jul 04, 2016 8:00 pm    Naslov sporočila:   Odgovori s citatom

AVRStudio uporablja GCC prevajalnik.


Pri takih stvareh je dobro, da določiš neke zgornje in spodnje margine, saj nočeš, da bi imel delay (-1). Tako da je fajn, da rečeš if(x<xmin) x = xmin; in seveda enako za max. Ni to sicer ravno kritično, je pa dobra praksa, še posebej ko se ti nekaj zatakne, pa potem ne veš več kje se te glava drži.

LP G

_________________
.
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
zan95
Član
Član



Pridružen-a: Čet 28 Feb 2013 0:36
Prispevkov: 89
Aktiv.: 0.66
Kraj: Grosuplje

PrispevekObjavljeno: Pon Jul 04, 2016 8:46 pm    Naslov sporočila:   Odgovori s citatom

Se pravi je priporočljivo, da postavim še te meje. To verjetno pride prav v primeru odštevanja, če bi odšteval prevelik delay oz. ga tolikokrat odštel in bi prišel pod 0?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 49 dni


Powered by phpBB © 2001, 2005 phpBB Group