M41Tt56 и ATMEGA1280

Sonic
Offline
Зарегистрирован: 07.03.2012

 Сразу прошу прощения за глупые вопросы, но в программировании я совсем не щарю....

Подарили мне  ATMEGA1280 хочу сделать на ней таймер на несколько каналов с управлением яркостью диодов и терморегулятор, купил микруху M41Tt56 аналог DS1307 собрал, подколчил но как ее заставить работать не знаю...

вот такое залил в контроллер 

#include <LiquidCrystal.h>
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//Переменные для сохранения данных часов
int hr_00; //часы
int mn_00; //минуты
int sc_00; //секунды
int DD_00; //дни
int MM_00; //месяцы
int YY_00; //годы

char buffer[9];
char delitel = ':'; //разделитель времени для отображения
void setup(){ }
void loop()
{
read_rtc1307();//прочитать время в переменные
}
void read_rtc1307()
{

hr_00=RTC.get(DS1307_HR,true);
mn_00=RTC.get(DS1307_MIN,false);
sc_00=RTC.get(DS1307_SEC,false);
DD_00=RTC.get(DS1307_DATE,false);
MM_00=RTC.get(DS1307_MTH,false);
YY_00=RTC.get(DS1307_YR,false);

lcd.begin(16,2);
sprintf(buffer,"%02d:%02d:%02d",hr_00,mn_00,sc_00);
lcd.setCursor(0,0);
lcd.print(buffer);
sprintf(buffer,"%02d-%02d-%02d",DD_00,MM_00,YY_00);
lcd.setCursor(0,1);
lcd.print(buffer);
delay (1000);
lcd.clear();
}

 

на дисплее показывает

00:00:00

00-00-2000

я так понимаю нужно настроить микруху но как это сделать совсем не шарю, поиски в гугле не дали результатов, там всё для тех кто хоть немного шарит в с++ а я от этого совсем далеко....

если кто поможет буду оч благодарен)))

Alexander
Offline
Зарегистрирован: 25.04.2010

Не по теме от модератора:

Вставка программного кода в топик

В теме я поправлю, просто на будущее - удобная функция.

step962
Offline
Зарегистрирован: 23.05.2011

 В google.com набрать "arduino ds1307 set time" и копаться в полученной куче в поисках жемчужных зерен истинного знания.

Взять библиотеку Time и поиграться с ней. В частности с функцией setTime.

Sonic
Offline
Зарегистрирован: 07.03.2012

Еслиб получилась разобратся по нарытому в гугле помочь......

вот везде есть куча кусков кода но что куда совать толклм не понятно.....

если кому не лень можете образец того как выставить время для чайников))))

собран и подключен таймер по такой схеме

www.arduino.cc/cgi-bin/yabb2/YaBB.pl

только с подтягиваюшими незисторами....

step962
Offline
Зарегистрирован: 23.05.2011

 Ну дык - дал вам два варианта.

Не получается с гуглом (и не хотите то же самое в Яндексе повторить) - попробуйте с предложенной библиотекой.

Sonic
Offline
Зарегистрирован: 07.03.2012

библиотеку пробую, но в англйском я не силен, немного не понятно что куда в ней вписовать.

0:05:30 1 1 1970

вот как кроме такова ни чего не получатся

как выставить время и как сделать чтоб оно сохранилось при перезапуске устройства?
 

leshak
Offline
Зарегистрирован: 29.09.2011

 С этой библиотекой идет пример (кстати всего один).

В нем в функции setup() видно как устанавливать время.

  RTC.stop();
  RTC.set(DS1307_SEC,1);        //set the seconds
  RTC.set(DS1307_MIN,23);     //set the minutes
  RTC.set(DS1307_HR,12);       //set the hours
  RTC.set(DS1307_DOW,4);       //set the day of the week
  RTC.set(DS1307_DATE,5);       //set the date
  RTC.set(DS1307_MTH,3);        //set the month
  RTC.set(DS1307_YR,9);         //set the year
  RTC.start();

Вот оно и "установит вам время".

Что-бы при каждом перезапуске микроконтроллера оно не устанавливалось заново (сбрасывалось), эти строчки нужно закоментировать.

Почитайте документацию про функции setup() и loop() - когда и сколько раз вызывается каждая из них. Без четкого понимания этого писать на ардуино не возможно.

leshak
Offline
Зарегистрирован: 29.09.2011

 Кстати lcd.begin(...) тоже должно быть setup(), а не loop(). 

Sonic
Offline
Зарегистрирован: 07.03.2012

так, чтот я уже кучу всего на открывал и совсем запутолся

#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>

int rtc[7];

void setup()
{
  Serial.begin(9600);
/*
  RTC.stop();
  RTC.set(DS1307_SEC,1);
  RTC.set(DS1307_MIN,57);
  RTC.set(DS1307_HR,17);
  RTC.set(DS1307_DOW,4);
  RTC.set(DS1307_DATE,18);
  RTC.set(DS1307_MTH,2);
  RTC.set(DS1307_YR,9);
  RTC.start();
*/
}

void loop()
{
  RTC.get(rtc,true);

  for(int i=0; i<7; i++)
  {
    Serial.print(rtc[i]);
    Serial.print(" ");
  }
  Serial.println();

  delay(1000);

}

тоесть я убираю /* */ во круг


  RTC.stop();
  RTC.set(DS1307_SEC,1);
  RTC.set(DS1307_MIN,57);
  RTC.set(DS1307_HR,17);
  RTC.set(DS1307_DOW,4);
  RTC.set(DS1307_DATE,18);
  RTC.set(DS1307_MTH,2);
  RTC.set(DS1307_YR,9);
  RTC.start();

и оно должно заработать?

leshak
Offline
Зарегистрирован: 29.09.2011

 Ну это как при покупке новых часов. Нужно один раз установить время, а потом "не трогать".

Вы должны "один раз" убрать /* */ , написать в эти set-ы правильное время (год нынче  2012, е не 2009 как в примере и т.п.). Залить скетч. setup() выполнится, время установится.

Потом вернуть /* */ на место, и опять залить скетч. Часы будут идти, и не сбрасывать каждый раз.

Если когда-либо понадобится их поять установить - убираете /* */ и т.д.

Потом можно, если время часто нужно менять, сделать что-бы скетч слушал seral, принимал какую-то команду типа "settime 15:15" и устанавливал это время в михросхему, тогда не нужно будет "трогать прошивку", что-бы "продкрутить время".

Ну и естественно, это все говорится в предположении, что ваш ds1307 имеет автономное питание. И не "сбрасывается в ноль" при исчезании питания.

 

Sonic
Offline
Зарегистрирован: 07.03.2012

 ну время то понятно куда вписывать так и делал но чтото оно как то не записывается и в сериал мониторе 

0 0 0 0 0 0 2000

leshak
Offline
Зарегистрирован: 29.09.2011

 Когда идут эти ""0 0 0 0 0 0 2000"? Когда set-ты закоментированы или раскоменитрованны?

Sonic
Offline
Зарегистрирован: 07.03.2012

 в любом случае(((

Sonic
Offline
Зарегистрирован: 07.03.2012

 може микруха мертвая, щас попробовал отключить часы от друины и всеравно 0 0 0 0 0 0 2000

leshak
Offline
Зарегистрирован: 29.09.2011

 А вы похоже еще время вычитываете как-то "по своему". Откруда вы взяли RTC.get умеет вычитывать в какой-то массив?

В примере идущем с библиотекой я вижу что первый параметр это не массив, а "какую часть времени" мы хотим получить.

Serial.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
  Serial.print(":");
  Serial.print(RTC.get(DS1307_MIN,false));//read minutes without update (false)
  Serial.print(":");
  Serial.print(RTC.get(DS1307_SEC,false));//read seconds
  Serial.print("      ");                 // some space for a more happy life
  Serial.print(RTC.get(DS1307_DATE,false));//read date
  Serial.print("/");
  Serial.print(RTC.get(DS1307_MTH,false));//read month
  Serial.print("/");
  Serial.print(RTC.get(DS1307_YR,false)); //read year 
  Serial.println();

 

leshak
Offline
Зарегистрирован: 29.09.2011

>може микруха мертвая,

ОЧЕНЬ сомневаюсь. Тогда-бы вы вообще ничего от нее не слышали.  

 

 Возможно как вы "вычитывать сразу массив" - тоже можно (но вначале попробуйте вариант из примера. Да и вообще, я не понимаю. IMHO первый делом всегда нужно пробовать "пример из коробки", а уж потом пилить что-то свое)

Но даже если "читать сразу в массив", то все-таки, нужно передавать переменную "по ссылке", а не "по значению". Попробуйте "RTC.get(&rtc,true);" вместо "RTC.get(rtc,true);"

Sonic
Offline
Зарегистрирован: 07.03.2012

 тот код что в начале я даже ужене помню где взял, 

0 0 0 0 0 0 2000
выдает даже без микрухи, похоже что сам скрипт, щас мучаю этот

#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>

int rtc[7];

void setup()
{
  Serial.begin(9600);

  RTC.stop();
  RTC.set(DS1307_SEC,1);
  RTC.set(DS1307_MIN,21);
  RTC.set(DS1307_HR,16);
  RTC.set(DS1307_DOW,3);
  RTC.set(DS1307_DATE,7);
  RTC.set(DS1307_MTH,3);
  RTC.set(DS1307_YR,12);
  RTC.start();

}

void loop()
{
  RTC.get(rtc,true);

  for(int i=0; i<7; i++)
  {
    Serial.print(rtc[i]);
    Serial.print(" ");
  }
  Serial.println();

  delay(1000);

}

сам писать не умею, если чесно вот то что вы писали про массивы мне не понятно...

мне бы готовы пример чтоб время затикало.....

leshak
Offline
Зарегистрирован: 29.09.2011

 >мне бы готовы пример чтоб время затикало.....

Ну дык в библиотеке же есть. В папке example.

Или прямо в ардуино IDE 

 

Изучение примеров из поставки это же и есть то, с чего нужно знакомство начинать.

leshak
Offline
Зарегистрирован: 29.09.2011

Sonic пишет:

сам писать не умею, если чесно вот то что вы писали про массивы мне не понятно...

ну честно говоря я тоже "смутно". Сам я на C# пишу, и C++ смотрю "по аналогии". А указатили в ардуино-документации не очень-то описаны. Такую форму записи "подсмотрел" в другой библиотеке.

Попробуйте, все-таки в строке 25 (последнего вашего скетча), заменить "RTC.get(rtc,true)" на "RTC.get(&rtc,true)"

Смысл сего действа примерно таков:

Когда мы передаем переменную "по значению", то внутрь функции передается ее копия. И если функция меняет внутри себя этот параметр (заполняет массив), то "изначальная переменная" - не трогается. Если же мы передали внутрь "как ссылку" (используя амперсанд), то передается "адрес этой переменной", и ее изменения внутри функции отражаются и на саму переменную.

Правда тут меня смущает что 2000 - все-таки как-то возвращается (я могу догадыватся "почему так", но не буду засорять счас мозг). Если-бы были все нули, то я был-бы уверен что дело в этом . Но ведь можно "попробовать" хуже-то не будет ;)