60 nap alatt Arduino #33 - I2C órachipek

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

60 nap alatt Arduino #33 - I2C órachipek

Hozzászólás Szerző: Robert »

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ő...
Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00

öröknaptár

Hozzászólás Szerző: macsek »

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!
Meglepő. Tudom, h számunkra mindegy, ha egyszer ezt tudja az IC akkor ezzel kell együtt élnünk, csak nem értem miért.
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?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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...
Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00

Hozzászólás Szerző: macsek »

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.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Az órachippel próbáld ki: 2099. 12. 31-e van, 23:59:59.

Hova lép tovább?:)

De ez a garancia lejárta miatt nem az én gondom.... 88 éver nem vállalok garanciát :P

De 2037. szeptemberében úgyis lesz még egy pontosidő káosz, mint az Y2K...
Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00

Hozzászólás Szerző: macsek »

Robert írta:Az órachippel próbáld ki: 2099. 12. 31-e van, 23:59:59.

Hova lép tovább?:)
Nincs olyan, h 2099-es év. Olyan van, h 99-es év és vagy C=1 vagy C=0.
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)
Avatar
csttom
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2010. február 20. szombat, 7:00

Hozzászólás Szerző: csttom »

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...
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.
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
Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00

Hozzászólás Szerző: macsek »

csttom írta: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.
Köszi!!! Kiindulásnak jó.
Mondjuk biztos nem void, mert akkor hogy adja vissza az értéket?
Mi lehet az a elteres[ho_m-1]?
Avatar
glezmen
Bitmanipulátor
Hozzászólások: 139
Csatlakozott: 2012. augusztus 9. csütörtök, 6:00

Hozzászólás Szerző: glezmen »

most jutottam el oda, hogy ki tudjam probalni a peldakodot, de nem fordul:

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’

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 :)
A hozzászólást 1 alkalommal szerkesztették, utoljára glezmen 2012. október 31. szerda, 16:57-kor.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Fuj, csunya, lusta diak! :twisted:
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.
Avatar
glezmen
Bitmanipulátor
Hozzászólások: 139
Csatlakozott: 2012. augusztus 9. csütörtök, 6:00

Hozzászólás Szerző: glezmen »

Robert írta:Fuj, csunya, lusta diak! :twisted:
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."

:evil:
jovanna, kozben rajottem, ld. fent :P
amugy meg olvasni olvastam, de ki a franc emlekszik mar arra igy 3 honap utan? :roll:
egyebkent a castolas szerintem nem volt a leckeben (most csakazertse' keresem meg! :D)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

3 hónap??? A tanfolyamot sorban kell olvasni:). És kipróbálni...

De az ilyen buktákból lehet a legtöbbet tanulni....
Avatar
glezmen
Bitmanipulátor
Hozzászólások: 139
Csatlakozott: 2012. augusztus 9. csütörtök, 6:00

Hozzászólás Szerző: glezmen »

Robert írta:3 hónap??? A tanfolyamot sorban kell olvasni:). És kipróbálni...

De az ilyen buktákból lehet a legtöbbet tanulni....
nem volt itthon RTC chip, anelkul nehez kiprobalni
amugy meg ma jottem haza kufoldrol :P
amugy nem neveznem 'buktanak', kb. 1 perc volt megtalalni a megoldast es kijavitani a kodot :)
Avatar
blaci
Újonc
Újonc
Hozzászólások: 6
Csatlakozott: 2012. február 6. hétfő, 7:00

Hozzászólás Szerző: blaci »

Ü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());
}
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A beállítás vagy a vissszaolvasás nem jó?
Válasz küldése