logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATMEGA32][C]zależności a wyświetlanie komunikatów txt

margas4542 17 Wrz 2010 22:19 1275 7
  • #1 8522278
    margas4542
    Poziom 16  
    Mam problemik z kodem w którym występują zależności na podstawie których załączane lub wyłączane są dwa obwody sieciowe oraz jest monitorowane napięcie ogniwa foto galwanicznego....zdefiniowane progi działają obwody są właściwie przełączane jednak nie funkcjonuje poprawnie podstawianie odpowiednich komunikatów tekstowych i nie potrafię doszukać się przyczyny.
    
    //-----definicje zmiennych ADC
    double aku;
    double lad;
    double sol;
    double out;
    double sensor;
    //-----definicje progów napięciowych
    float aku_min = 11.5;
    float aku_max = 14.2;
    float aku_stab = 14.0;
    float sol_ref = 13.0;
    float zas_ref = 10.0;
    //----------------------------------
    reszta kodu
    //----------------------------------
       char *napis="               ";
       char napis1=" system czeka  ";
       char napis2="obwod rezerwy  ";
       char napis3="zasilanie siec ";
       char napis4="zasilanie solar";
    //--------------------------przełącznik obwodów
       unsigned char val;
       LCD_GoTo(20,0); LCD_WriteText("               ");
       for(val=1; val<6; val++)   
       {   
        switch(val)
        {
    //--------------------------zasilanie główne
        case 1:
          if(sensor > zas_ref)                                          //jeżeli jest nap.w obw.1
          if((aku < aku_min)&&(sol < sol_ref))
           PORTB &=~ 0x01;                                           //załącz kanal 1
          PORTB |= 0x02;                                               //zablokuj kanal 2
           LCD_GoTo(20,0); LCD_WriteText(napis3);            //napis siec
          break;
        case 2:
          if(sensor > zas_ref)
          if((aku > aku_max)||(sol > sol_ref))
            PORTB |= 0x01;                                            //wyłącz kanal 1
          PORTB |= 0x02;                                              //zablokuj kanal 2
           if (sol > sol_ref)
           LCD_GoTo(20,0); LCD_WriteText(napis4);          //napis solar   
          break;
    //--------------------------zasilanie rezerwowe
        case 3:
          if(sensor < zas_ref)                                        //jeżeli nie ma nap.w obw.1
          if((aku < aku_min)&&(sol < sol_ref))
          PORTB |= 0x01;                                             //zablokuj kanal 1
           PORTB &=~ 0x02;                                         //załącz kanal 2
           LCD_GoTo(20,0); LCD_WriteText(napis2);         //napis rezerwa
           break;
        case 4:
          if(sensor < zas_ref)
          if((aku > aku_max)&&(sol > sol_ref))
          PORTB |= 0x01;                                           //zablokuj kanal 1
           PORTB |= 0x02;                                          //wyłącz kanal 2
          if (sol > sol_ref)
          LCD_GoTo(20,0); LCD_WriteText(napis4);         //napis solar   
          break;
    //---------------------------status
        case 5:
          if((aku > aku_stab)&&(sol < sol_ref))
           LCD_GoTo(20,0); LCD_WriteText(napis1);       //napis system czeka
          break;
        default:   
        break;
       }
      }
    //--reszta kodu
  • #2 8522351
    Andrzej__S
    Poziom 28  
    margas4542 napisał:

    
       ...
       for(val=1; val<6; val++)    
       {    
        switch(val) 
        {
           case 1: 
              if(sensor > zas_ref)                                          //jeżeli jest nap.w obw.1 
              if((aku < aku_min)&&(sol < sol_ref)) 
              PORTB &=~ 0x01;                                           //załącz kanal 1 
              PORTB |= 0x02;                                               //zablokuj kanal 2 
              LCD_GoTo(20,0); LCD_WriteText(napis3);            //napis siec 
              break;
             ...
    


    Nie wiem, co chciałeś w ten sposób osiągnąć, ale wyświetlając napisy w pętli 'for' bez żadnych opóźnień, niewiele chyba zdążysz przeczytać przed pojawieniem się następnego napisu.
  • #4 8522486
    Andrzej__S
    Poziom 28  
    Faktycznie, z tymi ciągami to nie zauważyłem, ale trochę dziwne, że kompilator tego nie zauważył. To się nie powinno skompilować:
    Cytat:

    error: initializer element is not computable at load time


    Zauważyłem za to jeszcze jedną rzecz.
    margas4542 napisał:

    
       ...
       if((aku < aku_min)&&(sol < sol_ref)) 
       PORTB &=~ 0x01;                                           //załącz kanal 1 
       PORTB |= 0x02;                                               //zablokuj kanal 2 
       LCD_GoTo(20,0); LCD_WriteText(napis3);            //napis siec
       ...
    


    Czy te trzy instrukcje po 'if' nie powinny być w nawiasach {}? Wydaje mi się, że problem z nawiasami występuje też w innych miejscach.
  • #5 8522700
    mirekk36
    Poziom 42  
    Jeśli nie masz nawiasów klamrowych {} po IF to nie jest to żaden problem i kompilator nie zgłosi żadnego błędu, tylko uzna, że w wyniku działania warunku gdy jego wartość = TRUE ma zostać wykonane tylko jedno polecenie zakończone średnikiem które jest za nim czy pod nim w kodzie to nieistotne.

    Jeśli chcesz więcej zadań umieścić w warunku to wtedy musisz je otoczyć nawiasami klamrowymi.
  • #6 8523205
    margas4542
    Poziom 16  
    To się jednak kompiluje bez problemu i progi zał/wył działają prawidłowo...co do napisów to podmiana wyświetlanego aktualnie napisu nastąpi dopiero po spełnieniu kolejnego (innego) warunku. W tym przypadku jeden z napisów ("obwod rezerwy") wyświetla się nie w tym momencie w którym powinien..tzn w sytuacji gdy obydwa obwody sieciowe są wyłączone..
  • #7 8523267
    Andrzej__S
    Poziom 28  
    margas4542 napisał:

    ...co do napisów to podmiana wyświetlanego aktualnie napisu nastąpi dopiero po spełnieniu kolejnego (innego) warunku.

    Nie przeczytałeś chyba uważnie tego, co napisał mirekk36. W poniższym kodzie:
    
       ...
        case 1:
          if((aku < aku_min)&&(sol < sol_ref)) 
          PORTB &=~ 0x01;                                           //załącz kanal 1 
          PORTB |= 0x02;                                               //zablokuj kanal 2 
          LCD_GoTo(20,0); LCD_WriteText(napis3);            //napis siec 
       ...
    

    instrukcje PORTB |= 0x02; LCD_GoTo(20,0); LCD_WriteText(napis3); wykonają się niezależnie od tego czy warunek if((aku < aku_min)&&(sol < sol_ref)) będzie spełniony, czy też nie, mimo tego, że kompilacja przebiegnie poprawnie. Tylko wykonanie instrukcji PORTB &=~ 0x01; będzie zależne od spełnienia warunku. Jeśli chcesz, by wszystkie instrukcje były wykonywane warunkowo musisz je ująć w nawiasy klamrowe:
    
       ...
        case 1:
          if((aku < aku_min)&&(sol < sol_ref))
          {
             PORTB &=~ 0x01;                                           //załącz kanal 1 
             PORTB |= 0x02;                                               //zablokuj kanal 2 
             LCD_GoTo(20,0); LCD_WriteText(napis3);            //napis siec
          }
       ...
    


    Poza tym nie wiem, jaki masz kompilator, że nie wyświetla Ci błędu po zainicjowaniu ciągu znaków:
    
       char napis1=" system czeka  ";
    

    Mój sygnalizuje błąd, jaki podałem w jednym z poprzednich postów. Powinno być raczej:
    
       char *napis1=" system czeka  ";
    // lub
       char napis1[]=" system czeka  ";
    
  • #8 8523396
    margas4542
    Poziom 16  
    Dziękuje za cenne wskazówki...co do kompilatora to korzystam z AVR Studio i dlaczego nie burzy się o taką składnie nie wiem...zrobiłem małą roszadę w kodzie powstawiałem nawiasy klamrowe i napisy wyświetlają się tak jak powinny...nie zmieniałem jednak definicji napisów a kod wygląda teraz tak;
    
       char *napis="               ";
       char napis1=" system czeka  ";
       char napis2="obwod rezerwy  ";
       char napis3="zasilanie siec ";
       char napis4="zasilanie solar";
    //--------------------------automatic power switch circuits 
       unsigned char val;
    
       for(val=1; val<6; val++)   
       {   
        switch(val)
        {
    //--------------------------main circuit
        case 1:
          if(sensor > zas_ref)						//jeżeli jest nap.w obw.1
    	  {
           if((aku < aku_min)&&(sol < sol_ref))
    	   {
            PORTB &=~ 0x01;							//załącz kanal 1
    	    PORTB |= 0x02;							//zablokuj kanal 2
            LCD_GoTo(20,0); LCD_WriteText(napis3);   //napis siec
    	   }
    	  }
          break;
        case 2:
          if(sensor > zas_ref)
    	   {
           if((aku > aku_max)||(sol > sol_ref))
    	    {
             PORTB |= 0x01;							//wyłącz kanal 1
    		 PORTB |= 0x02;							//zablokuj kanal 2						
    	    }
    	   }   
          break;
    //--------------------------backup circuit
        case 3:
          if(sensor < zas_ref)						//jeżeli nie ma nap.w obw.1
          { 
           if((aku < aku_min)&&(sol < sol_ref))
           {
    	    PORTB |= 0x01;							//zablokuj kanal 1
            PORTB &=~ 0x02;							//załącz kanal 2
            LCD_GoTo(20,0); LCD_WriteText(napis2);   //napis rezerwa
            }
    	   }
           break;
        case 4:
          if(sensor < zas_ref)
          {
          if((aku > aku_max)&&(sol > sol_ref))
           {
    	    PORTB |= 0x01;							//zablokuj kanal 1
            PORTB |= 0x02;							//wyłącz kanal 2
    	   }
    	  }  
          break;
    //---------------------------power status
        case 5:
    	    if (sol > sol_ref)
    		{
    	     LCD_GoTo(20,0); LCD_WriteText(napis4);   //napis solar
            }
            if((aku > aku_stab)&&(sol < sol_ref))
            {
             LCD_GoTo(20,0); LCD_WriteText(napis1);   //napis system czeka
            }
          break;
        default:
        break;
       }
      }
    //------------------------test backup circuit led sensor  
      if(sensor <= zas_ref)
       PORTB |= 0x04;
      if(sensor >= zas_ref)
       PORTB &=~ 0x04;
     }
    //------------------------external sensor twilight
      if(night <= zas_ref)
       PORTB |= 0x08;
      if(night >= zas_ref)
       PORTB &=~ 0x08;
    //-----------------------end automatic power switch circuits
REKLAMA