Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 18
  1. #1
    Гуру Аватар для ashu
    Регистрация
    29.01.2008
    Возраст
    51
    Сообщений
    1,161
    Вес репутации
    575

    По умолчанию Как сохранять промежуточные данные

    Растолкуйте для совсем начинающих...

    Есть код:
    Код:
    int test;
    int test2;
    int prev2;
    unsigned long time;
    unsigned long ptime;
    unsigned long taho; // количество импульсов
    unsigned int freq; // частота импульсов
    unsigned long stamp; // период измерения
    void setup()
    {
      Serial.begin(115200); // настроить скорость com порта
      pinMode(7, INPUT); // 7ой порт переключаем на ввод данных
      ptime = millis();  // запустить таймер
      test = 0;
      test2 = 0;
      prev2 = 0;
      taho = 0;
      freq = 0;
      stamp = 0;
    }
    void loop()
    {
      test = analogRead(0); //прочитать с аналогового пина(0)
      test2 = digitalRead(7); // читаем уровень цифрового порта(7)
      if(test2 != prev2) {
        prev2 = test2;
        if(test2 = HIGH) {
          freq++;
          taho++;
        }
      }
      stamp = millis(); // прочитать натиканое время  таймера
      if(stamp > ptime + 500 || stamp < ptime) {
        ptime = stamp;
        Serial.print("TimeStamp: ");
        Serial.print(ptime, DEC);  //отправить время в пути
        Serial.print(", Gasoile: ");
        Serial.print(test/4, DEC); // отправить колличество топлива
        Serial.print(", Tahometer: ");
        Serial.print(taho, DEC);  // отправить значение тахометра
        Serial.print(", Speed freq: ");
        Serial.println(freq, DEC); // отправить значение спидометра
        freq = 0;
      }
    }
    Один раз грузим в carduino. Потом много раз подключаемся терминалом на COM9 (carduino у меня в системе на 9ом порту)...
    И каждый раз получаем рестарт микропрограммы carduino - каждый раз millis() и taho начинают считаться с нуля. Т.е. carduino работает только когда есть связь с программой на ПК.

    Как carduino заставить работать в автономе?
    Последний раз редактировалось Chip; 13.09.2009 в 02:48.
    С уважением, Алексей
    Мой Prius NHW11

  2. #2
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,379
    Вес репутации
    10

    По умолчанию Re: Arduino учебный курс для начинающих

    А что должен делать девайс без компа? На ЖКИ выводить или светодиодом мигать?
    Он без проблем автономно работатет, распиши ТЗ
    Последний раз редактировалось Chip; 13.09.2009 в 02:01.

  3. #3
    Гуру Аватар для ashu
    Регистрация
    29.01.2008
    Возраст
    51
    Сообщений
    1,161
    Вес репутации
    575

    По умолчанию Re: Arduino учебный курс для начинающих

    Да, работает. Только при подключении к ПК засыпает на полторы-две секунды, а потом рестартует микропрограмму (нашёл тут).
    Как выход - либо шить девайс не через usb, а через доп.программатор (тогда бутлоадер не будет ждать 2 секунды после подключения компа), либо плюнуть на потерю данных в течение 2х секунд при подключении ПК, а все необходимые переменные постоянно сохранять в EEPROM.
    С уважением, Алексей
    Мой Prius NHW11

  4. #4
    Гуру Аватар для ashu
    Регистрация
    29.01.2008
    Возраст
    51
    Сообщений
    1,161
    Вес репутации
    575

    По умолчанию Re: Arduino учебный курс для начинающих

    Как пример решения через сохранение значения taho в EEPROM - при отключении и подключении ПК значение taho не обнуляется, а продолжает увеличиваться дальше.

    Код:
    #include <EEPROM.h>
    int test;
    int test2;
    int prev2;
    unsigned long time;
    unsigned long ptime;
    unsigned long taho; // количество импульсов
    unsigned int freq; // частота импульсов
    unsigned long stamp; // период измерения
    unsigned long byte1;
    byte byte2;
    int onoff = 0;
    void setup()
    {
      Serial.begin(115200); // настроить скорость com порта
      pinMode(7, INPUT); // 7ой порт переключаем на ввод данных
      ptime = millis();
      test = 0;
      test2 = 0;
      prev2 = 0;
      taho = 0;
      freq = 0;
      stamp = 0;
      // читаем из EEPROM
      byte2 = EEPROM.read(3);
      byte1 = byte2;
      byte1 = byte1 << 8;
      byte2 = EEPROM.read(2);
      byte1 = byte1 + byte2;
      byte1 = byte1 << 8;
      byte2 = EEPROM.read(1);
      byte1 = byte1 + byte2;
      byte1 = byte1 << 8;
      byte2 = EEPROM.read(0);
      taho = byte1 + byte2;
    }
    void loop()
    {
      test = analogRead(0); //прочитать с аналогового пина(0)
      test2 = digitalRead(7); // читаем уровень цифрового порта(7)
      if(test2 != prev2) {
        prev2 = test2;
        if(test2 = HIGH) {
          freq++;
          taho++;
          // сразу записываем в EEPROM
          byte1 = taho;
          byte2 = lowByte(byte1);
          EEPROM.write(0, byte2);
          byte1 = byte1 >> 8;
          byte2 = lowByte(byte1);
          EEPROM.write(1, byte2);
          byte1 = byte1 >> 8;
          byte2 = lowByte(byte1);
          EEPROM.write(2, byte2);
          byte1 = byte1 >> 8;
          byte2 = lowByte(byte1);
          EEPROM.write(3, byte2);
        }
      }
      stamp = millis();
      if(stamp > ptime + 500 || stamp < ptime) {
        ptime = stamp;
        Serial.print("TimeStamp: ");
        Serial.print(ptime, DEC);
        Serial.print(", Gasoile: ");
        Serial.print(test/4, DEC); // отправить значение компьютеру
        Serial.print(", Tahometer: ");
        Serial.print(taho, DEC);
        Serial.print(", Speed freq: ");
        Serial.println(freq, DEC);
        freq = 0;
        // Помигаем светодиодом в подтверждение работы микропрограммы
        if(onoff != 1) {
          digitalWrite(13, HIGH);
          onoff = 1;
        } else {
          digitalWrite(13, LOW);
          onoff = 0;
        }
      }
    }
    Последний раз редактировалось ashu; 13.09.2009 в 02:31.
    С уважением, Алексей
    Мой Prius NHW11

  5. #5
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,379
    Вес репутации
    10

    По умолчанию Re: Arduino учебный курс для начинающих

    Цитата Сообщение от ashu Посмотреть сообщение
    Как пример решения через сохранение значения taho в EEPROM - при отключении и подключении ПК значение taho не обнуляется, а продолжает увеличиваться дальше.

    Код:
    #include <EEPROM.h>
    int test;
    int test2;
    int prev2;
    unsigned long time;
    unsigned long ptime;
    unsigned long taho; // количество импульсов
    unsigned int freq; // частота импульсов
    unsigned long stamp; // период измерения
    unsigned long byte1;
    byte byte2;
    int onoff = 0;
    void setup()
    {
      Serial.begin(115200); // настроить скорость com порта
      pinMode(7, INPUT); // 7ой порт переключаем на ввод данных
      ptime = millis();
      test = 0;
      test2 = 0;
      prev2 = 0;
      taho = 0;
      freq = 0;
      stamp = 0;
      // читаем из EEPROM
      byte2 = EEPROM.read(3);
      byte1 = byte2;
      byte1 = byte1 << 8;
      byte2 = EEPROM.read(2);
      byte1 = byte1 + byte2;
      byte1 = byte1 << 8;
      byte2 = EEPROM.read(1);
      byte1 = byte1 + byte2;
      byte1 = byte1 << 8;
      byte2 = EEPROM.read(0);
      taho = byte1 + byte2;
    }
    void loop()
    {
      test = analogRead(0); //прочитать с аналогового пина(0)
      test2 = digitalRead(7); // читаем уровень цифрового порта(7)
      if(test2 != prev2) {
        prev2 = test2;
        if(test2 = HIGH) {
          freq++;
          taho++;
          // сразу записываем в EEPROM
          byte1 = taho;
          byte2 = lowByte(byte1);
          EEPROM.write(0, byte2);
          byte1 = byte1 >> 8;
          byte2 = lowByte(byte1);
          EEPROM.write(1, byte2);
          byte1 = byte1 >> 8;
          byte2 = lowByte(byte1);
          EEPROM.write(2, byte2);
          byte1 = byte1 >> 8;
          byte2 = lowByte(byte1);
          EEPROM.write(3, byte2);
        }
      }
      stamp = millis();
      if(stamp > ptime + 500 || stamp < ptime) {
        ptime = stamp;
        Serial.print("TimeStamp: ");
        Serial.print(ptime, DEC);
        Serial.print(", Gasoile: ");
        Serial.print(test/4, DEC); // отправить значение компьютеру
        Serial.print(", Tahometer: ");
        Serial.print(taho, DEC);
        Serial.print(", Speed freq: ");
        Serial.println(freq, DEC);
        freq = 0;
        // Помигаем светодиодом в подтверждение работы микропрограммы
        if(onoff != 1) {
          digitalWrite(13, HIGH);
          onoff = 1;
        } else {
          digitalWrite(13, LOW);
          onoff = 0;
        }
      }
    }
    у EEPROM ограниченое число циклов записи, так что не забывай об этом , ты пишешь в него в цикле , он долго так не проживет. Может быть как нибудь с массивом попробовать а в EPROM писать 1 раз в минуту или после определеного расстояния.
    Может отдельную тему создать по данному проекту ?
    Думаю что многим пригодится.
    Последний раз редактировалось Chip; 13.09.2009 в 03:49.

  6. #6
    Гуру Аватар для ashu
    Регистрация
    29.01.2008
    Возраст
    51
    Сообщений
    1,161
    Вес репутации
    575

    По умолчанию Re: Arduino учебный курс для начинающих

    Хмм... А где почитать про ограниченное количество циклов записи в EEPROM?
    Да, наверное, можно отдельной темой
    С уважением, Алексей
    Мой Prius NHW11

  7. #7
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,379
    Вес репутации
    10

    По умолчанию Re: Arduino учебный курс для начинающих

    Производитель контроллеров даёт гарантию на 100 000 циклов стирание/запись.
    Информацию ищи в даташите на контроллер Atmega168
    В массиве сохраняй
    Последний раз редактировалось Chip; 13.09.2009 в 12:13.

  8. #8
    Пользователь Аватар для murano
    Регистрация
    18.01.2008
    Сообщений
    92
    Вес репутации
    218

    По умолчанию Re: Arduino учебный курс для начинающих

    А если запись производить по прерыванию, например по выключению зажигания или контролю наличия какого-нибудь сигнала?

  9. #9
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,379
    Вес репутации
    10

    По умолчанию Re: Arduino учебный курс для начинающих

    +1
    Например по пропаданию АСС записывать в EEPROM.
    Прерывание для этого жалко использовать, можно и без него обойтись , программно проверять цифровой вход с подключенному к нему АСС
    Последний раз редактировалось Chip; 13.09.2009 в 12:28.

  10. #10
    Гуру Аватар для ashu
    Регистрация
    29.01.2008
    Возраст
    51
    Сообщений
    1,161
    Вес репутации
    575

    По умолчанию Re: Arduino учебный курс для начинающих

    Цитата Сообщение от ashu Посмотреть сообщение
    Как выход - либо шить девайс не через usb, а через доп.программатор (тогда бутлоадер не будет ждать 2 секунды после подключения компа)
    Этим способом можно только исключить 1.5..2 сек ожидания при открытии порта, но данные всё равно не сохранить, поскольку такова аппаратная реализация - при открытии порта сигнал управления потоком DTR посылает reset на чип:
    Rather then requiring a physical press of the reset button before an upload, the Arduino Nano is designed in a way that allows it to be reset by software running on a connected computer. One of the hardware flow control lines (DTR) of the FT232RL is connected to the reset line of the ATmega168 or ATmega328 via a 100 nanofarad capacitor. When this line is asserted (taken low), the reset line drops long enough to reset the chip. The Arduino software uses this capability to allow you to upload code by simply pressing the upload button in the Arduino environment. This means that the bootloader can have a shorter timeout, as the lowering of DTR can be well-coordinated with the start of the upload.
    С уважением, Алексей
    Мой Prius NHW11

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •