LGT8F328P - слетает делитель?

Добрый день!
Требуется выполнение программы раз в 48 секунд а потом в сон. Получилось добиться только установкой делителя на 16 и таким вот безобразием в цикле:

//#include <LowPower.h>
#include "lgt_LowPower.h"
#include "FineOffset.h"
#include <Wire.h>
#include <AHT20.h>
#define TX_PIN PORTB2
#define DEVICE_ID 1236

AHT20 aht20;
FineOffset tx(TX_PIN);

void setup() {
  CLKPR = 1<<PMCE;
  CLKPR = 4;
  Wire.begin(); //Join I2C bus
  aht20.begin();
    DDRB  = 0x00;                 // Set all pins to input
    DDRC  = 0x00;
    DDRD  = 0x00;
    DDRE  = 0x00;
    PORTB = 0xFF;                 // Set all input with internal pull up resistors
    PORTC = 0xFF;
    PORTD = 0xFF;
    PORTE = 0xFF;
    VDTCR = 0x80;
}
void loop() {
  float temperature = aht20.getTemperature();
  delay(200);
  //float humidity = aht20.getHumidity();
  //delay(30);
	float temp = temperature;
	//int hum = humidity;
  tx.send(DEVICE_ID, temp);
  delay(200);
  for (int i=0; i<2; i++) {
    LowPower.powerDown(SLEEP_16S, ADC_OFF, BOD_OFF);
  }
  for (int i=0; i<1; i++) {
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  }
  for (int i=0; i<1; i++) {
    LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_OFF);
  }
  for (int i=0; i<1; i++) {
    LowPower.powerDown(SLEEP_2S, ADC_OFF, BOD_OFF);
  }
  for (int i=0; i<1; i++) {
    LowPower.powerDown(SLEEP_512MS, ADC_OFF, BOD_OFF);
  }
}

Но при мониторинге время выполнения программы периодически сбивается - отправка данных может идти несколько циклов по 48 сек, после чего сбивается на 96, а иногда на 144 сек, может вернуться обратно на 48. Закономерности выявить не удалось. Может не правильно делитель выставляю?

Может отправка происходит всегда во время (раз в 48), просто не всегда успешно доставляется (принимается)?

Была такая мысль, но проверяю двумя разными приемниками - аналогично. Даже сделал паузу после отправки на всякий случай - не помогает

А две отправки через паузу?

Надо попробовать, спасибо

Проверьте на отправке в сериал. Или на светодиоде - 48 сек горит. 48 сек не горит.

Проверьте сначала без датчика.

Это зачем, если не секрет?

for (int i=0; i<1; i++) {
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  }

P.S. Могу ошибаться, но во время сна такты процессора остановлены, в чём тогда смысл делителя?

Достаточно проверять одним приемником.
Только, помимо прочего, передавать порядковый номер пакета.

Спасибо всем откликнувшимся!
На стопятсотый раз я понял что все мои циклы тут не работают. 48 секунд достигалось видимо только делителем и первым powerdown на 16 сек. Но теперь, когда я оставил только это…

void setup() {
  CLKPR = 1<<PMCE;
  CLKPR = 4;
  Wire.begin(); //Join I2C bus
  aht20.begin();
}
void loop() {
  float temperature = aht20.getTemperature();
  delay(200);
  float temp = temperature;
  tx.send(DEVICE_ID, temp);
  delay(200);
  LowPower.powerDown(SLEEP_16S, ADC_OFF, BOD_OFF);
}

… я не могу поменять частоту, по крайней мере сигнала я не вижу, просто тишина, как будто что-то не то с инструкциями смены частоты и мк просто залипает. Если убрать все CLKPR то мк запускается и работает с периодом ~16 сек.
Проверить ответы по сериал тоже не получается, как только включаю Serial.begin(57600) - сразу пропадает связь с LGTхой ( Timeout. The IDE has not received the success message from the monitor after successfully connecting to it. Could not connect to COM12 serial port).

CLKPR пробовал задавать и “=4” и “=0100” и “= 0b0000100” по данным из разных источников, язык даташита я пока не понимаю.

Подозреваю, что в процессе манипуляций поменял в МК какой-то бит, который не дает поменять частоту, либо что-то еще заблокировал. Буду искать как его “сбросить на заводские” или пробовать с новыми платами как придут.
Еще раз всем спасибо!

С чего же такой вывод? У вас как раз сон на 46.5сек , плюс увеличенные за счёт делителя два делея.(код из #1 сообщения)

Если вы об этом, то здесь нет цикла. Лишь один раз вызывается
LowPower.powerDown();

 for (int i=0; i<1; i++) {
    LowPower.powerDown(SLEEP_2S, ADC_OFF, BOD_OFF);
  }

Вот специально глянул даташит. Ни в одном из режимов сна не работает тактирование CPU. Меняя биты в CLKPR, вы увеличиваете время выполнения цикла loop(),(общение с датчиками, delay() ), но не время сна

To f00ntic

Непонятно, зачем вы в setup меняете частоту. В этом случае частоту наверно правильнее задавать в настройках IDE, и тогда частоты для Serial (и возможно других узлов) будут рассчитаны правильно. Если вы меняете частоту в setup, то частоты serial и I2C тоже меняются и могут стать “неправильными”.

Тоже так думалось, но если убрать все CLKPR и в loop указать например так

    for (int i=0; i<1; i++) {
    LowPower.powerDown(SLEEP_16S, ADC_OFF, BOD_OFF);
  }
  for (int i=0; i<2; i++) {
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  }

время сна не меняется, все равно ±19сек

11:18:28.327 -> 54 | 52 | 11970 | 1210 | 0x4D/77 0x40/64 0xF7/247 0xFF/255 0x81/129 | Sensor ID: 1236 | 255% | 24.7 | OK
11:18:47.439 -> 55 | 52 | 19129 | 1536 | 0x4D/77 0x40/64 0xFA/250 0xFF/255 0xC1/193 | Sensor ID: 1236 | 255% | 25.0 | OK
11:19:06.580 -> 56 | 52 | 19127 | 1850 | 0x4D/77 0x40/64 0xFA/250 0xFF/255 0xC1/193 | Sensor ID: 1236 | 255% | 25.0 | OK

Разве при отключении питания выставленный в IDE делитель не собьется? Только из этих соображений…

Это вообще две несвязанные вещи. При изменении частоты ее надо задавать и в ИДЕ и в коде

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

Да. В коде - чтобы у вас камень работал на нужной частоте. А в ИДЕ - чтобы код был откомпилирован на эту частоту.

1 лайк

Спасибо за подсказку, код из 1го сообщения все-таки работает, видимо сначала менял делитель и там и там а потом упустил этот момент, вот оно и зависало, сейчас вернулся к тому с чего начал, сон 48.200 сек, то что надо!

12:15:02.374 -> 220 | 1 | 38871 | 10976 | 0x4D/77 0x41/65 0x2/2 0xFF/255 0xA8/168 | Sensor ID: 1236 | 255% | 25.8 | OK
12:15:50.583 -> 224 | 1 | 39083 | 10995 | 0x4D/77 0x41/65 0x2/2 0xFF/255 0xA8/168 | Sensor ID: 1236 | 255% | 25.8 | OK
12:16:38.784 -> 229 | 1 | 39035 | 10965 | 0x4D/77 0x41/65 0x2/2 0xFF/255 0xA8/168 | Sensor ID: 1236 | 255% | 25.8 | OK
12:18:15.224 -> 235 | 1 | 39724 | 11096 | 0x4D/77 0x41/65 0x2/2 0xFF/255 0xA8/168 | Sensor ID: 1236 | 255% | 25.8 | OK
12:19:03.426 -> 240 | 1 | 39682 | 11065 | 0x4D/77 0x41/65 0x3/3 0xFF/255 0x5C/92 | Sensor ID: 1236 | 255% | 25.9 | OK

Буду дальше наблюдать за перебоями, всем спасибо!