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

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

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

Při resetu i při odpojení napájení USB to posouvá jen o hodinu. O dvě pouze při uploadu (i stejného programu beze změny).

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 » 18 bře 2022, 14:53

ivo_mu píše:
17 bře 2022, 16:27
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?
Aby jsi mohl program nahrávat jednoduše pomocí USB, tak v mikroprocesoru je program tzv bootloader. Procesor po nastartování spustí první instrukci, která spustí bootloader. Ten nějakou dobu vyčkává jestli nepřichází data, pokud ano, začne je ukládat do paměti procesoru, pokud ne, tak teprve tehdy spustí samotný program. Proto je nezbytně nutné procesor restartovat.

Ono i při programování procesoru bez bootloaderu pomocí programátoru je třeba procesor restartovat. Tady není důvod spuštění bootloaderu, ale je třeba ukončit činost procesoru.

Napadá mě, že po dokončení uploadu toho sketche a ještě před závěrečným restartem procesoru dojde k tomu, že se stihne vykonat kousek právě nahraného programu. Proto tam ten delay pomáhá.

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 » 18 bře 2022, 15:17

Takže - jestli to chápu správně - stačilo by nastavit v setupu příznak a tu pauzu vložit podle příznaku až ve funkci posunCas(), aby to nezdržovalo načítání pokaždé, nebo to spustit na začátku loop() podle příznaku i s pauzou. Je to tak? Děkuji.

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 » 18 bře 2022, 15:25

Příznak by se ti vždy vymazal, takže by to vždy čekalo ... leda bys ho uložil do EEPROM, jenže tam by zůstal, takže by to čekalo jen jednou a pak už nikdy. Musel bys před každým uploadem projektu tuto EEPROM vymazat jiným "projektem".
Tohle se řeší programovacím jumperem, nebo DIP přepínačem. Před programováním ho vytáhneš, uploadneš, odpojíš, nasadíš, zapojíš. V setupu hned na začátku spustíš nekonečnou smyčku podmíněnou nepřítomností onoho jumperu ...
něco jako
setup(){
//pin jako input pullup
while(digitalRead(pin)){//tohle zasekne program dokud na pin nebude GND, takže jumper mezi pin a GND}

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 » 18 bře 2022, 15:37

Tomu už moc nerozumím - přímo s hw jsem nikdy nepracoval. Nicméně takhle mi to funguje:

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
bool jeSetup = true; // pro pauzu při setupu pro bootloader
void setup() {
  Serial.begin(9600);
  Serial.println();
  rtc.begin();
  datumCas = rtc.getDateTime();
  Serial.println(datumCas.hour);
}
void posunHod(int oKolik) {
  if (jeSetup) {
    delay(5000);
    jeSetup = false;
  }
  unsigned int x;
  x = oKolik + int (datumCas.hour);
  rtc.setDateTime(datumCas.year, datumCas.month, datumCas.day, x, datumCas.minute, datumCas.second);
  datumCas = rtc.getDateTime();
  Serial.println(datumCas.hour);
}
void loop() {
  if (jeSetup) posunHod(-1);
}

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 » 18 bře 2022, 15:42

Tos mohl rovnou nechat delay na začátku setupu .... ten se provádí jen jednou a to při spuštění. Programovací jumper není žádná věda, jen na začátku setupu donekonečna testuješ jestli to že tam není je fakt pravda. To ti zabrání nechtěnému spuštění programu.

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 » 18 bře 2022, 15:53

Takhle ano, jenže já mám v setupu další kontroly - v eeprom hodin je příznak, zda čas hodin je letní nebo zimní a pokud to odpovídá období, tak se posun vůbec neprovede (a nedochází ke zbytečnému delay) - nastavím příznak na false.
To, proč to řeším, je případný výpadek proudu v čase, kdy má dojít k posunu.
Naposledy upravil(a) ivo_mu dne 18 bře 2022, 16:13, celkem upraveno 1 x.

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 » 18 bře 2022, 16:10

Víš, kdybys na začátku popsal rovnou co potřebuješ ... tím mám na mysli přechod letního a zimního času ... neprobádali bychom tady záhady restartů a bootloaderu arduina ...
Osobně mi to nevadí, ale mohl jsi dostat odpověď dříve a přímo k jádru pudla.

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 » 18 bře 2022, 16:16

To je sice pravda, ale nedozvěděl bych se, proč se to chová jinak, než očekávám. A příště bych to neuměl řešit sám. Já to mám tak, že vždycky chci porozumět tomu co dělám, a jsem perfekcionista. Proto si myslím, že jsem dobrý programátor, i když v posledních letech dělám jen PHP a JavaScript (takže kodér) a už se tím ani neživím. Takže mockrát děkuji všem za pomoc a vysvětlení.

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 » 18 bře 2022, 16:33

Však není problém popsat problém který vzniká, požádat o vysvětlení a zároveň i napsat co vlastně vůbec řeším v praxi. My jsme tady hodní :)

Odpovědět

Kdo je online

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