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().
так, чтот я уже кучу всего на открывал и совсем запутолся
тоесть я убираю /* */ во круг
и оно должно заработать?
Ну это как при покупке новых часов. Нужно один раз установить время, а потом "не трогать".
Вы должны "один раз" убрать /* */ , написать в эти 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 умеет вычитывать в какой-то массив?
В примере идущем с библиотекой я вижу что первый параметр это не массив, а "какую часть времени" мы хотим получить.
>може микруха мертвая,
ОЧЕНЬ сомневаюсь. Тогда-бы вы вообще ничего от нее не слышали.
Возможно как вы "вычитывать сразу массив" - тоже можно (но вначале попробуйте вариант из примера. Да и вообще, я не понимаю. IMHO первый делом всегда нужно пробовать "пример из коробки", а уж потом пилить что-то свое)
Но даже если "читать сразу в массив", то все-таки, нужно передавать переменную "по ссылке", а не "по значению". Попробуйте "RTC.get(&rtc,true);" вместо "RTC.get(rtc,true);"
тот код что в начале я даже ужене помню где взял,
0 0 0 0 0 0 2000
выдает даже без микрухи, похоже что сам скрипт, щас мучаю этот
сам писать не умею, если чесно вот то что вы писали про массивы мне не понятно...
мне бы готовы пример чтоб время затикало.....
>мне бы готовы пример чтоб время затикало.....
Ну дык в библиотеке же есть. В папке example.
Или прямо в ардуино IDE
Изучение примеров из поставки это же и есть то, с чего нужно знакомство начинать.
сам писать не умею, если чесно вот то что вы писали про массивы мне не понятно...
ну честно говоря я тоже "смутно". Сам я на C# пишу, и C++ смотрю "по аналогии". А указатили в ардуино-документации не очень-то описаны. Такую форму записи "подсмотрел" в другой библиотеке.
Попробуйте, все-таки в строке 25 (последнего вашего скетча), заменить "RTC.get(rtc,true)" на "RTC.get(&rtc,true)"
Смысл сего действа примерно таков:
Когда мы передаем переменную "по значению", то внутрь функции передается ее копия. И если функция меняет внутри себя этот параметр (заполняет массив), то "изначальная переменная" - не трогается. Если же мы передали внутрь "как ссылку" (используя амперсанд), то передается "адрес этой переменной", и ее изменения внутри функции отражаются и на саму переменную.
Правда тут меня смущает что 2000 - все-таки как-то возвращается (я могу догадыватся "почему так", но не буду засорять счас мозг). Если-бы были все нули, то я был-бы уверен что дело в этом . Но ведь можно "попробовать" хуже-то не будет ;)