Jump to content


Photo

Exercitii programare de la zero


  • Please log in to reply
99 replies to this topic

#1 OFFLINE   ciocanaru

ciocanaru

    Nou venit

  • Membri
  • Pip
  • 26 posts

Posted 09 February 2016 - 06:19 PM

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 comparator
ADCON0 = 0;          //dezactivam ADC
ADCON1 = 0x6;        //facem toate intrarile analogice, digitale.
CVRCON = 0;          //dezactivam referinta variabila de tensiune
PIE1 = 0b00000000;   //dezavtivam  "Parallel Slave Port" PSP (pag. 25 datasheets) Bit 7 == 0


TRISA = 0b00000001;   //facem INTRARE din pinul2 adica RA0; aici vom avea switch-ul conectat
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 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
       }
      }
      }
}

 


Edited by sofian, 10 February 2016 - 08:34 PM.


Cu_reclama

Cu_reclama
  • Membri

#2 OFFLINE   Liviu M

Liviu M

    -

  • Membri
  • PipPipPipPipPip
  • 3,071 posts
  • Locatie:In sat cu Doru

Posted 09 February 2016 - 06:38 PM

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?



#3 OFFLINE   ciocanaru

ciocanaru

    Nou venit

  • Membri
  • Pip
  • 26 posts

Posted 09 February 2016 - 07:19 PM

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"...


Edited by ciocanaru, 09 February 2016 - 07:22 PM.


#4 OFFLINE   Liviu M

Liviu M

    -

  • Membri
  • PipPipPipPipPip
  • 3,071 posts
  • Locatie:In sat cu Doru

Posted 09 February 2016 - 07:32 PM

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.


Edited by Liviu M, 09 February 2016 - 07:33 PM.


#5 OFFLINE   ciocanaru

ciocanaru

    Nou venit

  • Membri
  • Pip
  • 26 posts

Posted 11 February 2016 - 12:00 AM

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 == 0


TRISA = 0b00000001;   //facem INTRARE din pinul2 adica RA0; aici vom avea switch-ul conectat
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 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.



#6 OFFLINE   ciocanaru

ciocanaru

    Nou venit

  • Membri
  • Pip
  • 26 posts

Posted 11 February 2016 - 12:33 AM

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.



#7 OFFLINE   Liviu M

Liviu M

    -

  • Membri
  • PipPipPipPipPip
  • 3,071 posts
  • Locatie:In sat cu Doru

Posted 11 February 2016 - 12:55 AM

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.

Edited by Liviu M, 11 February 2016 - 12:56 AM.


#8 OFFLINE   ciocanaru

ciocanaru

    Nou venit

  • Membri
  • Pip
  • 26 posts

Posted 11 February 2016 - 01:05 AM

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.



#9 OFFLINE   ciocanaru

ciocanaru

    Nou venit

  • Membri
  • Pip
  • 26 posts

Posted 13 February 2016 - 01:50 AM

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
 }


#10 OFFLINE   Liviu M

Liviu M

    -

  • Membri
  • PipPipPipPipPip
  • 3,071 posts
  • Locatie:In sat cu Doru

Posted 13 February 2016 - 10:05 AM

 

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.



#11 OFFLINE   Vezi Muti

Vezi Muti

    Nou venit

  • Membri
  • Pip
  • 92 posts

Posted 13 February 2016 - 08:45 PM

@ciocanaru:

scapi de jumatate din comparartii asa:

 

RD6_bit=(timp > 6000);

RD5_bit=(timp > 11999);

...

RB1_bit=(timp > 53999);

 

intelegi ce vreau sa zic?



#12 OFFLINE   ciocanaru

ciocanaru

    Nou venit

  • Membri
  • Pip
  • 26 posts

Posted 13 February 2016 - 09:43 PM

o... da! Nu-mi trecuse prin gand. Si doar citisem TRUE=1, FALSE=0.  Multumesc! Testez si varianta asta si revin cu rezultate.



#13 OFFLINE   ciocanaru

ciocanaru

    Nou venit

  • Membri
  • Pip
  • 26 posts

Posted 14 February 2016 - 12:50 AM

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);


#14 OFFLINE   Liviu M

Liviu M

    -

  • Membri
  • PipPipPipPipPip
  • 3,071 posts
  • Locatie:In sat cu Doru

Posted 14 February 2016 - 12:56 AM

scapi de jumatate din comparartii asa:

Unde-a dispărut butonul like? :nas:

Cu_reclama

Cu_reclama
  • Membri

#15 ONLINE   mars01

mars01

    上昇

  • Membri
  • PipPip
  • 907 posts
  • Locatie:Bucuresti / Pitesti

Posted 14 February 2016 - 11:05 PM

@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 ....






1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users