60 nap alatt Arduino #32 - IIC busz és az óraIC
60 nap alatt Arduino #32 - IIC busz és az óraIC
A tanfolyam PCF8563T illetve DS1307 órachipjének programjai... Ezek finomításai...
60 nap alatt Arduino #33 - IIC busz és a portbővítés
??
A hozzászólást 1 alkalommal szerkesztették, utoljára Robert 2012. augusztus 29. szerda, 11:23-kor.
Tanfolyami program magyaritása
kicsit megpiszkáltam a tanfolyami levélben kapott programot.
Így most magyar változónevekkel, magyar dátumformátummal és egy függvénnyel bővített verzióját másolom ide. A program logikája nem változott.
Így most magyar változónevekkel, magyar dátumformátummal és egy függvénnyel bővített verzióját másolom ide. A program logikája nem változott.
/* PCF8563T orachip
60 nap alatt arduino tanfolyam
Magyarra forditotta es arduino 1.0-ra atirta: Macsek
2012.08.29
(c) TavIR http://avr.tavir.hu */
#include "Wire.h"
//I2C lesz hasznalva
//#define DEBUG // Hibakereso be/kikapcsolas
#define I2C_RTC 0x51 // 7 bites chip cim
#define ERROR_LED 13 //hibaLED
// Hibak
#define HIBA_ORA_BEALL 1 // Ido nem beallithato
#define HIBA_ORA_KIOLV 2 // Ido nem kiolvashato
#define HIBA_ORA_ELEM 3 // RTC ora hibas lehet (elemhiba)
byte evszazad;
byte ev;
byte ho;
byte nap;
byte het_napja;
byte ora;
byte ora_volt; // idovaltozas volt-e kiolvasas alatt
byte perc;
byte perc_volt; // idovaltozas volt-e kiolvasas alatt
byte mp;
byte mp_volt; // idovaltozas volt-e kiolvasas alatt
byte eredmeny;
//napok karakterszintu tombben (byte-k egymas utan, nem szoveglanckent tarolva!)??
//napok tombben, egyenkent lezaro nullaval, azaz karakterlancokbol allo tomb
char* het_napjai[] = {
"Vasarnap", "Hetfo", "Kedd",
"Szerda", "Csutortok", "Pentek", "Szombat"};
// fuggvenyek
byte bcd2dec(byte);
byte dec2bcd(byte);
void hibaJelzes(int);
void serial_print2(byte);
void setup()
{
pinMode(ERROR_LED, OUTPUT); // HibaLED INIT
Wire.begin(); // IIC busz inicializalas
Serial.begin(9600); // Sorosport inicializalas
// Valami kezdoadat beallitasa
ev = 11; // Ev (0-99)
ho = 12; // Honap (1-12)
nap = 31; // Nap (1-31)
het_napja = 0; // Het napja: 0 - vasarnap! (0-6)
ora = ora_volt = 23; // Ora (0-23)
perc = perc_volt = 59; // Perc (0-59)
mp = mp_volt = 53; // Masodperc (0-59)
Wire.beginTransmission(I2C_RTC); // Orachip megszolitasa irasra
Wire.write(0); // 0. regisztertol akarok irni
Wire.write(0); // 0. cim: Control es statusbitek 1
Wire.write(0); // 1. cim: Control es statusbitek 2
Wire.write(dec2bcd(mp)); // 2. cim: Masodperc
Wire.write(dec2bcd(perc)); // 3. cim: Perc
Wire.write(dec2bcd(ora)); // 4. cim: Ora
Wire.write(dec2bcd(nap)); // 5. cim: Nap
Wire.write(dec2bcd(het_napja)); // 6. cim: Het napja
Wire.write(dec2bcd(ho)); // 7. cim: Honap (evszazadbit: 0)
Wire.write(dec2bcd(ev)); // 8. cim: Ev
Wire.write(0b10000000); // 9. cim: Ebresztes perc + tiltobit
Wire.write(0b10000000); // 10. cim: Ebresztes ora + tiltobit
Wire.write(0b10000000); // 11. cim: Ebresztes nap + tiltobit
Wire.write(0b10000000); // 12. cim: Ebresztes het napja + tiltobit
Wire.write(0b10000011); // 13. cim: Kimeneti frekvencia 1 Hz
Wire.write(0); // 14. cim: Visszaszamlalas tiltva
Wire.write(0); // 15. cim: Visszaszamlalasi ertek: 0
Wire.endTransmission();
eredmeny = Wire.endTransmission();
#ifdef DEBUG
Serial.print("Beallitas eredmenye: ");
Serial.println(eredmeny);
#endif
if (eredmeny != 0)
hibaJelzes(HIBA_ORA_BEALL);
}
void loop()
{
Wire.beginTransmission(I2C_RTC); //OraIC megszolitasa olvasasra
Wire.write(0x02); // A 0x02-es regisztertol akarok olvasni
eredmeny = Wire.endTransmission();
#ifdef DEBUG
Serial.print("Az oraIC megszolitasa olvasasra sikeres: ");
Serial.println(eredmeny);
#endif
if (eredmeny != 0)
hibaJelzes(HIBA_ORA_KIOLV);
Wire.requestFrom(I2C_RTC, 1);
mp = Wire.read();
if (mp & 0x80)
hibaJelzes(HIBA_ORA_ELEM);
mp = bcd2dec(mp & 0b01111111);
if (mp != mp_volt) // Megnezzuk valtozott-e a masodperc
{
mp_volt = mp;
if (mp == 0) // Ha a masodperc 0, akkor a percet kiolvassuk
{
Wire.requestFrom(I2C_RTC, 1);
perc = bcd2dec(Wire.read());
if (perc != perc_volt) // Perc valtozott-e
{
perc_volt = perc;
if (perc == 0) // Ha a perc : 0, akkor kell az ora is
{
Wire.requestFrom(I2C_RTC, 1);
ora = bcd2dec(Wire.read());
if (ora != ora_volt) // Az ora valtozott-e
{
ora_volt = ora;
if (ora == 0) // Ha az ora nulla, akkor kell az egyeb adatok
{
//Meg negy adat kell: nap, het napja, honap (+evszazad), ev
Wire.requestFrom(I2C_RTC, 4);
nap = bcd2dec(Wire.read());
het_napja = bcd2dec(Wire.read());
ho = Wire.read();
evszazad = (ho & 0x80);
ho = bcd2dec(ho & 0b01111111);
ev = bcd2dec(Wire.read());
}
}
}
}
}
//milyen evszazad van?
Serial.print(20+evszazad);
// //Lehetne igy is:
// if (evszazad)
// Serial.print("21");
// else
// Serial.print("20");
//honap is ket szamjeggyel irando
//meg a tobbi oraadat is
//mert pl. egy szamjegyu ev eseten hulyen nezne ki
serial_print2(ev); // ket szamjegyesen ir
Serial.print(".");
serial_print2(ho); // lehetne ide is tombot kiiratni, mint a het napjainal
Serial.print(".");
serial_print2(nap);
Serial.print(". ");
//milyen nap van?
Serial.print(het_napjai[het_napja]);
Serial.print("(");
Serial.print(het_napja);
Serial.print("), ");
serial_print2(ora);
Serial.print(":");
serial_print2(perc);
Serial.print(":");
serial_print2(mp);
Serial.println(); // uj sor
}
}
// BCD - Decimalis atalakitas
byte bcd2dec(byte value)
{
return ((value / 16) * 10 + value % 16);
}
// Decimalis - BCD atalakitas
byte dec2bcd(byte value){
return (value / 10 * 16 + value % 10);
}
void hibaJelzes(int error)
// Ha hiba van, villogjon a D13 LED
// annyit amennyi a hiba!
{
while(1) // Folyton folyvast
{
for (byte index = 0; index < error; index++)
{
digitalWrite(ERROR_LED, HIGH);
delay(500);
digitalWrite(ERROR_LED, LOW);
delay(500);
}
delay(1000);
}
}
// Legalabb ket szamjegyen irja ki a kapott szamot
// (tehat ha kell, bevezeto nullaval) a soros portra
void serial_print2(byte kiirando)
{
if (kiirando<10)
Serial.print(0);
Serial.print(kiirando);
}
Két verzióban is ideteszek egy programot, az első jobban áttekinthető, a második pedig a hibakereső üzeneteket is tartalmazza.
Az előző program soros porton beállítható verziója, azaz ha muszáj akkor már lehet használni is, ez eddig az első teljes óraprogramunk, ami beállítható is
Az előző program soros porton beállítható verziója, azaz ha muszáj akkor már lehet használni is, ez eddig az első teljes óraprogramunk, ami beállítható is
/* PCF8563T orachip
60 nap alatt arduino tanfolyam
2012.08.27 TavIR
2012.08.29 Macsek Magyaritas, arduino 1.0, soros porti beallitas
(c) TavIR http://avr.tavir.hu */
#include "Wire.h" //I2C, azaz TWI miatt kell
#define I2C_RTC 0x51 // 7 bites chip cim
#define ERROR_LED 13 //hibaLED
// Hibak
#define HIBA_ORA_BEALL 1 // Ido nem beallithato
#define HIBA_ORA_KIOLV 2 // Ido nem kiolvashato
#define HIBA_ORA_ELEM 3 // RTC ora hibas lehet (elemhiba)
#define HIBA_BEALL 4 // Beallitaskor rossz erteket kapott
#define SOR_PARANCS_HOSSZ 7 // Soros vonali beallito szovegparancs hossza
byte evszazad;
byte ev;
byte ho;
byte nap;
byte het_napja;
byte ora;
byte ora_volt; // idovaltozas volt-e kiolvasas alatt
byte perc;
byte perc_volt; // idovaltozas volt-e kiolvasas alatt
byte mp;
byte mp_volt; // idovaltozas volt-e kiolvasas alatt
byte eredmeny;
//napok tombben, egyenkent lezaro nullaval, azaz karakterlancokbol allo tomb
char *het_napjai[] = {
"Vasarnap", "Hetfo", "Kedd",
"Szerda", "Csutortok", "Pentek", "Szombat"};
// fuggvenyek es parametereik tipusa
byte bcd2dec(byte);
byte dec2bcd(byte);
void hibaJelzes(int);
void serial_print2(byte);
char helyes_beallitoparancs(unsigned char *);
byte ora_beallitas(byte evszazad, byte ev, byte ho, byte nap, byte ora, byte perc, byte mp, byte het_napja);
void setup()
{
pinMode(ERROR_LED, OUTPUT); // HibaLED INIT
Wire.begin(); // IIC busz inicializalas
Serial.begin(9600); // Sorosport inicializalas
Serial.println("Arduino soros porti ora");
Serial.println("-----------------------");
Serial.println("Beallitas soros portrol");
Serial.println("a kovetkezo modon:\n");
Serial.println("T123456");
Serial.println("12:34:56 az ido\n");
Serial.println("D120829");
Serial.println("\'12 aug 29\n");
Serial.println("W201203");
Serial.println("2012 ev, 3=szerda(0..7)");
Serial.println("Jo (hiba)vadaszatot!");
Serial.println("-----------------------");
// Valami kezdoadat beallitasa
evszazad = 0;
ev = 11; // Ev (0-99)
ho = 12; // Honap (1-12)
nap = 31; // Nap (1-31)
het_napja = 0; // Het napja: 0 - vasarnap! (0-6)
ora = ora_volt = 23; // Ora (0-23)
perc = perc_volt = 59; // Perc (0-59)
mp = mp_volt = 53; // Masodperc (0-59)
eredmeny=ora_beallitas(evszazad, ev, ho, nap, ora, perc, mp, het_napja);
}
void loop() ///////////////////////////////////////////////////////
{
// ide tesszuk a soros porton beerkezo beallito parancsokat
unsigned char allitoparancs[SOR_PARANCS_HOSSZ+1];
static char sor_i=0;
char i;
allitoparancs[SOR_PARANCS_HOSSZ]=0; // ki tudjuk irni karakterlanckent
Wire.beginTransmission(I2C_RTC); //OraIC megszolitasa olvasasra
Wire.write(0x02); // A 0x02-es regisztertol akarok olvasni
eredmeny = Wire.endTransmission();
if (eredmeny != 0)
hibaJelzes(HIBA_ORA_KIOLV);
Wire.requestFrom(I2C_RTC, 1);
mp = Wire.read();
if (mp & 0x80)
hibaJelzes(HIBA_ORA_ELEM);
mp = bcd2dec(mp & 0b01111111);
if (mp != mp_volt) // Megnezzuk valtozott-e a masodperc
{
mp_volt = mp;
if (mp == 0) // Ha a masodperc 0, akkor a percet kiolvassuk
{
Wire.requestFrom(I2C_RTC, 1);
perc = bcd2dec(Wire.read());
if (perc != perc_volt) // Perc valtozott-e
{
perc_volt = perc;
if (perc == 0) // Ha a perc : 0, akkor kell az ora is
{
Wire.requestFrom(I2C_RTC, 1);
ora = bcd2dec(Wire.read());
if (ora != ora_volt) // Az ora valtozott-e
{
ora_volt = ora;
if (ora == 0) // Ha az ora nulla, akkor kell az egyeb adatok
{
//Meg negy adat kell: nap, het napja, honap (+evszazad), ev
Wire.requestFrom(I2C_RTC, 4);
nap = bcd2dec(Wire.read());
het_napja = bcd2dec(Wire.read());
ho = Wire.read();
evszazad = (ho & 0x80);
ho = bcd2dec(ho & 0b01111111);
ev = bcd2dec(Wire.read());
}
}
}
}
}
Serial.print(20+evszazad);
//honap is ket szamjeggyel irando
//meg a tobbi oraadat is
//mert pl. egy szamjegyu ev eseten hulyen nezne ki
serial_print2(ev); // ket szamjegyesen ir
Serial.print(".");
serial_print2(ho); // lehetne ide is tombot kiiratni, mint a het napjainal
Serial.print(".");
serial_print2(nap);
Serial.print(". ");
//milyen nap van?
Serial.print(het_napjai[het_napja]);
Serial.print(", ");
serial_print2(ora);
Serial.print(":");
serial_print2(perc);
Serial.print(":");
serial_print2(mp);
Serial.println(); // uj sor
}
// megnezzuk, akarnak-e beallitani
if(Serial.available())
{
allitoparancs[sor_i++]=Serial.read();
if(sor_i >= SOR_PARANCS_HOSSZ || isspace(allitoparancs[sor_i-1]))
{ // beerkezett a teljes parancs vagy entert/szokozt nyomtak
sor_i=0;
if(helyes_beallitoparancs(allitoparancs)) // hiheto ertek
{
for(i=1; i<SOR_PARANCS_HOSSZ; i++)
allitoparancs -= '0'; // minden beirt szamjegy helyere az erteke keruljon
switch(allitoparancs[0])
{
case 'D': // datum
ev = 10*allitoparancs[1] + allitoparancs[2];
ho = 10*allitoparancs[3] + allitoparancs[5];
nap = 10*allitoparancs[5] + allitoparancs[6];
break;
case 'T': // ido
ora = 10*allitoparancs[1] + allitoparancs[2];
perc = 10*allitoparancs[3] + allitoparancs[5];
mp = 10*allitoparancs[5] + allitoparancs[6];
break;
case 'W': // evszazad,ev,het_napja
evszazad = allitoparancs[2] ? 1 : 0; // ha 20xx akkor 0, amugy 1
ev = 10*allitoparancs[3] + allitoparancs[5];
// allitoparancs[5];
het_napja = allitoparancs[6]; // 0-vas, 1-hetf, 7-szomb
} // switch
ora_beallitas(evszazad, ev, ho, nap, ora, perc, mp, het_napja);
} // if helyes
} // if sorhossz
} // if serial.available
} // loop()
// BCD - Decimalis atalakitas
byte bcd2dec(byte value)
{
return ((value / 16) * 10 + value % 16);
}
// Decimalis - BCD atalakitas
byte dec2bcd(byte value){
return (value / 10 * 16 + value % 10);
}
void hibaJelzes(int error)
// Ha hiba van, villogjon a D13 LED
// annyit amennyi a hiba!
{
while(1) // Folyton folyvast
{
for (byte index = 0; index < error; index++)
{
digitalWrite(ERROR_LED, HIGH);
delay(500);
digitalWrite(ERROR_LED, LOW);
delay(500);
}
delay(1000);
// ide lehetne soros port figyelest tenni, beallitashoz
}
}
// Legalabb ket szamjegyen irja ki a kapott szamot
// (tehat ha kell, bevezeto nullaval) a soros portra
void serial_print2(byte kiirando)
{
if (kiirando<10)
Serial.print(0);
Serial.print(kiirando);
}
char helyes_beallitoparancs(unsigned char *allitoparancs)
{
char i;
char jo_parancs = 1;
if(allitoparancs != 'D' && allitoparancs != 'T' && allitoparancs != 'W'
// && allitoparancs != 'A'
)
jo_parancs = 0;
for(i=1; i<SOR_PARANCS_HOSSZ; i++)
{
if(!isdigit(allitoparancs)) // a parancs betujelet koveto osszes karakter szam?
jo_parancs=0;
}
// lehetne meg jatszani az ertektartomany ellenorzessel
if(!jo_parancs) // Ez nem tul felhasznalobarat, de jateknak jo.
hibaJelzes(HIBA_BEALL);
return jo_parancs;
}
byte ora_beallitas(byte evszazad, byte ev, byte ho, byte nap, byte ora, byte perc, byte mp, byte het_napja)
{
Wire.beginTransmission(I2C_RTC); // Orachip megszolitasa irasra
Wire.write(0); // 0. regisztertol akarok irni
Wire.write(0); // 0. cim: Control es statusbitek 1
Wire.write(0); // 1. cim: Control es statusbitek 2
Wire.write(dec2bcd(mp)); // 2. cim: Masodperc
Wire.write(dec2bcd(perc)); // 3. cim: Perc
Wire.write(dec2bcd(ora)); // 4. cim: Ora
Wire.write(dec2bcd(nap)); // 5. cim: Nap
Wire.write(dec2bcd(het_napja)); // 6. cim: Het napja
Wire.write(dec2bcd(ho)); // 7. cim: Honap (evszazadbit: 0)
Wire.write(dec2bcd(ev)); // 8. cim: Ev
Wire.write(0b10000000); // 9. cim: riasztas perc + tiltobit
Wire.write(0b10000000); // 10. cim: riasztas ora + tiltobit
Wire.write(0b10000000); // 11. cim: riasztas nap + tiltobit
Wire.write(0b10000000); // 12. cim: riasztas het napja + tiltobit
Wire.write(0b10000011); // 13. cim: Kimeneti frekvencia 1 Hz
Wire.write(0); // 14. cim: Visszaszamlalas tiltva
Wire.write(0); // 15. cim: Visszaszamlalasi ertek: 0
Wire.endTransmission();
eredmeny = Wire.endTransmission();
if (eredmeny != 0)
hibaJelzes(HIBA_ORA_BEALL);
return eredmeny;
}
/* PCF8563T orachip
60 nap alatt arduino tanfolyam
2012.08 TavIR
2012.08.29 Macsek Magyaritas, arduino 1.0, soros porti beallitas
(c) TavIR http://avr.tavir.hu */
#include "Wire.h" //I2C, azaz TWI miatt kell
//#define DEBUG // Hibakereso be/kikapcsolas
//#define DEBUG1 // sok kimenetet generalo hibakereso be/kikapcsolas
#define I2C_RTC 0x51 // 7 bites chip cim
#define ERROR_LED 13 //hibaLED
// Hibak
#define HIBA_ORA_BEALL 1 // Ido nem beallithato
#define HIBA_ORA_KIOLV 2 // Ido nem kiolvashato
#define HIBA_ORA_ELEM 3 // RTC ora hibas lehet (elemhiba)
#define HIBA_BEALL 4 // Beallitaskor rossz erteket kapott
#define SOR_PARANCS_HOSSZ 7 // Soros vonali beallito szovegparancs hossza
byte evszazad;
byte ev;
byte ho;
byte nap;
byte het_napja;
byte ora;
byte ora_volt; // idovaltozas volt-e kiolvasas alatt
byte perc;
byte perc_volt; // idovaltozas volt-e kiolvasas alatt
byte mp;
byte mp_volt; // idovaltozas volt-e kiolvasas alatt
byte eredmeny;
//byte riasztas_ora;
//byte riasztas_perc;
//byte riasztas_nap;
//byte riasztas_tipus;
//byte riasztas_hetnapja;
//
//byte riasztas_nap_tiltas;
//byte riasztas_ora_tiltas;
//byte riasztas_perc_tiltas;
//byte riasztas_hetnapja_tiltas;
//napok karakterszintu tombben (byte-k egymas utan, nem szoveglanckent tarolva!)??
//napok tombben, egyenkent lezaro nullaval, azaz karakterlancokbol allo tomb
char *het_napjai[] = {
"Vasarnap", "Hetfo", "Kedd",
"Szerda", "Csutortok", "Pentek", "Szombat"};
// fuggvenyek es parametereik tipusa
byte bcd2dec(byte);
byte dec2bcd(byte);
void hibaJelzes(int);
void serial_print2(byte);
char helyes_beallitoparancs(unsigned char *);
byte ora_beallitas(byte evszazad, byte ev, byte ho, byte nap, byte ora, byte perc, byte mp, byte het_napja
// ,byte riasztas_nap, byte riasztas_ora, byte riasztas_perc, byte riasztas_hetnapja,
// byte riasztas_nap_tiltas, byte riasztas_ora_tiltas,
// byte riasztas_perc_tiltas, byte riasztas_hetnapja_tiltas
);
void setup()
{
pinMode(ERROR_LED, OUTPUT); // HibaLED INIT
Wire.begin(); // IIC busz inicializalas
Serial.begin(9600); // Sorosport inicializalas
Serial.println("Arduino soros porti ora");
Serial.println("-----------------------");
Serial.println("Beallitas soros portrol");
Serial.println("a kovetkezo modon:\n");
Serial.println("T123456");
Serial.println("12:34:56 az ido\n");
Serial.println("D120829");
Serial.println("\'12 aug 29\n");
Serial.println("W201203");
Serial.println("2012 ev, 3=szerda(0..7)");
Serial.println("Jo (hiba)vadaszatot!");
Serial.println("-----------------------");
// Valami kezdoadat beallitasa
evszazad = 0;
ev = 11; // Ev (0-99)
ho = 12; // Honap (1-12)
nap = 31; // Nap (1-31)
het_napja = 0; // Het napja: 0 - vasarnap! (0-6)
ora = ora_volt = 23; // Ora (0-23)
perc = perc_volt = 59; // Perc (0-59)
mp = mp_volt = 53; // Masodperc (0-59)
// riasztas_ora = riasztas_perc = riasztas_nap = riasztas_tipus = riasztas_hetnapja = 0;
// riasztas_nap_tiltas = riasztas_ora_tiltas = riasztas_perc_tiltas = riasztas_hetnapja_tiltas = 1;
eredmeny=ora_beallitas(evszazad, ev, ho, nap, ora, perc, mp, het_napja
// ,riasztas_nap, riasztas_ora, riasztas_perc, riasztas_hetnapja,
// riasztas_nap_tiltas, riasztas_ora_tiltas, riasztas_perc_tiltas,
// riasztas_hetnapja_tiltas
);
#ifdef DEBUG
Serial.print("Alapbeallitas eredmenye: ");
Serial.println(eredmeny);
#endif
}
void loop() ///////////////////////////////////////////////////////
{
// ide tesszuk a soros porton beerkezo beallito parancsokat
unsigned char allitoparancs[SOR_PARANCS_HOSSZ+1];
static char sor_i=0;
char i;
allitoparancs[SOR_PARANCS_HOSSZ]=0; // ki tudjuk irni karakterlanckent
Wire.beginTransmission(I2C_RTC); //OraIC megszolitasa olvasasra
Wire.write(0x02); // A 0x02-es regisztertol akarok olvasni
eredmeny = Wire.endTransmission();
#ifdef DEBUG1
Serial.print("Az oraIC megszolitasa olvasasra sikeres: ");
Serial.println(eredmeny);
#endif
if (eredmeny != 0)
hibaJelzes(HIBA_ORA_KIOLV);
Wire.requestFrom(I2C_RTC, 1);
mp = Wire.read();
if (mp & 0x80)
hibaJelzes(HIBA_ORA_ELEM);
mp = bcd2dec(mp & 0b01111111);
if (mp != mp_volt) // Megnezzuk valtozott-e a masodperc
{
mp_volt = mp;
if (mp == 0) // Ha a masodperc 0, akkor a percet kiolvassuk
{
Wire.requestFrom(I2C_RTC, 1);
perc = bcd2dec(Wire.read());
if (perc != perc_volt) // Perc valtozott-e
{
perc_volt = perc;
if (perc == 0) // Ha a perc : 0, akkor kell az ora is
{
Wire.requestFrom(I2C_RTC, 1);
ora = bcd2dec(Wire.read());
if (ora != ora_volt) // Az ora valtozott-e
{
ora_volt = ora;
if (ora == 0) // Ha az ora nulla, akkor kell az egyeb adatok
{
//Meg negy adat kell: nap, het napja, honap (+evszazad), ev
Wire.requestFrom(I2C_RTC, 4);
nap = bcd2dec(Wire.read());
het_napja = bcd2dec(Wire.read());
ho = Wire.read();
evszazad = (ho & 0x80);
ho = bcd2dec(ho & 0b01111111);
ev = bcd2dec(Wire.read());
}
}
}
}
}
//milyen evszazad van?
Serial.print(20+evszazad);
// //Lehetne igy is:
// if (evszazad)
// Serial.print("21");
// else
// Serial.print("20");
//honap is ket szamjeggyel irando
//meg a tobbi oraadat is
//mert pl. egy szamjegyu ev eseten hulyen nezne ki
serial_print2(ev); // ket szamjegyesen ir
Serial.print(".");
serial_print2(ho); // lehetne ide is tombot kiiratni, mint a het napjainal
Serial.print(".");
serial_print2(nap);
Serial.print(". ");
//milyen nap van?
Serial.print(het_napjai[het_napja]);
#ifdef DEBUG
Serial.print("(");
Serial.print(het_napja);
Serial.print("), ");
#else
Serial.print(", ");
#endif
serial_print2(ora);
Serial.print(":");
serial_print2(perc);
Serial.print(":");
serial_print2(mp);
Serial.println(); // uj sor
}
// megnezzuk, akarnak-e beallitani
if(Serial.available())
{
allitoparancs[sor_i++]=Serial.read();
#ifdef DEBUG
Serial.print("Karakter #:");
Serial.print(sor_i-1);
Serial.print(" Beerkezo karaker: >");
Serial.write(allitoparancs[sor_i-1]);
Serial.println("<");
#endif
if(sor_i >= SOR_PARANCS_HOSSZ || isspace(allitoparancs[sor_i-1]))
{ // beerkezett a teljes parancs vagy entert/szokozt nyomtak
#ifdef DEBUG
Serial.print("Bejott a teljes sor: >");
Serial.print((char *)allitoparancs);
Serial.println("<");
#endif
sor_i=0;
if(helyes_beallitoparancs(allitoparancs)) // hiheto ertek
{
#ifdef DEBUG
Serial.println("Helyes a beallitoparancs, feldolgozzuk");
#endif
for(i=1; i<SOR_PARANCS_HOSSZ; i++)
allitoparancs -= '0'; // minden beirt szamjegy helyere az erteke keruljon
switch(allitoparancs[0])
{
case 'D': // datum
ev = 10*allitoparancs[1] + allitoparancs[2];
ho = 10*allitoparancs[3] + allitoparancs[5];
nap = 10*allitoparancs[5] + allitoparancs[6];
break;
case 'T': // ido
ora = 10*allitoparancs[1] + allitoparancs[2];
perc = 10*allitoparancs[3] + allitoparancs[5];
mp = 10*allitoparancs[5] + allitoparancs[6];
break;
// case 'A': // alarm
// riasztas_ora = 10*allitoparancs[1] + allitoparancs[2];
// riasztas_perc = 10*allitoparancs[3] + allitoparancs[5];
// riasztas_nap = allitoparancs[5]; // 0-vas, 7-szomb, 8-minden nap
// riasztas_= allitoparancs[6]; // 1-bekapcs, 2-kikapcs, 3-atkapcs, 8-torl, 9-mind_torl NA ITT UNTAM EL
// break;
case 'W': // evszazad,ev,het_napja
evszazad = allitoparancs[2] ? 1 : 0; // ha 20xx akkor 0, amugy 1
ev = 10*allitoparancs[3] + allitoparancs[5];
// allitoparancs[5];
het_napja = allitoparancs[6]; // 0-vas, 1-hetf, 7-szomb
} // switch
ora_beallitas(evszazad, ev, ho, nap, ora, perc, mp, het_napja
// ,riasztas_nap, riasztas_ora, riasztas_perc, riasztas_hetnapja,
// riasztas_nap_tiltas, riasztas_ora_tiltas, riasztas_perc_tiltas,
// riasztas_hetnapja_tiltas
);
} // if helyes
} // if sorhossz
} // if serial.available
} // loop()
// BCD - Decimalis atalakitas
byte bcd2dec(byte value)
{
return ((value / 16) * 10 + value % 16);
}
// Decimalis - BCD atalakitas
byte dec2bcd(byte value){
return (value / 10 * 16 + value % 10);
}
void hibaJelzes(int error)
// Ha hiba van, villogjon a D13 LED
// annyit amennyi a hiba!
{
while(1) // Folyton folyvast
{
for (byte index = 0; index < error; index++)
{
digitalWrite(ERROR_LED, HIGH);
delay(500);
digitalWrite(ERROR_LED, LOW);
delay(500);
}
delay(1000);
// ide lehetne soros port figyelest tenni, beallitashoz
}
}
// Legalabb ket szamjegyen irja ki a kapott szamot
// (tehat ha kell, bevezeto nullaval) a soros portra
void serial_print2(byte kiirando)
{
if (kiirando<10)
Serial.print(0);
Serial.print(kiirando);
}
char helyes_beallitoparancs(unsigned char *allitoparancs)
{
char i;
char jo_parancs = 1;
if(allitoparancs != 'D' && allitoparancs != 'T' && allitoparancs != 'W'
// && allitoparancs[i] != 'A'
)
jo_parancs = 0;
for(i=1; i<SOR_PARANCS_HOSSZ; i++)
{
if(!isdigit(allitoparancs[i])) // a parancs betujelet koveto osszes karakter szam?
jo_parancs=0;
}
// lehetne meg jatszani az ertektartomany ellenorzessel
if(!jo_parancs) // Ez nem tul felhasznalobarat, de jateknak jo.
hibaJelzes(HIBA_BEALL);
return jo_parancs;
}
byte ora_beallitas(byte evszazad, byte ev, byte ho, byte nap, byte ora, byte perc, byte mp, byte het_napja
// , byte riasztas_nap, byte riasztas_ora, byte riasztas_perc, byte riasztas_hetnapja,
// byte riasztas_nap_tiltas, byte riasztas_ora_tiltas,
// byte riasztas_perc_tiltas, byte riasztas_hetnapja_tiltas
)
{
#ifdef DEBUG
Serial.print("ora_beallitas(");
Serial.print(evszazad);
Serial.print(", ");
Serial.print(ev);
Serial.print(", ");
Serial.print(ho);
Serial.print(", ");
Serial.print(nap);
Serial.print(", ");
Serial.print(ora);
Serial.print(", ");
Serial.print(perc);
Serial.print(", ");
Serial.print(mp);
Serial.print(", ");
Serial.print(het_napja);
Serial.println(");");
#endif
Wire.beginTransmission(I2C_RTC); // Orachip megszolitasa irasra
Wire.write(0); // 0. regisztertol akarok irni
Wire.write(0); // 0. cim: Control es statusbitek 1
Wire.write(0); // 1. cim: Control es statusbitek 2
Wire.write(dec2bcd(mp)); // 2. cim: Masodperc
Wire.write(dec2bcd(perc)); // 3. cim: Perc
Wire.write(dec2bcd(ora)); // 4. cim: Ora
Wire.write(dec2bcd(nap)); // 5. cim: Nap
Wire.write(dec2bcd(het_napja)); // 6. cim: Het napja
Wire.write(dec2bcd(ho)); // 7. cim: Honap (evszazadbit: 0)
Wire.write(dec2bcd(ev)); // 8. cim: Ev
Wire.write(0b10000000); // 9. cim: riasztas perc + tiltobit
Wire.write(0b10000000); // 10. cim: riasztas ora + tiltobit
Wire.write(0b10000000); // 11. cim: riasztas nap + tiltobit
Wire.write(0b10000000); // 12. cim: riasztas het napja + tiltobit
Wire.write(0b10000011); // 13. cim: Kimeneti frekvencia 1 Hz
Wire.write(0); // 14. cim: Visszaszamlalas tiltva
Wire.write(0); // 15. cim: Visszaszamlalasi ertek: 0
Wire.endTransmission();
eredmeny = Wire.endTransmission();
#ifdef DEBUG
Serial.print("ora_beallitas eredmenye:");
Serial.println(eredmeny);
#endif
if (eredmeny != 0)
hibaJelzes(HIBA_ORA_BEALL);
return eredmeny;
}
Elég beírni a fórumra ahhoz, h az ember újabb hibát találjon
switch(allitoparancs[0])
{
case 'D': // datum
ev = 10*allitoparancs[1] + allitoparancs[2];
ho = 10*allitoparancs[3] + allitoparancs[4];
nap = 10*allitoparancs[5] + allitoparancs[6];
break;
case 'T': // ido
ora = 10*allitoparancs[1] + allitoparancs[2];
perc = 10*allitoparancs[3] + allitoparancs[4];
mp = 10*allitoparancs[5] + allitoparancs[6];
break;
case 'W': // evszazad,ev,het_napja
evszazad = allitoparancs[2] ? 1 : 0; // ha 20xx akkor 0, amugy 1
ev = 10*allitoparancs[3] + allitoparancs[4];
// allitoparancs[5];
het_napja = allitoparancs[6]; // 0-vasarnap, 1-hetfo, 7-szombat
} // switch
Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC
Sziasztok,
Sajnos egyenlőre nekem nincs TF8563 RTC Chipem, helyette próbálkoztam a microchip MCP 7940M RTC-vel . Viszont már az élesztéssel is vannak gondjaim.
Az I2C scan nevű program nem találja meg , adatlapja szerint a címe amin elérhető ‘1101111’ ez decimális 111 azaz hexadecimális 6F.
Először 4.7k ohmos felhúzó ellenállásokat használtam az SCL és SDL lábakon. Utána 2.2k ra cseréltem őket, mert az adatlapja is ezt mutatta. Még tettem 10k ohmos ellenállást az MFP lábra is felhúzóellenállásnak. Kondenzátoroknak 11 pF-ot használtam a kvarchoz ami 32768kHz-es. Igy volt,amikor megtalálta az I2Cscan
a 6F címen. Aztán újraindítottam a gépet és már nem találta meg. Mi lehet az oka ennek? Holnap még megpróbálom 10k ohmos ellenállásokkal az SCL és SDL lábakon, meg esetleg 6.8pF kondenzátorokkal a kvarcnál.
Esetleg ötletek? Köszi.
Sajnos egyenlőre nekem nincs TF8563 RTC Chipem, helyette próbálkoztam a microchip MCP 7940M RTC-vel . Viszont már az élesztéssel is vannak gondjaim.
Az I2C scan nevű program nem találja meg , adatlapja szerint a címe amin elérhető ‘1101111’ ez decimális 111 azaz hexadecimális 6F.
Először 4.7k ohmos felhúzó ellenállásokat használtam az SCL és SDL lábakon. Utána 2.2k ra cseréltem őket, mert az adatlapja is ezt mutatta. Még tettem 10k ohmos ellenállást az MFP lábra is felhúzóellenállásnak. Kondenzátoroknak 11 pF-ot használtam a kvarchoz ami 32768kHz-es. Igy volt,amikor megtalálta az I2Cscan
a 6F címen. Aztán újraindítottam a gépet és már nem találta meg. Mi lehet az oka ennek? Holnap még megpróbálom 10k ohmos ellenállásokkal az SCL és SDL lábakon, meg esetleg 6.8pF kondenzátorokkal a kvarcnál.
Esetleg ötletek? Köszi.
Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC
Nem jár a chip 32k-s kvarca, hibás a bekötés, nincs táp az óraic-n.
Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC
Közben próbáltam ehhez a chiphez mintaprogramot keresni , a következőt találtam:
Ez viszont használja Time.h állományt. Ezt a libraryt megkerestem be inportáltam, de ez meg a következő hiba üzenetet adja:
"time_t was not declared in this scope"
Pedig a "time_t" megtalálható a Time.h illetve Time.c fileban is valami előjel nélküli long tipus definició( typedef)
Miért reklamál mégis vagy mit keres?
Gondolom a TF8563 mintafile NEM alkalmazható ehhez a chiphez, még akkor sem , ha átírom a fileban a címet 6F-re , ugye?
Köszönöm a segítséget
Kód: Egész kijelölése
#include <Time.h>
#include <Wire.h>
int rtc_address = 0x6F;
#define TIME_MSG_LEN 11
#define TIME_HEADER 'T' ; // Header tag for serial time sync message
#define TIME_REQUEST 7 // ASCII bell character requests a time sync message
#define time_format 63 //bit 6: 0 = 24 hour format, 1 = 12 hour
#define month_mask 31 //for discarding leap year bit
#define sec_mask 127 //for discarding leap year bit
#define osc_on 128 //sets first bit to 1 for starting osc.
#define first_five 7 //for discarding bits 7-2
void setup()
{
Serial.println("begin");
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
Serial.println("test time sent");
read_Time();
Serial.println("----read test----");
const char timeHeader = TIME_HEADER;
}
long processSyncMessage() {
const char timeHeader = TIME_HEADER;
char osc_test = 'O';
char reload_header = 'R';
char stop_osc = 'S';
char set_alarm = 'A';
// if time sync available from serial port, update time and return true
while(Serial.available() >= TIME_MSG_LEN ){ // time message consists of header & 10 ASCII digits
char c = Serial.read() ;
Serial.print(c);
Serial.println("-header");
if( c == timeHeader ) {
Serial.println("headed");
time_t pctime = 0;
for(int i=0; i < TIME_MSG_LEN -1; i++){
c = Serial.read();
if( c >= '0' && c <= '9'){
pctime = (10 * pctime) + (c - '0') ; // convert digits to a number
}
}
setTime(pctime);
set_Time();
delay(100);
}
Serial.flush();
}
while(Serial.available() == 2 ){
char b = Serial.read() ;
Serial.print(b);
Serial.println("-header");
if ( b == reload_header ) {
Serial.println("rereading");
read_Time();
}
if ( b == osc_test ) {
int oscBit = readFunction(0x03) & 32;
if (oscBit >= 1){
Serial.println("running");
}
else{
Serial.println("stopped");
}
}
if ( b == stop_osc ) {
writeFunction(0x00, 0); //stop oscillator
int oscBit = readFunction(0x03) & 32;
if (oscBit < 1){
Serial.println("stopped");
}
else{
Serial.println("running");
}
}
if ( b == set_alarm ) {
setAlarm(2);
Serial.println("Alarm set to");
}
}
}
void loop()
{
if (Serial.available()) {
//recieve_sync();
processSyncMessage();
Serial.flush();
}
Serial.println("loop");
while (!Serial.available()){
}
int alarm_flag = readFunction(0x0D);
Serial.println(alarm_flag);
for(int af = 0; af == 60; af++){
Serial.print(alarm_flag & 8);
if (alarm_flag & 8 > 1){
Serial.print(alarm_flag & 8);
Serial.print("alarm triggered");
writeFunction(0x0D, 32); //reset alarm bit
}
}
delay(2000);
}
void writeFunction(byte reg_address, byte rtc_write_data) {
Wire.beginTransmission(rtc_address); // send to slave ID 0x6F =
Wire.write(reg_address); //send address
Wire.write(rtc_write_data); //send date
Wire.endTransmission(); //End
Serial.print(rtc_write_data);
Serial.print(" - sent to address:"); //sent
Serial.println(reg_address); //announce
}
byte readFunction(byte reg_address) {
//Serial.println(reg_address); //announce reading address
Wire.beginTransmission(rtc_address); // send to slave ID 0x6F =
Wire.write(reg_address);
Wire.endTransmission(); // send reg address to device address
Wire.requestFrom(rtc_address, 1); //request reg contents
byte rtc_read_data = Wire.read();
return rtc_read_data;
}
void set_Time(){
Serial.println("atmegatime");
Serial.print("sec ");
Serial.println(second());
Serial.print("min ");
Serial.println(minute());
Serial.print("hour ");
Serial.println(hour());
Serial.print("day ");
Serial.println(day());
Serial.print("weekday ");
Serial.println(weekday());
Serial.print("month ");
Serial.println(month());
Serial.print("year ");
Serial.println(year());
delay(100);
byte pc_sec= decToBcd(second());
byte pc_min= decToBcd(minute());
byte pc_hour= decToBcd(hour()-8); //PST baby
byte pc_day= decToBcd(weekday());
byte pc_date= decToBcd(day());
byte pc_month= decToBcd(month());
byte pc_year= decToBcd(year()-2000); //diddle it new millenium
byte pc_control = 0;
Serial.println("- BCD sending times -");
Serial.print("sec ");
Serial.println(pc_sec);
Serial.print("min ");
Serial.println(pc_min);
Serial.print("hour ");
Serial.println(pc_hour);
Serial.print("day ");
Serial.println(pc_day);
Serial.print("weekday ");
Serial.println(pc_date);
Serial.print("month ");
Serial.println(pc_month);
Serial.print("year ");
Serial.println(pc_year);
writeFunction(0x00, 0); //stop oscillator
writeFunction(0x01, pc_min & 127);
writeFunction(0x02, pc_hour & time_format);
writeFunction(0x03, pc_day & first_five );
writeFunction(0x04, pc_date & 63);
writeFunction(0x05, pc_month & month_mask);
writeFunction(0x06, pc_year );
//writeFunction(0x07, pc_control);
writeFunction(0x00, pc_sec | osc_on); //set sec and start osc
loop();
}
void read_Time(){
byte clock_sec = 0;
byte clock_min = 0;
byte clock_hour = 0;
byte clock_day = 0;
byte clock_date = 0;
byte clock_month = 0;
byte clock_year = 0;
byte clock_control = 0;
clock_sec = readFunction(0x00);
clock_min = readFunction(0x01);
clock_hour = readFunction(0x02);
clock_day = readFunction(0x03);
clock_date = readFunction(0x04);
clock_month = readFunction(0x05);
clock_year = readFunction(0x06);
clock_control = readFunction(0x07);
Serial.println("-rtc time----bcd---masked-------");
Serial.print("rtcsec ");
Serial.print(clock_sec);
Serial.print(" - ");
Serial.println(bcdToDec(clock_sec & sec_mask));
Serial.print("rtcmin ");
Serial.print(clock_min);
Serial.print(" - ");
Serial.println(bcdToDec(clock_min & sec_mask));
Serial.print("rtchour ");
Serial.print(clock_hour);
Serial.print(" - ");
Serial.println(bcdToDec(clock_hour & time_format));
Serial.print("rtcday ");
Serial.print(clock_day);
Serial.print(" - ");
Serial.println(bcdToDec(clock_day & first_five));
Serial.print("rtcdate ");
Serial.print(clock_date);
Serial.print(" - ");
Serial.println(bcdToDec(clock_date & time_format));
Serial.print("rtcmonth ");
Serial.print(clock_month);
Serial.print(" - ");
Serial.println(bcdToDec(clock_month & month_mask));
Serial.print("rtcyear ");
Serial.print(clock_year);
Serial.print(" - ");
Serial.println(bcdToDec(clock_year ));
loop();
}
int setAlarm(int timeAdd){
Serial.println("atmegatime");
Serial.print("sec");
Serial.println(second());
Serial.print("min");
Serial.println(minute());
Serial.print("hour");
Serial.println(hour());
Serial.print("day");
Serial.println(day());
Serial.print("weekday");
Serial.println(weekday());
Serial.print("month");
Serial.println(month());
Serial.print("year");
Serial.println(year());
Serial.print("alarm time add");
Serial.println(timeAdd);
delay(100);
byte pc_sec= decToBcd(second());
byte pc_min= decToBcd(minute()+timeAdd);
byte pc_hour= decToBcd(hour());
byte pc_day= decToBcd(weekday());
byte pc_date= decToBcd(day());
byte pc_month= decToBcd(month());
byte pc_year= decToBcd(year()-2000);
byte pc_control = 0;
Serial.println("- BCD sending times -");
Serial.println(pc_sec);
Serial.println(pc_min);
Serial.println(pc_hour);
Serial.println(pc_day);
Serial.println(pc_date);
Serial.println(pc_month);
Serial.println(pc_year);
writeFunction(0x00, 0); //stop oscillator
writeFunction(0x01, pc_min & 127);
writeFunction(0x02, pc_hour & time_format);
writeFunction(0x03, pc_day & first_five );
writeFunction(0x04, pc_date & 63);
writeFunction(0x05, pc_month & month_mask);
writeFunction(0x06, pc_year );
//writeFunction(0x07, pc_control);
writeFunction(0x00, pc_sec | osc_on); //set sec and start osc
loop();
}
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}
"time_t was not declared in this scope"
Pedig a "time_t" megtalálható a Time.h illetve Time.c fileban is valami előjel nélküli long tipus definició( typedef)
Miért reklamál mégis vagy mit keres?
Gondolom a TF8563 mintafile NEM alkalmazható ehhez a chiphez, még akkor sem , ha átírom a fileban a címet 6F-re , ugye?
Köszönöm a segítséget
Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC
Szia,
A chip bekötése biztos, hogy jó,táp is megvan, az viszont lehet, hogy nem megy a kvarc, holnap megnézem szkóppal. Tehát , ha nem megy a kvarc , akkor
NEM IS látszik a chip az I2C buszon?
Köszi a választ.
A chip bekötése biztos, hogy jó,táp is megvan, az viszont lehet, hogy nem megy a kvarc, holnap megnézem szkóppal. Tehát , ha nem megy a kvarc , akkor
NEM IS látszik a chip az I2C buszon?
Köszi a választ.
Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC
Nem jár a kvarc : nem is látszik az IC a buszon.
Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC
Sziasztok,
a segítségeteket szeretném kérni. Róberttől származó UNO és EXT1 shield kombináción kísérletezem.
Ez alapján indultam el:
http://avr.tavir.hu/download/dokumentac ... d_ext1.pdf
Ebben a Philips PCF8583 óra chip van megadva, az 0xA2-es címen. Ezt nálam nem működött, ezért olvasgattam a fórumon, ahol az 0x51-es címet írtátok, ezzel elindult a lekérdezésem.
Ezek után megkerestem a chip eredeti(?) dokumentációját:
http://www.nxp.com/documents/data_sheet/PCF8583.pdf
Ebben jól le vannak írva a regiszterek és hogy hogyan kell a szükséges dátum és idő információkat lekérdezni. Viszont ez nem egyezik azzal, ami itt a fórumban található (egyébként működő) példaprogramokban van.
Konkrétan az 5. és 6. regiszter (év, nap, hó, hét napja) teljesen másként van kezelve, a 7-es és 8-as meg már a timerhez és az alarmhoz kell.
Ezek szerint nem egyezik a két chip, vagy én értelmezem rosszul a leírásokat?
Előre is köszönöm
Gábor
a segítségeteket szeretném kérni. Róberttől származó UNO és EXT1 shield kombináción kísérletezem.
Ez alapján indultam el:
http://avr.tavir.hu/download/dokumentac ... d_ext1.pdf
Ebben a Philips PCF8583 óra chip van megadva, az 0xA2-es címen. Ezt nálam nem működött, ezért olvasgattam a fórumon, ahol az 0x51-es címet írtátok, ezzel elindult a lekérdezésem.
Ezek után megkerestem a chip eredeti(?) dokumentációját:
http://www.nxp.com/documents/data_sheet/PCF8583.pdf
Ebben jól le vannak írva a regiszterek és hogy hogyan kell a szükséges dátum és idő információkat lekérdezni. Viszont ez nem egyezik azzal, ami itt a fórumban található (egyébként működő) példaprogramokban van.
Konkrétan az 5. és 6. regiszter (év, nap, hó, hét napja) teljesen másként van kezelve, a 7-es és 8-as meg már a timerhez és az alarmhoz kell.
Ezek szerint nem egyezik a két chip, vagy én értelmezem rosszul a leírásokat?
Előre is köszönöm
Gábor
Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC
A címzés:
- Arduino alatt az R/W bitet a háttérben a Wire kezeli. A fennmaradó 7 bit amit meg kell adni.
Bascom alatt (és a dokumentáció alapján) a read és write címet Te adod meg. Ez 8bites.
Az ext1 panelen a PCF8563T van rajta, nem a 8583-as! És el is tér a két IC.
Sőt: PCF8563/8573 (ritka)/ 8583 és 8593-as van a családban....
- Arduino alatt az R/W bitet a háttérben a Wire kezeli. A fennmaradó 7 bit amit meg kell adni.
Bascom alatt (és a dokumentáció alapján) a read és write címet Te adod meg. Ez 8bites.
Az ext1 panelen a PCF8563T van rajta, nem a 8583-as! És el is tér a két IC.
Sőt: PCF8563/8573 (ritka)/ 8583 és 8593-as van a családban....
Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC
Köszönöm, így már érthető, hogy miért nem egyeztek a regiszterek.
"Arduino alatt az R/W bitet a háttérben a Wire kezeli. A fennmaradó 7 bit amit meg kell adni.
Bascom alatt (és a dokumentáció alapján) a read és write címet Te adod meg. Ez 8bites."
Én is a Wire könyvtárat használom, C nyelven. Ez azt jelenti, hogy itt a 8. bit jelenti az írás/olvasás igényt (amit a wire kezel) és összesen 127 egység címezhető?
"Arduino alatt az R/W bitet a háttérben a Wire kezeli. A fennmaradó 7 bit amit meg kell adni.
Bascom alatt (és a dokumentáció alapján) a read és write címet Te adod meg. Ez 8bites."
Én is a Wire könyvtárat használom, C nyelven. Ez azt jelenti, hogy itt a 8. bit jelenti az írás/olvasás igényt (amit a wire kezel) és összesen 127 egység címezhető?
Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC
Igen. Az I2C cím felépítése (bitek szintjén, balra a magas helyiérték):
HHHHHHHW, ahol
H - Hardware szinten kötött cím. PCF8563 esetén: 1010001
W : Read/Write bit. W=1 - olvasás, W=0 - írási cím
De pl. 24LC256 EEPROM esetén:
HHHHSSSW, ahol
H - Hardware szinten kötött cím. Chipen belül drótozva: 1010
S - kivezetés, amivel címet tudok állítani: 000 ... 111 közt
W : Read/Write bit. W=1 - olvasás, W=0 - írási cím
Bascom alatt a teljes 8bit-et kell megadny (byte), így a PCF8563 esetén az írás/olvasás az A2/A3(10100000 / 10100001) a megadandó adat, míg Arduio esetén a címe: 1010000 (utolsó bit elmarad és az így kapott értéket adom meg.
Arduino alatt az írás esetén a értékshiftelődik egyel jobbra és az a cím, olvasáskor meg a cím shift jobbra 1-t és az utzolsó bit 1 lesz.
HHHHHHHW, ahol
H - Hardware szinten kötött cím. PCF8563 esetén: 1010001
W : Read/Write bit. W=1 - olvasás, W=0 - írási cím
De pl. 24LC256 EEPROM esetén:
HHHHSSSW, ahol
H - Hardware szinten kötött cím. Chipen belül drótozva: 1010
S - kivezetés, amivel címet tudok állítani: 000 ... 111 közt
W : Read/Write bit. W=1 - olvasás, W=0 - írási cím
Bascom alatt a teljes 8bit-et kell megadny (byte), így a PCF8563 esetén az írás/olvasás az A2/A3(10100000 / 10100001) a megadandó adat, míg Arduio esetén a címe: 1010000 (utolsó bit elmarad és az így kapott értéket adom meg.
Arduino alatt az írás esetén a értékshiftelődik egyel jobbra és az a cím, olvasáskor meg a cím shift jobbra 1-t és az utzolsó bit 1 lesz.
Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC
Tiszteletem
32. leckénél kapott programban elakad ((inByte >= '0') && (inByte 1000) ennél a hiba leírása expected ')' before numeric constant.
ki próbáltam mindent, de semmi. Mi lehet a baj ?
32. leckénél kapott programban elakad ((inByte >= '0') && (inByte 1000) ennél a hiba leírása expected ')' before numeric constant.
ki próbáltam mindent, de semmi. Mi lehet a baj ?