RTC DS3231 - podivné chování při ukládání změn

ivo_mu
Příspěvky: 10
Registrován: 16 bře 2022, 03:11
Reputation: 0

RTC DS3231 - podivné chování při ukládání změn

Příspěvek od ivo_mu » 16 bře 2022, 03:31

Dobrý den,
mám modul DS3231 (nikoliv samotný čip) a při posunu času se mi při uploadu sketche čas posune o dvě hodiny místo o jednu. Při resetu a odpojení a zapojení napájení to funguje správně. Hodina se mi je přičtená jednou v setup() na řádku 10 - i když ji přičítám až na řádku 15 - a podruhé ve funkci posunHod(). Poraďte, prosím, kde udělali soudruzi z NDR chybu?

Kód: Vybrat vše

#include <DS3231.h> // hodiny
DS3231 rtc; // inicializace RTC z knihovny
RTCDateTime datumCas; // vytvoření proměnné pro práci s časem
void setup() {
  Serial.begin(9600);
  while (!Serial); // wait for serial port to connect.
  Serial.println();
  rtc.begin();
  datumCas = rtc.getDateTime();
  Serial.println(datumCas.hour);
  posunHod(1);
}
void posunHod(int oKolik) {
  unsigned int x;
  x = oKolik + datumCas.hour;
  rtc.setDateTime(datumCas.year, datumCas.month, datumCas.day, x, datumCas.minute, datumCas.second);
  datumCas = rtc.getDateTime();
  Serial.println(datumCas.hour);
}
void loop() {
  // put your main code here, to run repeatedly:
}
Mám Uno R3, modul RTC DS3231 z kitu Lafvin Ultimate Starter Kit for UNO R3, Arduino IDE 2.0.0-rc5. Děkuji za tipy.
Zkoušel jsem to i bez knihovny DS3231.h (master z arduino.cc) přímo přes wire, ale dělá to stejně.

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: RTC DS3231 - podivné chování při ukládání změn

Příspěvek od kiRRow » 16 bře 2022, 16:49

Nebude to tím, že už tam máš nějakou verzi programu, píchneš to do USB, program se spustí a posune to o hodinu, uploadneš sketch, procesor se restartuje a znovu to posune o další hodinu ?

ivo_mu
Příspěvky: 10
Registrován: 16 bře 2022, 03:11
Reputation: 0

Re: RTC DS3231 - podivné chování při ukládání změn

Příspěvek od ivo_mu » 16 bře 2022, 16:57

Tomu moc nerozumím. Arduino běží, IDE je připojené. Domnívám se, že to proběhne tak, že se načte nový sketch a pak se restartuje procesor s novým programem. Proč by se měl restartovat (spouštět) dvakrát? A když tam dám posunCas(0), čas se nezmění, přestože původní sketch je s posunem.
Naposledy upravil(a) ivo_mu dne 16 bře 2022, 17:11, celkem upraveno 2 x.

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: RTC DS3231 - podivné chování při ukládání změn

Příspěvek od AstroMiK » 16 bře 2022, 17:04

Ten tvůj kód se mi ani nepovedlo přeložit. Použil jsem tu knihovnu, kterou uvádíš.

Tak jsem našel na internetu nějakou jinou a podle examplu jsem to našrouboval na ten tvůj kód.
Funguje to podle očekávání (při každém resetu to přičte jednu hodinu).

Knihovnu jsem stáhnul tady (nemám k ní žádný vztah, prostě první odkaz na Googlu):
https://electronoobs.com/eng_arduino_ds3231.php

A kód je tady:

Kód: Vybrat vše

#include <DS3231.h>
DS3231  rtc(SDA, SCL);

Time  t;

void setup() {
  Serial.begin(9600);
  while (!Serial); // wait for serial port to connect.
  Serial.println();

  rtc.begin();
  t = rtc.getTime();
  Serial.println(t.hour);
  posunHod(1);
}

void posunHod(int oKolik) {
  unsigned int x;
  x = oKolik + t.hour;
  rtc.setTime(x, t.min, t.sec);
  t = rtc.getTime();
  Serial.println(t.hour);
}

void loop() {
  // put your main code here, to run repeatedly:
}

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: RTC DS3231 - podivné chování při ukládání změn

Příspěvek od AstroMiK » 16 bře 2022, 17:15

... SORRY, už chápu, co jsi měl na mysli.

O ty dvě hodiny se posune čas jen při uploadu sketche přes USB.
Při normálním resetu je to v pohodě.

Na opravu stačí, abys na začátek setupu dal pauzu (třeba jednu sekundu).
Ta pauza musí překlenout čas, po který bootloader očekává komunikaci.

Při nahrání programu dochází k tomu, že se nejdřív zresetuje Arduino pomocí signálu z USB převodníku.
Původní program se ale po resetu začne okamžitě vykonávat. To je první přičtení hodiny.

Zároveň bootloader nějakou dobu čeká, jestli se neobjeví na pinu Rx nějaká komunikace. Když ano, přeruší vykonávání programu a začne ukládat nový program do paměti. Po uložení celého nového programu se provede reset a tím se nový program spustí znova. To je to druhé přičtení hodiny.

ivo_mu
Příspěvky: 10
Registrován: 16 bře 2022, 03:11
Reputation: 0

Re: RTC DS3231 - podivné chování při ukládání změn

Příspěvek od ivo_mu » 16 bře 2022, 17:43

Omlouvám se za dezinformaci. Měl jsem knihovnu nikoliv z Arduino.cc, ale z dratek.cz z návodu pro modul DS3231. Ta z Arduino.cc se mi také nepovedla zkompilovat.
Jinak ale po odebrání starých knihoven a nahrání této mi to dělá úplně stejně s tím rozdílem, že upload i odpojení a připojení napájení mi přičte 2 hodiny. Reset (tlačítkem) jen jedu hodinu.

To jsem psal ještě před těmi pauzami.

ivo_mu
Příspěvky: 10
Registrován: 16 bře 2022, 03:11
Reputation: 0

Re: RTC DS3231 - podivné chování při ukládání změn

Příspěvek od ivo_mu » 16 bře 2022, 18:22

Děkuji, pauza pomohla. Akorát nestačí 1 sec, je potřeba minimálně 5 sec. A může to být kdekoliv od začátku setup() až před rtc.getTime(). I po částech.

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: RTC DS3231 - podivné chování při ukládání změn

Příspěvek od kiRRow » 17 bře 2022, 16:16

AstroMiK píše:
16 bře 2022, 17:15
Při nahrání programu dochází k tomu, že se nejdřív zresetuje Arduino pomocí signálu z USB převodníku.
Původní program se ale po resetu začne okamžitě vykonávat. To je první přičtení hodiny.

Zároveň bootloader nějakou dobu čeká, jestli se neobjeví na pinu Rx nějaká komunikace. Když ano, přeruší vykonávání programu a začne ukládat nový program do paměti. Po uložení celého nového programu se provede reset a tím se nový program spustí znova. To je to druhé přičtení hodiny.
Opravdu to funguje takhle ? Já měl za to, že při připojení napájení se nejprve spustí bootloader, který čeká na RX data, pokud nepříjdou do nějaké doby, tak skočí na první řádek samotného programu.
To dvojnásobné odečtení dle mne způsobuje to, že člověk to připojí s už nějakou verzí programu do USB, bootloader, pauza spustí se program (odečet). Člověk pak nahraje nový sketch, restart přes USB, bootloader, pauza, data jdou a přepíše se program, restart, bootloader, pauza a spustí se program (odečet).

ivo_mu
Příspěvky: 10
Registrován: 16 bře 2022, 03:11
Reputation: 0

Re: RTC DS3231 - podivné chování při ukládání změn

Příspěvek od ivo_mu » 17 bře 2022, 16:27

Mně se to děje v situaci, kdy mám spuštěné IDE a jsem připojený z PC přes USB (i napájení) k Uno, kde běží předchozí verze programu. Udělám v IDE úpravu a nepatrně změněný program uploudnu do Una. A přitom mně to bez pauzy počítalo dvakrát.
Proč se to restartuje před nahráním programu? To mi přijde nelogické a zbytečné. Po nahrání to potřebuji restartovat, aby se začal vykonávat ten nový program. Ale před?

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: RTC DS3231 - podivné chování při ukládání změn

Příspěvek od AstroMiK » 17 bře 2022, 16:47

S tím bootloaderem máš asi pravdu.

Jenže k tomu problému s posunem dochází i v případě, že se USB neodpojí.
Jen se přehraje program a už se čas posune o 2 hodiny.

Při obyčejném resetu se čas posune jen o hodinu.

Tady je video:
https://youtu.be/bHEiYaUaZ0w
Naposledy upravil(a) AstroMiK dne 17 bře 2022, 16:56, celkem upraveno 1 x.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 10 hostů