Beállítás, óra DS1307

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 9898
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Beállítás, óra DS1307

HozzászólásSzerző: Robert » 2016. március 11. péntek, 15:27

Tippek:

a __DATE__, __TimE__ változó? ha igen, hol adtál neki értéket? mire állítanád az rtc-t?
ide nem egy konkrét dátumot és egy időt kellett volna írni?

Ez a fordításkori PC idő.

Avatar
csegebiga
Chipgyilok
Hozzászólások: 277
Csatlakozott: 2015. március 27. péntek, 21:27

Re: Beállítás, óra DS1307

HozzászólásSzerző: csegebiga » 2016. március 11. péntek, 16:16

nahát!
ezt nem tudtam!
mindig tanul a zember!

köszönöm!
:)

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9898
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Beállítás, óra DS1307

HozzászólásSzerző: Robert » 2016. március 12. szombat, 7:04

Ilyen paraméter még:
__file__ : melyik állományt fordítom,
__line__: program hányadik sora
__ASSEMBLER__: ASM van e a kódban
__OBJC__: objective-c fordító közreműködött e a kódfordításban
__STDC_VERSION__: melyik kiadású C standard került értelmezésre a fordításkor
__STDC__: standard C került e alkalmazásra a teljes kódértelmezés során

Forrás: https://gcc.gnu.org/onlinedocs/gcc-4.1. ... acros.html

Dvix95
DrótVégénSzéndarab
Hozzászólások: 23
Csatlakozott: 2015. június 15. hétfő, 20:56

Re: Beállítás, óra DS1307

HozzászólásSzerző: Dvix95 » 2016. március 12. szombat, 8:28

1. 3 as lábon van a 13 az el van írva
2. át volt rakva a 3. pontban lévőhöz csak ott maradt .
3. csak akkor állítsa be az időt ha rá van dugva a gépre mert előtte akár hányszor bekapcsoltam újra beállított valamit
4. az lcd n kiírja milyen módban lesz a bekapcsolás időzítve ha a másodperc nagyobb mint 5 kikapcsol azaz 07:00:05 kor kikapcsol
5. az egy változó akart lenni ami a kód elejéről sajnos lemarat nem jól másoltam be, de 5 az értéke annak is az az 07:00:00kor bekapcsol.

Nézegettem a linket ,de nem értem mi mit csinál a leírást is csak ha németül lenne akkor érteném meg.

Dvix95
DrótVégénSzéndarab
Hozzászólások: 23
Csatlakozott: 2015. június 15. hétfő, 20:56

Re: Beállítás, óra DS1307

HozzászólásSzerző: Dvix95 » 2016. március 14. hétfő, 9:08

Sikerült előre haladni ,működik amit szerettem volna csinálni,de valaki le ellenőrizné,hogy helyesen van e meg írva nincs e benne nagyobb hiba. Amit tud beállítom az időt a program indulásakor ha 4 lábon lévő gombot megnyomom a perchez hozzá ad 1 et ha a5 ös lábon lévőt nyomom meg el vesz 1 et.

Kód: Egész kijelölése

;
#include "Wire.h"
#define DS1307_ADDRESS 0x68
byte zero = 0x00;

void setup(){
pinMode(4,INPUT);
pinMode(5,INPUT);
Wire.begin();
Serial.begin(9600);
setDateTime();

}
void loop(){
  if(digitalRead(4)==LOW){
      Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);

  byte second = bcdToDec(Wire.read());
  byte minute = bcdToDec(Wire.read()+1);
      if(minute>59){minute=0;}
  byte hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  byte weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  byte monthDay = bcdToDec(Wire.read());
  byte month = bcdToDec(Wire.read());
  byte year = bcdToDec(Wire.read());
   Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);

  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekDay));
  Wire.write(decToBcd(monthDay));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.write(zero); //start
  Wire.endTransmission();}
if(digitalRead(5)==LOW){
Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);

  byte second = bcdToDec(Wire.read());
  byte minute = bcdToDec(Wire.read()-1);
      if(minute>=60){minute=59;}
  byte hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  byte weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  byte monthDay = bcdToDec(Wire.read());
  byte month = bcdToDec(Wire.read());
  byte year = bcdToDec(Wire.read());
   Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);

  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekDay));
  Wire.write(decToBcd(monthDay));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.write(zero); //start
  Wire.endTransmission(); 
}
printDate();

delay(1000);
}

void setDateTime(){
byte second =      45; //0-59
byte minute =     58; //0-59
byte hour =        0; //0-23
byte weekDay =     2; //1-7
byte monthDay =    1; //1-31
byte month =       3; //1-12
byte year  =       17; //0-99
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(weekDay));
Wire.write(decToBcd(monthDay));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.write(zero); //start
Wire.endTransmission();
}

byte decToBcd(byte val){
return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)  {
return ( (val/16*10) + (val%16) );
}

void printDate(){
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
int monthDay = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());

  Serial.print(month);
  Serial.print("/");
  Serial.print(monthDay);
  Serial.print("/");
  Serial.print(year);
  Serial.print(" ");
  Serial.print(hour);
  Serial.print(":");
  Serial.print(minute);
  Serial.print(":");
  Serial.println(second);

}







Avatar
Robert
Elektronbűvölő
Hozzászólások: 9898
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Beállítás, óra DS1307

HozzászólásSzerző: Robert » 2016. március 14. hétfő, 9:20

A nyomógomb prellegés nincs lekezelve.
Igaz külső felhúzóellenállás ott van a gombokon?

Dvix95
DrótVégénSzéndarab
Hozzászólások: 23
Csatlakozott: 2015. június 15. hétfő, 20:56

Re: Beállítás, óra DS1307

HozzászólásSzerző: Dvix95 » 2016. március 14. hétfő, 9:24

Igen, az ott van. Azon kívül más hiba van ,vagy tűrhető ?

Dvix95
DrótVégénSzéndarab
Hozzászólások: 23
Csatlakozott: 2015. június 15. hétfő, 20:56

Re: Beállítás, óra DS1307

HozzászólásSzerző: Dvix95 » 2016. március 14. hétfő, 13:11

Egy olyan kérdésem lenne még ,hogy a void loopból meg hívaja printDate()-t arra mi szükség van,ha simán a loopba teszem az úgy nem jó ?

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3228
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: Beállítás, óra DS1307

HozzászólásSzerző: kapu48 » 2016. március 14. hétfő, 15:52

Inkább a setup-ból tedd megjegyzésbe a : //setDateTime(); sort!
Mert az feleslegesen minden bekapcsoláskór újra állítja az RTC-t!
Ezt csak egyszer kel megtenni amig az ellem birja a modulban!

Avatar
csegebiga
Chipgyilok
Hozzászólások: 277
Csatlakozott: 2015. március 27. péntek, 21:27

Re: Beállítás, óra DS1307

HozzászólásSzerző: csegebiga » 2016. március 14. hétfő, 16:02

a ctrl+c ctrl+v átka:

Kód: Egész kijelölése

 byte minute = bcdToDec(Wire.read()-1);
      if(minute>=60){minute=59;}

a függvények használatáról:
a programozó egy lusta állatfajta; utál többszörösen,dolgozni.
    nézd meg a programodat, hány helyen olvasod a rtc chipet?
    3 helyen, háromszor leprogramozva (perc plusz, perc mínusz, idő kiíratás)
    ha módosítani kéne, hogy a hét napjának nevét is mutassa, hány helyen kéne módosítani? igen, három helyen.
    és ugyanez van a chipbe kiíratásnál is(perc plusz, perc minusz, setDateTime)
tehát mikor egy programrészt egynél többször kell leírni, (azután mindegyiket egyenként módosítani, javítani), akkor erre kitalál valamit

jelen esetben azt, hogy az ismétlődő programrészletet kirakja külön függvénybe (getData() és setData() ), és azt hívogatja több helyről.
egyszer írja meg, egy helyen kell módosítani, olvashatóbb a program

Kód: Egész kijelölése

 if(digitalRead(5)==LOW){        //perc csökkentő
      getDate();                   // beolvassa a dátum-idő adatokat
        minute=minute-1;
        if(minute<0){minute=59;}
      setDate();                   // kiírja a dátum-idő adatokat
    }
   


jelen kérdésed annyiban jogos, hogy a printDate() ebben a programban csak egy helyről hívódik meg, nem feltétlenül indokolt kirakni
amiért mégis jó, ha külön van, az a loop() olvashatósága, a moduláris felépítés szerkezete.
meg amikor megírod a printLcd() lcd kezelő függvényt, tudod, hogy ennek a helyére/ez mellé kell berakni a loop() ba :)

Dvix95
DrótVégénSzéndarab
Hozzászólások: 23
Csatlakozott: 2015. június 15. hétfő, 20:56

Re: Beállítás, óra DS1307

HozzászólásSzerző: Dvix95 » 2016. március 14. hétfő, 22:09

Értem,köszönöm a válaszokat!

Dvix95
DrótVégénSzéndarab
Hozzászólások: 23
Csatlakozott: 2015. június 15. hétfő, 20:56

Re: Beállítás, óra DS1307

HozzászólásSzerző: Dvix95 » 2016. július 3. vasárnap, 14:14

Sziasztok , ds1307 el készítettem egy órát még régebben akkor félreraktam idő hiány miatt most viszont szeretném folytatni, a kérdéseim az lennének,hogy: amikor állítom év,hónap ,nap stb. a hét napjai az hogy van pontosan mert láttam olyat ahol 1 volt a vasárnap 7 a hétfő ,de olyat is ahol 0-6 ig volt hétfő-vasárnap pontosan melyik akar melyik lenni? A másik kérdésem az volna,hogy ha van egy 1 Hz es jelem akkor azt melyik lábára kell rakni ha nem a saját órajelét akarom használni( legjobb tudomásom szerint lehet ilyet csinálni) .
A válaszokat előre is köszönöm.

Avatar
csegebiga
Chipgyilok
Hozzászólások: 277
Csatlakozott: 2015. március 27. péntek, 21:27

Re: Beállítás, óra DS1307

HozzászólásSzerző: csegebiga » 2016. július 3. vasárnap, 18:03

ds1307 datasheet

nézd meg!

8.oldal alja. Table 2. Timekeeper Registers
ott van benne, hogy a hét napja (03H day) értékkészlete (range) 1-7

ugyanitt a 9.oldalon tárgyalják, hogy a SQW láb az kimenet, amit be lehet állítani, hogy milyen frekvencián dolgozzon, ha engedélyezve van.
tehát ezt az áramkört nem hajthatod meg 1 Hz-es órajellel, hanem tőle kaphatsz ilyen jelet.
7 SQW/OUT
Square Wave/Output Driver. When enabled, the SQWE bit set to 1, the SQW/OUT pin
outputs one of four square-wave frequencies (1Hz, 4kHz, 8kHz, 32kHz). The SQW/OUT
pin is open drain and requires an external pullup resistor. SQW/OUT operates with either
VCC or VBAT applied. The pullup voltage can be up to 5.5V regardless of the voltage on
VCC. If not used, this pin can be left floating.


(a SCL az az i2c busz órajele, nem a rtc bemenete.)


Vissza: “Arduino / C-nyelvű programozás (AVR-Duino, EthDuino, Arduino, Diecimila)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég