Jump to content
ELFORUM - Forumul electronistilor

probleme program PIC16F877A


Myhayxx
 Share

Recommended Posts

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 to comment
Share on other sites

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;   }
Edited by Liviu M
Link to comment
Share on other sites

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 to comment
Share on other sites

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

Edited by Myhayxx
Link to comment
Share on other sites

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;   }
Edited by Liviu M
Link to comment
Share on other sites

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!

Edited by Myhayxx
Link to comment
Share on other sites

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;  }}}
Edited by Myhayxx
Link to comment
Share on other sites

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.

Edited by Liviu M
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines