3d_killer

Модуль ic2 работа часов и внешней памяти EEPROM вместе

5 сообщений в этой теме

3d_killer    4

Не могу заставить работать модуль, отдельно все работает, но если хочу и считывать внешнюю EEPROM и работать с часами, то часы стоят и показывают ерунду, вот скетч

#include <Wire.h>
#include <Eeprom24C32_64.h>
#define EEPROM_ADDRESS  0x50
static Eeprom24C32_64 eeprom(EEPROM_ADDRESS);


#include <DS1307.h>
// Init the DS1307
DS1307 rtc(SDA, SCL);


void setup() {
  // put your setup code here, to run once:
// Initialize serial communication.
    Serial.begin(9600);
        
    // Initialize EEPROM library.
    eeprom.initialize();

    const word address = 0;
    
    // Write a byte at address 0 in EEPROM memory.
    Serial.println("Write byte to EEPROM memory...");
    eeprom.writeByte(address, 0xAA);
    
    // Write cycle time (tWR). See EEPROM memory datasheet for more details.
    delay(10);
    
    // Read a byte at address 0 in EEPROM memory.
    Serial.println("Read byte from EEPROM memory...");
    byte data = eeprom.readByte(address);
    
    // Print read byte.
    Serial.print("Read byte = 0x");
    Serial.print(data, HEX);
    Serial.println("");


    //Запуск времени
  // Set the clock to run-mode
  rtc.halt(false);
  // Set SQW/Out rate to 1Hz, and enable SQW
  rtc.setSQWRate(SQW_RATE_1);
  rtc.enableSQW(true);
}

void loop() {
  // put your main code here, to run repeatedly:
delay(1000);
Serial.println(rtc.getTimeStr());
}

IC2 сканер видит 2 устройства с разными адресами, может кто сталкивался?

2017-12-08_10-48-03.jpg

а вот тест часов

#include <Wire.h>
#include <Eeprom24C32_64.h>
#define EEPROM_ADDRESS  0x50
static Eeprom24C32_64 eeprom(EEPROM_ADDRESS);


#include <DS1307.h>
// Init the DS1307
DS1307 rtc(SDA, SCL);


void setup() {
  // put your setup code here, to run once:
// Initialize serial communication.
    Serial.begin(9600);
        
    // Initialize EEPROM library.
   // eeprom.initialize();

   // const word address = 0;
    
    // Write a byte at address 0 in EEPROM memory.
    Serial.println("Write byte to EEPROM memory...");
   // eeprom.writeByte(address, 0xAA);
    
    // Write cycle time (tWR). See EEPROM memory datasheet for more details.
    delay(10);
    
    // Read a byte at address 0 in EEPROM memory.
    Serial.println("Read byte from EEPROM memory...");
   // byte data = eeprom.readByte(address);
    
    // Print read byte.
    Serial.print("Read byte = 0x");
   // Serial.print(data, HEX);
    Serial.println("");


    //Запуск времени
  // Set the clock to run-mode
  rtc.halt(false);
  // Set SQW/Out rate to 1Hz, and enable SQW
  rtc.setSQWRate(SQW_RATE_1);
  rtc.enableSQW(true);
}

void loop() {
  // put your main code here, to run repeatedly:
delay(1000);
Serial.println(rtc.getTimeStr());
}

 

2017-12-08_10-49-51.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    547

Такие вещи нужно самому писать, без ардуиновских библиотек. Неизвестно, что они там с шиной делают...
У меня в текущем проекте стоят часы и еепромина на одной шине - проблем нет никаких.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3d_killer    4

Библиотека eeprom маленькая там 4 функции всего, библиотека часов чуть побольше, но тоже ничего особого, задается адрес и  Wire.beginTransmission(); и Wire.endTransmission();

могу сказать одно, что лучше я не напишу...

да и я понимаю что лучше писать не на Arduino, но знаний пока не хватает, да и ветка вроде как ардуино, или я перепутал?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    547
22 минуты назад, 3d_killer сказал:

могу сказать одно, что лучше я не напишу...

А Вы попробуйте. Если оно всё заработает - это уже будет лучше !
"Под лежачий камень вода не течёт" (c)
Найдите нормальную библиотеку I2C и с её помощью напишите свой код для часов и епром. Сначала по-отдельности. Потом уже и вместе соедините.

22 минуты назад, 3d_killer сказал:

но тоже ничего особого

Это на первый взгляд ничего сложного. На самом деле, там достаточно сложный механизм.
АрдуБиблиотеки основаны на С++ классах. И для каждого модуля (часы и еепром), где-то там внутри, создаются разные экземпляры этого класса, работающие с одним ресурсом (шиной i2c). Это уже косяк. Оно может работать, а может и не работать. И ели работать, то коряво. А если разные библиотеки юзают разные типы классов I2C, то это уже не косяк, а катастрофа...

Вам нужно найти библу для I2C, создать его единственный экземпляр класса и работать только с ним. Тогда счастье Вам обеспечено.

Да и, собственно, библу I2C тоже можно не искать. Сделайте свою, с программным I2C, а не аппаратным. Там всё ограничивается всего-лишь обычным дёрганьем ног, ничего сложного.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
UTSource

Найдите миллионы труднодоступных

электронных компонентов

3d_killer    4

Все заработало, проблема была в том что от часов я использовыход sqw с частотой 1гц для прерывания, в этом прерывании и производил попытку записи и чтения, когда сделал это в основной программе то все заработало

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...