Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
zan95 Član
Pridružen-a: Čet 28 Feb 2013 0:36 Prispevkov: 89 Aktiv.: 0.66 Kraj: Grosuplje
|
Objavljeno: Pon Jul 04, 2016 2:12 am Naslov sporočila: Težava pri povečevanju delaya |
|
|
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?
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!
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 |
|
|
elektronik1982 Član
Pridružen-a: Pet 18 Maj 2012 5:53 Prispevkov: 101 Aktiv.: 0.69 Kraj: Maribor
|
Objavljeno: Pon Jul 04, 2016 6:59 am Naslov sporočila: |
|
|
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 |
|
|
zan95 Član
Pridružen-a: Čet 28 Feb 2013 0:36 Prispevkov: 89 Aktiv.: 0.66 Kraj: Grosuplje
|
Objavljeno: Pon Jul 04, 2016 12:50 pm Naslov sporočila: |
|
|
@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 |
|
|
elektronik1982 Član
Pridružen-a: Pet 18 Maj 2012 5:53 Prispevkov: 101 Aktiv.: 0.69 Kraj: Maribor
|
Objavljeno: Pon Jul 04, 2016 2:48 pm Naslov sporočila: |
|
|
@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 |
|
|
zan95 Član
Pridružen-a: Čet 28 Feb 2013 0:36 Prispevkov: 89 Aktiv.: 0.66 Kraj: Grosuplje
|
Objavljeno: Pon Jul 04, 2016 3:14 pm Naslov sporočila: |
|
|
@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 |
|
|
zan95 Član
Pridružen-a: Čet 28 Feb 2013 0:36 Prispevkov: 89 Aktiv.: 0.66 Kraj: Grosuplje
|
Objavljeno: Pon Jul 04, 2016 3:19 pm Naslov sporočila: |
|
|
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 |
|
|
elektronik1982 Član
Pridružen-a: Pet 18 Maj 2012 5:53 Prispevkov: 101 Aktiv.: 0.69 Kraj: Maribor
|
Objavljeno: Pon Jul 04, 2016 3:22 pm Naslov sporočila: |
|
|
Ne bo delalo. Vsaj ne tako, kot bi ti zelel. Poskusi iti po korakih vsako iteracijo for zanke ... |
|
Nazaj na vrh |
|
|
zan95 Član
Pridružen-a: Čet 28 Feb 2013 0:36 Prispevkov: 89 Aktiv.: 0.66 Kraj: Grosuplje
|
Objavljeno: Pon Jul 04, 2016 3:55 pm Naslov sporočila: |
|
|
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 |
|
|
elektronik1982 Član
Pridružen-a: Pet 18 Maj 2012 5:53 Prispevkov: 101 Aktiv.: 0.69 Kraj: Maribor
|
Objavljeno: Pon Jul 04, 2016 4:23 pm Naslov sporočila: |
|
|
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 |
|
|
zan95 Član
Pridružen-a: Čet 28 Feb 2013 0:36 Prispevkov: 89 Aktiv.: 0.66 Kraj: Grosuplje
|
Objavljeno: Pon Jul 04, 2016 4:56 pm Naslov sporočila: |
|
|
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 |
|
Nazaj na vrh |
|
|
zan95 Član
Pridružen-a: Čet 28 Feb 2013 0:36 Prispevkov: 89 Aktiv.: 0.66 Kraj: Grosuplje
|
Objavljeno: Pon Jul 04, 2016 4:59 pm Naslov sporočila: |
|
|
Kako to, da se lahko odšteva pri delayu, glede na to, da naj bi bila načeloma samo konstanta OK? |
|
Nazaj na vrh |
|
|
elektronik1982 Član
Pridružen-a: Pet 18 Maj 2012 5:53 Prispevkov: 101 Aktiv.: 0.69 Kraj: Maribor
|
Objavljeno: Pon Jul 04, 2016 6:50 pm Naslov sporočila: |
|
|
Kateri compiler uporabljas? |
|
Nazaj na vrh |
|
|
zan95 Član
Pridružen-a: Čet 28 Feb 2013 0:36 Prispevkov: 89 Aktiv.: 0.66 Kraj: Grosuplje
|
Objavljeno: Pon Jul 04, 2016 7:14 pm Naslov sporočila: |
|
|
Uporabljam Atmel Studio 7.0 z vgrajenim compilerjem. |
|
Nazaj na vrh |
|
|
RGorazd Član
Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1713 Aktiv.: 7.68 Kraj: Ig
|
Objavljeno: Pon Jul 04, 2016 8:00 pm Naslov sporočila: |
|
|
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 |
|
|
zan95 Član
Pridružen-a: Čet 28 Feb 2013 0:36 Prispevkov: 89 Aktiv.: 0.66 Kraj: Grosuplje
|
Objavljeno: Pon Jul 04, 2016 8:46 pm Naslov sporočila: |
|
|
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 |
|
|
|