PIC16f873a и DS1307 - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: ivan_fd 
Форум Picbasic.ru » Программирование МК » PicBasicPro » PIC16f873a и DS1307 (Не могу правильно произвести начальную инициализацию DS1307)
PIC16f873a и DS1307
rdx75 Дата: Ср, 07.10.2009, 21:44  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 8
Репутация: 0   ±
Замечания:   ±
На сайте с 29.08.2009

Статус: Offline

Помогите разобраться с работой часов реального времени ds1307.

Схему собрал с батареей. Подтягивающий резистор установлен только на линии SDA.
Вот код програмы что я записываю в мк.
Алгоритм работы такой:
при нажатии на кнопку1 в ds1307 записываются установки даты, времени.
при нажатии на кнопку2 читаются данные из ds1307 и выдаются на терминал.
когда ниодна кнопка не нажата мерцают два светодиода

Когда по схеме было установлено два подтягивающих резистор, терминал принимал все значения $00.
Когда установил подтягивающий резистор только на SDA, терминал начал принимать все значения $04.
Больше ничего с ним сделать я не смог.

Quote
Include "modedefs.bas" ' Описание режимов последовательного порта
define I2C_slow 1
control con %11010000 ' Задать управляющий код НА ЗАПИСЬ
control2 con %11010001 ' Задать управляющий код НА ЧТЕНИЕ
DPIN var PORTC.2 ' Вывод данных шины I2C (SDA)
CPIN var PORTC.3 ' Вывод тактового сигнала шины I2C (SCL)
Value var byte '
X var byte

i var byte

adcon1 = 7 ' Сделать все выводы порта PORTA цифровыми выводами
trisb = %00000011
portb = %00000000
trisc = %10000000

portb.2 = 0 'светодиод1
portb.3 = 0 'светодиод2
start:
toggle portb.2
toggle portb.3
pause 400

if portb.0 = 1 then '
pause 300 '
if portb.0 = 0 then n 'проверяется нажата ли кнопка1
portb.3 = 0
portb.2 = 0
toggle portb.3
pause 400
toggle portb.3
pause 400
toggle portb.3
pause 400
toggle portb.3
pause 400
I2Cwrite dpin, cpin, control, $00, [%00000000]
I2Cwrite dpin, cpin, control, $01, [%00001010]
I2Cwrite dpin, cpin, control, $02, [%00011001]
I2Cwrite dpin, cpin, control, $03, [%00000011]
I2Cwrite dpin, cpin, control, $04, [%00000111]
I2Cwrite dpin, cpin, control, $05, [%00010000]
I2Cwrite dpin, cpin, control, $06, [%00001001]

endif
n:
if portb.1 = 1 then '
pause 400 '
if portb.1 = 0 then start 'проверяется нажата ли кнопка2
portb.3 = 0
portb.2 = 0
toggle portb.2
pause 400
toggle portb.2
pause 400
toggle portb.2
pause 400
toggle portb.2
pause 400
for i = $00 to $07
I2Cread dpin, cpin, control2, i, [value]
Serout portc.6, T2400, [value] 'вывод на терминал считаного значения
next
endif

goto start

end

Прикрепил вырезку из даташита

Сообщение отредактировал rdx75 - Ср, 07.10.2009, 22:22
ЯНДЕКС Дата: 07.10.2009
demanik Дата: Ср, 07.10.2009, 23:54  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Попробуйте работать с часами одним пакетом, вот пример:

чтение
I2CRead SDA, SCL, rtc_read, 0, [sec,mins,hr,day,date,mon,yr]

запись
I2CWrite SDA, SCL, rtc_write, 0, [sec, mins, hr, day, date, mon, yr]

P.S. Резисторы вцепите на обе шины.


Попробуй всё и вся... может быть пол...


Сообщение отредактировал demanik - Ср, 07.10.2009, 23:57
rdx75 Дата: Чт, 08.10.2009, 00:57  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 8
Репутация: 0   ±
Замечания:   ±
На сайте с 29.08.2009

Статус: Offline

Quote (demanik)
Попробуйте работать с часами одним пакетом, вот пример:
чтение
I2CRead SDA, SCL, rtc_read, 0, [sec,mins,hr,day,date,mon,yr]
запись
I2CWrite SDA, SCL, rtc_write, 0, [sec, mins, hr, day, date, mon, yr]
P.S. Резисторы вцепите на обе шины.

Поцепив на обе линии резисторы это решило половину проблемы (насчет приминения только одного резюка вычитал на одном форуме, видимо дезинформацией занимаются люди biggrin ).
А вторую половину решил когда замерял питание на микросхеме, оно оказалось на мое удивление не 5В, а чуть меньше 4, в даташите указано что при питании меньше, чем 1.25 x VBAT микруха не принимает и не отсылает данные, переходит в ждущий режим. Причина неполадки была в токоограничивающем резисторе в цепи питания, удалил его и все заработало))
Кстати, одним пакетом действительно удобнее работать. Не знал о такой особенности)))

Добавлено (08.10.2009, 00.57.02)
---------------------------------------------
Еще столкнулся с такой проблемой:
при работе с внешней памятью через I2C интерфейс и также с микросхемой часов реального времени DS1307 через тот же интерфейс при первом (после подачи питающего напряжения) чтении данных из памяти либо первая ячейка памяти читается неправильно либо целый массив, напоминает случайные числа, никаких закономерностей. Последующие считывания происходят без сбоев.
Может кто подскажет в чем проблема?

Dmitry Дата: Чт, 08.10.2009, 22:57  |                                                                                                                Сообщение # 4
Группа: Пользователи
Ранг:  Могу и подсказать
Сообщений: 161
Репутация: 6   ±
Замечания:   ±
На сайте с 12.05.2009

Статус: Offline

Quote (rdx75)
(насчет приминения только одного резюка вычитал на одном форуме, видимо дезинформацией занимаются люди

Нет, то внимательно надо читать приводимый код. Для PBP надо добавлять строчку:

DEFINE I2C_SCLOUT 1

и тогда резюк на SCL можно не ставить. Проверено.

Форум Picbasic.ru » Программирование МК » PicBasicPro » PIC16f873a и DS1307 (Не могу правильно произвести начальную инициализацию DS1307)
Страница 1 из 11
Поиск: