Vizitator caif Postat Decembrie 30, 2007 Partajează Postat Decembrie 30, 2007 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
bogdan_ Postat Decembrie 30, 2007 Partajează Postat Decembrie 30, 2007 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 Postat Decembrie 31, 2007 Partajează Postat Decembrie 31, 2007 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 AndreisS Postat Ianuarie 2, 2008 Partajează Postat Ianuarie 2, 2008 mai baga un contor pe care sa il incrementezi cand apesi tasta si pune-l in "for" sa bage delay pana la el.... :smt024 Link spre comentariu
Vizitator caif Postat Ianuarie 2, 2008 Partajează Postat Ianuarie 2, 2008 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
Vizitator AndreisS Postat Ianuarie 2, 2008 Partajează Postat Ianuarie 2, 2008 in loc de "char i,j,h,t,c;" pune "volatile char i,j,h,t,c;" Link spre comentariu
bogdan_ Postat Ianuarie 3, 2008 Partajează Postat Ianuarie 3, 2008 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 Postat Ianuarie 3, 2008 Partajează Postat Ianuarie 3, 2008 nu merge la fel ca si pana acum face prima operatie dupa care o pastreaza toto pe ea indiferent de cat apas pe tasta Link spre comentariu
Vizitator caif Postat Ianuarie 3, 2008 Partajează Postat Ianuarie 3, 2008 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
bogdan_ Postat Ianuarie 3, 2008 Partajează Postat Ianuarie 3, 2008 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 Postat Ianuarie 3, 2008 Partajează Postat Ianuarie 3, 2008 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
bogdan_ Postat Ianuarie 3, 2008 Partajează Postat Ianuarie 3, 2008 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
bogdan_ Postat Ianuarie 4, 2008 Partajează Postat Ianuarie 4, 2008 merge pana la urma? Link spre comentariu
Vizitator caif Postat Ianuarie 5, 2008 Partajează Postat Ianuarie 5, 2008 Nu merge fara sa ii pun o bucla while si atunci e la fel ca la si prog de il scrisesm mai sus incrementeaza o singura data si gata Link spre comentariu
bogdan_ Postat Ianuarie 5, 2008 Partajează Postat Ianuarie 5, 2008 ah, da.... trebuia si o bucla while. n-am fost atent(am modificat si in prog). dar trebuie sa mearga... Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum