60 nap alatt Arduino #33 - I2C órachipek
60 nap alatt Arduino #33 - I2C órachipek
A fórum ezen része az órachipekkel foglalkozik. Nem a komplett projektekkel -> az a másik fórumban van.
Itt a PCF8563T / DS1307 / R5S372A és egyéb I2C buszos órák rejtelmei jönnek elő...
Itt a PCF8563T / DS1307 / R5S372A és egyéb I2C buszos órák rejtelmei jönnek elő...
öröknaptár
Meglepő. Tudom, h számunkra mindegy, ha egyszer ezt tudja az IC akkor ezzel kell együtt élnünk, csak nem értem miért.Robert a 60 nap alatt Arduino #33 - I2C busz és az óra levélben írta:A hét napja és a dátum külön életet él; nincs a naptárchipben öröknaptár, hogy kiszámolja milyen nap van!
A téli/nyári időszámítást nem tudja, ezt értem, ez gazdaságpolitikai kérdés, és ráadásul területenként és törvénymódosításonként változhat. De az "öröknaptár" funkciót mi az az ok, ami miatt nem teszik bele?
Lehet, h ez a megfejtés. Köszi.
Amúgy az óraIC jelenlegi definíció szerint nem is tudja, h melyik évszázadban vagyunk. Csak azt mondja meg, h x évszázadban, vagy x+1 században. És x lehet 20 v 21, de akár 19 is valami régebbi cuccban, persze csak kifacsart logika szerint. Így pedig tényleg nem lehet megmondani, h adott dátum a hét milyen napjára esik.
Amúgy az óraIC jelenlegi definíció szerint nem is tudja, h melyik évszázadban vagyunk. Csak azt mondja meg, h x évszázadban, vagy x+1 században. És x lehet 20 v 21, de akár 19 is valami régebbi cuccban, persze csak kifacsart logika szerint. Így pedig tényleg nem lehet megmondani, h adott dátum a hét milyen napjára esik.
Nincs olyan, h 2099-es év. Olyan van, h 99-es év és vagy C=1 vagy C=0.Robert írta:Az órachippel próbáld ki: 2099. 12. 31-e van, 23:59:59.
Hova lép tovább?:)
A leírás szerint ekkor váltja C értékét, azaz ha 0 volt 1 lesz, ha 1 volt, 0 lesz.
De ha hozzájutok a vackocskáimhoz otthon akkor kipróbálom, jó?
(C a hetes regiszter 7-es bitje a PCF8563 óraICben)
Igaz nem teljes, csak1901-től jó a számítás, de nem is nagyon sok számolást tartalmaz és így nem kell megadni kezdő napot.Robert írta:Az öröknaptár számolásigényes. Ez tranzisztor-chipfelület. Osztás van benne, és az sokat számít. TE add meg, hogy milyen nap van és utána ezt léptetem 0..6 sorban...
Azért annyi csalás van benne, hogy 1901 január 1. meghatározott nap, ebből indul.
void milyen_nap (int ev_m,int ho_m,int nap_m) //mai nap datuma eeee hh nn formatumban
{
kezdo_nap=((((ev_m-1901)/4)*5)+((ev_m-1901)%4)+2)%7; //a keresett ev januar 1 milyen nap
szokoev = (((!(ev_m%4) && (ev_m%100))||!(ev_m%400))&&(ho_m>2)) ? 1 : 0; //az adott ev szokoev
nap_szam=(kezdo_nap+elteres[ho_m-1]+szokoev+nap_m-1)%7; //a keresett nap 0..6 Vas ..Szo, ahol az elteres adjameg,
//hogy a honap elseje hanyadik nap az evben, igaz csak 1901-tol jo, de ez is eleg
most jutottam el oda, hogy ki tudjam probalni a peldakodot, de nem fordul:
gondolom megvaltozott az osztaly az uj Arduino verzioban, mindjart utanaguglizok, de nem artana aktualizalni a lecket
MOD: send helyett write, receive helyett read, plusz egy kis eroszakos (uint8_t) castolas, es kesz
Kód: Egész kijelölése
RTC_test.cpp: In function ‘void setup()’:
RTC_test.cpp:80:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp:82:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp:84:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp:86:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp:88:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp:90:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp:92:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp:94:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp:96:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp:98:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp:100:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp:102:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp:104:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp:106:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp:108:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp:110:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp:112:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp: In function ‘void loop()’:
RTC_test.cpp:129:8: error: ‘class TwoWire’ has no member named ‘send’
RTC_test.cpp:140:17: error: ‘class TwoWire’ has no member named ‘receive’
RTC_test.cpp:152:30: error: ‘class TwoWire’ has no member named ‘receive’
RTC_test.cpp:161:32: error: ‘class TwoWire’ has no member named ‘receive’
RTC_test.cpp:171:35: error: ‘class TwoWire’ has no member named ‘receive’
RTC_test.cpp:172:39: error: ‘class TwoWire’ has no member named ‘receive’
RTC_test.cpp:173:28: error: ‘class TwoWire’ has no member named ‘receive’
RTC_test.cpp:177:36: error: ‘class TwoWire’ has no member named ‘receive’
MOD: send helyett write, receive helyett read, plusz egy kis eroszakos (uint8_t) castolas, es kesz
A hozzászólást 1 alkalommal szerkesztették, utoljára glezmen 2012. október 31. szerda, 16:57-kor.
Fuj, csunya, lusta diak!
Nem olvas és a tanárra fogja! Olvasd el az I2C első leckéjét.
Arduino-00xx és Arduino-1.x részt.
A wire.send/receive helyett wire.read/write az utasítás.
29. lecke, közepe:
"Arduino-00xx sorozatban a Wire.receive() utasítás volt érvényben, ez változott meg Wire.read()-ra az Arduino-1.0-ban."
"Arduino-00xx sorozatban a Wire.send() utasítás volt érvényben, ez változott meg Wire.write()-ra az Arduino-1.0-ban."
Direkt nincs aktualizálva, ugyanis az Arduino1.x sok esetben _még mindig_ nem használható! A külső eljárás- és függvénykönyvtárak ~40 %-a NEM működik az Arduino 1.x alatt!
Nem olvas és a tanárra fogja! Olvasd el az I2C első leckéjét.
Arduino-00xx és Arduino-1.x részt.
A wire.send/receive helyett wire.read/write az utasítás.
29. lecke, közepe:
"Arduino-00xx sorozatban a Wire.receive() utasítás volt érvényben, ez változott meg Wire.read()-ra az Arduino-1.0-ban."
"Arduino-00xx sorozatban a Wire.send() utasítás volt érvényben, ez változott meg Wire.write()-ra az Arduino-1.0-ban."
Direkt nincs aktualizálva, ugyanis az Arduino1.x sok esetben _még mindig_ nem használható! A külső eljárás- és függvénykönyvtárak ~40 %-a NEM működik az Arduino 1.x alatt!
A hozzászólást 1 alkalommal szerkesztették, utoljára Robert 2012. október 31. szerda, 16:58-kor.
jovanna, kozben rajottem, ld. fentRobert írta:Fuj, csunya, lusta diak!
Nem olvas és a tanárra fogja! Olvasd el az I2C első leckéjét.
Arduino-00xx és Arduino-1.x részt.
A wire.send/receive helyett wire.read/write az utasítás.
29. lecke, közepe:
"Arduino-00xx sorozatban a Wire.receive() utasítás volt érvényben, ez változott meg Wire.read()-ra az Arduino-1.0-ban."
"Arduino-00xx sorozatban a Wire.send() utasítás volt érvényben, ez változott meg Wire.write()-ra az Arduino-1.0-ban."
amugy meg olvasni olvastam, de ki a franc emlekszik mar arra igy 3 honap utan?
egyebkent a castolas szerintem nem volt a leckeben (most csakazertse' keresem meg! )
nem volt itthon RTC chip, anelkul nehez kiprobalniRobert írta:3 hónap??? A tanfolyamot sorban kell olvasni:). És kipróbálni...
De az ilyen buktákból lehet a legtöbbet tanulni....
amugy meg ma jottem haza kufoldrol
amugy nem neveznem 'buktanak', kb. 1 perc volt megtalalni a megoldast es kijavitani a kodot
Üdv!
A tanfolyami példa programot szerettem volna továbbfejleszteni, és szeretném, ha nem állítana be valamit, ha már korábban beállítottam, és az órachip meg úgy is megjegyezte. Ehhez írtam az alábbi függvényt, amit a setup() -ból hívok meg, de nem igazán akar működni. Valamiért az év, a nap, az óra és a perc rendben, de a többi eléggé ötletszerű értékeket ad.
Az eredeti példaprogram amúgy rendesen működik.
Mi lehet a gond?
void ido_kerdez()
{
Wire.beginTransmission(I2C_RTC);
Wire.write(0x02);
result = Wire.endTransmission();
if (result) SetError(ERROR_RTC_GET);
Wire.requestFrom(I2C_RTC, 7);
second_old = Wire.read();
if (second & 0x80) SetError(ERROR_CLOCK_INTEGRITY);
second_old = BcdToDec(second & 0b01111111);
second = second_old;
minute_old = BcdToDec(Wire.read());
minute = minute_old;
hour_old = BcdToDec(Wire.read());
hour = hour_old;
day = BcdToDec(Wire.read());
weekday = BcdToDec(Wire.read());
month = Wire.read();
century = (month & 0x80);
month = BcdToDec(month & 0b01111111);
year = BcdToDec(Wire.read());
}
A tanfolyami példa programot szerettem volna továbbfejleszteni, és szeretném, ha nem állítana be valamit, ha már korábban beállítottam, és az órachip meg úgy is megjegyezte. Ehhez írtam az alábbi függvényt, amit a setup() -ból hívok meg, de nem igazán akar működni. Valamiért az év, a nap, az óra és a perc rendben, de a többi eléggé ötletszerű értékeket ad.
Az eredeti példaprogram amúgy rendesen működik.
Mi lehet a gond?
void ido_kerdez()
{
Wire.beginTransmission(I2C_RTC);
Wire.write(0x02);
result = Wire.endTransmission();
if (result) SetError(ERROR_RTC_GET);
Wire.requestFrom(I2C_RTC, 7);
second_old = Wire.read();
if (second & 0x80) SetError(ERROR_CLOCK_INTEGRITY);
second_old = BcdToDec(second & 0b01111111);
second = second_old;
minute_old = BcdToDec(Wire.read());
minute = minute_old;
hour_old = BcdToDec(Wire.read());
hour = hour_old;
day = BcdToDec(Wire.read());
weekday = BcdToDec(Wire.read());
month = Wire.read();
century = (month & 0x80);
month = BcdToDec(month & 0b01111111);
year = BcdToDec(Wire.read());
}