M41Tt56 и ATMEGA1280
- Войдите на сайт для отправки комментариев
Ср, 07/03/2012 - 03:22
Сразу прошу прощения за глупые вопросы, но в программировании я совсем не щарю....
Подарили мне 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
я так понимаю нужно настроить микруху но как это сделать совсем не шарю, поиски в гугле не дали результатов, там всё для тех кто хоть немного шарит в с++ а я от этого совсем далеко....
если кто поможет буду оч благодарен)))
Не по теме от модератора:
Вставка программного кода в топик
В теме я поправлю, просто на будущее - удобная функция.
В google.com набрать "arduino ds1307 set time" и копаться в полученной куче в поисках жемчужных зерен истинного знания.
Взять библиотеку Time и поиграться с ней. В частности с функцией setTime.
Еслиб получилась разобратся по нарытому в гугле помочь......
вот везде есть куча кусков кода но что куда совать толклм не понятно.....
если кому не лень можете образец того как выставить время для чайников))))
собран и подключен таймер по такой схеме
www.arduino.cc/cgi-bin/yabb2/YaBB.pl
только с подтягиваюшими незисторами....
Ну дык - дал вам два варианта.
Не получается с гуглом (и не хотите то же самое в Яндексе повторить) - попробуйте с предложенной библиотекой.
библиотеку пробую, но в англйском я не силен, немного не понятно что куда в ней вписовать.
0:05:30 1 1 1970
вот как кроме такова ни чего не получатся
как выставить время и как сделать чтоб оно сохранилось при перезапуске устройства?
С этой библиотекой идет пример (кстати всего один).
В нем в функции setup() видно как устанавливать время.
Вот оно и "установит вам время".
Что-бы при каждом перезапуске микроконтроллера оно не устанавливалось заново (сбрасывалось), эти строчки нужно закоментировать.
Почитайте документацию про функции setup() и loop() - когда и сколько раз вызывается каждая из них. Без четкого понимания этого писать на ардуино не возможно.
Кстати lcd.begin(...) тоже должно быть setup(), а не loop().
так, чтот я уже кучу всего на открывал и совсем запутолся
#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); }тоесть я убираю /* */ во круг
и оно должно заработать?
Ну это как при покупке новых часов. Нужно один раз установить время, а потом "не трогать".
Вы должны "один раз" убрать /* */ , написать в эти set-ы правильное время (год нынче 2012, е не 2009 как в примере и т.п.). Залить скетч. setup() выполнится, время установится.
Потом вернуть /* */ на место, и опять залить скетч. Часы будут идти, и не сбрасывать каждый раз.
Если когда-либо понадобится их поять установить - убираете /* */ и т.д.
Потом можно, если время часто нужно менять, сделать что-бы скетч слушал seral, принимал какую-то команду типа "settime 15:15" и устанавливал это время в михросхему, тогда не нужно будет "трогать прошивку", что-бы "продкрутить время".
Ну и естественно, это все говорится в предположении, что ваш ds1307 имеет автономное питание. И не "сбрасывается в ноль" при исчезании питания.
ну время то понятно куда вписывать так и делал но чтото оно как то не записывается и в сериал мониторе
0 0 0 0 0 0 2000
Когда идут эти ""0 0 0 0 0 0 2000"? Когда set-ты закоментированы или раскоменитрованны?
в любом случае(((
може микруха мертвая, щас попробовал отключить часы от друины и всеравно 0 0 0 0 0 0 2000
А вы похоже еще время вычитываете как-то "по своему". Откруда вы взяли 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();>може микруха мертвая,
ОЧЕНЬ сомневаюсь. Тогда-бы вы вообще ничего от нее не слышали.
Возможно как вы "вычитывать сразу массив" - тоже можно (но вначале попробуйте вариант из примера. Да и вообще, я не понимаю. IMHO первый делом всегда нужно пробовать "пример из коробки", а уж потом пилить что-то свое)
Но даже если "читать сразу в массив", то все-таки, нужно передавать переменную "по ссылке", а не "по значению". Попробуйте "RTC.get(&rtc,true);" вместо "RTC.get(rtc,true);"
тот код что в начале я даже ужене помню где взял,
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); }сам писать не умею, если чесно вот то что вы писали про массивы мне не понятно...
мне бы готовы пример чтоб время затикало.....
>мне бы готовы пример чтоб время затикало.....
Ну дык в библиотеке же есть. В папке example.
Или прямо в ардуино IDE
Изучение примеров из поставки это же и есть то, с чего нужно знакомство начинать.
сам писать не умею, если чесно вот то что вы писали про массивы мне не понятно...
ну честно говоря я тоже "смутно". Сам я на C# пишу, и C++ смотрю "по аналогии". А указатили в ардуино-документации не очень-то описаны. Такую форму записи "подсмотрел" в другой библиотеке.
Попробуйте, все-таки в строке 25 (последнего вашего скетча), заменить "RTC.get(rtc,true)" на "RTC.get(&rtc,true)"
Смысл сего действа примерно таков:
Когда мы передаем переменную "по значению", то внутрь функции передается ее копия. И если функция меняет внутри себя этот параметр (заполняет массив), то "изначальная переменная" - не трогается. Если же мы передали внутрь "как ссылку" (используя амперсанд), то передается "адрес этой переменной", и ее изменения внутри функции отражаются и на саму переменную.
Правда тут меня смущает что 2000 - все-таки как-то возвращается (я могу догадыватся "почему так", но не буду засорять счас мозг). Если-бы были все нули, то я был-бы уверен что дело в этом . Но ведь можно "попробовать" хуже-то не будет ;)