Sari la conținut
ELFORUM - Forumul electronistilor

Exercitii programare de la zero


Vizitator ciocanaru

Postări Recomandate

Vizitator ciocanaru

Salutare lume!

Am pornit de la exemplul lui Marsh01 si am incercat sa dezvolt aplicatia in asa fel incat, folosind doar notiunile acumulate pana acum, sa putem "tine aprins" un bec o perioada de timp reglabila in pasi. Am ales pasi de 1 minut si o durata totala de 10 minute. In acelasi timp am incercat sa configurez controlerul sa-mi semnalizele prin aprinderea succesiva a 10 LED-uri in ce pozitie se afla contorul. Mentionez ca este doar un exercitiu in care am folosit DOAR notiunile explicate pana acum, fiind posibil sa existe greseli. Cu siguranta programul poate fi mult mai compact daca s-ar folosi alte functii/variabile etc. Rog pe cei experimentati sa corecteze daca este cazul dar sa aiba in vedere nivelul(notiunile) atins pana acum.

 
void main() {unsigned int timp = 6000;    /*declaram o variabila numita timp, de tip unsigned int - deci poate lua valori intre 0 si 65535                             Aceasta variabila va tine in ea numarul de zeci de milisecunde care va constitui perioada de temporizare.                             Initializam aceasta variabila cu val 6000 care corespunde la 6000 cicluri de 10ms adica 1 minut */const unsigned int tempo = 6000;  /*declaram o constanta numita "tempo" (temporizare), de tip unsigned int - deci poate lua valori intre 0 si 65535                                  Valoarea acestei constante va if adaugata la timpul cronometrat la fiecare apasare de buton. */                                  /*Declaram doua constante ON si OFF ca sa ne fie mai usor de inteles programul*/const unsigned char ON = 1;const unsigned char OFF = 0;/************** INITIALIZARE***************************/CMCON = 0b00000111;  //dezactivam comparatorADCON0 = 0;          //dezactivam ADCADCON1 = 0x6;        //facem toate intrarile analogice, digitale.CVRCON = 0;          //dezactivam referinta variabila de tensiunePIE1 = 0b00000000;   //dezavtivam  "Parallel Slave Port" PSP (pag. 25 datasheets) Bit 7 == 0TRISA = 0b00000001;   //facem INTRARE din pinul2 adica RA0; aici vom avea switch-ul conectatTRISB = 0b00000000;   //facem IESIRE din toti pinii PORTB; aici vom avea releulul si LED-urile conectateTRISD = 0b00011111;   //facem IESIRE din pinii 28-30 ai PORTD, adica RD5-RD7; si aici vom avea LED-uri conectatePORTB = 0b00000000;   //pornim cu releul decuplat si LED-urile stinsePORTD = 0b00000000;   //pornim cu releul decuplat si LED-urile stinse/**************SFARSIT INITIALIZARE********************/      while(1){            if(RA0_bit == 0){         //daca intrarea este LOW      delay_ms(10);             //asteptam 10 milisecunde       if (RA0_bit == 0){       //daca intrarea inca mai este LOW atunci chiar ca avem o apasare reala de switch       RB0_bit = ON;            //actionam releul       RD5_bit = ON;            //aprindem primul LED       while( 1 < timp <6000){  //Daca timpul este mai mic de un minut       if(RA0_bit == 0){        //si in acest timp avem o apasare de buton       delay_ms(10);            //asteptam 10 milisecunde        if(RA0_bit == 0){        //si daca in continuare avem "apasare"        timp = timp + tempo;    //la timpul ramas se adauga valoarea constantei "tempo"        RD6_bit = ON;           //aprindem al doilea  LED (cca 2 min)        }       }       if(timp<6000){RD6_bit = OFF;}       //daca timpul scade sub un minut stinge ledul 2              /*in mod similar se multiplica actiunea pana acolo unde dorim sau cat ne permite controlerul*/       /*in cazul de fata 10 pasi*/              while(6000 < timp <12000){        if(RA0_bit == 0){       delay_ms(10);        if(RA0_bit = 0){        timp = timp + tempo;        RD7_bit = ON;        }       }       }       if(timp<12000){RD7_bit = OFF;}              while(12000 < timp <18000){        if(RA0_bit == 0){       delay_ms(10);        if(RA0_bit == 0){        RB1_bit = ON;        timp = timp + tempo;        }       }       }       if(timp<18000){RB1_bit = OFF;}              while(18000 < timp <24000){        if(RA0_bit == 0){       delay_ms(10);        if(RA0_bit == 0){        RB2_bit = ON;        timp = timp + tempo;        }       }       }       if(timp<24000){RB2_bit = OFF;}              while(24000 < timp <30000){        if(RA0_bit == 0){       delay_ms(10);        if(RA0_bit == 0){        RB3_bit = ON;        timp = timp + tempo;        }       }       }       if(timp<30000){RB3_bit = OFF;}              while(30000 < timp <36000){        if(RA0_bit == 0){       delay_ms(10);        if(RA0_bit == 0){        RB4_bit = ON;        timp = timp + tempo;        }       }       }if(timp<36000){RB4_bit = OFF;}              while(36000 < timp <42000){        if(RA0_bit == 0){       delay_ms(10);        if(RA0_bit == 0){        RB5_bit = ON;        timp = timp + tempo;        }       }       }       if(timp<42000){RB5_bit = OFF;}              while(42000 < timp <48000){        if(RA0_bit == 0){       delay_ms(10);        if(RA0_bit == 0){        RB6_bit = ON;        timp = timp + tempo;        }       }       }       if(timp<48000){RB6_bit = OFF;}              while(48000< timp <54000){        if(RA0_bit == 0){       delay_ms(10);        if(RA0_bit == 0){        timp = timp + tempo;        RB7_bit = ON;        }       }       }       if(timp<54000){RB7_bit = OFF;}                timp = timp-1;                   //variabila timp scade (se decrementeaza)        delay_ms(10);                    //asteptam 10 milisecunde (esential in temporizarea de fara)               }       if(timp = 0){                    //cand timpul este egal cu 0       RB0_bit = OFF;                   //dezarmam releul       RD5_bit = OFF;                   //stingem ledul 1       timp = 6000;}                    //readucem variabila timp la starea initiala       }      }      }}

 

Editat de ciocanaru
Link spre comentariu

Mai uita-te pe la egaluri. Nu m-am uitat prea atent, asta mi-a sarit in ochi repede.

       while( 1 < timp <6000){  //Daca timpul este mai mic de un minut       if(RA0_bit == 0){        //si in acest timp avem o apasare de buton       delay_ms(10);            //asteptam 10 milisecunde        if(RA0_bit = 0){        //si daca in continuare avem "apasare"        timp = timp + tempo;    //la timpul ramas se adauga valoarea constantei "tempo"        RD6_bit = ON;           //aprindem al doilea  LED (cca 2 min)        }       }

Pe de alta arte, la ce-s utile doo if(RA0_bit == 0) unul dupa altul?

Link spre comentariu
Vizitator ciocanaru

Multumesc, am editat(corectat).{Of... Un egal tot mi-a scapat}

 

Pe de alta arte, la ce-s utile doo if(RA0_bit == 0) unul dupa altul?

Se executa un "debounce"...

Editat de ciocanaru
Link spre comentariu

He, he, ai dreptate, nu m-am gandit destul... Ma rog, era suficient sa citesc comentariul, da' cum eram la serviciu. Concluzia - nu mai postez de la serviciu.

Editat de Liviu M
Link spre comentariu
Vizitator ciocanaru

Salutare din nou!

Desi mi-am luat papara binemeritata dupa ce am "poluat" topicul de curs, sa stiti ca nu am renuntat. De data aceasta, cu norocul sa am asa mentori, am de gand sa ma imprietenesc serios cu microcontrolerele. Asa ca voi exersa, cu greselile inerente, pana o voi scoate la capat.

Am pornit de la exemplul lui Marsh01 si am incercat sa dezvolt aplicatia in asa fel incat, folosind doar notiunile acumulate pana acum, sa putem "tine aprins" un bec o perioada de timp reglabila in pasi. Am ales pasi de 1 minut si o durata totala de 10 minute. In acelasi timp am incercat sa configurez controlerul sa-mi semnalizele prin aprinderea succesiva a 10 LED-uri in ce pozitie se afla contorul. Mentionez ca este doar un exercitiu in care am folosit DOAR notiunile explicate pana acum, fiind posibil sa existe greseli. Cu siguranta programul poate fi mult mai compact daca s-ar folosi alte functii/variabile etc. Rog pe cei experimentati sa corecteze daca este cazul dar sa aiba in vedere nivelul(notiunile) atins pana acum.

void main() {  /*declaram o variabila numita timp, de tip unsigned int - deci poate lua valori intre 0 si 65535  Aceasta variabila va tine in ea numarul de zeci de milisecunde care va constitui perioada de temporizare.  Initializam aceasta variabila cu val 6000 care corespunde la 6000 cicluri de 10ms adica 1minut */  unsigned int timp = 6000;  const unsigned int tempo = 6000;  //declaram si initializam o constanta numita tempo cu ajutorul careia vom "pasi"  /*Declaram doua constante ON si OFF ca sa ne fie mai usor de inteles programul*/  const unsigned char ON = 1;  const unsigned char OFF = 0;  /************** INITIALIZARE***************************/  CMCON = 0b00000111;  //dezactivam comparator  ADCON0 = 0;          //dezactivam ADC  ADCON1 = 0x6;        //totuna cu ADCON1 = 0x00000110; facem toate intrarile analogice, digitale.  CVRCON = 0;          //dezactivam referinta variabila de tensiune  PIE1 = 0b00000000;   //dezactivam "Parallel Slave Port" PSP (pag. 25 datasheets) Bit 7 == 0TRISA = 0b00000001;   //facem INTRARE din pinul2 adica RA0; aici vom avea switch-ul conectatTRISB = 0b00000000;   //facem IESIRE din toti pinii PORTB; aici vom avea releulul si LED-urile conectateTRISD = 0b00011111;   //facem IESIRE din pinii 28-30 ai PORTD, adica RD5-RD7; si aici vom avea LED-uri conectatePORTB = 0b00000000;   //pornim cu releul decuplat si LED-urile stinsePORTD = 0b00000000;   //pornim cu LED-urile stinse  /**************SFARSIT INITIALIZARE********************/  /*urmeaza bucla infinita  */    while(1) {    if (RA0_bit == 0) {   //daca intrarea este LOW      delay_ms(10);       //asteptam 10 milisecunde      if (RA0_bit == 0) { //daca intrarea inca mai este LOW atunci chiar ca avem o apasare reala de switch        RB0_bit = ON;     //actionam releul        RD7_bit = ON;     //aprindem primul LED        while (timp != 0) {     //cat timp timpul este diferit de zero          /*Urmatoarele doua conditii if(expresie) se folosesc pentru ca daca in timpul de asteptare mai apasam          pe buton, la timpul trecut se aduna valoarea constantei "tempo"*/          if (RA0_bit == 0) {   //daca intrarea  este LOW            delay_ms(300);       //asteptam 300 milisecunde            if (RA0_bit == 0) { //daca intrarea inca mai este LOW atunci chiar ca avem o apasare reala de switch             if(timp<59535){    //daca timpul e mai mic de 59535              timp = timp + tempo ; //adunam la timpul trecut valoarea constantei              }            }          }                    /* urmatoarele functii aprind si sting LED-uri in functie de valoarea variabilei timp;             Ne folosim de LED-uri pentru a sti cat timp mei este de trecut. */                    if (timp > 6000){            RD6_bit = ON;           }            if (timp < 6000){              RD6_bit = OFF;             }           if (timp > 11999){           RD5_bit = ON;          }            if (timp <12000){             RD5_bit = OFF;            }             if (timp>17999){              RB7_bit = ON;             }              if (timp < 18000){               RB7_bit = OFF;              }                if (timp > 23999){                 RB6_bit = ON;                }                  if (timp < 24000){                   RB6_bit = OFF;                  }                   if (timp > 29999){                    RB5_bit = ON;                   }                    if (timp < 30000){                     RB5_bit = OFF;                    }                     if (timp > 35999){                      RB4_bit = ON;                     }                      if (timp < 36000){                       RB4_bit = OFF;                      }                       if (timp > 41999){                        RB3_bit = ON;                       }                        if (timp < 42000){                         RB3_bit = OFF;                        }                         if (timp > 47999){                          RB2_bit = ON;                         }                          if (timp < 48000){                           RB2_bit = OFF;                          }                           if (timp > 53999){                            RB1_bit = ON;                           }                            if (timp <54000){                             RB1_bit = OFF;                            }                       if (timp > 60000){   //Daca timpul progtamat depaseste 10 minute                        timp = 60000;       //Ajustam valoarea la 10 minute.                       }                                //variabila timp va scadea cu o unitate pentru fiecare 10ms care trec          timp = timp - 1;      // sau se poate scrie timp--;          delay_ms(10);         //aceasta este intarzierea esentiala pentru cronometrarea timpului cat releul sta aprins        }        RB0_bit = OFF;          //timpul cat releul trebuie sa stea ON a trecut si acum facem releul OFF        RD7_bit = OFF;          //timpul cat LED-ul trebuie sa stea ON a trecut si acum facem LED-ul OFF        timp = 6000;            //refacem valoare initiala a variabilei timp      }    }  }}

Simulat in Proteus (l-am instalat ieri sa pot verifica ce "programez") functioneaza ok.

Link spre comentariu
Vizitator ciocanaru
PIE1 = 0b00000000;   //dezactivam "Parallel Slave Port" PSP (pag. 25 datasheets) Bit 7 == 0

M-am uitat in datasheets si am considerat ca trebuie sa dezactivez Paralel Slave Port prin aducerea bitului 7 al registrului PIE1  la 0. I-am adus pe toti.

if(timp<59535){    //daca timpul e mai mic de 59535

Am introdus si aceasta conditie pentru a nu depasi valoarea maxima ce o poate lua variabila timp. ( Este de tip unsigned int cu valoari intre 0 si 65535) Daca timpul ar fi mai mare decat valoarea din conditia pusa, sa presupunem 59800, si am incerca sa adaugam valoarea constantei (6000) am ajunge la 65800 care de fapt, la tipul acesta de variabila, este tot una cu 256. (Spune si Mars01 in "lectii").

if (timp > 60000){   //Daca timpul programat depaseste 10 minute timp = 60000;       //Ajustam valoarea la 10 minute.}

Exista posibilitatea ca in timpul manevrearii timpul sa depaseasca 60000. Sa presupunem ca valoarea lui este 55000. Indeplineste conditia pusa pentru a putea fi incrementat, se adauga tempo (6000) si ajunge la 61000. In acest caz programul functioneaza doar ca timpul masurat va fi ceva mai lung.

 if (RA0_bit == 0) {    //daca intrarea  este LOW   delay_ms(300);       //asteptam 300 milisecunde if (RA0_bit == 0) {    //daca intrarea inca mai este LOW atunci chiar ca avem o apasare reala de switch

Am marit asteptarea in cazul apasarii butonului. Trebuie astfel sa apasam putin mai "lung"pentru a adauga un pas si avem timp sa ne oprim acolo unde vrem.

Imi propun sa adaug un buton pentru scaderea timpului pas cu pas, unul care sa opreasca imediat functiomarea (nu OFF alimentare :)) si eventual unul care sa schimbe timpii pasilor in ore, zile... etc.

Daca aveti si alte idei despre ce s-ar mai putea face cu notiunile studiate pana acum, nu va sfiiti, dati-mi "teme" de facut.

Link spre comentariu

Salut,

 

                    if (timp > 6000){            RD6_bit = ON;           }            if (timp < 6000){              RD6_bit = OFF;             }           if (timp > 11999){           RD5_bit = ON;          }

 

Inainte sa te apuci sa scrii codul, incearca sa-l "compui" cat mai clar "pe romaneste". Daca ne uitam la pragurile de timp, avem mai mic de 6000, intre 6000 si 12000...Pe romaneste probabil cel mai bine suna in genul

Daca timp e mai mic decat 6000, atunci ...altfel, daca timp e mai mic decat 12000 atunci...altfel, daca timp e mai mic decat...

Transcris in cod, asta iese
   if(timp < 6000){     ...   } else if(timp < 12000){     ...   } else if(timp < 18000){     ...   }...
Scris sub forma asta, cred ca codul va fi mai clar, mai usor de urmarit.PS Nu e cazul sa indentezi cand nu e cazul. Editat de Liviu M
Link spre comentariu
Vizitator ciocanaru

of... ai dreptate. Am uitat de else if ... Sunt bucuros insa ca am sris si eu primul programel in care inteleg rolul fiecarei litere/cifre din cod :d Mai este loc garla de imbunatatit, dar macar acum am ce. Maine ma apuc sa-l recompun. Multumesc pentru observatii.

Link spre comentariu
Vizitator ciocanaru

A durat ceva mai mult pana am avut timp sa-mi continui exercitiile dar pana la urma am reusit. M-am tot gandit la varianta sugerata de Liviu, ba chiar am incercat-o, dar nu functioneaza asa cum imi doresc. Daca prima conditie IF este indeplinita, toate celelalte "else if" sunt ignorate, sau daca oricare dintre ELSE if e indeplinita, celelalte sunt ignorate. Ori eu vreau sa am aprinse toate LED-urile pana la valoarea setata. Asadar am lasat functii IF ("daca" timpul e asa, fa cutare) pentru fiecare prag. Functioneaza ca un VU-metru :d. (Mi-am dat seama si cum sa fac sa se aprinda doar ledul corespunzator pragului setat, ""lumina mobila"")

Nu m-am oprit aici, am adaugat un buton pentru scaderea timpului si inca unul pentru oprirea imediata a releului. Pun codul si revin cu explicatiile:

void main() {  /*declaram o variabila numita timp, de tip unsigned int - deci poate lua valori intre 0 si 65535  Aceasta variabila va tine in ea numarul de zeci de milisecunde care va constitui perioada de temporizare.  Initializam aceasta variabila cu val 6000 care corespunde la 6000 cicluri de 10ms adica 1minut */  unsigned int timp = 6000;  const unsigned int tempo = 6000;  //declaram si initializam o constanta numita tempo cu ajutorul careia vom "pasi"  /*Declaram doua constante ON si OFF ca sa ne fie mai usor de inteles programul*/  const unsigned char ON = 1;  const unsigned char OFF = 0;  /************** INITIALIZARE***************************/  CMCON = 0b00000111;  //dezactivam comparator  ADCON0 = 0;          //dezactivam ADC  ADCON1 = 0x6;        //totuna cu ADCON1 = 0x00000110; facem toate intrarile analogice, digitale.  CVRCON = 0;          //dezactivam referinta variabila de tensiune  PIE1 = 0b00000000;   //dezactivam "Parallel Slave Port" PSP (pag. 25 datasheets) Bit 7 == 0  TRISA = 0b00000111;   //facem INTRARI din pinii 2, 3 si 4 adica RA0, RA1 si RA2; aici vom avea switch-uri conectate  TRISB = 0b00000000;   //facem IESIRE din toti pinii PORTB; aici vom avea releulul si LED-urile conectate  TRISD = 0b00011111;   //facem IESIRE din pinii 28-30 ai PORTD, adica RD5-RD7; si aici vom avea LED-uri conectate  PORTB = 0b00000000;   //pornim cu releul decuplat si LED-urile stinse  PORTD = 0b00000000;   //pornim cu LED-urile stinse  /**************SFARSIT INITIALIZARE********************/  /*urmeaza bucla infinita  */  while(1) {    if (RA0_bit == 0) {   //daca intrarea este LOW      delay_ms(10);       //asteptam 10 milisecunde      if (RA0_bit == 0) { //daca intrarea inca mai este LOW atunci chiar ca avem o apasare reala de switch        RB0_bit = ON;     //actionam releul        RD7_bit = ON;     //aprindem primul LED        while (timp != 0) {     //cat timp timpul este diferit de zero          /*Urmatoarele trei conditii if(expresie) se folosesc pentru a adauga la timpul trecut valoarea constantei "tempo"           daca si numai daca sunt indeplinite toate trei. Buton real apasat si timpul mai mic decat 59535*/          if (RA0_bit == 0) {       //daca intrarea  este LOW            delay_ms(300);          //asteptam 300 milisecunde            if (RA0_bit == 0) {     //daca intrarea inca mai este LOW atunci chiar ca avem o apasare reala de switch             if(timp<59535){        //daca timpul e mai mic de 59535              timp = timp + tempo ; //adunam la timpul trecut valoarea constantei              }            }          }          /*Urmatoarele trei conditii if(expresie) se folosesc pentru a scadea din timpul trecut valoarea constantei "tempo"          daca si numai daca sunt indeplinite toate trei. Buton real apasat si timpul mai mare decat 6001*/            if (RA1_bit == 0){          //daca intrarea este LOW             delay_ms(300);             //asteptam 300 milisecunde              if (RA1_bit == 0){        //daca intrarea inca mai este LOW atunci chiar ca avem o apasare reala de switch                if (timp > 6001){       //daca timpul e mai mare decat 6001                 timp = timp - tempo;   //scadem din timpul trecut valoarea constantei                }              }            }                  //Daca urmatoarea conditie este indeplinita se dezarmeaza releul si se sting toate LED-urile; Buton OFF             if(RA2_bit == 0){      //daca intrarea este LOW (nu este necesar debounce)              timp = 1;             //timpul egal cu 1             }                                              /* urmatoarele functii aprind si sting LED-uri in functie de valoarea variabilei timp;             Ne folosim de LED-uri pentru a sti cat timp mei este de trecut. */              if (timp > 6000){                  RD6_bit = ON;}              if (timp > 11999){                  RD5_bit = ON;}              if (timp > 17999){                  RB7_bit = ON;}              if (timp > 23999){                  RB6_bit = ON;}              if (timp > 29999){                  RB5_bit = ON;}              if (timp > 35999){                  RB4_bit = ON;}              if (timp > 41999){                  RB3_bit = ON;}              if (timp > 47999){                  RB2_bit = ON;}              if (timp > 53999){                  RB1_bit = ON;}              if (timp <6000){                  RD6_bit = OFF;}              if (timp < 12000){                  RD5_bit = OFF;}              if(timp < 18000){                  RB7_bit = OFF;}              if (timp < 24000){                  RB6_bit = OFF;}              if (timp < 30000){                  RB5_bit = OFF;}              if (timp < 36000){                  RB4_bit = OFF;}              if (timp < 42000){                  RB3_bit = OFF;}              if (timp <48000){                  RB2_bit = OFF;}              if (timp < 54000){                  RB1_bit = OFF;}              if (timp > 60000){      //Daca timpul programat depaseste 10 minute                  timp = 60000;       //Ajustam valoarea la 10 minute.                 }                                //variabila timp va scadea cu o unitate pentru fiecare 10ms care trec          timp = timp - 1;      // sau se poate scrie timp--;          delay_ms(10);         //aceasta este intarzierea esentiala pentru cronometrarea timpului cat LED-ul sta aprins        }        RB0_bit = OFF;          //timpul cat releul trebuie sa stea ON a trecut si acum facem releul OFF        RD7_bit = OFF;          //timpul cat LED-ul trebuie sa stea ON a trecut si acum facem LED-ul OFF        timp = 6000;            //refacem valoare initiala a variabilei timp      }    }  }}
            if (RA1_bit == 0){          //daca intrarea este LOW             delay_ms(300);             //asteptam 300 milisecunde              if (RA1_bit == 0){        //daca intrarea inca mai este LOW atunci chiar ca avem o apasare reala de switch                if (timp > 6001){       //daca timpul e mai mare decat 6001                 timp = timp - tempo;   //scadem din timpul trecut valoarea constantei                }              }            }

Smilar cu incrementarea facem si decrementarea. Daca avem o apasare reala de buton, atunci scadem "tempo" din timp. A treia conditie,timp > 6001 este pusa pentru a nu scadea sub zero, ceea ce ar fi similar cu mutarea spre 65535. Dece 6001 si nu 6000?! Sa presupunem ca reusim sa apasam pe "minus" fix in acel moment cand mai sunt exact 6000 ms.Scadem valoarea lui "tempo" (adica 6000) si rezulta timp = 0. Este bine?! Pai nu e. Pana la iesirea din bucla mai trebuie executat

timp = timp - 1;      // sau se poate scrie timp--;delay_ms(10);         //aceasta este intarzierea esentiala pentru cronometrarea timpului cat LED-ul sta aprins

si asta inseamna ca timp = 0 minus 1 adica 65535... departe de ce voiam noi.

Similar "butonul de OFF" nu duce timpul la 0 ci la 1 (atentie, sunt valori zecimale, NU binare)

if(RA2_bit == 0){      //daca intrarea este LOW (nu este necesar debounce) timp = 1;             //timpul egal cu 1 }
Link spre comentariu

 

Functioneaza ca un VU-metru :d.

Recunosc ca n-am avut rabdare sa descifrez tot programul initial. Sorry, ai dreptate, cum am scris eu nu avea cum sa functioneze.

Link spre comentariu
Vizitator ciocanaru

Multumesc inca odata lui Vezi Muti pentru sugestie. In locul acelor multe functii "if" care aprindeau si stingeau LED-urile merge foarte bine mult mai elegantul cod:

              RD6_bit = (timp>6000);         // daca "timp"  mai mare de 6000, 12000, 18000 etc.              RD5_bit = (timp>12000);        // este adevarat atunci expresia dintre parantze              RB7_bit = (timp>18000);        // este adevarata adica TRUE. Stim ca TRUE = 1 logic              RB6_bit = (timp>24000);        // si FALSE = 0 logic. In consecinta pinii corespondenti              RB5_bit = (timp>30000);        // lui RD6, RD5, RB7 etc. trec in 1 sau 0 logic in              RB4_bit = (timp>36000);        // functie de adevarul sau neadevarul dintre paranteze si              RB3_bit = (timp>42000);        // LED-urile se aprind sau se sting proportional cu              RB2_bit = (timp>48000);        // valoarea variabilei "timp"              RB1_bit = (timp>54000);
Link spre comentariu

@ciocanaru:

scapi de jumatate din comparartii asa:

 

RD6_bit=(timp > 6000);

RD5_bit=(timp > 11999);

...

RB1_bit=(timp > 53999);

 

intelegi ce vreau sa zic?

 

Buna smecheria :)

 

Eu ma gandeam eventual la utilizarea operatorului ternar gen:

RD6_bit = (timp > 6000 ? 1 : 0);

Dar e mult mai elegant si mai scurt cum a scris @Vezi_Muti ....

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