60 nap alatt Arduino #32 - IIC busz és az óraIC

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

60 nap alatt Arduino #32 - IIC busz és az óraIC

HozzászólásSzerző: Robert » 2012. augusztus 25. szombat, 10:00

A tanfolyam PCF8563T illetve DS1307 órachipjének programjai... Ezek finomításai...

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

60 nap alatt Arduino #33 - IIC busz és a portbővítés

HozzászólásSzerző: Robert » 2012. augusztus 25. szombat, 10:01

?? 8O
A hozzászólást 1 alkalommal szerkesztették, utoljára Robert 2012. augusztus 29. szerda, 11:23-kor.

Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00
Tartózkodási hely: Bp

Tanfolyami program magyaritása

HozzászólásSzerző: macsek » 2012. augusztus 29. szerda, 11:16

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.

/*  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);
}




Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00
Tartózkodási hely: Bp

HozzászólásSzerző: macsek » 2012. augusztus 29. szerda, 18:25

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 :)

/*  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[i] -= '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[i] != 'D' && allitoparancs[i] != 'T' && allitoparancs[i] != '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)
{    
  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[i] -= '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[i] != 'D' && allitoparancs[i] != 'T' && allitoparancs[i] != '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;
}



Avatar
macsek
Bitmanipulátor
Hozzászólások: 121
Csatlakozott: 2008. december 4. csütörtök, 7:00
Tartózkodási hely: Bp

HozzászólásSzerző: macsek » 2012. augusztus 29. szerda, 18:40

Elég beírni a fórumra ahhoz, h az ember újabb hibát találjon :roll:

        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


Avatar
scalesman
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2010. augusztus 31. kedd, 6:00

Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC

HozzászólásSzerző: scalesman » 2014. április 6. vasárnap, 18:23

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.

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

Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC

HozzászólásSzerző: Robert » 2014. április 6. vasárnap, 18:30

Nem jár a chip 32k-s kvarca, hibás a bekötés, nincs táp az óraic-n.

Avatar
scalesman
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2010. augusztus 31. kedd, 6:00

Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC

HozzászólásSzerző: scalesman » 2014. április 6. vasárnap, 18:33

Közben próbáltam ehhez a chiphez mintaprogramot keresni , a következőt találtam:

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) );
}


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

Avatar
scalesman
Újonc
Újonc
Hozzászólások: 12
Csatlakozott: 2010. augusztus 31. kedd, 6:00

Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC

HozzászólásSzerző: scalesman » 2014. április 6. vasárnap, 18:36

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.

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

Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC

HozzászólásSzerző: Robert » 2014. április 7. hétfő, 13:49

Nem jár a kvarc : nem is látszik az IC a buszon.

gabor
Újonc
Újonc
Hozzászólások: 11
Csatlakozott: 2014. június 23. hétfő, 9:20

Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC

HozzászólásSzerző: gabor » 2015. január 15. csütörtök, 18:06

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

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

Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC

HozzászólásSzerző: Robert » 2015. január 15. csütörtök, 19:02

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....

gabor
Újonc
Újonc
Hozzászólások: 11
Csatlakozott: 2014. június 23. hétfő, 9:20

Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC

HozzászólásSzerző: gabor » 2015. január 16. péntek, 10:01

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ő?

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

Re: 60 nap alatt Arduino #32 - IIC busz és az óraIC

HozzászólásSzerző: Robert » 2015. január 16. péntek, 10:42

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.


Vissza: “60 nap alatt Arduino - Házi feladatok”

Ki van itt

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