Sari la conținut
ELFORUM - Forumul electronistilor

modificare delay


Vizitator caif

Postări Recomandate

Salut, incerc sa fac un program in care vreau prin apasare repetata a unei taste sa modific delay-ul unui led prin incrementarea cu o valoare stabilita iar prin apasarea altei taste sa scada cu aceeasi valoare cu care a fost incrementata, ideea de la care am pornit este de a folosi fc de delay cu un anumit timp din cadrul WINAVR la care sa adun sau sa scad aceeasi fc cu un alt timp iar in final sa folosesc fc suma sau diferenta. Problema care apare este cea ca nu reusesc sa fac aceste operatii in WINAVR daca ma puiteti ajuta isau aveti alta ideea cum as putea sa o fac :drinkers: .PS: folosesc un atemega16 si WINAVR

Link spre comentariu
  • Răspunsuri 16
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • bogdan_

    6

pai e putin mai complicat.

daca folosesti functiile din avrlib vei vedea in fisierul delay.h ca iti spune acolo ce limite au acele functii(_delay_ms() si _delay_us()).

de exemplu, la _delay_ms(x) x poate fi max 260 si nu stiu cat supra frecventa de quartz in Mhz. pe scurt stiu ca iesea maxim 16ms pentru 16MHz.

ai putea sa faci delayul cu un for

de genu

for(i=0; i

{

functie_delay();

....

}

unde functie_delay() iti introduce un delay egal cu pasul tau pe care vrei sa il folosesti.

la apasarea unui buton creste sau scade valoare intre anumite limite...

Link spre comentariu
Vizitator caif

unsigned delay(){char i; for(i=0;i<5;i++){ _delay_ms(10); } unsigned delai(){char i; for(i=0;i<11;i++){ _delay_ms(10); } } void intarziere(){char i,c,sum,dif;c= usart_rec();if (c==0x31){ delai(); }if(c==0x32){ delay(); } }cam asa am incercat sa fac dar de aici nu prea pot sa maresc sau sa micsorez intarzierea in mod repetat si constant prin apasarea unei singure taste

Link spre comentariu
Vizitator caif

tocmai ce incercai si asta sub forma asta void dela (){ char i,j,h,t,c; c=usart_rec(); t=2;//valoara care se adauga la apasarea tastei h=6;//intarzierea standard if(c==0x31){ h=h+t;// noua intraziere rezultat la apasarea tastei for (i=0;i<2;i++) for(j=0; j

Link spre comentariu

pai nu merge, pentru ca ai declarat variabilele local in functie. adica la terminarea functiei se pierd, cand se apeleaza functia sunt alocate altele. declara-le global...totusi, eu tot nu am reusit sa pricep ce vrei sa faci.ce e de fapt acel delay?vrei sa reglezi instensitatea ledului cu pwm?

Link spre comentariu
Vizitator caif

vreau sa am un leg aprins iar prin apasarea unei singure taste in mod repetat sa se introduca un delay ( ex apasa tasta 1 se introduce 10ms iar 1 ajunge la 20ms si tot asa ) adica sa incrementez delay-ul prin intermediul unei singure taste

Link spre comentariu

oki, vrei sa ai un led aprins, bun. e simplu. dar delay intre ce si ce?ce intarzie acel delay?te rog, explica cat se poate de pe larg ce vrei sa faci... eu nu prea te inteleg.

Link spre comentariu
Vizitator caif

sincer nu stiu cat mai pe larg dar incerc :rolleyes: am stare initiala a unui led - aprins -la apasarea tastei 1 programul se modifica adica ledul se stinge si se aprinde cu o anumita intarziere de ex. 10 ms, daca mai apas inca o data tasta 1 intarzierea se va mari cu inca 5 ms, adica se va calcul asa 10ms +5ms, la o apasare iar a tastei 1 intarzierea va deveni 15+5 si tot asa, iar apoi tasta 2 va face la fel numai ca o ia in sens descrescator adica de la ultima valoare de 20 se scade 5 pana se ajunge la valoare initiala de 10 prin apasare repetat a aceleiasi taste . ceea ce eu nu reusesc e sa memorez valoarea intarzieri rezultate in urma apasari unei taste si sa o folosesc la urmatoarea apasare de fiecare data uC imi da aceeasi valoare scrisa in prog fara a retine valoare obtinuta prin calcul pentru urmatoarea intarziere . sper ca am reusit de data asta sa fiu mai clar

Link spre comentariu

uite ceva de genu ar trebui sa mearga..

void stingere(uint8_t nr){  uint8_t i;  //instr_stins_led;    for(i=0; i<nr; i++)  _delay_ms(5);  //instr_aprins_led;}//uint8_t tasta, num;void main(){uint8_t tasta, num;num = 2;while(1) {tasta = USART_receive;if(tasta == cod_buton_1)     {      if(num<100) num++;      stingere(num);      }if(tasta == cod_buton_2)     {      if(num>2) num--;      stingere(num);      }}}

Variabila num de mai sus poate fi declarata global(adica sus unde e comentata decalaratia) sau in functia main. cum main se executa doar o data inseamna ca si variabila va fi initializata o singura data. de exemplu, sus in functia stingere se foloseste cate un i pentru fiecare apelare de functie, pentru ca i e declarat in functie...nu se pastreaza valoaerea lui i de la una la alta.

mai sus trebuie sa inlocuiesti tu cod_buton_x cu ce vrei, eu am pus delayul intre 2x5 ms si 100x5 ms. ti le schimbi cum vrei. mai trebuie completat si cu #include de rigoare si cu functile pentru usart....

concluzie: variabila care vrei sa iti tina minte "durata" intarzierii declaro global...

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări