Strona 1 z 1

Pętla while nie przerywa wykonywania kodu

: środa 27 wrz 2017, 21:23
autor: foreste
Witam mam problem w pętlą while powtarza kod ciagle nie zwracając uwagi na liczbę cykli , np 3 razy chce by wykonał się kod.

Kod: Zaznacz cały

void alarm_power(int counter, float voltage_limit_definition )
{
   
   while (counter >= 0)
   {
      if (monitor_batery() <= voltage_limit_definition)
      {
         
            
         licznik.start();
            
         if (licznik.read_ms() >= 1500)
         {
               
            buzzer = !buzzer;
            licznik.reset();
               
         }
            
         
      }
      counter--;
   }
   }

Re: Pętla while nie przerywa wykonywania kodu

: środa 27 wrz 2017, 21:27
autor: Antystatyczny
Jakiego typu jest zmienna counter? Nigdzie nie widać jej deklaracji.

Re: Pętla while nie przerywa wykonywania kodu

: środa 27 wrz 2017, 21:29
autor: foreste
Antystatyczny pisze:Jakiego typu jest zmienna counter? Nigdzie nie widać jej deklaracji.
tak wyglada w głównej while(1)

Kod: Zaznacz cały

alarm_power(3, 4.10);

Re: Pętla while nie przerywa wykonywania kodu

: środa 27 wrz 2017, 21:34
autor: Antystatyczny
Ok, moja ślepota. Counter jest typu int. No dobra, jeśli dobrze rozumiem... powyższy kod ma się wykonywać tak długo, aż wartość zmiennej counter spadnie poniżej zera i zasadniczo nie widzę tam problemu. W pętli while jest dekrementacja tej zmiennej, a jej typ umożliwia zejście poniżej zera. Inna sprawa jest taka, że w pętli głównej wywołujesz funkcję alarm_power(), a więc notorycznie nadajesz zmiennej counter wartość 3.

Re: Pętla while nie przerywa wykonywania kodu

: środa 27 wrz 2017, 21:40
autor: foreste
Antystatyczny pisze:Ok, moja ślepota. Counter jest typu int. No dobra, jeśli dobrze rozumiem... powyższy kod ma się wykonywać tak długo, aż wartość zmiennej counter spadnie poniżej zera i zasadniczo nie widzę tam problemu. W pętli while jest dekrementacja tej zmiennej, a jej typ umożliwia zejście poniżej zera. Inna sprawa jest taka, że w pętli głównej wywołujesz funkcję alarm_power(), a więc notorycznie nadajesz zmiennej counter wartość 3.

jak to naprawić lub poprawić ?.

Re: Pętla while nie przerywa wykonywania kodu

: środa 27 wrz 2017, 21:46
autor: Antystatyczny
To zależy, co tak naprawdę chcesz osiągnąć. Obecnie wywołujesz funkcję alarm_power() non stop, więc pewnie Ci się wydaje, że tak funkcja działa cały czas. Zastanów się najpierw, kiedy ta funkcja ma być wywoływana, bo nie sądzę, by musiała być wywoływana setki tysięcy razy na sekundę.

Re: Pętla while nie przerywa wykonywania kodu

: czwartek 28 wrz 2017, 20:41
autor: Antystatyczny
Wróżki doniosły, że chcesz, aby kod wewnątrz funkcji został wykonany trzykrotnie, a potem jego wykonanie miałoby być udaremniane zewnętrzną zmienną. Oto moja propozycja naskrobana na kolanie:

Kod: Zaznacz cały

typedef enum
{
    LockType_Unlocked = 0,
    LockType_Locked
}LockType;

LockType lock = LockType_Unlocked;

void foo(void)
{
    if(lock == LockType_Unlocked)
    {
        for(int i = 0; i < 3; ++i)
        {
            //put your code here
        }
       
        lock = LockType_Locked;
    }
}

int main(void)
{
    while(true)
    {
        foo();
    }
}



Ot, taka prosta konstrukcja. Zmienna lock umożliwia sterowanie wykonywaniem kodu wewnątrz funkcji foo().

Re: Pętla while nie przerywa wykonywania kodu

: sobota 30 wrz 2017, 13:01
autor: foreste
Napisałem podobny kod ale nie robi 3 razy kodu tylko jakby tylko opóźniło to

Kod: Zaznacz cały

oid alarm_power( float voltage_limit_definition )
{
   
   
      if (monitor_batery() <= voltage_limit_definition)
      {
         if (lock == 0)
         {
            for (int x =0; x < 3; x++)
            {
               licznik.start();
            
               if (licznik.read_ms() >= 1500)
               {
               
                  buzzer = !buzzer;
                  licznik.reset();
               
               }
               
            }
            lock = 1;
         }
      }
   }

edit
problem rozwiążany zamiast while i for dałem typowe if i kod chodzi

Kod: Zaznacz cały

void alarm_power( float voltage_limit_definition )
{
   
   
      if (monitor_batery() <= voltage_limit_definition)
      {
         if (lock <= 4)
         {
         
               licznik.start();
            
               if (licznik.read_ms() >= 1500)
               {
               
                  buzzer = !buzzer;
                  licznik.reset();
               
               }
            lock++;
            }
            
         
      }
   }

A tak wygląda cały kod programu

Kod: Zaznacz cały

#include "mbed.h"
#include "MPL3115A2.h"
#include "Terminal.h"
#include "eeprom.h"
#include "cstdlib"
#include "string"

#define EEPROM_ADDR 0x00   // I2c EEPROM address is 0x00

#define SDA PTE25            // I2C SDA pin
#define SCL PTE24           // I2C SCL pin
int32_t eeprom_size ,  addr;
Terminal pc(PTA2, PTA1); // tx, rx
I2C i2c(PTE0, PTE1);       // sda, scl
EEPROM brain(SDA, SCL, EEPROM_ADDR, EEPROM::T24C08);
MPL3115A2 sensor(&i2c, &pc);
int temperature_live_state;
static int read_user_temp;
int val = 0;
int *temp_data = &read_user_temp;
Timer licznik;
char buffer[20];
char dane[4];
float  check_battery;



DigitalOut myled1(PTA12);     // Sanity check to make sure the program is working.
DigitalOut buzzer(PTD1, 1 );     // Sanity check to make sure the program is working.
AnalogIn batery(PTC2);
int lock  = 0;

float monitor_batery()
{
   check_battery = batery.read();
   float resume;
return    resume = (check_battery*4.1);
}
void refresh_buffer()
{
   for (int y = 0; y < sizeof(buffer); y++)
      buffer[y] = 0;
   for (int z = 0; z < sizeof(dane); z++)
      dane[z] = 0;
}      
void serials()
{
   if (pc.readable())
   {
      pc.scanf( "%s", buffer);
   }
}

void signaller()
{
   licznik.start();
   
   if (licznik.read_ms() >= 1000)
   {
      buzzer = !buzzer;
      licznik.reset();
   }
   
}

void alarm_power( float voltage_limit_definition )
{
   
   
      if (monitor_batery() <= voltage_limit_definition)
      {
         if (lock <= 4)
         {
         
               licznik.start();
            
               if (licznik.read_ms() >= 1500)
               {
               
                  buzzer = !buzzer;
                  licznik.reset();
               
               }
            lock++;
            }
            
         
      }
   }

void alarm_temp(string  & temp_read_input)
{
   string str = temp_read_input;
   temperature_live_state = atoi(str.c_str());
   if (temperature_live_state >= *temp_data)
   {
      signaller();
   }
   if (*temp_data > temperature_live_state)
   {
      buzzer = 0;
   }
   
}

void screen()
{
   pc.foreground(0xFFFF00);
   pc.hideCursor();
}
void intro()
{
   pc.locate(15, 5);
   pc.printf(" ** inteligentny Termometr   ** ");
   pc.locate(15, 6);
   pc.printf("Created by Foreste");
}
void labels()
{
   pc.locate(10, 7);
   pc.printf("Temperatura");
   pc.locate(25, 7);
   pc.printf("Cisnienie");
   pc.locate(38, 7);
   pc.printf("otrzezenie wysokiej temp");
   pc.locate(65, 7);
   pc.printf("Bateria");
}
void input_add_user_define_temperature()
{
   int tempint;
   refresh_buffer();
   
   screen();
   intro();
   pc.locate(1, 7);
   pc.printf("Wpisz wartość temperatury ,po której termometr bedzie sygnalizował przekroczenie");
   
   if (pc.readable())
   {
      pc.scanf("%s", dane);
      
   }   
   
   
   for (int   z = 0; z < 4; z++)
   {
               
      if (isdigit(dane[z]))//sprawdzanie czy znak jest liczbą
      {
       
         tempint = atoi(dane); //kowertowanie tablicy typu char na zmienną int
            
      }
   }
   
            
   *temp_data = tempint;
   if ((*temp_data >= 1) && (*temp_data <= 99))
   {
      
      if ((*temp_data >= 12) && (*temp_data <= 40))
      {
         pc.cls();
         screen();
         intro();
         brain.write(eeprom_size = 8, (int32_t) *temp_data);
         pc.locate(20, 7);
         pc.printf("Zapisalem podaną temperature przekroczenia");
         wait(5);
         val = 1;
         //fflush(stdin);
         refresh_buffer();
         pc.cls();
            
      }
      else
      {
         pc.cls();
         screen();
         intro();
         pc.locate(20, 7);
         pc.printf("Wpisano niepoprawne dane. Dopuszczalny zakres: od 12 do 40");
         wait(5);
         pc.cls();
         
      }
   }
}

   

void rs232_menu()
{
   
   if (strcmp(buffer, "reset") == 0)
   {
      NVIC_SystemReset();
   }
   else if (strcmp(buffer, "alarm") == 0)
   {
      pc.cls();
      while (val <= 0)
      {
         input_add_user_define_temperature();
      }
   }
   
}

int main() {
   int lock  = 0;   
   pc.baud(9600);     
   pc.cls();
   sensor.init();
   screen();
   intro();
   wait(5);
   Temperature t;
   Pressure p;                                                                                                                                     
   sensor.setOffsetTemperature(20);
   sensor.setOffsetPressure(-32);
   brain.read((uint32_t)(eeprom_size = 8), (int32_t&) *temp_data);
   
   while (read_user_temp <= 0)
   {
      while (val <= 0)
      {
         input_add_user_define_temperature();
      }      
   }
   pc.cls();
   
   
   while (1)
   {
      val = 0;
      
      sensor.readTemperature(&t);
        sensor.setModeStandby();
      sensor.setModeBarometer();
      sensor.setModeActive();
      sensor.readPressure(&p);
      
      screen();
      intro();
      labels();
      string temp_cache = t.print();
      pc.locate(10, 9);
      pc.printf("%s C", t.print());
      pc.locate(25, 9);
      pc.printf("%s Hpa", p.print());
      pc.locate(45, 9);
      pc.printf("%d", *temp_data);
      pc.locate(65, 9);
      pc.printf("%1.2fV", monitor_batery());
      pc.locate(65, 11);
      pc.printf("%d", licznik.read_ms());
      pc.locate(65, 12);
      alarm_temp(temp_cache);
      serials();
      alarm_power(4.20);
      rs232_menu();
      
      sensor.setModeStandby();
      sensor.setModeAltimeter();
      sensor.setModeActive();
      
   }
}