попробую, благодарю
Получилось ее запустить вместе часами, но возникла другая проблема, при запуске любого таймера (кроме раскомментированного), в сериал порт летят нули (вобщем программа перестает работать), а при запуске любого из них delay начинает работать не правильно (то есть 100000 которые сейчас стоят соответствуют одной) секунде. Если отключить первый таймер то 1 секунде соответствует delay(1000).
#include <microDS3231.h>
MicroDS3231 rtc;
#define F_CPU 8000000UL
//----------------------БИБЛИОТЕКИ--------------------------
#include <avr/wdt.h> //Библиотека сторожевого таймера
#include <EEPROM.h>
#include <Wire.h>
//#define DS3231_ADDRESS 0x68 //Адрес часов
//#define disk 0x50 //адрес чипа FM24C
//***************
void scan()
{
//Сканер
byte error, address;
int nDevices;
Serial1.println("Scanning...");
nDevices = 0;
for(address = 0; address < 127; address++ ){
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0){
Serial1.print("I2C device found at address 0x");
if (address<16)
Serial1.print("0");
Serial1.print(address,HEX);
Serial1.println(" !");
nDevices++;
}
else if (error==4) {
Serial1.print("Unknow error at address 0x");
if (address<16)
Serial1.print("0");
Serial1.println(address,HEX);
}
}
if (nDevices == 0)
Serial1.println("No I2C devices found\n");
else
Serial1.println("done\n");
}
//функции записи
#define disk 0x50 //адрес чипа FM24C
// -------------- функции чтение-запись ------------
void FM24C_write(unsigned int startAddress, void *data, unsigned int len) { // адрес, указатель на первый байт, длина в байтах
Wire.beginTransmission(disk);
Wire.write((byte*)&startAddress,2);
Wire.write((byte*)data, len);
Wire.endTransmission(true);
delay(1);
}
int FM24C_read(unsigned int startAddress, void *data, unsigned int len) { // возвращаем кол-во считанных байт
byte rdata;
byte *p;
Wire.beginTransmission(disk);
Wire.write((byte*)&startAddress,2);
Wire.endTransmission();
//Wire.beginTransmission(disk);
Wire.requestFrom(disk, len);
for (rdata = 0, p = (byte*)data; Wire.available() && rdata < len; rdata++, p++) {
*p = Wire.read();
}
return (rdata);
}
struct vvv {
byte a;
int b;
long c;
};
struct vvv abc;
struct vvv cab;
ISR(INT4_vect)
{
//Сброс сторожевого таймера
wdt_reset();
}
//Установка
void setup() {
//Запуск внешнего прерывания
Serial1.begin(38400);
wdt_enable(WDTO_2S);
Wire.begin();
// пишем данные (раскомментировать для первого запуска)
/* int a = -5432;
FM24C_write(10, &a, sizeof(a)); // адрес 10
unsigned long aa = 12345678;
FM24C_write(100, &aa, sizeof(aa)); // адрес 100
abc.a = 10;
abc.b = 100;
abc.c = 1000;
FM24C_write(300, &abc, sizeof(abc)); // адрес 300*/
// читаем данные
int b;
FM24C_read(10, &b, sizeof(b)); // из тех же адресов, что записывали!
Serial1.println(b);
unsigned long bb;
FM24C_read(100, &bb, sizeof(bb));
Serial1.println(bb);
FM24C_read(300, &cab, sizeof(cab));
Serial1.println(cab.a);
Serial1.println(cab.b);
Serial1.println(cab.c);
// пишем массив (раскомментировать для первого запуска)
/* char hello[] = "hello, 3d-diy.ru";
FM24C_write(1500, &hello, sizeof(hello) + 1); // записываем по адресу 1500*/
// читаем массив
char hhh[16];
FM24C_read(1500, &hhh, sizeof(hhh) + 1); // считываем из того же адреса
Serial1.println(hhh);
//Работа с часами
Wire.beginTransmission(0x68); // начинаем обмен с DS3231 с i2c адресом 0x68
Wire.write(0x0E); // выбор регистра CONTROL
Wire.write(0b00011000); // регистр записи (бит 7 — EOSC)
Wire.endTransmission(true);
//******************************************************************
//Запуск таймера 1000 циклов одна секунда
//******************************************************************
//cli();
TIMSK =0;
ETIMSK =0;
EICRB = (1<<ISC41); // Setting it equal is good here *IF* you want to ensure all other bits are clear, in this test code we do
EIFR |= (1<<INTF4); // Write a 1 to clear any possible pending interrupt
EIMSK = (1<<INT4);
//attachInterrupt(4, INT_4, FALLING);
//TCCR3A =0;
//TCCR3B=0;
//ETIMSK |= (1 << OCIE3A);
//TCNT3 =0;
//TCCR3A = 0b01000000;
//OCR3A = 1562;
//TCCR3B =0b00001100;
//
//TCCR1A =0;
//TCCR1B=0;
//TCNT1 =0;
//TIMSK |= (1 << OCIE1A);
//TCCR1A = 0b01000000;
//OCR1A = 78;
//TCCR1B=0b00001000;
//
//TCCR0 =0;
//TCCR0=0;
//TCNT0 =0;
//TIMSK |= (1 << OCIE0);
//OCR0 = 78;
//TCCR0=0b00011100;
//
//TCCR2=0;
//TCNT2 = 0;
//TIMSK = (1<<OCIE2);
//TCCR2=0b00101100;
//OCR2 = 78;
//sei();*/
}
//Основной метод
void loop()
{
delay(100000);
//wdt_reset();
//Сканер
scan();
DateTime now = rtc.getTime();
Serial1.println(now.hour);
Serial1.println(rtc.getTemperatureFloat());
Serial1.println(now.minute);
Serial1.println(now.second);
Serial1.println(now.day);
Serial1.println(now.date);
Serial1.println(now.month);
Serial1.println(rtc.getUnix(+3));
}
Не вижу в этом коде ни одного таймера вообще.
В чем вообще задача, можете пояснить?
Каждый раз, когда чайник, который не отличает бита от байта, пытается лезть в регистры - мне кажется что он переусложняет задачу.
Зачем вам вообще понадобился “железный” таймер, чтобы считать секунды? Обычным миллисом не можете обойтись?
А это что? по документации все
так они все закомментированы, оставшиеся 5 строк не запускают НИ ОДНОГО ТАЙМЕРА.
Так можете пояснить, зачем вам понадобилось столько таймеров?
Пробую поработать, совместить это все, закомментированы я вроде написал почему ранее
то что раскомментировано это запускают внешнее прерывание от часов
ну пробуйте.
От форума вы какой помощи ждете, не объясняя цели своих попыток? Как можно помочь, не понимая, чего вы хотите добиться?
запустить закомментированные таймеры совместно с часами и ферроэлектрической памятью
удачи
Мой вам совет напоследок - не трогайте Таймер0, он управляет миллисом и определяет все задержки и таймауты в коде. Без него все развалится.
Что вы хотите от таймера ? То что он работает не так как вы хотите - не говорит о том что он не работает !!! Он работает именно так как вы его запустили !!!
Я не говорю что они не работают, это написаны рабочие таймеры, перестают работать часы и функция scan. При запуске любого из таймеров, одного любого.
Не сильно углублялся в ваш код (особенно выкушенный как комментарий), но вы вроде везде разрешаете прерывания от таймеров, но нет ни одного обработчика - ваш код по прерыванию улетает на заглушку __bad_interrupt и туда на reset … и так по кругу …
Это так задумано ???
У нулевого таймера есть обработчик, на котором крутится millis, но вы же сбиваете ему параметры и он начинает считать не так как было задумано в Arduino !!!
да нет конечно. Он просто совсем не понимает, что делает.
А память нужна была что бы писать туда какую-то дичь ???
И еще вопрос - почему она не сразу заработала ? (может кому то поможет информация)
Непропай был, хотя под микроскопом все выглядело хорошо