Sari la conținut
ELFORUM - Forumul electronistilor

probleme program PIC16F877A


Postări Recomandate

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
  • Răspunsuri 21
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

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 de Liviu M
Link spre comentariu

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 :95  dar n-a fost asa...

Link spre comentariu

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 :tryre

o sa incerc si revin cu detalii. dar nu stiu daca reusesc in seara asta

Editat de Myhayxx
Link spre comentariu

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 de Liviu M
Link spre comentariu

Am incercat si programul din librarie mi-a iesit mie ceva dar nu cum trebuia...pana la urma am luat copy/paste :rade:  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 de Myhayxx
Link spre comentariu

probabil mi-a scpat ceva. cum am mai zis nu sunt expert. am glumit la faza cu :wretre 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 de Myhayxx
Link spre comentariu

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 de Liviu M
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