www.elektronik.si
Ura z DS1307 si ne zapomni po izklopu napajanja

www.elektronik.si -> Arduino sekcija

Avtor: marko11Kraj: Dobrepolje PrispevekObjavljeno: Sob Apr 17, 2021 7:51 pm    Naslov sporočila:  Ura z DS1307 si ne zapomni po izklopu napajanja
----------------------------------------------------------------------------
Hi

Imam modul DS1307, ko naložim program in odprem serijski vmesnik vse lepo deluje, prikazuje pravi čas in datum.

Ko pa izklopim napajanje in ga čez čas ponovno vklopim pa začne prikazovati čas od takrat naprej, ko sem naložil program, ne pa trenutni čas.

Menjal sem knjižnice in programe pa je vedno isto.

Mogoče kdo ve kje je problem?

LP,marko

Avtor: BranezKraj: Koprivnica HR PrispevekObjavljeno: Sob Apr 17, 2021 8:02 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Ima ta tvoj modul DS1307 lastno napajanje, oziroma baterijski backup (CR2032)?

Avtor: marko11Kraj: Dobrepolje PrispevekObjavljeno: Sob Apr 17, 2021 8:07 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Branez je napisal/a:
Ima ta tvoj modul DS1307 lastno napajanje, oziroma baterijski backup?


Da ima baterijo, takšen je ta modul kot na tem naslovu:

https://robotdyn.com/rtc-real-time-clock-ds1307-module.html

lp,

Avtor: mucekKraj: Domzale PrispevekObjavljeno: Sob Apr 17, 2021 8:30 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Pa je baterija dobra? Zmeri napetost ...

Avtor: marko11Kraj: Dobrepolje PrispevekObjavljeno: Tor Apr 20, 2021 9:20 pm    Naslov sporočila:  
----------------------------------------------------------------------------
mucek je napisal/a:
Pa je baterija dobra? Zmeri napetost ...


Ni baterija.
Mi pa je nekako uspelo zamenjati čas. Je neki čuden postopek, nekako takole sem napravil, pa nisem čisto siguren, če je to to:

Zaprem serijski vmesnik
Vpišem nove podatke v program
Naložim program
izklopim napajanje
potem pa zopet vklopim napajanje
odprem serijski, da vidim če je čas spremenjen.

Pa ta postopek mi ne uspe vedno.


Mogoče obstajajo kakšna navodila glede zamenjave časa v čipu.

Mogoče se je že marsikdo ukvarjal s tem časom, da je ugotovil postopek na uri DS1307.

Kako se pa zamenja čas na DS3231 ?

Lp,

Avtor: rplink3rKraj: Levec PrispevekObjavljeno: Tor Apr 20, 2021 10:03 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Da nimaš slučajno tako narejeno, da Arduino compile time vsakič naloži na DS?


Nekateri primeri so imeli podobno, tisto vrstico sem ven brisal.

Avtor: marko11Kraj: Dobrepolje PrispevekObjavljeno: Tor Apr 27, 2021 11:55 am    Naslov sporočila:  
----------------------------------------------------------------------------
rplink3r je napisal/a:
Da nimaš slučajno tako narejeno, da Arduino compile time vsakič naloži na DS?


Nekateri primeri so imeli podobno, tisto vrstico sem ven brisal.


Ja, seveda to vrstico moraš pokomentirati.

Mogoče pa obstajajo kakšna tovarniška navodila glede zamenjave časa na DS1307?

Verjetno se je že kdo spopadel s to zadevo.

lp,

Avtor: mato1111Kraj: Vrhnika PrispevekObjavljeno: Tor Apr 27, 2021 9:45 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Da ne ugibamo na pamet bi lahko pripel testni program Think
Gleda na tvoj komentar "Vpišem nove podatke v program" potem sumim da imas v programu nekje vrstico kjer v ds1307 "na roke" vpises cas ampak to se zgodi ob vsakem vklopu napajanja...

Avtor: bostjangKraj: Postojna PrispevekObjavljeno: Čet Apr 29, 2021 7:08 am    Naslov sporočila:  
----------------------------------------------------------------------------
marko11 je napisal/a:
Mogoče pa obstajajo kakšna tovarniška navodila glede zamenjave časa na DS1307?

Verjetno se je že kdo spopadel s to zadevo.

lp,

Ja pogledaš v podatkovni list. To je osnova...

Najbrž je že kakšen proizvajalec kje uporabil ta čip, tako da ja.

Avtor: marko11Kraj: Dobrepolje PrispevekObjavljeno: Čet Apr 29, 2021 12:02 pm    Naslov sporočila:  
----------------------------------------------------------------------------
@bostjang, ne znam angleško, pa prosim, če poveš na kateri strani opisuje, pa bom potem z googlom prevedel. Hvala

lp,

Avtor: mucekKraj: Domzale PrispevekObjavljeno: Čet Apr 29, 2021 3:16 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Brez angleščine bo pa težka ...

Avtor: bostjangKraj: Postojna PrispevekObjavljeno: Pet Apr 30, 2021 12:52 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Moram se strinjati z muckom. To smo ugotavljali že v eni drugi temi.

Ampak, če si uspel prebrati čas, ga tudi napisati ne bi smel biti problem tako velik problem.
Sicer pa si za začetek prevedi naslove poglavij.

Avtor: igo PrispevekObjavljeno: Pet Apr 30, 2021 7:32 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Predvsem za začetek pripni sem svoj program, da vidimo, kaj sploh imaš v Setup() in kaj v loop() .


Omenjaš namreč, da pred nalaganjem "vpišeš nove podatke v program" - verjetno kompleten čas in datum.


Razlika ned pisanjem in branjem je en bit v naslovu (R/W) in malenkost drugačna struktura zanke - pri pisanju je SDA pin ves čas izhod in se nanj pošilja "1" oziroma "0", pri branju pa je pin SDA najprej izhod (da vpišeš naslov in ukaz), nato pa vhod, ki bere, kar je DS1397 poslal.

Tisti dve "for zanki" se da iz časovnega diagrama napisati tudi brez knjižnic (ki včasih vsebujejo kakšno "presenečenje"), samo z digitalWrite(...), maskiranjem spremenljivk in delayMicros(10).

Avtor: marko11Kraj: Dobrepolje PrispevekObjavljeno: Pet Apr 30, 2021 10:02 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Tukaj pripenjam program za uro. Če hočem ročno vpisati drugi čas naj bi odkomentiral clock.setDateTim in naložil program. Ko to napravim se čas ne zamenja.

Sem nekje zgoraj opisal postopek kako mi je uspelo zamenjati čas. Samo tisto ni verjetno pravi postopek.

Lp



Koda:


#include <DS1307.h>
DS1307 clock;   //(0x68)
RTCDateTime dt;

void setup() {
 
//--------------------------------------------- DS1307
  Serial.println("Inicializiraj DS1307");;
  clock.begin();
 

  if (!clock.isReady())
  {   
    clock.setDateTime(__DATE__, __TIME__);
      // Rocno vnasanje (YYYY, MM, DD, HH, mm, SS
     //clock.setDateTime(2021, 4, 30, 19, 53, 00);       
  }

}

void loop() {

  dt = clock.getDateTime();
 
  Serial.print("Datum in ura: ");
  Serial.print(dt.year);   Serial.print("-");
  Serial.print(dt.month);  Serial.print("-");
  Serial.print(dt.day);    Serial.print(" ");
  Serial.print(dt.hour);   Serial.print(":"); 
  Serial.print(dt.minute); Serial.print(":");
  Serial.print(dt.second); Serial.println("");
     
}

Avtor: mato1111Kraj: Vrhnika PrispevekObjavljeno: Pet Apr 30, 2021 10:26 pm    Naslov sporočila:  
----------------------------------------------------------------------------
clock.setDateTime postavi za if stavkom, ampak po vsakem vklopu arduina ti bo potem nastavil na ta čas (to lahko rešiš z pomnenjem zastavice v eepromu ipd.)

Sumim da !clock.isReady() pomeni da čas ni nastavljen (privzete tovarniške vrednosti) in ti ga potem avtomatsko nastavi iz časa ko je bil program naložen na arduino. Ker si čas na ta način že nastavil tega if stavka ne izvede več (dokler ne odstraniš baterije).

Avtor: rafaellsiKraj: Radovljica PrispevekObjavljeno: Pet Apr 30, 2021 11:03 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Spremenjivki __DATE__ in __TIME__, ti nastavi prevajalnik, in dejansko namesto spremenjivk vstavi trenutni čas. Se pravi, ti čas nastavi na čas ko si progam prevajal. ..

Avtor: igo PrispevekObjavljeno: Sob Maj 01, 2021 12:09 am    Naslov sporočila:  
----------------------------------------------------------------------------
Tvoj program je še najbolj podoben temu:
https://github.com/jarzebski/Arduino-DS1307/blob/master/DS1307_simple/DS1307_simple.ino


Knjižnic za ds1307 je pa nešteto in vsaka ima svoje ukaze.
Posledično primeri kode od ene knjižnice ne delujejo z drugo knjižnico.

Pripni povezavo do vira, kje si dobil tvojo.

Našel pa sem tole:
clock. setDateTime(__DATE__, __TIME__); resets the clock to compile date & time. Set it once then load a modified program that doesn't include that line

V komentarju torej piše: Ta vrstica resetira DS1307 na čas prevajanja (compile time). Prvič naložiš program, ki vsebuje gornjo vrstico.
Nato pa to vrstico zakomentiraš in ponovno naložiš program. V bistvu pri drugem nalaganju zakomentiraj kar celoten if stavek znotraj setup() funkcije.

Nato lahko normalno nalagaš gor razne poskusne programe, ki ne vsebujejo tega if stavka in se bo čas ohranil, dokler ne boš odstranil baterije.

Avtor: igo PrispevekObjavljeno: Sob Maj 01, 2021 4:31 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Nastavljanje datuma in časa s pošiljanjem znakov na Arduinota:
Koda:

#include <DS1307.h>
DS1307 clock;   //(0x68)
RTCDateTime dt;

byte incomingByte = 0; // for incoming serial data (sprejeti byte)
byte StareSek = 0; // Stare Sekunde, da časa ne izpisuje prepogosto, temveč vsako sekundo

void setup()
{
  Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}


void loop()
{
  dt = clock.getDateTime(); // loop() lepo bere datum in čas

  BereSerP(); // Bere Serijski Port

  if(dt.second != StareSek)
  { // Izpiše samo, kadar so nove sekunde različne od starih
    Serial.print("Datum in ura: ");
    Serial.print(dt.year);   Serial.print("-");
    Serial.print(dt.month);   Serial.print("-");
    Serial.print(dt.day);    Serial.print(" ");
    Serial.print(dt.hour);   Serial.print(":"); 
    Serial.print(dt.minute);   Serial.print(":");
    Serial.print(dt.second);   Serial.println("");
    StareSek = dt.second;
  }

} // void loop()

void BereSerP() // Bere Serijski Port
{
  if (Serial.available() > 0) // je kaj sprejeto?
  { // read the incoming byte:
    incomingByte = Serial.read(); // je
  }
  else return; // nič ni sprejetega, lahko leti ven

  switch(incomingByte) // preveri sprejeto in
  { // spremeni ustrezno dt vrednost
    case  0:  break; // ničla 0x00 (brez narekovajev): ne stori ničesar
    case  'Y':  dt.year++;  break; // črka Y
    case  'y':  dt.year--;  break; // črka mali y
    case  'M':  dt.month++;  break;
    case  'm':  dt.month--;  break;
    case  'D':  dt.day++;  break;
    case  'd':  dt.day--;  break;
    case  'H':  dt.hour++;  break;
    case  'h':  dt.hour--;  break;
    case  'N': dt.minute++;  break; // miNute
    case  'n':  dt.minute--;  break;  // miNute
    case  'S':  dt.second++;  break;
    case  's':  dt.second--;  break;
    default:  incomingByte = 0; // če je znak neveljaven, ga izbriše
  }
  if(incomingByte > 0) // bil je veljaven
  {
    clock.setDateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second); // Vpiše spremembo nazaj v DS1307
    incomingByte = 0; // v vsakem primeru izbriše sprejet znak
    StareSek = 255; // da takoj izpiše spremembo
  }
}  // void BereSerP()


Branje DS in serijskega porta se dogaja ves čas, izpis pa samo vsako sekundo ali, če je kakšna sprememba.

Spremenljivke se povečajo ++ ali zmanjšajo -- brez preverjanja veljavnosti. Če "nastaviš" npr sekunde ali minute na 61 ali 255 (ali ostale spremenljivke izven dovoljenih vrednosti), se lahko zgodi "marsikaj". Za hec preveri in poročaj. Po potrebi v case dodaj if stavke za omejitev posameznih spremenljivk navzgor in navzdol.

case "s": // zmanjša sekunde
if(dt.second == 0) dt.second = 59; // dol okrog iz 0 na 59
else dt.second--;
break;

case "S": // poveča sekunde
if(dt.second >= 59) dt.second = 0; // gor okrog iz 59 na 0
else dt.second++;
break;

... in tako še za ostale.

Stran 1 od 1

Powered by phpBB © 2001,2002 phpBB Group