Myhayxx Postat Octombrie 6, 2016 Partajează Postat Octombrie 6, 2016 Salutare! Am programelul atasat care as vrea sa functioneze in urmatorul mod: partea de hard contine 3 pushbutton o iesire pentru led si o iesire PWM; cand apas primul buton incrementeaza PWM, al doilea decrementeaza iar al treilea vreau sa-l folosesc pentru aprinderea si stingerea unui led. (Apas odata se aprinde, apas a 2 oara se stinge, a 3-a oara se aprinde si tot asa la infinit) partaea de PWM functioneaza fara probleme insa cand apas butonul pentru led cateodata se aprinde,cateodata nu reactioneaza (se aprinde si se stinge cam cand vrea el, iar daca il tin apasat se tot aprinde si se stinge si nu as vrea sa faca asta.. unsigned short current_duty, old_duty, OnoffState;#define ON 1#define OFF 0void InitMain() {PORTA = 0; TRISA = 0; PORTB = 0; TRISB = 0xff; PORTC = 0; TRISC = 0; TRISD = 0xfd; PWM1_Init(5000);} void main() { InitMain(); current_duty = 20; PWM1_Start(); while (1) { if (RB6_bit) { Delay_ms(10); if(current_duty < 255) { current_duty++; } PWM1_Set_Duty(current_duty); } if (RB7_bit) { Delay_ms(10); if(current_duty > 0) { current_duty--; } PWM1_Set_Duty(current_duty); } if (PORTB.B5) { if (OnOffState == OFF) { OnOffState = ON; } else { OnOffState = OFF; } } if (OnOffState == OFF) { PORTD.B1 = 0; } else { PORTD.B1 = 1; }}} Link spre comentariu
Liviu M Postat Octombrie 6, 2016 Partajează Postat Octombrie 6, 2016 (editat) Este normal, tu nu testezi decat starea actuala butonului, fara sa te verifici daca a mai si fost lasat liber intre timp.Asa ca ar trebui sa mai folosesti o variabila care sa-ti zica daca butonul e deja apasat sau nu.Ceva de genul: boolean butonNeapasata = true; if ((PORTB.B5) && butonNeapasat) { butonNeapasat = false; OnOffState ^= 1; PORTD.B1 = OnOffState & 1; } else { butonNeapasat = true; } Editat Octombrie 6, 2016 de Liviu M Link spre comentariu
tes2000 Postat Octombrie 6, 2016 Partajează Postat Octombrie 6, 2016 Liviu are dreptate dar nici exeplul lui nu e corect, doar incetineste cu /2 , daca tin apasat butonul variabila "butonNeapasat" schimba 0-1-0....Daca tot folosesti mikroc atunci iata un exemplu din librarie: http://download.mikroe.com/documents/compilers/mikroc/pic/help/button_library.htm Link spre comentariu
Myhayxx Postat Octombrie 6, 2016 Autor Partajează Postat Octombrie 6, 2016 o sa incerc si exemplul din librarie sa vedem ce o sa iasa... sunt la nivel de incepator cu programarea si de aceea ma tot blochez in diverse... partea cu PWM-ul am luat-o tot din librarie dar la buton nu m-am gandit. am zis ca trebuie sa fie destul de simplu dar n-a fost asa... Link spre comentariu
tes2000 Postat Octombrie 6, 2016 Partajează Postat Octombrie 6, 2016 Sau de exemplu: if (port){ apasat=1}if (!port && apasat){ schimba stare led apasat = 0}Dar nici asta nu e 100%, tema e sa ghicesti de ce!? (nu e din cauza programarii, e fenomen electric) Link spre comentariu
Myhayxx Postat Octombrie 6, 2016 Autor Partajează Postat Octombrie 6, 2016 (editat) pai fenomenul electric cred ca se refera la "bounce" rezistenta de contact de la pushbutton care se poate anula prin montarea unui condensator ceramic in paralel cu butonul sau soft dar nu stiu cum.. sper ca n-am zis vreo prostie. daca da nu dati prea tare o sa incerc si revin cu detalii. dar nu stiu daca reusesc in seara asta Editat Octombrie 6, 2016 de Myhayxx Link spre comentariu
Liviu M Postat Octombrie 6, 2016 Partajează Postat Octombrie 6, 2016 (editat) doar incetineste cu /2 , Asa e, trebuia sa separ testul butonului de al variabilei. if (PORTB.B5) { if(butonNeapasat){ butonNeapasat = false; OnOffState ^= 1; PORTD.B1 = OnOffState & 1; } } else { butonNeapasat = true; } Editat Octombrie 6, 2016 de Liviu M Link spre comentariu
Myhayxx Postat Octombrie 7, 2016 Autor Partajează Postat Octombrie 7, 2016 (editat) Am incercat si programul din librarie mi-a iesit mie ceva dar nu cum trebuia...pana la urma am luat copy/paste de la Liviu M si merge in sfarsit. Bine are si acest programel o problema: ledul nu se stinge la prima apasare dupa ce porneste programul dar o ia din a doua iar dupa aceea merge perfect. Nu ma deranjeaza. Multumesc celor 2 useri pentru ajutor! Editat Octombrie 7, 2016 de Myhayxx Link spre comentariu
Elison Postat Octombrie 7, 2016 Partajează Postat Octombrie 7, 2016 "ledul nu se stinge la prima apasare dupa ce porneste programul " Se intampla asta cand uiti sa initializezi variabile. Link spre comentariu
Liviu M Postat Octombrie 7, 2016 Partajează Postat Octombrie 7, 2016 Mi s-a ciobit globul de cristral. Link spre comentariu
Elison Postat Octombrie 7, 2016 Partajează Postat Octombrie 7, 2016 butonNeapasata si butonNeapasat sunt chestii diferite. Link spre comentariu
Myhayxx Postat Octombrie 7, 2016 Autor Partajează Postat Octombrie 7, 2016 de atata lucru mi-am dat si eu seama si am corectat Link spre comentariu
Elison Postat Octombrie 7, 2016 Partajează Postat Octombrie 7, 2016 Daca corectai ce este gresit sau incomplet, ledul se aprindea si se stingea exact asa cum ai fi vrut. Link spre comentariu
Myhayxx Postat Octombrie 7, 2016 Autor Partajează Postat Octombrie 7, 2016 (editat) probabil mi-a scpat ceva. cum am mai zis nu sunt expert. am glumit la faza cu sper ca nu te-am suparat. Da cum ziceam nu e asa important ca nu functioneaza, o sa folosesc chestia asta pentru comanda unui trenulet de jucarie si un led care semnalizeaza ceva.. acesta este codul complet: unsigned short current_duty, OnoffState,butonNeapasat;#define false 0#define true 1void InitMain() { PORTA = 0; TRISA = 0; PORTB = 0; TRISB = 0xff; PORTC = 0; TRISC = 0; TRISD = 0xfd; PWM1_Init(5000);} void main() { InitMain(); current_duty = 20; PWM1_Start(); while (1) { if (RB6_bit) { Delay_ms(10); if(current_duty < 255) { current_duty++; } PWM1_Set_Duty(current_duty); } if (RB7_bit) { Delay_ms(10); if(current_duty > 0) { current_duty--; } PWM1_Set_Duty(current_duty); } if (PORTB.B5) { if(butonNeapasat){ butonNeapasat = false; OnOffState ^=1; PORTD.B1 = OnOffState & 1; } } else { butonNeapasat = true; }}} Editat Octombrie 7, 2016 de Myhayxx Link spre comentariu
Liviu M Postat Octombrie 7, 2016 Partajează Postat Octombrie 7, 2016 (editat) Hm, acum am vazut ca mikroc nu are tipul de date bool(ean), asa ca atribuirile false/true sunt aiurea dar merg. Testul de buton si decizia daca sa modifice starea iesirii sunt "activate" de valoarea lui butonNeapasat. Tetstul e if(butonNeapasat){ Dupa cum ii spune si numele, butonApasat trebuie sa fie "adevarat" ca sa se modifice iesirea. Cu alte cuvinte, butonNeapasat trebuie sa fie diferit de 0 (asa e C-ul, 0 e fals, orice altceva e adevarat). Numai ca variabilele neinitializate la declarare sunt in (in C) initializate automat cu... 0/fals. Asa ca ori declari si initializezi variabila direct #define false 0#define true 1#define ON 1#define OFF 0unsigned short current_duty = 0;unsigned short OnoffState = OFF;unsigned short butonNeapasat = true; ori lasi cum e si initializezi cum trebuie in InitMain(), de exemplu void InitMain() { butonNeapasat = true; LE In primul meu post, cel cu butonNeapasata, era declarat si initializat cum trebuie. Editat Octombrie 7, 2016 de Liviu M 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