• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Programator eeprom i2c
#1
Witam. Posiadam program do Arduino Uno, który służy do zapisywania zawartości 4 eepromów i2c o adresach 80, 81, 82, 83. Przed zapisem muszę sprawdzić innym programem do skanowania adresów i2c jaki adres ma dany eeprom i zmodyfikować program wpisując odczytany adres w skanerze w pozycję: #define EEPROM_I2C_ADDRESS 83, gdzie 83 to np. adres jednego z chipów. Proszę o podpowiedź, w jaki sposób zmodyfikować program, aby na początku odczytał adres, wybrał odpowiedni wsad dla danego adresu i zapisał w eepromie. Załączam kod programu do zapisu:
Kod:
#define EEPROM_I2C_ADDRESS 83
#include <Wire.h>

// blank data for K, C, M & Y chip. 128 array of data.
byte KChipData[]={168,0,1,3,18,1,1,255,100,0,52,48,55,53,52,51,20,9,65,66,22,0,22,38,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte CChipData[]={168,0,1,3,14,2,1,255,100,0,49,49,49,53,52,54,20,2,65,66,23,0,7,1,255,255,255,255,255,255,255,255,88,48,56,54,80,52,48,49,50,48,56,0,68,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,1,85,0,18,0,40,0,5,184,230,50,0,128,0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte MChipData[]={168,0,1,3,14,3,1,255,100,0,49,49,49,53,52,54,20,2,65,66,24,0,7,16,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte YChipData[]={168,0,1,3,14,4,1,255,100,0,49,49,49,53,52,55,20,2,65,66,25,0,3,7,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};


void setup() {
//   Select correct data for chip then copy to WriteData array

  byte WriteData[128];
  switch (EEPROM_I2C_ADDRESS){
    case 83:
      memcpy(WriteData,KChipData,128*sizeof(byte));
      break;
    case 82:
      memcpy(WriteData,CChipData,128*sizeof(byte));
      break;
    case 81:
      memcpy(WriteData,MChipData,128*sizeof(byte));
      break;
    case 80:
      memcpy(WriteData,YChipData,128*sizeof(byte));
      break;
    default: //default K chip data, no reason.
      memcpy(WriteData,KChipData,128*sizeof(byte));
      break;
  }
 
  // Start Wire and Serial bus
  Wire.begin();
  Serial.begin(9600);
  delay(100);

  Serial.println("Start");
  Serial.println(" ");
 

  // Start Write Chip with blank data
  Serial.println("Write 128 bytes:");
  byte wordaddress;

  for(byte i=0;i<128;i++){
        wordaddress = i;
        i2cwrite((byte)wordaddress,(byte)WriteData[i]);
        Serial.println(i);
      
       // Serial.print(":");
        //Serial.print(WriteData[i]);
       // Serial.print(" ");
  }

//  Start Read chip
  Serial.println(" ");
  Serial.println("Read 128 bytes:");
  for(byte i=0;i<128;i++){
      byte readVale = i2cread(i);
      Serial.print(i);
      Serial.print(":");
      Serial.print(readVale);
      Serial.print(" ");
   Serial.print(" - ");
 
   if (readVale != WriteData[i]) {Serial.println("NOK"); while(1);}
   else if (readVale == WriteData[i]) {Serial.println("OK");}
  }
  Serial.println(" "); 
  Serial.println("End");

}

void loop() {

}

void i2cwrite(byte address, byte data) {
  Wire.beginTransmission(EEPROM_I2C_ADDRESS);
  Wire.write((byte)address);
  Wire.write((byte)data);
  Wire.endTransmission();
  delay(20);
}

byte i2cread(byte address) {
  byte rData = 0;
  Wire.beginTransmission(EEPROM_I2C_ADDRESS);
  Wire.write((byte)address);
Wire.endTransmission();

  Wire.requestFrom(EEPROM_I2C_ADDRESS,1);
  while (Wire.available()){
    rData = Wire.read();
    return rData;
  }
}
void WhatI2CAddress() {
    for(int i=0;i<128;i++){
      Wire.requestFrom(i,1);  //request first data byte
      Serial.print(i);
      Serial.print(":");
      while(Wire.available()){
        byte c = Wire.read();
        Serial.print(c);      //if data exist, print it out. That way you can identify which address.
      }
      Serial.println(" ");
      delay(5);
  }
}
I kod skanera:
Kod:
#include <Wire.h>


void setup()
{
  Wire.begin();

  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Skaner");
}


void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Skanuję...");

  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C urządzenie znaleziono pod adresem ");
      if (address<16)
        Serial.print("0");
      Serial.print(address,DEC);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Błąd odczytu adresu I2C ");
      if (address<16)
        Serial.print("0");
      Serial.println(address,DEC);
    }   
  }
  if (nDevices == 0)
    Serial.println("I2C brak urządzenia\n");
  else
    Serial.println("gotowe\n");

  delay(5000);           // wait 5 seconds for next scan
}
Pozdrawiam.
 
Odpowiedź
#2
To będzie mało uniwersalne, bo niektóre eepromy czy pamięci FRAM mają wiele adresów, np. cała jest podzielona na 4 części i zapisując okolice środka pisze się na adres drugi i trzeci, a koniec na czwarty.
Zamień define na zmienną, np. int.
int EEPROM_I2C_ADDRESS=83 i teraz możesz go zmieniać w trakcie działania programu. 
Adres będzie wielkości bajt, więc może być i byte czy uint8_t.
Całe skanowanie wrzuć w setup i tam gdzie program komunikuje znalezienie pamięci wydrukiem na serial wystarczy dodać EEPROM_I2C_ADDRESS=adress. Jeśli ma być tylko pierwszy znaleziony to można dodać if, że jeśli adres do tej pory był równy 0 to przypisz mu aktualny znaleziony.
Loop pozostanie z grubsza bez zmian.
Polecam kurs Arduino, problem raczej jest prosty, więc zaraz zrodzi kolejne proste pytania.
 
Odpowiedź
#3
Zmodyfikowałem program. Teraz skanuje i odczytuje adres eeproma przed zapisem, ale wartość zmiennej address nie jest przypisywana do zmiennej EEPROM_I2C_ADDRESS. Ta ma cały czas wartość jaką wpisałem definiując zmienną. Przejrzałem dostępne kursy, ale traktują zmienne bardzo ogólnikowo nie wywnioskowałem niczego co mógłbym odnieść do tego przypadku. Jeśli nie nadwyrężam uprzejmości to prosiłbym o podpowiedź co zrobiłem nie tak. Z góry dziękuję.
Kod:
int EEPROM_I2C_ADDRESS=83;
byte error, address;
int nDevices;
#include <Wire.h>

// blank data for K, C, M & Y chip. 128 array of data.
byte KChipData[]={168,0,1,3,18,1,1,255,100,0,52,48,55,53,52,51,20,9,65,66,22,0,22,38,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte CChipData[]={168,0,1,3,14,2,1,255,100,0,49,49,49,53,52,54,20,2,65,66,23,0,7,1,255,255,255,255,255,255,255,255,88,48,56,54,80,52,48,49,50,48,56,0,68,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,1,85,0,18,0,40,0,5,184,230,50,0,128,0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte MChipData[]={168,0,1,3,14,3,1,255,100,0,49,49,49,53,52,54,20,2,65,66,24,0,7,16,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte YChipData[]={168,0,1,3,14,4,1,255,100,0,49,49,49,53,52,55,20,2,65,66,25,0,3,7,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};


void setup() {
//   Select correct data for chip then copy to WriteData array

  byte WriteData[128];
  switch (EEPROM_I2C_ADDRESS){
    case 83:
      memcpy(WriteData,KChipData,128*sizeof(byte));
      break;
    case 82:
      memcpy(WriteData,CChipData,128*sizeof(byte));
      break;
    case 81:
      memcpy(WriteData,MChipData,128*sizeof(byte));
      break;
    case 80:
      memcpy(WriteData,YChipData,128*sizeof(byte));
      break;
    default: //default K chip data, no reason.
      memcpy(WriteData,KChipData,128*sizeof(byte));
      break;
  }
 
  // Start Wire and Serial bus
  Wire.begin();
  Serial.begin(9600);
  delay(100);

  Serial.println("Start");
  Serial.println(" ");
  //skaner
 

  Serial.println("Skanuję...");


  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C urządzenie znaleziono pod adresem ");
      if (address<16)
       
      // if (address=0)
     
       // Serial.print("0");
      EEPROM_I2C_ADDRESS = address,DEC;
      Serial.print(address,DEC);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Błąd odczytu adresu I2C ");
      if (address<16)
        Serial.print("0");
      Serial.println(address,DEC);
    }   
  }
  if (nDevices == 0)
    Serial.println("I2C brak urządzenia\n");
  else
    Serial.println("gotowe\n");

  delay(5000);           // wait 5 seconds for next scan

  // Start Write Chip with blank data
  Serial.println("Write 128 bytes:");
  byte wordaddress;

  for(byte i=0;i<128;i++){
        wordaddress = i;
        i2cwrite((byte)wordaddress,(byte)WriteData[i]);
        Serial.print(wordaddress);
        Serial.print(":");
        Serial.print(WriteData[i]);
        Serial.print(" ");
  }

//  Start Read chip
  Serial.println(" ");
  Serial.println("Read 128 bytes:");
  for(byte i=0;i<128;i++){
      byte readVale = i2cread(i);
      Serial.print(i);
      Serial.print(":");
      Serial.print(readVale);
      Serial.print(" ");
   Serial.print(" - ");
   Serial.print(" ");
 
   if (readVale != WriteData[i]) {Serial.println("NOK"); while(1);}
   else if (readVale == WriteData[i]) {Serial.println("OK");}
  }
  Serial.println(" "); 
  Serial.println("End");

}

void loop() {

}

void i2cwrite(byte address, byte data) {
  Wire.beginTransmission(EEPROM_I2C_ADDRESS);
  Wire.write((byte)address);
  Wire.write((byte)data);
  Wire.endTransmission();
  delay(20);
}

byte i2cread(byte address) {
  byte rData = 0;
  Wire.beginTransmission(EEPROM_I2C_ADDRESS);
  Wire.write((byte)address);
Wire.endTransmission();

  Wire.requestFrom(EEPROM_I2C_ADDRESS,1);
  while (Wire.available()){
    rData = Wire.read();
    return rData;
  }
}
void WhatI2CAddress() {
    for(int i=0;i<128;i++){
      Wire.requestFrom(i,1);  //request first data byte
      Serial.print(i);
      Serial.print(":");
      while(Wire.available()){
        byte c = Wire.read();
        Serial.print(c);      //if data exist, print it out. That way you can identify which address.
      }
      Serial.println(" ");
      delay(5);
  }
}
 
Odpowiedź
#4
Jak faktycznie chcesz skorzystać z wyniku wyszukiwania to najpierw wyszukaj, a potem z tego korzystaj. No i usuń przypisanie adresu 83, wstaw tam 0 lub tylko int EEPROM_I2C_ADDRESS; (nie przypisanie wartości w zmiennej globalnej i tak wstawi tam 0). Wtedy będziesz mógł skorzystać z if adres 0. W funkcji switch też możesz zareagować jak nic nie znajdzie na magistrali, czyli tu też możesz dodać przypadek 0 lub zmodyfikować ten default:, po co masz przypadek, że jeśli jest jakikolwiek inny adres niż wymienione to i tak kopiujesz jakieś dane.
Niestety piszę porady niewłaściwie, z punktu widzenia osoby, która przeczytała parę książek i zrobiła te kursy, dla mnie literówka lub niedopowiedzenie oznacza zupełnie niewłaściwe działanie dla Ciebie. Zrób kurs na Forbot, bo inaczej to będzie takie tureckie kazanie.
 
Odpowiedź
#5
Dzięki, już polubiłem twoje podpowiedzi. Fajne jest to że nie podajesz rozwiązań na tacy tylko zmuszasz do myślenia. Odezwę się jak będę mądrzejszy. Pozdrawiam.
 
Odpowiedź
#6
No niestety w programie widać, że poruszasz się po omacku, najpierw korzystasz z adresu, a dopiero potem go szukasz. Setup działa tylko raz realizując wypisane linijki jedna po drugiej, dopier w loop zaczyna je powtarzać realizując je bez końca od klamerki do klamerki. Co do zasady, bo oczywiście w setup można wstawić nieskończoną pętlę tak samo jak i loop tym samym sposobem zatrzymać czy nawet przerwać innym.
 
Odpowiedź
#7
Witam ponownie. Dzięki Twoim podpowiedziom i rewelacyjnemu kursowi arduino z forbota zatrybiłem w końcu i udało mi się zmodyfikować kod. Działa rewelacyjnie. Rozpoznaje adresy i wybiera odpowiednie wsady, jeśli nie znajdzie adresu to stoi i nie ładuje bezsensownie zawartości. Zatrzymanie ładowania przypadkowej zawartości zrealizowałem wpisując warunek:
Kod:
if (EEPROM_I2C_ADDRESS == 0)
      while(1);
Wyczytałem że nieskończona pętla while(1) służy do zatrzymania programu w przypadku awarii. Przykładowo jeśli korzystamy z jakiegoś czujnika. zauważyłem że podobnie działa jeśli wpiszę return. Czy ten sposób jest poprawny i czy ewentualnie jest jakaś inna metoda na zatrzymanie wykonywania programu w przypadku spełnienia warunku.
Kod:
int EEPROM_I2C_ADDRESS = 0;
#include <Wire.h>

// blank data for K, C, M & Y chip. 128 array of data.
byte KChipData[]={168,0,1,3,18,1,1,255,100,0,52,48,55,53,52,51,20,9,65,66,22,0,22,38,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte CChipData[]={168,0,1,3,14,2,1,255,100,0,49,49,49,53,52,54,20,2,65,66,23,0,7,1,255,255,255,255,255,255,255,255,88,48,56,54,80,52,48,49,50,48,56,0,68,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,1,85,0,18,0,40,0,5,184,230,50,0,128,0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte MChipData[]={168,0,1,3,14,3,1,255,100,0,49,49,49,53,52,54,20,2,65,66,24,0,7,16,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte YChipData[]={168,0,1,3,14,4,1,255,100,0,49,49,49,53,52,55,20,2,65,66,25,0,3,7,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};

void setup() {
  // Start Wire and Serial bus
byte error, address;
  int nDevices;
  byte WriteData[128];
  Wire.begin();
  Serial.begin(9600);
  delay(100);
 
  Serial.println("Start");
  Serial.println(" ");
  //skaner
  Serial.println("Skanuję...");
 

  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
   
    if (error == 0)
    {
     
      Serial.print("I2C urządzenie znaleziono pod adresem ");
      EEPROM_I2C_ADDRESS = address,DEC;
      if (address<16)
      Serial.print("0");
      Serial.print(address,DEC);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Błąd odczytu adresu I2C ");
      if (address<16)
       // Serial.print("0");
      Serial.println(address,DEC);
    }   
  }
  if (nDevices == 0)
    Serial.println("I2C brak urządzenia\n");
  else
    Serial.println("gotowe\n");

  delay(5000);           // wait 5 seconds for next scan
//   Select correct data for chip then copy to WriteData array

 
  switch (EEPROM_I2C_ADDRESS){
    case 83:
      memcpy(WriteData,KChipData,128*sizeof(byte));
      break;
    case 82:
      memcpy(WriteData,CChipData,128*sizeof(byte));
      break;
    case 81:
      memcpy(WriteData,MChipData,128*sizeof(byte));
      break;
    case 80:
      memcpy(WriteData,YChipData,128*sizeof(byte));
      break;
    default: //default K chip data, no reason.
     // memcpy(WriteData,KChipData,128*sizeof(byte));
    if (EEPROM_I2C_ADDRESS == 0)
      while(1);
      //return;
      //break;
  }
 
  // Start Write Chip with blank data
  Serial.println("Write 128 bytes:");
  byte wordaddress;

  for(byte i=0;i<128;i++){
        wordaddress = i;
        i2cwrite((byte)wordaddress,(byte)WriteData[i]);
        //Serial.println(i);
       Serial.print(wordaddress);
        Serial.print(":");
        Serial.print(WriteData[i]);
        Serial.print(" ");
  }

//  Start Read chip
  Serial.println(" ");
  Serial.println("Read 128 bytes:");
  for(byte i=0;i<128;i++){
      byte readVale = i2cread(i);
      Serial.print(i);
      Serial.print(":");
      Serial.print(readVale);
      Serial.print(" ");
   Serial.print(" - ");
 
   if (readVale != WriteData[i]) {Serial.println("NOK"); while(1);}
   else if (readVale == WriteData[i]) {Serial.println("OK");}
  }
  Serial.println(" "); 
  Serial.println("End");

}

void loop() {

}

void i2cwrite(byte address, byte data) {
  Wire.beginTransmission(EEPROM_I2C_ADDRESS);
  Wire.write((byte)address);
  Wire.write((byte)data);
  Wire.endTransmission();
  delay(20);
}

byte i2cread(byte address) {
  byte rData = 0;
  Wire.beginTransmission(EEPROM_I2C_ADDRESS);
  Wire.write((byte)address);
Wire.endTransmission();

  Wire.requestFrom(EEPROM_I2C_ADDRESS,1);
  while (Wire.available()){
    rData = Wire.read();
    return rData;
  }
}
void WhatI2CAddress() {
    for(int i=0;i<128;i++){
      Wire.requestFrom(i,1);  //request first data byte
      Serial.print(i);
      Serial.print(":");
      while(Wire.available()){
        byte c = Wire.read();
        Serial.print(c);      //if data exist, print it out. That way you can identify which address.
      }
      Serial.println(" ");
      delay(5);
  }
}

Dzięki i pozdrawiam.
 
Odpowiedź
#8
(14-07-2019, 23:14)lejk napisał(a): Wyczytałem że nieskończona pętla while(1) służy do zatrzymania programu w przypadku awarii. Przykładowo jeśli korzystamy z jakiegoś czujnika. zauważyłem że podobnie działa jeśli wpiszę return. Czy ten sposób jest poprawny i czy ewentualnie jest jakaś inna metoda na zatrzymanie wykonywania programu w przypadku spełnienia warunku.
while(true)  - 1 jest zapisem niepoprawnym - zawiesza Ci aplikację.
Stosuj break do zamknięcia pętli albo return do zakończenia metody.
 
Odpowiedź
#9
Jeśli zamierzonym działaniem jest pozostać w tej pętli nic nie robiąc dalej to nic nie zawiesza. Szczególnym przypadkiem jest jednak ESP8266, który tak to potraktuje, bo automatycznie ma włączonego WDT i tu trzeba zapisać co najmniej:
while(1) delay(0);. W ESP8266 WDT jest resetowany na końcu loop i wewnątrz funkcji delay.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości