DS1307 примеры кода - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » DS1307 примеры кода
DS1307 примеры кода
ntro123 Дата: Пт, 29.10.2010, 23:01  |                                                                                                                Сообщение # 1
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 28.06.2010

Статус: Offline

Добрый вечер.

Уважаймые профи, помогите, никак не могу понять.
Написал код

Code
Device = 16F876A
Xtal = 4
LCD_DTPin = PORTB.4
LCD_RSPin = PORTB.2   
LCD_ENPin = PORTB.1
LCD_Interface = 4
LCD_Lines = 2
LCD_CommandUs = 2000
LCD_DataUs = 50
SCL VAR PORTC.3 ' íîæêà clock   
SDA VAR PORTC.4 ' íîæêêà data   
rtc_read CON %11010000 ' Àäðåñ ÷àñîâ äëÿ ÷òåíèÿ   
rtc_write con %11010001 ' Àäðåñ ÷àñîâ äëÿ çàïèñè   
sec VAR Byte ' ñåêóíäû   
mins VAR Byte ' ìèíóòû â ôîðìàòå DS1307   
mins1 var Byte ' ìèíóòû â äåñÿòè÷íîì ôîðìàòå   
hr VAR Byte ' ÷àñû â ôîðìàòå DS1307   
hr1 VAR Byte ' ÷àñû â äåñÿòè÷íîì ôîðìàòå   
day VAR Byte ' äåíü íåäåëè   
date VAR Byte ' äàòà â ôîðìàòå DS1307   
date1 VAR Byte ' äàòà â äåñÿòè÷íîì ôîðìàòå   
mon VAR Byte ' ìåñÿö â ôîðìàòå DS1307   
mon1 var Byte ' ìåñÿö â äåñÿòè÷íîì ôîðìàòå   
yr VAR Byte ' ãîä â ôîðìàòå DS1307   
yr1 VAR Byte ' ãîä â äåñÿòè÷íîì ôîðìàòå   
tmp var Byte   
tmp1 var Byte   

Dim VR1 As Dword

main:
'Print At 1, 1, "123"
DelayMS 1000
GoSub read_time
GoSub write_time

Print At 1, 1, Dec mins1
DelayMS 1000
GoTo main

read_time:'---------------------------------------------------------   
I2CRead SDA, SCL, RTC_read, 0, [sec,mins,hr,day,date,mon,yr]   
tmp = mins   
GoSub fix_bcd_in   
mins1 = tmp   
tmp = hr   
GoSub fix_bcd_in   
hr1 = tmp   
tmp = date   
GoSub fix_bcd_in   
date1 = tmp   
tmp = mon   
GoSub fix_bcd_in   
mon1 = tmp   
tmp = yr   
GoSub fix_bcd_in   
yr1 = tmp   
Return'----------------------------------------------------------   

write_time:'---------------------------------------------   
t mp = mins1   
GoSub fix_bcd_out   
mins = tmp   
tmp = hr1   
GoSub fix_bcd_out   
hr = tmp   
tmp = date1   
GoSub fix_bcd_out   
date = tmp   
tmp = mon1   
GoSub fix_bcd_out   
mon = tmp   
tmp = yr1   
GoSub fix_bcd_out   
yr = tmp   
sec = 0   
I2CWrite SDA, SCL, RTC_write, 0, [sec,mins,hr,day,date,mon,yr]   
Return'----------------------------------------------------------   

fix_bcd_in:'----------------------------------------------------- --------------------   
tmp1 = tmp & 15   
tmp = tmp >> 4   
tmp = tmp1 + 10 * tmp   
Return   

fix_bcd_out:'------------------------------------------------------------------------   
tmp1 = tmp / $A   
tmp = tmp - (tmp1 * $A)   
tmp = tmp + (tmp1 << 4)   
Return

Пои деи на дисплеи он должен вывести минуты ... но что не делал всегда выводит 0.
Совсем не понимаю

вот схема

Нужно подать команду дс'у чтобы начел отсчет времени с 0, потом послать команду чтобы вернул сколько времени он отсчетал от 0, сбросился и ждал еще команды чтобы о5 начать считать с 0 и т.д.

ПС. а без батарейки рабоать может?
т.к. ненужно сохранять дату и время, даже было бы лучше еслиб при включении было все по 0.

Спасибо.

Прикрепления: 1509230.jpg(150Kb)

Сообщение отредактировал ntro123 - Пт, 29.10.2010, 23:01
ЯНДЕКС Дата: 29.10.2010
DAlexV Дата: Пт, 29.10.2010, 23:17  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

По схемотехнике:
кварцы на проце(с конденсаторами) и на 1307 можно выкинуть, С3 то же. Обязательно 4.7k одним хвостом к +5вольт, второй на SDA. Точно так же и на SCL. От батарейки можно отказаться. В Протеусе есть I2C отладчик, с помощью него проверь что у тебя отправляет-принимает PIC. От этого уже продолжай.
И желательно полностью архивом весь проект.


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)

Сообщение отредактировал DAlexV - Пт, 29.10.2010, 23:19
ntro123 Дата: Сб, 30.10.2010, 20:26  |                                                                                                                Сообщение # 3
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 28.06.2010

Статус: Offline

DAlexV,
А вобще реально ли реализовать чтобы:
При нажатии на кнопку МК посылал команду внешниму таймеру (не обязательно такому крутому и сложному как DS1307) тот тупо начел отсчет в секундах (а лучше в милисекундах) и при другой команде от МК отдавал сколько времени он отсчетал с того момента как он ему послал команду на начала счета времени в мили секундах.
и потом мгновенно идет сразу команда начать считать заного и так до бесконечности.

про100 кажется что дс не совсем подходит под эти цели ...
а МК не может делать две вещи одновремено
1. и следить за кнопкой (была ли она нажата)
2. и отсчитывать милисикунды со временем последнего нажатия

может быть проще какойнить 12f как таймер юзать?

Спасибо за помощь.

Сообщение отредактировал ntro123 - Сб, 30.10.2010, 20:31
DAlexV Дата: Сб, 30.10.2010, 20:49  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Насчет 12f так же как и 16f не подскажу. Давно забросил. Все зависит от количества времени и время приращения таймера.
таймер настраивается на нужные интервалы. в прерывании таймера если разрешено просто прибавляется 1.
в основной программе опрос кнопок, разрешение/запрет счета, вывод на индикацию. Насколько понял это обычный таймер должен быть(кнопки старт стоп и индикатор). Могу набросать пример. Нужен интервал между срабатыванием таймер(сколько милисекунд).


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
ntro123 Дата: Сб, 30.10.2010, 21:15  |                                                                                                                Сообщение # 5
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 28.06.2010

Статус: Offline

DAlexV, половину не понял ...
буду очень признателен если на прикрепленном проекте напишете небольшой кодик.
который по нажатию кнопку пошлет команду ds1307 чтобы тот начел отсчет и при повторном нажатии вернул количество секунд прошедшее с первого нажатия, и вывести это число на lcd

заранее спасибо.

Прикрепления: ssse.dsn(89Kb)
DAlexV Дата: Сб, 30.10.2010, 21:34  |                                                                                                                Сообщение # 6
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (ntro123)
который по нажатию кнопку пошлет команду ds1307 чтобы тот начел отсчет и при повторном нажатии вернул количество секунд прошедшее с первого нажатия, и вывести это число на lcd
Теперь я ни чего не понял. smile
то отказаться от ds1307, то не отказаться.
Quote (ntro123)
а МК не может делать две вещи одновремено 1. и следить за кнопкой (была ли она нажата) 2. и отсчитывать милисикунды со временем последнего нажатия
.Это он как раз может.
Повторим условие задачи:
При нажатии кнопки запускается отсчет времени в сеукндах.
Ждем до следующего нажатия. (параллельно выводим текущее время на LCD 1 строка)
При нажатии кнопки второй раз выводим в 2 строку LCD то что насчитали, сбрасываем время на ноль, и считаем снова.
и т.д.
вроде все.

Для этого варианта совсем не обязательно использовать ds. Достаточно 1 таймер.
Пример будет завтра. На сегодня уже хватит жестокого обращения с таймерами(это я про свои заморочки). Хорошо ???
Если что не правильно понял, поправь.

P/s. Чуть не забыл Пример будет на SwordFish Basic ! Но с подробными комментариями. Постараюсь писать без наворотов.


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)

Сообщение отредактировал DAlexV - Сб, 30.10.2010, 22:43
DAlexV Дата: Сб, 30.10.2010, 21:59  |                                                                                                                Сообщение # 7
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Подправил схемотехнику. Если продолжишь эксперименты.
Вот хорошее описание на DS1307 на русском
Доступно только для пользователей
И еще просьба. Выкладывать все полностью в виде архива. Не только схемотехнику, но и хотя бы hex или лучше всего COF. Это расширение могут генерировать почти все компиляторы. Его безболезненно распознает протеус позволяя пошагово рассматривать выполнение программы.
Прикрепления: 6784667.dsn(87Kb)


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
ntro123 Дата: Вс, 31.10.2010, 15:20  |                                                                                                                Сообщение # 8
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 28.06.2010

Статус: Offline

Quote (DAlexV)
Теперь я ни чего не понял. то отказаться от ds1307, то не отказаться.

Да мне без разницы как делать главное чтобы работало, а с дс1307 я вобше не понимаю как с ним работать.
Quote (DAlexV)
.Это он как раз может.

я пробывал, но уменя не полалось, пробывал по разному.

условия задачи такие.
запускается программа.
ждет пока будет нажата кнопка button1.
как только на кнопку нажали, идет отсчет времени (обязательно в миллисекундах). (на экран ничего пока выводить не надо) все будем считать что на кнопку нажали начался отсчет времени, и МК параллельно должен проверять не нажата ли была кнопка еще раз? если нажата то количество миллисекунд прошедших между первым и вторым нажатием вывести на экран и опять начать считать время и потом опять нажимается кнопка опять выодится время и т.д. НО если время прошедшее с последнего момента нажатия больше 3 секунд то программа начинает тупо начинать все сначала.
Надеюсь понятно ... впринцепи все равно с ds1307 делать или без него, про100 посути МК должен будет выполнять 3 задачи

1. чекать бутон если не был он нажат, если не был то зацикливается на этом 1 пункте.
2. если был нажат, количество прошедшего времени с момента этого (т.е. последнего нажатия) в миллисекундах считать
3. и проверять если это время не больше 3000 миллисекунд, и если больше то начинать все с первого пункта, а если не больше то вывести на экран количество мили секунд.

вроде все...
но чтобы было на 100% понятно то объясняю зачем это нужно.
Мой отец работает в типографии было бы не плохо если на каждую машину поставить такое устройство которое будет считать среднюю скорость в минуту прошедших книг...
а это в свою очередь нужно чтобы настроить моного печатных машин.
т.е. на первой машине скорость 40 шт в минуту. значит вторая должна быть 40-41 третья 41-42 и т.д. чтобы машины не захлебнулись ...
без таких устройств вручную очень долго настраивать... т.е. нужно на угад скорость крутить вертеть и т.д.

Спасибо большое что помогаешь.
ПС. если что нужно по вебу ты пиши (ну там seo php js верстка - совсем дружу на хорошем уравне)

Добавлено (31.10.2010, 15.18.51)
---------------------------------------------
ПСС. если надо то могу еще сказать что максимальная скорость машин по 1 делу в секунду (делу - имеется ввиду обернуть книгу и отдать следующей машине, та будет золотые углы насаживать и следушей и т.д.) и вот к каждоый машине нужно по устройству ...

Добавлено (31.10.2010, 15.20.11)
---------------------------------------------
Выложил схемотехнику т.е. кода банально нету ... то что писал удалил зачем-то...
да там кроме кривого кода ничего небыло, который тупо выводит 123 на лсд

Сообщение отредактировал ntro123 - Вс, 31.10.2010, 15:17
DAlexV Дата: Вс, 31.10.2010, 15:33  |                                                                                                                Сообщение # 9
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (ntro123)
как только на кнопку нажали, идет отсчет времени (обязательно в миллисекундах). (на экран ничего пока выводить не надо) все будем считать что на кнопку нажали начался отсчет времени, и МК параллельно должен проверять не нажата ли была кнопка еще раз? если нажата то количество миллисекунд прошедших между первым и вторым нажатием вывести на экран и опять начать считать время и потом опять нажимается кнопка опять выодится время и т.д. НО если время прошедшее с последнего момента нажатия больше 3 секунд то программа начинает тупо начинать все сначала.

Задача ясна, за пару часиков накидаем.


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
ntro123 Дата: Вс, 31.10.2010, 18:32  |                                                                                                                Сообщение # 10
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 28.06.2010

Статус: Offline

Чуть не забыл ... написал на делфи программку, она мне очень помогала при отладке ...
Прикрепления: 8529650.jpg(47Kb) · 8989773.exe(372Kb)
DAlexV Дата: Вс, 31.10.2010, 18:34  |                                                                                                                Сообщение # 11
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Ну вот вроде бы получилось. Смотри. Изучай. Будут вопросы, пиши.
Прикрепления: Count_Timer.rar(37Kb)


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
ntro123 Дата: Вс, 31.10.2010, 18:34  |                                                                                                                Сообщение # 12
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 28.06.2010

Статус: Offline

Вот этой программой я проверял.... каждый раз МК выдавал разные значения... пррограмма нажимала точно ...т.к. если смотреть в протеусе и в программе то количество соответсвовало количество секунд в самом протеусе ..
DAlexV Дата: Вс, 31.10.2010, 18:37  |                                                                                                                Сообщение # 13
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Я не мно по другому поступил, генераторы использую. Но идея интересная. Дай исходничек. Через API управляешь хвостом???

Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
ntro123 Дата: Вс, 31.10.2010, 19:56  |                                                                                                                Сообщение # 14
Группа: Пользователи
Ранг:  Понимаю
Сообщений: 62
Репутация: 0   ±
Замечания:   ±
На сайте с 28.06.2010

Статус: Offline

Исходников нет т.к. писал давно (2-3 мес назад) по случаю удалил ...
Там ничего сложного небыло т.к. в делфи я еще более делитант чем в МК. (чтобы написать эту программу посмотрел пару видео уроков по делфи, там какраз был урок по управлению курсором)

Спасибо за программу!
присоединил кнопку к порту A0 и запустил свою прогу на 60 нажатий! и о чудо! всегда выдавалось одно и тоже значение 799-800 (хотя в программе четко 1000 мижду нажатиями)
почему так хз ... надо разбирается.... но уже с мертвой точке сдвинулся с вашей помоши, т.к. у меня вобше разница была дикая между нажжатиями а тут её нет!

Добавлено (31.10.2010, 19.37.45)
---------------------------------------------
Если поставить между нажатиями 2000 то будет выдовать 1500 =( а я ожидал 1600 (т.е. 800*2) ... надобна разобратся ...

Добавлено (31.10.2010, 19.56.42)
---------------------------------------------
можно пару вопросиков))
PIE1, PIR1, T1CON, TMR1L - это что кто и с чем это едят?
TMR1Val = 64690 - что это за константа? почему там значени 64690? константы в МК занимают меньше памяти чем обычные переменные?

Interrupt TMR1_Interrupt()
....
End Interrupt

Interrupt - это что-то вроде ключевого слова function в picbasic?

Include "LCD.bas"
Include "convert.bas"

что это за подключаемые файлы?
Save(0) - что это?

LCD.WriteAt(1,1,"Count Timer") - прям ООП. и ко многим объектам можно обращатся так?
я думал можно только print at ...

If LCD_out=1 Then // если разрешен вывод на LCD

а как он может быть запрещен?

а есть что-то вроде свойства LCD.ReadAt() ???

У МК есть свой таймер? это как?

Сообщение отредактировал ntro123 - Вс, 31.10.2010, 19:58
DAlexV Дата: Вс, 31.10.2010, 20:38  |                                                                                                                Сообщение # 15
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (ntro123)
PIE1, PIR1, T1CON, TMR1L - это что кто и с чем это едят?

Это регистры процессора отвечающие за работу и прерывания от таймера 1
Quote (ntro123)
TMR1Val = 64690 - что это за константа? почему там значени 64690?

Так как таймер 16 битный эта константа обозначает начальные значения таймера. когда он работает значение регистров TMR1L и TMR1H прибавляется прерывание происходит при переходе от $FFFF к $0000
64690=$FCB2 расчитывается специальной программой на период в 1 mS.
Quote (ntro123)
Interrupt TMR1_Interrupt() .... End Interrupt
это подпрограмма обработчик прерываний.
Quote (ntro123)
Include "LCD.bas" Include "convert.bas"
загружаемые библиотеки. Первая работает с LCD. Вторая для конвертирования данных(что бы не париться с преобразованием 16-битного целого числа на LCD)
Quote (ntro123)
Save(0)
Команды Save(0) и Restore(0) применяются во всех процедурах прерывания для сохранения значений служебных регистров при прерывании. Если этого не делать, программа поведет себя непредсказуемо(зависнет например)
Quote (ntro123)
LCD.WriteAt(1,1,"Count Timer")
все верно. Это что то наподобии
Quote (ntro123)
print at

Quote (ntro123)
If LCD_out=1 Then // если разрешен вывод на LCD а как он может быть запрещен?

это некая переменная или так называемый флаг который устанавливается(сбрасывается) и в зависимости от его состояния выполняются подрограммы(что то наподобии виртуальных кнопок(вкл/выкл))

Я ведь предупреждал:

Quote (DAlexV)
Чуть не забыл Пример будет на SwordFish Basic ! Но с подробными комментариями. Постараюсь писать без наворотов.

Советую что бы проще было посмотреть программу по шагам. Вот как это делается: http://www.picbasic.ru/forum/5-426-6142-16-1288513029


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
Форум Picbasic.ru » Программирование МК » Proton PicBasic » DS1307 примеры кода
Страница 1 из 212»
Поиск: